From db4a970d2331fa382b28caa218b6e6c5873b8caa Mon Sep 17 00:00:00 2001 From: bixilon Date: Thu, 4 Jun 2020 21:54:46 +0200 Subject: [PATCH] ChatComponent wip; chat, disconnect, spawn location packets, datatype location --- .../game/datatypes/ChatComponent.java | 33 +++++++++++++++ .../game/datatypes/player/Location.java | 34 ++++++++++++++++ .../de/bixilon/minosoft/objects/Player.java | 11 +++++ .../login/PacketLoginDisconnect.java | 9 ++--- .../clientbound/play/PacketChatMessage.java | 38 ++++++++++++++++++ ...layChunkBulk.java => PacketChunkBulk.java} | 2 +- .../clientbound/play/PacketDisconnect.java | 37 +++++++++++++++++ .../clientbound/play/PacketSpawnLocation.java | 40 +++++++++++++++++++ .../protocol/protocol/InByteBuffer.java | 5 +++ .../protocol/protocol/OutByteBuffer.java | 5 +++ .../protocol/protocol/PacketHandler.java | 14 ++++++- .../minosoft/protocol/protocol/Protocol.java | 5 ++- 12 files changed, 225 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/player/Location.java create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessage.java rename src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/{PlayChunkBulk.java => PacketChunkBulk.java} (98%) create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java new file mode 100644 index 000000000..9007385ed --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java @@ -0,0 +1,33 @@ +package de.bixilon.minosoft.game.datatypes; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class ChatComponent { + final JSONObject json; + + public ChatComponent(String raw) { + this.json = new JSONObject(raw); + } + + public ChatComponent(JSONObject json) { + this.json = json; + } + + //ToDo + public String getRawMessage() { + if (json.getString("text").length() != 0) { + return json.getString("text"); + } + StringBuffer buffer = new StringBuffer(); + JSONArray arr = json.getJSONArray("extra"); + for (int i = 0; i < arr.length(); i++) { + buffer.append(arr.getJSONObject(i).getString("text")); + } + return buffer.toString(); + } + + public JSONObject getRaw() { + return this.json; + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/player/Location.java b/src/main/java/de/bixilon/minosoft/game/datatypes/player/Location.java new file mode 100644 index 000000000..0abd02251 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/player/Location.java @@ -0,0 +1,34 @@ +package de.bixilon.minosoft.game.datatypes.player; + +public class Location { + private final double x; + private final double y; + private final double z; + + public Location(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + return true; + } + Location that = (Location) obj; + return that.getX() == getX() && that.getY() == getY() && that.getZ() == getZ(); + } +} diff --git a/src/main/java/de/bixilon/minosoft/objects/Player.java b/src/main/java/de/bixilon/minosoft/objects/Player.java index a6a8bd2a8..4ec5ccd04 100644 --- a/src/main/java/de/bixilon/minosoft/objects/Player.java +++ b/src/main/java/de/bixilon/minosoft/objects/Player.java @@ -1,5 +1,7 @@ package de.bixilon.minosoft.objects; +import de.bixilon.minosoft.game.datatypes.player.Location; + import java.util.UUID; public class Player { @@ -7,6 +9,7 @@ public class Player { float health; short food; float saturation; + Location spawnLocation; public Player(Account acc) { this.acc = acc; @@ -44,4 +47,12 @@ public class Player { public void setSaturation(float saturation) { this.saturation = saturation; } + + public Location getSpawnLocation() { + return spawnLocation; + } + + public void setSpawnLocation(Location spawnLocation) { + this.spawnLocation = spawnLocation; + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java index 18ecc01e9..7fd64ad1e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java @@ -5,20 +5,19 @@ import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; -import org.json.JSONObject; public class PacketLoginDisconnect implements ClientboundPacket { - JSONObject reason; + String reason; @Override public void read(InPacketBuffer buffer, ProtocolVersion v) { - reason = buffer.readJson(); + reason = buffer.readString(); log(); } @Override public void log() { - Log.protocol(String.format("Receiving login disconnect packet (%s)", reason.toString())); + Log.protocol(String.format("Receiving login disconnect packet (%s)", reason)); } @Override @@ -26,7 +25,7 @@ public class PacketLoginDisconnect implements ClientboundPacket { h.handle(this); } - public JSONObject getReason() { + public String getReason() { return reason; } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessage.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessage.java new file mode 100644 index 000000000..dce118ff2 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessage.java @@ -0,0 +1,38 @@ +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.game.datatypes.ChatComponent; +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; + +public class PacketChatMessage implements ClientboundPacket { + ChatComponent c; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_7_10: + c = buffer.readChatComponent(); + break; + } + log(); + } + + @Override + public void log() { + Log.game(String.format("[CHAT] %s", c.getRawMessage())); + } + + public ChatComponent getChatComponent() { + return c; + } + + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java similarity index 98% rename from src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java rename to src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java index 4a59f8fdb..7a535f449 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java @@ -16,7 +16,7 @@ import de.bixilon.minosoft.util.Util; import java.util.HashMap; -public class PlayChunkBulk implements ClientboundPacket { +public class PacketChunkBulk implements ClientboundPacket { HashMap chunkMap = new HashMap<>(); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java new file mode 100644 index 000000000..7bf7a452d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java @@ -0,0 +1,37 @@ +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; + +public class PacketDisconnect implements ClientboundPacket { + String reason; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_7_10: + reason = buffer.readString(); + break; + } + log(); + } + + @Override + public void log() { + Log.game(String.format("Disconnected: %s", reason)); + } + + public String getReason() { + return reason; + } + + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java new file mode 100644 index 000000000..1ecc95fe2 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java @@ -0,0 +1,40 @@ +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.game.datatypes.player.Location; +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; + +public class PacketSpawnLocation implements ClientboundPacket { + Location loc; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_7_10: + int x = buffer.readInteger(); + int y = buffer.readInteger(); + int z = buffer.readInteger(); + loc = new Location(x, y, z); + break; + } + log(); + } + + @Override + public void log() { + Log.protocol(String.format("Received spawn location %s %s %s", loc.getX(), loc.getY(), loc.getZ())); + } + + public Location getSpawnLocation() { + return loc; + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java index 552d639e4..e7390c463 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java @@ -1,6 +1,7 @@ package de.bixilon.minosoft.protocol.protocol; import de.bixilon.minosoft.game.datatypes.BlockPosition; +import de.bixilon.minosoft.game.datatypes.ChatComponent; import org.json.JSONObject; import java.nio.ByteBuffer; @@ -140,4 +141,8 @@ public class InByteBuffer { public String toString() { return "dataLen: " + bytes.length + "; pos: " + pos; } + + public ChatComponent readChatComponent() { + return new ChatComponent(readJson()); + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java index 2a3133d07..3c8f86c55 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java @@ -1,6 +1,7 @@ package de.bixilon.minosoft.protocol.protocol; import de.bixilon.minosoft.game.datatypes.BlockPosition; +import de.bixilon.minosoft.game.datatypes.ChatComponent; import org.json.JSONObject; import java.nio.ByteBuffer; @@ -133,4 +134,8 @@ public class OutByteBuffer { public void writeBlockPosition(BlockPosition pos) { writeLong((((long) pos.getX() & 0x3FFFFFF) << 38) | (((long) pos.getZ() & 0x3FFFFFF) << 12) | ((long) pos.getY() & 0xFFF)); } + + public void writeChatComponent(ChatComponent c) { + writeJson(c.getRaw()); + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index 7b4fe372d..e5785c138 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -67,7 +67,7 @@ public class PacketHandler { connection.sendPacket(new PacketKeepAliveResponse(pkg.getId())); } - public void handle(PlayChunkBulk pkg) { + public void handle(PacketChunkBulk pkg) { //ToDo } @@ -79,4 +79,16 @@ public class PacketHandler { public void handle(PacketPluginMessageReceived pkg) { } + + public void handle(PacketSpawnLocation pkg) { + connection.getPlayer().setSpawnLocation(pkg.getSpawnLocation()); + } + + public void handle(PacketChatMessage pkg) { + } + + public void handle(PacketDisconnect pkg) { + // got kicked + connection.setConnectionState(ConnectionState.DISCONNECTING); + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java index 0928b5a23..da3fe198e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -38,8 +38,11 @@ public interface Protocol { packetClassMapping.put(Packets.Clientbound.PLAY_PLAYER_INFO, PacketPlayerInfo.class); packetClassMapping.put(Packets.Clientbound.PLAY_TIME_UPDATE, PacketTimeUpdate.class); packetClassMapping.put(Packets.Clientbound.PLAY_KEEP_ALIVE, PacketKeepAlive.class); - packetClassMapping.put(Packets.Clientbound.PLAY_CHUNK_BULK, PlayChunkBulk.class); + packetClassMapping.put(Packets.Clientbound.PLAY_CHUNK_BULK, PacketChunkBulk.class); packetClassMapping.put(Packets.Clientbound.PLAY_UPDATE_HEALTH, PacketUpdateHealth.class); packetClassMapping.put(Packets.Clientbound.PLAY_PLUGIN_MESSAGE, PacketUpdateHealth.class); + packetClassMapping.put(Packets.Clientbound.PLAY_SPAWN_POSITION, PacketSpawnLocation.class); + packetClassMapping.put(Packets.Clientbound.PLAY_CHAT_MESSAGE, PacketChatMessage.class); + packetClassMapping.put(Packets.Clientbound.PLAY_DISCONNECT, PacketDisconnect.class); } } \ No newline at end of file