diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java index 215a5cd76..be3a0ea37 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java @@ -18,14 +18,15 @@ public enum MetaType1_14 implements MetaType { Slot(6, Type.FLAT_VAR_INT_ITEM), Boolean(7, Type.BOOLEAN), Vector3F(8, Type.ROTATION), - Position(9, Type.POSITION), - OptPosition(10, Type.OPTIONAL_POSITION), + Position(9, Type.POSITION1_14), + OptPosition(10, Type.OPTIONAL_POSITION_1_14), Direction(11, Type.VAR_INT), OptUUID(12, Type.OPTIONAL_UUID), BlockID(13, Type.VAR_INT), NBTTag(14, Type.NBT), PARTICLE(15, Protocol1_13_2To1_13_1.PARTICLE_TYPE), VillagerData(16, Type.VILLAGER_DATA), + OptVarInt(17, Type.OPTIONAL_VAR_INT), Discontinued(99, null); private final int typeID; diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java index a09e9cf2a..25c6cd0ab 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java @@ -50,6 +50,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { /* Variable Types */ public static final Type VAR_INT = new VarIntType(); public static final Type VAR_INT_ARRAY = new ArrayType<>(Type.VAR_INT); + public static final Type OPTIONAL_VAR_INT = new OptionalVarIntType(); public static final Type VAR_LONG = new VarLongType(); public static final Type VAR_LONG_ARRAY = new ArrayType<>(Type.VAR_LONG); /* Special Types */ @@ -65,6 +66,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { public static final Type OPTIONAL_UUID = new OptUUIDType(); public static final Type OPTIONAL_CHAT = new OptionalChatType(); public static final Type OPTIONAL_POSITION = new OptPositionType(); + public static final Type OPTIONAL_POSITION_1_14 = new OptPosition1_14Type(); public static final Type ITEM = new ItemType(); public static final Type ITEM_ARRAY = new ItemArrayType(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPosition1_14Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPosition1_14Type.java new file mode 100644 index 000000000..5b2fc945c --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPosition1_14Type.java @@ -0,0 +1,25 @@ +package us.myles.ViaVersion.api.type.types.minecraft; + +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.api.type.Type; + +public class OptPosition1_14Type extends Type { + public OptPosition1_14Type() { + super(Position.class); + } + + @Override + public Position read(ByteBuf buffer) throws Exception { + boolean present = buffer.readBoolean(); + if (!present) return null; + return Type.POSITION1_14.read(buffer); + } + + @Override + public void write(ByteBuf buffer, Position object) throws Exception { + buffer.writeBoolean(object != null); + if (object != null) + Type.POSITION1_14.write(buffer, object); + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalVarIntType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalVarIntType.java new file mode 100644 index 000000000..8c4f1aec1 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalVarIntType.java @@ -0,0 +1,23 @@ +package us.myles.ViaVersion.api.type.types.minecraft; + +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.type.Type; + +public class OptionalVarIntType extends Type { + public OptionalVarIntType() { + super(Integer.class); + } + + @Override + public Integer read(ByteBuf buffer) throws Exception { + int read = Type.VAR_INT.read(buffer); + if (read == 0) return null; + return read - 1; + } + + @Override + public void write(ByteBuf buffer, Integer object) throws Exception { + if (object == null) Type.VAR_INT.write(buffer, 0); + else Type.VAR_INT.write(buffer, object + 1); + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/packets/EntityPackets.java index b44b505c6..aa6556d18 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/packets/EntityPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/packets/EntityPackets.java @@ -2,7 +2,6 @@ package us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; -import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13_2; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; @@ -15,6 +14,15 @@ import us.myles.ViaVersion.packets.State; public class EntityPackets { public static void register(Protocol protocol) { + final PacketHandler metaTypeHandler = new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) { + metadata.setMetaType(MetaType1_13_2.byId(metadata.getMetaType().getTypeID())); + } + } + }; + // Spawn mob packet protocol.registerOutgoing(State.PLAY, 0x3, 0x3, new PacketRemapper() { @Override @@ -33,16 +41,7 @@ public class EntityPackets { map(Type.SHORT); // 11 - Velocity Z map(Types1_13.METADATA_LIST, Types1_13_2.METADATA_LIST); // 12 - Metadata - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) { - if (metadata.getMetaType() == MetaType1_13.Slot) { - metadata.setMetaType(MetaType1_13_2.Slot); - } - } - } - }); + handler(metaTypeHandler); } }); @@ -59,16 +58,7 @@ public class EntityPackets { map(Type.BYTE); // 6 - Pitch map(Types1_13.METADATA_LIST, Types1_13_2.METADATA_LIST); // 7 - Metadata - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) { - if (metadata.getMetaType() == MetaType1_13.Slot) { - metadata.setMetaType(MetaType1_13_2.Slot); - } - } - } - }); + handler(metaTypeHandler); } }); @@ -80,16 +70,7 @@ public class EntityPackets { map(Type.VAR_INT); // 0 - Entity ID map(Types1_13.METADATA_LIST, Types1_13_2.METADATA_LIST); // 1 - Metadata list - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) { - if (metadata.getMetaType() == MetaType1_13.Slot) { - metadata.setMetaType(MetaType1_13_2.Slot); - } - } - } - }); + handler(metaTypeHandler); } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/MetadataRewriter.java index 431bccf94..6c8f8494f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/MetadataRewriter.java @@ -20,8 +20,11 @@ public class MetadataRewriter { for (Metadata metadata : new ArrayList<>(metadatas)) { try { // Handle new MetaTypes - if (metadata.getMetaType().getTypeID() > 4) + if (metadata.getMetaType().getTypeID() > 4) { metadata.setMetaType(MetaType1_13.byId(metadata.getMetaType().getTypeID() + 1)); + } else { + metadata.setMetaType(MetaType1_13.byId(metadata.getMetaType().getTypeID())); + } // Handle String -> Chat DisplayName if (metadata.getId() == 2) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/MetadataRewriter.java index 468f13c3c..41b5b835e 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/MetadataRewriter.java @@ -6,7 +6,6 @@ import us.myles.ViaVersion.api.entities.Entity1_14Types; import us.myles.ViaVersion.api.minecraft.VillagerData; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; -import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13_2; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_14; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.packets.InventoryPackets; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage.EntityTracker; @@ -19,11 +18,13 @@ public class MetadataRewriter { public static void handleMetadata(int entityId, Entity1_14Types.EntityType type, List metadatas, UserConnection connection) { for (Metadata metadata : new ArrayList<>(metadatas)) { try { + metadata.setMetaType(MetaType1_14.byId(metadata.getMetaType().getTypeID())); + EntityTracker tracker = connection.get(EntityTracker.class); // 1.13 changed item to flat item (no data) - if (metadata.getMetaType() == MetaType1_13_2.Slot) { + if (metadata.getMetaType() == MetaType1_14.Slot) { InventoryPackets.toClient((Item) metadata.getValue()); - } else if (metadata.getMetaType() == MetaType1_13_2.BlockID) { + } else if (metadata.getMetaType() == MetaType1_14.BlockID) { // Convert to new block id int data = (int) metadata.getValue(); metadata.setValue(Protocol1_14To1_13_2.getNewBlockStateId(data)); @@ -59,8 +60,8 @@ public class MetadataRewriter { if (type.is(Entity1_14Types.EntityType.FIREWORKS_ROCKET)) { if (metadata.getId() == 7) { - metadata.setValue(tracker.getUUID(((Number) metadata.getValue()).intValue()).orNull()); - metadata.setMetaType(MetaType1_14.OptUUID); + if (metadata.getValue().equals(0)) metadata.setValue(null); // https://bugs.mojang.com/browse/MC-111480 + metadata.setMetaType(MetaType1_14.OptVarInt); } } } catch (Exception e) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java index aadb38aeb..da3c0e057 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java @@ -1,9 +1,6 @@ package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage; import com.google.common.base.Optional; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Maps; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.Entity1_14Types; @@ -14,19 +11,16 @@ import java.util.concurrent.ConcurrentHashMap; public class EntityTracker extends StoredObject { private final Map clientEntityTypes = new ConcurrentHashMap<>(); - private final BiMap uuidToId = Maps.synchronizedBiMap(HashBiMap.create()); public EntityTracker(UserConnection user) { super(user); } public void removeEntity(int entityId) { - uuidToId.inverse().remove(entityId); clientEntityTypes.remove(entityId); } public void addEntity(int entityId, UUID uuid, Entity1_14Types.EntityType type) { - uuidToId.forcePut(uuid, entityId); clientEntityTypes.put(entityId, type); } @@ -37,8 +31,4 @@ public class EntityTracker extends StoredObject { public Optional get(int id) { return Optional.fromNullable(clientEntityTypes.get(id)); } - - public Optional getUUID(int id) { - return Optional.fromNullable(uuidToId.inverse().get(id)); - } }