diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java index 9007385ed..c7f9f1d9d 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChatComponent.java @@ -1,13 +1,20 @@ package de.bixilon.minosoft.game.datatypes; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; public class ChatComponent { - final JSONObject json; + JSONObject json; public ChatComponent(String raw) { - this.json = new JSONObject(raw); + try { + this.json = new JSONObject(raw); + } catch (JSONException e) { + // not a text component, is a legacy string + this.json = new JSONObject(); + this.json.put("text", raw); + } } public ChatComponent(JSONObject json) { @@ -16,10 +23,10 @@ public class ChatComponent { //ToDo public String getRawMessage() { - if (json.getString("text").length() != 0) { + if (json.has("text") && json.getString("text").length() != 0) { return json.getString("text"); } - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); JSONArray arr = json.getJSONArray("extra"); for (int i = 0; i < arr.length(); i++) { buffer.append(arr.getJSONObject(i).getString("text")); diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java index 7483d3ddf..0033f9737 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java @@ -153,6 +153,10 @@ public class Network { try { ClientboundPacket packet = clazz.getConstructor().newInstance(); packet.read(inPacketBuffer, connection.getVersion()); + if (inPacketBuffer.getBytesLeft() > 0) { + // warn not all data used + Log.protocol(String.format("[IN] Packet %s did not used all bytes sent", ((p != null) ? p.name() : "UNKNOWN"))); + } if (packet instanceof PacketLoginSuccess) { // login was okay, setting play status to avoid miss timing issues 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 7fd64ad1e..c14b630dc 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 @@ -1,5 +1,6 @@ package de.bixilon.minosoft.protocol.packets.clientbound.login; +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; @@ -7,17 +8,17 @@ import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; public class PacketLoginDisconnect implements ClientboundPacket { - String reason; + ChatComponent reason; @Override public void read(InPacketBuffer buffer, ProtocolVersion v) { - reason = buffer.readString(); + reason = buffer.readChatComponent(); log(); } @Override public void log() { - Log.protocol(String.format("Receiving login disconnect packet (%s)", reason)); + Log.protocol(String.format("Receiving login disconnect packet (%s)", reason.getRawMessage())); } @Override @@ -25,7 +26,7 @@ public class PacketLoginDisconnect implements ClientboundPacket { h.handle(this); } - public String getReason() { + public ChatComponent getReason() { return reason; } } 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 index 7bf7a452d..0d1e757f8 100644 --- 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 @@ -1,5 +1,6 @@ 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; @@ -7,14 +8,14 @@ import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; public class PacketDisconnect implements ClientboundPacket { - String reason; + ChatComponent reason; @Override public void read(InPacketBuffer buffer, ProtocolVersion v) { switch (v) { case VERSION_1_7_10: - reason = buffer.readString(); + reason = buffer.readChatComponent(); break; } log(); @@ -22,10 +23,10 @@ public class PacketDisconnect implements ClientboundPacket { @Override public void log() { - Log.game(String.format("Disconnected: %s", reason)); + Log.game(String.format("Disconnected: %s", reason.getRawMessage())); } - public String getReason() { + public ChatComponent getReason() { return reason; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java index a99c9449b..f2f42ee49 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java @@ -16,9 +16,9 @@ public class PacketUpdateHealth implements ClientboundPacket { public void read(InPacketBuffer buffer, ProtocolVersion v) { switch (v) { case VERSION_1_7_10: - health = buffer.readFloat(); + health = (float) (Math.round(buffer.readFloat() * 10) / 10.0); food = buffer.readShort(); - saturation = buffer.readFloat(); + saturation = (float) (Math.round(buffer.readFloat() * 10) / 10.0); break; } log(); 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 e7390c463..3d9259bfe 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java @@ -143,6 +143,18 @@ public class InByteBuffer { } public ChatComponent readChatComponent() { - return new ChatComponent(readJson()); + return new ChatComponent(readString()); + } + + public int getPos() { + return this.pos; + } + + public int getLength() { + return bytes.length; + } + + public int getBytesLeft() { + return bytes.length - pos; } } 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 da3fe198e..eabe9fc07 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -40,7 +40,7 @@ public interface Protocol { packetClassMapping.put(Packets.Clientbound.PLAY_KEEP_ALIVE, PacketKeepAlive.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_PLUGIN_MESSAGE, PacketPluginMessageReceived.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);