diff --git a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriter.java b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriter.java index 9a2ac789..46fa68e6 100644 --- a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriter.java +++ b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriter.java @@ -19,6 +19,7 @@ import nl.matsv.viabackwards.api.entities.storage.EntityData; import nl.matsv.viabackwards.api.entities.storage.EntityTracker; import nl.matsv.viabackwards.api.entities.storage.MetaStorage; import nl.matsv.viabackwards.api.exceptions.RemovedValueException; +import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.EntityType; @@ -26,7 +27,11 @@ import us.myles.ViaVersion.api.entities.ObjectType; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; +import us.myles.ViaVersion.api.remapper.PacketHandler; +import us.myles.ViaVersion.api.remapper.PacketRemapper; +import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; +import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ChatRewriter; import java.util.ArrayList; @@ -175,6 +180,82 @@ public abstract class EntityRewriter extends Rewrit return storage; } + /** + * Helper method to handle a metadata list packet. + */ + protected void registerMetadataRewriter(int oldPacketId, int newPacketId, Type> oldMetaType, Type> newMetaType) { + getProtocol().registerOutgoing(State.PLAY, oldPacketId, newPacketId, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.VAR_INT); // 0 - Entity ID + if (oldMetaType != null) { + map(oldMetaType, newMetaType); + } else { + map(newMetaType); + } + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + List metadata = wrapper.get(newMetaType, 0); + wrapper.set(newMetaType, 0, + handleMeta(wrapper.user(), wrapper.get(Type.VAR_INT, 0), new MetaStorage(metadata)).getMetaDataList()); + } + }); + } + }); + } + + protected void registerMetadataRewriter(int oldPacketId, int newPacketId, Type> metaType) { + registerMetadataRewriter(oldPacketId, newPacketId, null, metaType); + } + + /** + * Helper method to handle player, painting, or xp orb trackers without meta changes. + */ + protected void registerExtraTracker(int packetId, EntityType entityType, Type intType) { + getProtocol().registerOutgoing(State.PLAY, packetId, packetId, new PacketRemapper() { + @Override + public void registerMap() { + map(intType); // 0 - Entity id + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + addTrackedEntity(wrapper.user(), (int) wrapper.get(intType, 0), entityType); + } + }); + } + }); + } + + protected void registerExtraTracker(int packetId, EntityType entityType) { + registerExtraTracker(packetId, entityType, Type.VAR_INT); + } + + /** + * Helper method to handle the destroy entities packet. + */ + protected void registerEntityDestroy(int oldPacketId, int newPacketId) { + getProtocol().registerOutgoing(State.PLAY, oldPacketId, newPacketId, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.VAR_INT_ARRAY); // 0 - Entity ids + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + EntityTracker.ProtocolEntityTracker tracker = getEntityTracker(wrapper.user()); + for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) { + tracker.removeEntity(entity); + } + } + }); + } + }); + } + + protected void registerEntityDestroy(int packetId) { + registerEntityDestroy(packetId, packetId); + } + protected EntityTracker.ProtocolEntityTracker getEntityTracker(UserConnection user) { return user.get(EntityTracker.class).get(getProtocol()); } diff --git a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/Rewriter.java b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/Rewriter.java index 61080c52..b958f8c1 100644 --- a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/Rewriter.java +++ b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/Rewriter.java @@ -22,7 +22,7 @@ public abstract class Rewriter { * * @param protocol Protocol instance */ - public void register(T protocol) { + public final void register(T protocol) { this.protocol = protocol; registerPackets(protocol); registerRewrites(); diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java index 580952c7..a5ace566 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java @@ -107,45 +107,10 @@ public class EntityPackets1_11 extends EntityRewriter { }); // Spawn Experience Orb - protocol.registerOutgoing(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity id - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_11Types.ObjectType.THROWN_EXP_BOTTLE.getType() - ); - } - }); - } - }); + registerExtraTracker(0x01, Entity1_11Types.EntityType.EXPERIENCE_ORB); // Spawn Global Entity - protocol.registerOutgoing(State.PLAY, 0x02, 0x02, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Type.BYTE); // 1 - Type - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_11Types.EntityType.WEATHER // Always thunder according to wiki.vg - ); - } - }); - } - }); + registerExtraTracker(0x02, Entity1_11Types.EntityType.WEATHER); // Spawn Mob protocol.registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() { @@ -211,24 +176,7 @@ public class EntityPackets1_11 extends EntityRewriter { }); // Spawn Painting - protocol.registerOutgoing(State.PLAY, 0x04, 0x04, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_11Types.EntityType.PAINTING - ); - } - }); - } - }); + registerExtraTracker(0x04, Entity1_11Types.EntityType.PAINTING); // Join game protocol.registerOutgoing(State.PLAY, 0x23, 0x23, new PacketRemapper() { @@ -320,44 +268,10 @@ public class EntityPackets1_11 extends EntityRewriter { }); // Destroy entities - protocol.registerOutgoing(State.PLAY, 0x30, 0x30, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); + registerEntityDestroy(0x30); // Metadata packet - protocol.registerOutgoing(State.PLAY, 0x39, 0x39, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_9.METADATA_LIST); // 1 - Metadata list - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - wrapper.set( - Types1_9.METADATA_LIST, - 0, - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(Types1_9.METADATA_LIST, 0)) - ).getMetaDataList() - ); - } - }); - } - }); + registerMetadataRewriter(0x39, 0x39, Types1_9.METADATA_LIST); // Entity Status protocol.registerOutgoing(State.PLAY, 0x1B, 0x1B, new PacketRemapper() { diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java index 9b936b02..ef86983b 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java @@ -107,45 +107,10 @@ public class EntityPackets1_12 extends EntityRewriter { }); // Spawn Experience Orb - protocol.registerOutgoing(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity id - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_12Types.ObjectType.THROWN_EXP_BOTTLE.getType() - ); - } - }); - } - }); + registerExtraTracker(0x01, Entity1_12Types.EntityType.EXPERIENCE_ORB); // Spawn Global Entity - protocol.registerOutgoing(State.PLAY, 0x02, 0x02, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Type.BYTE); // 1 - Type - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_12Types.EntityType.WEATHER // Always thunder according to wiki.vg - ); - } - }); - } - }); + registerExtraTracker(0x02, Entity1_12Types.EntityType.WEATHER); // Spawn Mob protocol.registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() { @@ -212,24 +177,7 @@ public class EntityPackets1_12 extends EntityRewriter { }); // Spawn Painting - protocol.registerOutgoing(State.PLAY, 0x04, 0x04, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_12Types.EntityType.PAINTING - ); - } - }); - } - }); + registerExtraTracker(0x04, Entity1_12Types.EntityType.PAINTING); // Spawn Player protocol.registerOutgoing(State.PLAY, 0x05, 0x05, new PacketRemapper() { @@ -343,44 +291,10 @@ public class EntityPackets1_12 extends EntityRewriter { }); // Destroy entities - protocol.registerOutgoing(State.PLAY, 0x31, 0x30, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); + registerEntityDestroy(0x31, 0x30); // Metadata packet - protocol.registerOutgoing(State.PLAY, 0x3B, 0x39, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_12.METADATA_LIST); // 1 - Metadata list - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - wrapper.set( - Types1_12.METADATA_LIST, - 0, - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(Types1_12.METADATA_LIST, 0)) - ).getMetaDataList() - ); - } - }); - } - }); + registerMetadataRewriter(0x3B, 0x39, Types1_12.METADATA_LIST); } @Override diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11to1_11_1/packets/EntityPackets1_11_1.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11to1_11_1/packets/EntityPackets1_11_1.java index dc5cb917..cfaaa09d 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11to1_11_1/packets/EntityPackets1_11_1.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_11to1_11_1/packets/EntityPackets1_11_1.java @@ -82,45 +82,10 @@ public class EntityPackets1_11_1 extends EntityRewriter { }); // Spawn Experience Orb - protocol.registerOutgoing(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity id - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_11Types.ObjectType.THROWN_EXP_BOTTLE.getType() - ); - } - }); - } - }); + registerExtraTracker(0x01, Entity1_11Types.EntityType.EXPERIENCE_ORB); // Spawn Global Entity - protocol.registerOutgoing(State.PLAY, 0x02, 0x02, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Type.BYTE); // 1 - Type - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_11Types.EntityType.WEATHER // Always thunder according to wiki.vg - ); - } - }); - } - }); + registerExtraTracker(0x02, Entity1_11Types.EntityType.WEATHER); // Spawn Mob protocol.registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() { @@ -187,24 +152,7 @@ public class EntityPackets1_11_1 extends EntityRewriter { }); // Spawn Painting - protocol.registerOutgoing(State.PLAY, 0x04, 0x04, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_11Types.EntityType.PAINTING - ); - } - }); - } - }); + registerExtraTracker(0x04, Entity1_11Types.EntityType.PAINTING); // Join game protocol.registerOutgoing(State.PLAY, 0x23, 0x23, new PacketRemapper() { @@ -296,44 +244,10 @@ public class EntityPackets1_11_1 extends EntityRewriter { }); // Destroy entities - protocol.registerOutgoing(State.PLAY, 0x30, 0x30, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); + registerEntityDestroy(0x30); // Metadata packet - protocol.registerOutgoing(State.PLAY, 0x39, 0x39, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_9.METADATA_LIST); // 1 - Metadata list - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - wrapper.set( - Types1_9.METADATA_LIST, - 0, - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(Types1_9.METADATA_LIST, 0)) - ).getMetaDataList() - ); - } - }); - } - }); + registerMetadataRewriter(0x39, 0x39, Types1_9.METADATA_LIST); } @Override diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/packets/EntityPackets1_13.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/packets/EntityPackets1_13.java index 79416eea..82862e71 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/packets/EntityPackets1_13.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/packets/EntityPackets1_13.java @@ -26,7 +26,6 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ChatRewriter; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.Particle; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; -import java.util.List; import java.util.Optional; public class EntityPackets1_13 extends EntityRewriter { @@ -97,42 +96,11 @@ public class EntityPackets1_13 extends EntityRewriter { } }); - //Spawn Experience Orb - protocol.out(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_13Types.EntityType.XP_ORB - ); - } - }); - } - }); + // Spawn Experience Orb + registerExtraTracker(0x01, Entity1_13Types.EntityType.XP_ORB); - //Spawn Global Entity - protocol.out(State.PLAY, 0x02, 0x02, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); - map(Type.BYTE); - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_13Types.EntityType.LIGHTNING_BOLT - ); - } - }); - } - }); + // Spawn Global Entity + registerExtraTracker(0x02, Entity1_13Types.EntityType.LIGHTNING_BOLT); //Spawn Mob protocol.out(State.PLAY, 0x03, 0x03, new PacketRemapper() { @@ -328,41 +296,10 @@ public class EntityPackets1_13 extends EntityRewriter { }); // Destroy Entities Packet - protocol.registerOutgoing(State.PLAY, 0x35, 0x32, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); + registerEntityDestroy(0x35, 0x32); // Entity Metadata packet - protocol.registerOutgoing(State.PLAY, 0x3F, 0x3C, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_13.METADATA_LIST, Types1_12.METADATA_LIST); // 1 - Metadata list - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - final List metaDataList = handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(Types1_12.METADATA_LIST, 0)) - ).getMetaDataList(); - wrapper.set(Types1_12.METADATA_LIST, 0, metaDataList); - } - }); - } - }); + registerMetadataRewriter(0x3F, 0x3C, Types1_13.METADATA_LIST, Types1_12.METADATA_LIST); } @Override diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13_2to1_14/packets/EntityPackets1_14.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13_2to1_14/packets/EntityPackets1_14.java index cebfd109..604d5103 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13_2to1_14/packets/EntityPackets1_14.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13_2to1_14/packets/EntityPackets1_14.java @@ -22,6 +22,7 @@ import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13_2; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.version.Types1_13; import us.myles.ViaVersion.api.type.types.version.Types1_13_2; import us.myles.ViaVersion.api.type.types.version.Types1_14; import us.myles.ViaVersion.packets.State; @@ -205,48 +206,13 @@ public class EntityPackets1_14 extends EntityRewriter { }); // Spawn Experience Orb - protocol.registerOutgoing(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity id + registerExtraTracker(0x01, Entity1_14Types.EntityType.XP_ORB); - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_14Types.EntityType.XP_ORB - ); - } - }); - } - }); + // Spawn Global Object + registerExtraTracker(0x02, Entity1_14Types.EntityType.LIGHTNING_BOLT); // Spawn painting - protocol.registerOutgoing(State.PLAY, 0x04, 0x04, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); - map(Type.UUID); - map(Type.VAR_INT); - map(Type.POSITION1_14, Type.POSITION); - map(Type.BYTE); - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_14Types.EntityType.PAINTING - ); - } - }); - } - }); + registerExtraTracker(0x04, Entity1_14Types.EntityType.PAINTING); // Spawn player packet protocol.registerOutgoing(State.PLAY, 0x05, 0x05, new PacketRemapper() { @@ -282,43 +248,10 @@ public class EntityPackets1_14 extends EntityRewriter { }); // Destroy entities - protocol.registerOutgoing(State.PLAY, 0x37, 0x35, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS + registerEntityDestroy(0x37, 0x35); - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); - - // Metadata packet - protocol.registerOutgoing(State.PLAY, 0x43, 0x3F, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_14.METADATA_LIST, Types1_13_2.METADATA_LIST); // 1 - Metadata list - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - int entityId = wrapper.get(Type.VAR_INT, 0); - - wrapper.set(Types1_13_2.METADATA_LIST, 0, - handleMeta( - wrapper.user(), - entityId, - new MetaStorage(wrapper.get(Types1_13_2.METADATA_LIST, 0)) - ).getMetaDataList() - ); - } - }); - } - }); + // Entity Metadata packet + registerMetadataRewriter(0x43, 0x3F, Types1_14.METADATA_LIST, Types1_13.METADATA_LIST); //join game protocol.registerOutgoing(State.PLAY, 0x25, 0x25, new PacketRemapper() { diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13to1_13_1/packets/EntityPackets1_13_1.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13to1_13_1/packets/EntityPackets1_13_1.java index 7ce98d79..b24cc74c 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13to1_13_1/packets/EntityPackets1_13_1.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_13to1_13_1/packets/EntityPackets1_13_1.java @@ -65,42 +65,10 @@ public class EntityPackets1_13_1 extends EntityRewriter { }); // Spawn Experience Orb - protocol.out(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_13Types.EntityType.XP_ORB - ); - } - }); - } - }); + registerExtraTracker(0x01, Entity1_13Types.EntityType.XP_ORB); // Spawn Global Entity - protocol.out(State.PLAY, 0x02, 0x02, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); - map(Type.BYTE); - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_13Types.EntityType.LIGHTNING_BOLT - ); - } - }); - } - }); + registerExtraTracker(0x02, Entity1_13Types.EntityType.LIGHTNING_BOLT); // Spawn Mob protocol.out(State.PLAY, 0x3, 0x3, new PacketRemapper() { @@ -203,23 +171,7 @@ public class EntityPackets1_13_1 extends EntityRewriter { }); //Spawn Painting - protocol.out(State.PLAY, 0x04, 0x04, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); - map(Type.UUID); - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_13Types.EntityType.PAINTING - ); - } - }); - } - }); + registerExtraTracker(0x04, Entity1_13Types.EntityType.PAINTING); // Join Game protocol.registerOutgoing(State.PLAY, 0x25, 0x25, new PacketRemapper() { @@ -272,45 +224,10 @@ public class EntityPackets1_13_1 extends EntityRewriter { }); // Destroy entities - protocol.out(State.PLAY, 0x35, 0x35, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS + registerEntityDestroy(0x35); - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); - - - // Metadata packet - protocol.out(State.PLAY, 0x3F, 0x3F, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_13.METADATA_LIST); // 1 - Metadata list - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - wrapper.set( - Types1_13.METADATA_LIST, - 0, - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(Types1_13.METADATA_LIST, 0)) - ).getMetaDataList() - ); - } - }); - } - }); + // Entity Metadata packet + registerMetadataRewriter(0x3F, 0x3F, Types1_13.METADATA_LIST); } @Override diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/MetadataRewriter.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/MetadataRewriter.java deleted file mode 100644 index 9a57018a..00000000 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/MetadataRewriter.java +++ /dev/null @@ -1,37 +0,0 @@ -package nl.matsv.viabackwards.protocol.protocol1_14to1_14_1; - -import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.api.entities.Entity1_14Types; -import us.myles.ViaVersion.api.minecraft.metadata.Metadata; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Marco Neuhaus on 15.05.2019 for the Project ViaBackwardsFoorcee. - */ -public class MetadataRewriter { - - public static void handleMetadata(int entityId, Entity1_14Types.EntityType type, List metadatas, UserConnection connection) { - if (type == null) return; - - for (Metadata metadata : new ArrayList<>(metadatas)) { - try { - if (type.is(Entity1_14Types.EntityType.VILLAGER) || type.is(Entity1_14Types.EntityType.WANDERING_TRADER)) { - if (metadata.getId() >= 16) { - metadata.setId(metadata.getId() - 1); - } - } - } catch (Exception e) { - metadatas.remove(metadata); - if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("An error occurred with entity metadata handler"); - Via.getPlatform().getLogger().warning("Metadata: " + metadata); - e.printStackTrace(); - } - } - } - } - -} diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java index 49eb734e..d4dcc43b 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java @@ -1,22 +1,24 @@ package nl.matsv.viabackwards.protocol.protocol1_14to1_14_1; import nl.matsv.viabackwards.api.BackwardsProtocol; +import nl.matsv.viabackwards.api.entities.storage.EntityTracker; import nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.packets.EntityPackets; -import nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.storage.EntityTracker; import us.myles.ViaVersion.api.data.UserConnection; -/** - * Created by Marco Neuhaus on 15.05.2019 for the Project ViaBackwardsFoorcee. - */ public class Protocol1_14To1_14_1 extends BackwardsProtocol { @Override protected void registerPackets() { - EntityPackets.register(this); + new EntityPackets().register(this); } @Override - public void init(UserConnection userConnection) { - userConnection.put(new EntityTracker(userConnection)); + public void init(UserConnection user) { + // Register EntityTracker if it doesn't exist yet. + if (!user.has(EntityTracker.class)) + user.put(new EntityTracker(user)); + + // Init protocol in EntityTracker + user.get(EntityTracker.class).initProtocol(this); } } diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/packets/EntityPackets.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/packets/EntityPackets.java index 7e56b95a..7afaeb07 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/packets/EntityPackets.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/packets/EntityPackets.java @@ -1,24 +1,44 @@ package nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.packets; -import com.google.common.base.Optional; -import nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.MetadataRewriter; -import nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.storage.EntityTracker; +import nl.matsv.viabackwards.api.entities.storage.MetaStorage; +import nl.matsv.viabackwards.api.rewriters.EntityRewriter; +import nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.Protocol1_14To1_14_1; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.entities.Entity1_14Types; -import us.myles.ViaVersion.api.entities.Entity1_14Types.EntityType; -import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_14; import us.myles.ViaVersion.packets.State; -/** - * Created by Marco Neuhaus on 15.05.2019 for the Project ViaBackwardsFoorcee. - */ -public class EntityPackets { +public class EntityPackets extends EntityRewriter { - public static void register(Protocol protocol) { + @Override + protected void registerPackets(Protocol1_14To1_14_1 protocol) { + registerExtraTracker(0x01, Entity1_14Types.EntityType.XP_ORB); + registerExtraTracker(0x02, Entity1_14Types.EntityType.LIGHTNING_BOLT); + registerExtraTracker(0x04, Entity1_14Types.EntityType.PAINTING); + registerExtraTracker(0x05, Entity1_14Types.EntityType.PLAYER); + registerExtraTracker(0x25, Entity1_14Types.EntityType.PLAYER, Type.INT); // Join game + registerEntityDestroy(0x37); + + // Spawn Object + protocol.registerOutgoing(State.PLAY, 0x00, 0x00, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.VAR_INT); // 0 - Entity id + map(Type.UUID); // 1 - UUID + map(Type.VAR_INT); // 2 - Type + + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + int type = wrapper.get(Type.VAR_INT, 1); + addTrackedEntity(wrapper.user(), wrapper.get(Type.VAR_INT, 0), Entity1_14Types.getTypeFromId(type)); + } + }); + } + }); // Spawn Mob protocol.registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() { @@ -44,40 +64,11 @@ public class EntityPackets { int entityId = wrapper.get(Type.VAR_INT, 0); int type = wrapper.get(Type.VAR_INT, 1); - Entity1_14Types.EntityType entType = Entity1_14Types.getTypeFromId(type); - // Register Type ID - wrapper.user().get(EntityTracker.class).addEntity(entityId, entType); + addTrackedEntity(wrapper.user(), entityId, Entity1_14Types.getTypeFromId(type)); - MetadataRewriter.handleMetadata(entityId, entType, wrapper.get(Types1_14.METADATA_LIST, 0), wrapper.user()); - } - }); - } - }); - - // Spawn Player - protocol.registerOutgoing(State.PLAY, 0x05, 0x05, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Type.UUID); // 1 - Player UUID - map(Type.DOUBLE); // 2 - X - map(Type.DOUBLE); // 3 - Y - map(Type.DOUBLE); // 4 - Z - map(Type.BYTE); // 5 - Yaw - map(Type.BYTE); // 6 - Pitch - map(Types1_14.METADATA_LIST); // 7 - Metadata - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - int entityId = wrapper.get(Type.VAR_INT, 0); - - Entity1_14Types.EntityType entType = Entity1_14Types.EntityType.PLAYER; - - // Register Type ID - wrapper.user().get(EntityTracker.class).addEntity(entityId, entType); - MetadataRewriter.handleMetadata(entityId, entType, wrapper.get(Types1_14.METADATA_LIST, 0), wrapper.user()); + MetaStorage storage = new MetaStorage(wrapper.get(Types1_14.METADATA_LIST, 0)); + handleMeta(wrapper.user(), entityId, storage); } }); } @@ -89,18 +80,22 @@ public class EntityPackets { public void registerMap() { map(Type.VAR_INT); // 0 - Entity ID map(Types1_14.METADATA_LIST); // 1 - Metadata list - handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { int entityId = wrapper.get(Type.VAR_INT, 0); - - Optional type = wrapper.user().get(EntityTracker.class).get(entityId); - MetadataRewriter.handleMetadata(entityId, type.orNull(), wrapper.get(Types1_14.METADATA_LIST, 0), wrapper.user()); + wrapper.set(Types1_14.METADATA_LIST, 0, + handleMeta(wrapper.user(), entityId, new MetaStorage(wrapper.get(Types1_14.METADATA_LIST, 0))).getMetaDataList()); } }); } }); } + @Override + protected void registerRewrites() { + registerMetaHandler().filter(Entity1_14Types.EntityType.VILLAGER, 15).removed(); + registerMetaHandler().filter(Entity1_14Types.EntityType.VILLAGER, 16).handleIndexChange(15); + registerMetaHandler().filter(Entity1_14Types.EntityType.WANDERING_TRADER, 15).removed(); + } } diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/storage/EntityTracker.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/storage/EntityTracker.java deleted file mode 100644 index 40acb3d5..00000000 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_14to1_14_1/storage/EntityTracker.java +++ /dev/null @@ -1,49 +0,0 @@ -package nl.matsv.viabackwards.protocol.protocol1_14to1_14_1.storage; - -import com.google.common.base.Optional; -import lombok.Getter; -import lombok.Setter; -import us.myles.ViaVersion.api.data.ExternalJoinGameListener; -import us.myles.ViaVersion.api.data.StoredObject; -import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.api.entities.Entity1_14Types; -import us.myles.ViaVersion.api.entities.Entity1_14Types.EntityType; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Created by Marco Neuhaus on 15.05.2019 for the Project ViaBackwardsFoorcee. - */ -public class EntityTracker extends StoredObject implements ExternalJoinGameListener { - private final Map clientEntityTypes = new ConcurrentHashMap<>(); - @Getter - @Setter - private int clientEntityId; - - public EntityTracker(UserConnection user) { - super(user); - } - - public void removeEntity(int entityId) { - clientEntityTypes.remove(entityId); - } - - public void addEntity(int entityId, Entity1_14Types.EntityType type) { - clientEntityTypes.put(entityId, type); - } - - public boolean has(int entityId) { - return clientEntityTypes.containsKey(entityId); - } - - public Optional get(int id) { - return Optional.fromNullable(clientEntityTypes.get(id)); - } - - @Override - public void onExternalJoinGame(int playerEntityId) { - clientEntityId = playerEntityId; - clientEntityTypes.put(playerEntityId, Entity1_14Types.EntityType.PLAYER); - } -} \ No newline at end of file diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java index 6259bddb..723693f1 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java @@ -110,45 +110,10 @@ public class EntityPackets1_10 extends EntityRewriter { }); // Spawn Experience Orb - protocol.registerOutgoing(State.PLAY, 0x01, 0x01, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity id - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_10Types.ObjectType.THROWN_EXP_BOTTLE.getType() - ); - } - }); - } - }); + registerExtraTracker(0x01, Entity1_10Types.EntityType.EXPERIENCE_ORB); // Spawn Global Entity - protocol.registerOutgoing(State.PLAY, 0x02, 0x02, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Type.BYTE); // 1 - Type - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_10Types.EntityType.WEATHER // Always thunder according to wiki.vg - ); - } - }); - } - }); + registerExtraTracker(0x02, Entity1_10Types.EntityType.WEATHER); // Spawn Mob protocol.registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() { @@ -215,24 +180,7 @@ public class EntityPackets1_10 extends EntityRewriter { }); // Spawn Painting - protocol.registerOutgoing(State.PLAY, 0x04, 0x04, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - - // Track entity - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - addTrackedEntity( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - Entity1_10Types.EntityType.PAINTING - ); - } - }); - } - }); + registerExtraTracker(0x04, Entity1_10Types.EntityType.PAINTING); // Join game protocol.registerOutgoing(State.PLAY, 0x23, 0x23, new PacketRemapper() { @@ -324,44 +272,10 @@ public class EntityPackets1_10 extends EntityRewriter { }); // Destroy entities - protocol.registerOutgoing(State.PLAY, 0x30, 0x30, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY); // 0 - Entity IDS - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0)) - getEntityTracker(wrapper.user()).removeEntity(entity); - } - }); - } - }); + registerEntityDestroy(0x30); // Metadata packet - protocol.registerOutgoing(State.PLAY, 0x39, 0x39, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - map(Types1_9.METADATA_LIST); // 1 - Metadata list - - handler(new PacketHandler() { - @Override - public void handle(PacketWrapper wrapper) throws Exception { - wrapper.set( - Types1_9.METADATA_LIST, - 0, - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(Types1_9.METADATA_LIST, 0)) - ).getMetaDataList() - ); - } - }); - } - }); + registerMetadataRewriter(0x39, 0x39, Types1_9.METADATA_LIST); } @Override