From ada7f23ae5c9b200d8d48148cf11483596be02e7 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 30 Jun 2020 14:08:45 +0200 Subject: [PATCH] fix EntityMetaData NullPointerException (1.7.10 - 1.8) --- .../entities/meta/EntityMetaData.java | 196 +++++++++--------- .../datatypes/entities/mob/OtherPlayer.java | 3 +- .../play/PacketPlayerPositionAndRotation.java | 13 +- .../clientbound/play/PacketSpawnMob.java | 1 + .../protocol/protocol/InByteBuffer.java | 5 +- 5 files changed, 117 insertions(+), 101 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java index 2f239d328..17ede1012 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/meta/EntityMetaData.java @@ -39,6 +39,83 @@ public class EntityMetaData { this.version = version; } + public static Object getData(EntityMetaData.Types type, InByteBuffer buffer) { + Object data = null; + + switch (type) { + case BYTE: + data = buffer.readByte(); + break; + case VAR_INT: + data = buffer.readVarInt(); + break; + case SHORT: + data = buffer.readShort(); + break; + case INT: + data = buffer.readInteger(); + break; + case FLOAT: + data = buffer.readFloat(); + break; + case STRING: + data = buffer.readString(); + break; + case CHAT: + data = buffer.readTextComponent(); + break; + case BOOLEAN: + data = buffer.readBoolean(); + break; + case VECTOR: + data = new Vector(buffer.readInteger(), buffer.readInteger(), buffer.readInteger()); + break; + case SLOT: + data = buffer.readSlot(); + break; + case ROTATION: + data = new EntityRotation(buffer.readFloat(), buffer.readFloat(), buffer.readFloat()); + break; + case POSITION: + data = buffer.readPosition(); + break; + case OPT_CHAT: + if (buffer.readBoolean()) { + data = buffer.readTextComponent(); + } + break; + case OPT_POSITION: + if (buffer.readBoolean()) { + data = buffer.readPosition(); + } + break; + case DIRECTION: + data = buffer.readDirection(); + break; + case OPT_UUID: + if (buffer.readBoolean()) { + data = buffer.readUUID(); + } + break; + case NBT: + data = buffer.readNBT(); + break; + case PARTICLE: + data = buffer.readParticle(); + break; + case POSE: + data = buffer.readPose(); + break; + case BLOCK_ID: + int blockId = buffer.readVarInt(); + data = Blocks.byId(blockId >> 4, blockId & 0xF); + break; + default: + throw new IllegalStateException("Unexpected value: " + type); + } + return data; + } + public HashMap getSets() { return sets; } @@ -138,101 +215,6 @@ public class EntityMetaData { return false; } - public static Object getData(EntityMetaData.Types type, InByteBuffer buffer) { - Object data = null; - - switch (type) { - case BYTE: - data = buffer.readByte(); - break; - case VAR_INT: - data = buffer.readVarInt(); - break; - case SHORT: - data = buffer.readShort(); - break; - case INT: - data = buffer.readInteger(); - break; - case FLOAT: - data = buffer.readFloat(); - break; - case STRING: - data = buffer.readString(); - break; - case CHAT: - data = buffer.readTextComponent(); - break; - case BOOLEAN: - data = buffer.readBoolean(); - break; - case VECTOR: - data = new Vector(buffer.readInteger(), buffer.readInteger(), buffer.readInteger()); - break; - case SLOT: - data = buffer.readSlot(); - break; - case ROTATION: - data = new EntityRotation(buffer.readFloat(), buffer.readFloat(), buffer.readFloat()); - break; - case POSITION: - data = buffer.readPosition(); - break; - case OPT_CHAT: - if (buffer.readBoolean()) { - data = buffer.readTextComponent(); - } - break; - case OPT_POSITION: - if (buffer.readBoolean()) { - data = buffer.readPosition(); - } - break; - case DIRECTION: - data = buffer.readDirection(); - break; - case OPT_UUID: - if (buffer.readBoolean()) { - data = buffer.readUUID(); - } - break; - case NBT: - data = buffer.readNBT(); - break; - case PARTICLE: - data = buffer.readParticle(); - break; - case POSE: - data = buffer.readPose(); - break; - case BLOCK_ID: - int blockId = buffer.readVarInt(); - data = Blocks.byId(blockId >> 4, blockId & 0xF); - break; - default: - throw new IllegalStateException("Unexpected value: " + type); - } - return data; - } - - public static class MetaDataSet { - final int index; - final Object data; - - public MetaDataSet(int index, Object data) { - this.index = index; - this.data = data; - } - - public Object getData() { - return data; - } - - public int getIndex() { - return index; - } - } - public enum Types { BYTE(0), SHORT(new MapSet[]{new MapSet<>(ProtocolVersion.VERSION_1_7_10, 1), new MapSet<>(ProtocolVersion.VERSION_1_9_4, 1000)}), // got removed in 1.9 @@ -280,7 +262,29 @@ public class EntityMetaData { } public int getId(ProtocolVersion version) { - return valueMap.get(version); + Integer ret = valueMap.get(version); + if (ret == null) { + return -2; + } + return ret; + } + } + + public static class MetaDataSet { + final int index; + final Object data; + + public MetaDataSet(int index, Object data) { + this.index = index; + this.data = data; + } + + public Object getData() { + return data; + } + + public int getIndex() { + return index; } } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/mob/OtherPlayer.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/mob/OtherPlayer.java index 59fc93c7b..9771a6059 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/mob/OtherPlayer.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/mob/OtherPlayer.java @@ -82,8 +82,7 @@ public class OtherPlayer extends Mob implements MobInterface { @Override public int getMaxHealth() { - return 40; - //ToDo: absorption + return (int) (40 + metaData.getAbsorptionHearts()); } public String getName() { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java index 1e3789b28..37d3ec60b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java @@ -27,6 +27,8 @@ public class PacketPlayerPositionAndRotation implements ClientboundPacket { boolean onGround; byte flags; + int teleportId; + @Override public boolean read(InPacketBuffer buffer) { switch (buffer.getVersion()) { @@ -37,12 +39,17 @@ public class PacketPlayerPositionAndRotation implements ClientboundPacket { onGround = buffer.readBoolean(); return true; case VERSION_1_8: + location = buffer.readLocation(); + yaw = buffer.readFloat(); + pitch = buffer.readFloat(); + flags = buffer.readByte(); + return true; case VERSION_1_9_4: location = buffer.readLocation(); yaw = buffer.readFloat(); pitch = buffer.readFloat(); flags = buffer.readByte(); - onGround = buffer.readBoolean(); + teleportId = buffer.readVarInt(); return true; } @@ -70,6 +77,10 @@ public class PacketPlayerPositionAndRotation implements ClientboundPacket { return onGround; } + public int getTeleportId() { + return teleportId; + } + @Override public void handle(PacketHandler h) { h.handle(this); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java index c9e529796..e91e835f6 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java @@ -50,6 +50,7 @@ public class PacketSpawnMob implements ClientboundPacket { return true; } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | NullPointerException e) { e.printStackTrace(); + //ToDo: on hypixel, here comes mob id 30 which could be an armor stand, but an armor stand is an object :? } } case VERSION_1_9_4: 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 73c9bd679..fd347c143 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java @@ -368,15 +368,16 @@ public class InByteBuffer { sets.put((int) index, new EntityMetaData.MetaDataSet(index, EntityMetaData.getData(type, this))); item = readByte(); } + break; } case VERSION_1_9_4: byte index = readByte(); while (index != (byte) 0xFF) { - byte type2 = readByte(); - EntityMetaData.Types type = EntityMetaData.Types.byId(type2, version); + EntityMetaData.Types type = EntityMetaData.Types.byId(readByte(), version); sets.put((int) index, new EntityMetaData.MetaDataSet(index, EntityMetaData.getData(type, this))); index = readByte(); } + break; } return sets; }