From 5991ac5633c03c25cd4ceca61a3589dab1c8be9e Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Tue, 9 Jan 2024 20:43:43 +0100 Subject: [PATCH] Update old metadata handlers, some cleanup --- .../Protocol1_11To1_10.java | 3 +- .../metadata/MetadataRewriter1_11To1_10.java | 160 ++++++------- .../Protocol1_12To1_11_1.java | 3 +- .../MetadataRewriter1_12To1_11_1.java | 24 +- .../Protocol1_13_1To1_13.java | 3 +- .../MetadataRewriter1_13_1To1_13.java | 35 +-- .../Protocol1_13To1_12_2.java | 3 +- .../MetadataRewriter1_13To1_12_2.java | 105 +++----- .../Protocol1_14_1To1_14.java | 2 +- .../MetadataRewriter1_14_1To1_14.java | 16 +- .../Protocol1_14To1_13_2.java | 3 +- .../MetadataRewriter1_14To1_13_2.java | 225 +++++++++--------- .../packets/EntityPackets.java | 17 +- .../Protocol1_15To1_14_4.java | 3 +- .../MetadataRewriter1_15To1_14_4.java | 50 +--- .../Protocol1_16_2To1_16_1.java | 3 +- .../MetadataRewriter1_16_2To1_16_1.java | 44 +--- .../Protocol1_16To1_15_2.java | 3 +- .../MetadataRewriter1_16To1_15_2.java | 53 +---- .../packets/EntityPackets.java | 19 +- .../packets/EntityPackets.java | 22 +- .../packets/EntityPackets.java | 12 +- .../packets/EntityPackets.java | 20 +- .../packets/EntityPackets.java | 41 ++-- .../rewriter/EntityPacketRewriter1_20_2.java | 6 +- .../rewriter/EntityPacketRewriter1_20_3.java | 32 +-- .../packets/EntityPackets.java | 15 +- .../protocol1_9to1_8/Protocol1_9To1_8.java | 2 +- .../metadata/MetadataRewriter1_9To1_8.java | 23 +- .../viaversion/rewriter/EntityRewriter.java | 51 +--- .../viaversion/rewriter/meta/MetaFilter.java | 76 +++++- .../rewriter/EntityPacketRewriter1_99.java | 8 +- 32 files changed, 469 insertions(+), 613 deletions(-) diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java index 5908a1b8d..cce340cd3 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java @@ -57,8 +57,7 @@ public class Protocol1_11To1_10 extends AbstractProtocol metadatas, UserConnection connection) { - if (metadata.getValue() instanceof DataItem) { - // Apply rewrite - EntityIdRewriter.toClientItem((Item) metadata.getValue()); - } + protected void registerRewrites() { + filter().handler((event, meta) -> { + if (meta.getValue() instanceof DataItem) { + // Apply rewrite + EntityIdRewriter.toClientItem(meta.value()); + } + }); - if (type == null) return; - if (type.is(EntityType.ELDER_GUARDIAN) || type.is(EntityType.GUARDIAN)) { // Guardians - int oldid = metadata.id(); - if (oldid == 12) { - boolean val = (((byte) metadata.getValue()) & 0x02) == 0x02; - metadata.setTypeAndValue(MetaType1_9.Boolean, val); - } - } + filter().type(EntityType.GUARDIAN).index(12).handler((event, meta) -> { + boolean value = (((byte) meta.getValue()) & 0x02) == 0x02; + meta.setTypeAndValue(MetaType1_9.Boolean, value); + }); - if (type.isOrHasParent(EntityType.ABSTRACT_SKELETON)) { // Skeletons - int oldid = metadata.id(); - if (oldid == 12) { - metadatas.remove(metadata); - } - if (oldid == 13) { - metadata.setId(12); - } - } + filter().type(EntityType.ABSTRACT_SKELETON).removeIndex(12); - if (type.isOrHasParent(EntityType.ZOMBIE)) { // Zombie | Zombie Villager | Husk - if ((type == EntityType.ZOMBIE || type == EntityType.HUSK) && metadata.id() == 14) { - metadatas.remove(metadata); - } else { - if (metadata.id() == 15) { - metadata.setId(14); - } else { - if (metadata.id() == 14) { - metadata.setId(15); - } - } + filter().type(EntityType.ZOMBIE).handler((event, meta) -> { + if ((event.entityType() == EntityType.ZOMBIE || event.entityType() == EntityType.HUSK) && meta.id() == 14) { + event.cancel(); + } else if (meta.id() == 15) { + meta.setId(14); + } else if (meta.id() == 14) { + meta.setId(15); } - } + }); - if (type.isOrHasParent(EntityType.ABSTRACT_HORSE)) { // Horses - // Remap metadata id - int oldid = metadata.id(); - if (oldid == 14) { // Type - metadatas.remove(metadata); + filter().type(EntityType.ABSTRACT_HORSE).handler((event, metadata) -> { + final com.viaversion.viaversion.api.minecraft.entities.EntityType type = event.entityType(); + int id = metadata.id(); + if (id == 14) { // Type + event.cancel(); + return; } - if (oldid == 16) { // Owner + + if (id == 16) { // Owner metadata.setId(14); - } - if (oldid == 17) { // Armor + } else if (id == 17) { // Armor metadata.setId(16); } // Process per type - if (type.is(EntityType.HORSE)) { - // Normal Horse - } else { - // Remove 15, 16 - if (metadata.id() == 15 || metadata.id() == 16) { - metadatas.remove(metadata); + if (!type.is(EntityType.HORSE) && metadata.id() == 15 || metadata.id() == 16) { + event.cancel(); + return; + } + + if ((type == EntityType.DONKEY || type == EntityType.MULE) && metadata.id() == 13) { + if ((((byte) metadata.getValue()) & 0x08) == 0x08) { + event.createExtraMeta(new Metadata(15, MetaType1_9.Boolean, true)); + } else { + event.createExtraMeta(new Metadata(15, MetaType1_9.Boolean, false)); } } - if (type == EntityType.DONKEY || type == EntityType.MULE) { - // Chested Horse - if (metadata.id() == 13) { - if ((((byte) metadata.getValue()) & 0x08) == 0x08) { - metadatas.add(new Metadata(15, MetaType1_9.Boolean, true)); - } else { - metadatas.add(new Metadata(15, MetaType1_9.Boolean, false)); + }); + + filter().type(EntityType.ARMOR_STAND).index(0).handler((event, meta) -> { + if (!Via.getConfig().isHologramPatch()) { + return; + } + + Metadata flags = event.metaAtIndex(11); + Metadata customName = event.metaAtIndex(2); + Metadata customNameVisible = event.metaAtIndex(3); + if (flags == null || customName == null || customNameVisible == null) { + return; + } + + byte data = meta.value(); + // Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true + if ((data & 0x20) == 0x20 && ((byte) flags.getValue() & 0x01) == 0x01 + && !((String) customName.getValue()).isEmpty() && (boolean) customNameVisible.getValue()) { + EntityTracker1_11 tracker = tracker(event.user()); + int entityId = event.entityId(); + if (tracker.addHologram(entityId)) { + try { + // Send movement + PacketWrapper wrapper = PacketWrapper.create(ClientboundPackets1_9_3.ENTITY_POSITION, null, event.user()); + wrapper.write(Type.VAR_INT, entityId); + wrapper.write(Type.SHORT, (short) 0); + wrapper.write(Type.SHORT, (short) (128D * (-Via.getConfig().getHologramYOffset() * 32D))); + wrapper.write(Type.SHORT, (short) 0); + wrapper.write(Type.BOOLEAN, true); + + wrapper.send(Protocol1_11To1_10.class); + } catch (Exception e) { + e.printStackTrace(); } } } - } - - if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) { - Metadata flags = metaByIndex(11, metadatas); - Metadata customName = metaByIndex(2, metadatas); - Metadata customNameVisible = metaByIndex(3, metadatas); - if (metadata.id() == 0 && flags != null && customName != null && customNameVisible != null) { - byte data = (byte) metadata.getValue(); - // Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true - if ((data & 0x20) == 0x20 && ((byte) flags.getValue() & 0x01) == 0x01 - && !((String) customName.getValue()).isEmpty() && (boolean) customNameVisible.getValue()) { - EntityTracker1_11 tracker = tracker(connection); - if (tracker.addHologram(entityId)) { - try { - // Send movement - PacketWrapper wrapper = PacketWrapper.create(ClientboundPackets1_9_3.ENTITY_POSITION, null, connection); - wrapper.write(Type.VAR_INT, entityId); - wrapper.write(Type.SHORT, (short) 0); - wrapper.write(Type.SHORT, (short) (128D * (-Via.getConfig().getHologramYOffset() * 32D))); - wrapper.write(Type.SHORT, (short) 0); - wrapper.write(Type.BOOLEAN, true); - - wrapper.send(Protocol1_11To1_10.class); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - } + }); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java index d261de99f..7d39ab96b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java @@ -58,8 +58,7 @@ public class Protocol1_12To1_11_1 extends AbstractProtocol { @@ -34,19 +31,14 @@ public class MetadataRewriter1_12To1_11_1 extends EntityRewriter metadatas, UserConnection connection) { - if (metadata.getValue() instanceof Item) { - // Apply rewrite - metadata.setValue(protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue())); - } - - if (type == null) return; - // Evocation Illager aggressive property became 13 - if (type == EntityTypes1_12.EntityType.EVOCATION_ILLAGER) { - if (metadata.id() == 12) { - metadata.setId(13); + protected void registerRewrites() { + filter().handler((event, meta) -> { + if (meta.getValue() instanceof Item) { + meta.setValue(protocol.getItemRewriter().handleItemToClient(meta.value())); } - } + }); + + filter().type(EntityTypes1_12.EntityType.EVOCATION_ILLAGER).index(12).toIndex(13); // Aggressive } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java index bfbfc4faa..24681b400 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java @@ -51,8 +51,7 @@ public class Protocol1_13_1To1_13 extends AbstractProtocol { @@ -36,27 +31,13 @@ public class MetadataRewriter1_13_1To1_13 extends EntityRewriter metadatas, UserConnection connection) { - // 1.13 changed item to flat item (no data) - if (metadata.metaType() == Types1_13.META_TYPES.itemType) { - protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue()); - } else if (metadata.metaType() == Types1_13.META_TYPES.blockStateType) { - // Convert to new block id - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (metadata.metaType() == Types1_13.META_TYPES.particleType) { - rewriteParticle((Particle) metadata.getValue()); - } - - if (type == null) return; - - if (type.isOrHasParent(EntityTypes1_13.EntityType.MINECART_ABSTRACT) && metadata.id() == 9) { - // New block format - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (type.isOrHasParent(EntityTypes1_13.EntityType.ABSTRACT_ARROW) && metadata.id() >= 7) { - metadata.setId(metadata.id() + 1); // New shooter UUID - } + protected void registerRewrites() { + registerMetaTypeHandler(Types1_13.META_TYPES.itemType, Types1_13.META_TYPES.blockStateType, null, Types1_13.META_TYPES.particleType); + filter().type(EntityTypes1_13.EntityType.MINECART_ABSTRACT).index(9).handler((event, meta) -> { + int data = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + }); + filter().type(EntityTypes1_13.EntityType.ABSTRACT_ARROW).addIndex(7); // Shooter UUID } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index 93d4f6702..1d2664a2c 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -162,8 +162,7 @@ public class Protocol1_13To1_12_2 extends AbstractProtocol { @@ -40,87 +37,61 @@ public class MetadataRewriter1_13To1_12_2 extends EntityRewriter metadatas, UserConnection connection) throws Exception { - // Handle new MetaTypes - if (metadata.metaType().typeId() > 4) { - metadata.setMetaType(Types1_13.META_TYPES.byId(metadata.metaType().typeId() + 1)); - } else { - metadata.setMetaType(Types1_13.META_TYPES.byId(metadata.metaType().typeId())); - } + protected void registerRewrites() { + filter().mapMetaType(typeId -> Types1_13.META_TYPES.byId(typeId > 4 ? typeId + 1 : typeId)); + filter().metaType(Types1_13.META_TYPES.itemType).handler(((event, meta) -> protocol.getItemRewriter().handleItemToClient(meta.value()))); + filter().metaType(Types1_13.META_TYPES.blockStateType).handler(((event, meta) -> meta.setValue(WorldPackets.toNewId(meta.value())))); - // Handle String -> Chat DisplayName - if (metadata.id() == 2) { - if (metadata.getValue() != null && !((String) metadata.getValue()).isEmpty()) { - metadata.setTypeAndValue(Types1_13.META_TYPES.optionalComponentType, ComponentUtil.legacyToJson((String) metadata.getValue())); + // Previously unused, now swimming + filter().index(0).handler((event, meta) -> meta.setValue((byte) ((byte) meta.getValue() & ~0x10))); + + filter().index(2).handler(((event, meta) -> { + if (meta.getValue() != null && !((String) meta.getValue()).isEmpty()) { + meta.setTypeAndValue(Types1_13.META_TYPES.optionalComponentType, ComponentUtil.legacyToJson((String) meta.getValue())); } else { - metadata.setTypeAndValue(Types1_13.META_TYPES.optionalComponentType, null); + meta.setTypeAndValue(Types1_13.META_TYPES.optionalComponentType, null); } - } + })); - // Remap held block to match new format for remapping to flat block - if (type == EntityTypes1_13.EntityType.ENDERMAN && metadata.id() == 12) { - int stateId = (int) metadata.getValue(); + filter().type(EntityTypes1_13.EntityType.ENDERMAN).index(12).handler((event, meta) -> { + // Remap held block to match new format for remapping to flat block + int stateId = meta.value(); int id = stateId & 4095; int data = stateId >> 12 & 15; - metadata.setValue((id << 4) | (data & 0xF)); - } + meta.setValue((id << 4) | (data & 0xF)); + }); - // 1.13 changed item to flat item (no data) - if (metadata.metaType() == Types1_13.META_TYPES.itemType) { - metadata.setMetaType(Types1_13.META_TYPES.itemType); - protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue()); - } else if (metadata.metaType() == Types1_13.META_TYPES.blockStateType) { - // Convert to new block id - metadata.setValue(WorldPackets.toNewId((int) metadata.getValue())); - } + filter().type(EntityTypes1_13.EntityType.WOLF).index(17).handler((event, meta) -> { + // Handle new colors + meta.setValue(15 - (int) meta.getValue()); + }); - // Skip type related changes when the type is null - if (type == null) return; + filter().type(EntityTypes1_13.EntityType.ZOMBIE).addIndex(15); // Shaking - // Handle new colors - if (type == EntityTypes1_13.EntityType.WOLF && metadata.id() == 17) { - metadata.setValue(15 - (int) metadata.getValue()); - } - - // Handle new zombie meta (INDEX 15 - Boolean - Zombie is shaking while enabled) - if (type.isOrHasParent(EntityTypes1_13.EntityType.ZOMBIE)) { - if (metadata.id() > 14) - metadata.setId(metadata.id() + 1); - } - - // Handle Minecart inner block - if (type.isOrHasParent(EntityTypes1_13.EntityType.MINECART_ABSTRACT) && metadata.id() == 9) { - // New block format - int oldId = (int) metadata.getValue(); + filter().type(EntityTypes1_13.EntityType.MINECART_ABSTRACT).index(9).handler((event, meta) -> { + int oldId = meta.value(); int combined = (((oldId & 4095) << 4) | (oldId >> 12 & 15)); int newId = WorldPackets.toNewId(combined); - metadata.setValue(newId); - } + meta.setValue(newId); + }); - // Handle other changes - if (type == EntityTypes1_13.EntityType.AREA_EFFECT_CLOUD) { - if (metadata.id() == 9) { - int particleId = (int) metadata.getValue(); - Metadata parameter1Meta = metaByIndex(10, metadatas); - Metadata parameter2Meta = metaByIndex(11, metadatas); - int parameter1 = parameter1Meta != null ? (int) parameter1Meta.getValue() : 0; - int parameter2 = parameter2Meta != null ? (int) parameter2Meta.getValue() : 0; + filter().type(EntityTypes1_13.EntityType.AREA_EFFECT_CLOUD).handler((event, meta) -> { + if (meta.id() == 9) { + int particleId = meta.value(); + Metadata parameter1Meta = event.metaAtIndex(10); + Metadata parameter2Meta = event.metaAtIndex(11); + int parameter1 = parameter1Meta != null ? parameter1Meta.value() : 0; + int parameter2 = parameter2Meta != null ? parameter2Meta.value() : 0; Particle particle = ParticleRewriter.rewriteParticle(particleId, new Integer[]{parameter1, parameter2}); if (particle != null && particle.getId() != -1) { - metadatas.add(new Metadata(9, Types1_13.META_TYPES.particleType, particle)); + event.createExtraMeta(new Metadata(9, Types1_13.META_TYPES.particleType, particle)); } } - - if (metadata.id() >= 9) - metadatas.remove(metadata); // Remove - } - - if (metadata.id() == 0) { - metadata.setValue((byte) ((byte) metadata.getValue() & ~0x10)); // Previously unused, now swimming - } - - // TODO: Boat has changed + if (meta.id() >= 9) { + event.cancel(); + } + }); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14_1to1_14/Protocol1_14_1To1_14.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14_1to1_14/Protocol1_14_1To1_14.java index 58d61d652..5b4645853 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14_1to1_14/Protocol1_14_1To1_14.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14_1to1_14/Protocol1_14_1To1_14.java @@ -36,7 +36,7 @@ public class Protocol1_14_1To1_14 extends AbstractProtocol { @@ -33,14 +30,9 @@ public class MetadataRewriter1_14_1To1_14 extends EntityRewriter metadatas, UserConnection connection) { - if (type == null) return; - - if (type == EntityTypes1_14.VILLAGER || type == EntityTypes1_14.WANDERING_TRADER) { - if (metadata.id() >= 15) { - metadata.setId(metadata.id() + 1); - } - } + protected void registerRewrites() { + filter().type(EntityTypes1_14.VILLAGER).addIndex(15); + filter().type(EntityTypes1_14.WANDERING_TRADER).addIndex(15); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java index efe9b7298..6dec33486 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java @@ -52,8 +52,7 @@ public class Protocol1_14To1_13_2 extends AbstractProtocol { @@ -46,141 +43,133 @@ public class MetadataRewriter1_14To1_13_2 extends EntityRewriter metadatas, UserConnection connection) throws Exception { - metadata.setMetaType(Types1_14.META_TYPES.byId(metadata.metaType().typeId())); + protected void registerRewrites() { + filter().mapMetaType(Types1_14.META_TYPES::byId); + registerMetaTypeHandler(Types1_14.META_TYPES.itemType, Types1_14.META_TYPES.blockStateType, null, Types1_14.META_TYPES.particleType); - EntityTracker1_14 tracker = tracker(connection); + filter().type(EntityTypes1_14.ENTITY).addIndex(6); + filter().type(EntityTypes1_14.LIVINGENTITY).addIndex(12); - if (metadata.metaType() == Types1_14.META_TYPES.itemType) { - protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue()); - } else if (metadata.metaType() == Types1_14.META_TYPES.blockStateType) { - // Convert to new block id - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (metadata.metaType() == Types1_14.META_TYPES.particleType) { - rewriteParticle((Particle) metadata.getValue()); - } - - if (type == null) return; - - //Metadata 6 added to abstract_entity - if (metadata.id() > 5) { - metadata.setId(metadata.id() + 1); - } - if (metadata.id() == 8 && type.isOrHasParent(EntityTypes1_14.LIVINGENTITY)) { - final float v = ((Number) metadata.getValue()).floatValue(); - if (Float.isNaN(v) && Via.getConfig().is1_14HealthNaNFix()) { - metadata.setValue(1F); + filter().type(EntityTypes1_14.LIVINGENTITY).index(8).handler((event, meta) -> { + float value = ((Number) meta.getValue()).floatValue(); + if (Float.isNaN(value) && Via.getConfig().is1_14HealthNaNFix()) { + meta.setValue(1F); } - } + }); - //Metadata 12 added to living_entity - if (metadata.id() > 11 && type.isOrHasParent(EntityTypes1_14.LIVINGENTITY)) { - metadata.setId(metadata.id() + 1); - } + filter().type(EntityTypes1_14.ABSTRACT_INSENTIENT).index(13).handler((event, meta) -> { + EntityTracker1_14 tracker = tracker(event.user()); + int entityId = event.entityId(); + tracker.setInsentientData(entityId, (byte) ((((Number) meta.getValue()).byteValue() & ~0x4) + | (tracker.getInsentientData(entityId) & 0x4))); // New attacking metadata + meta.setValue(tracker.getInsentientData(entityId)); + }); - if (type.isOrHasParent(EntityTypes1_14.ABSTRACT_INSENTIENT)) { - if (metadata.id() == 13) { - tracker.setInsentientData(entityId, (byte) ((((Number) metadata.getValue()).byteValue() & ~0x4) - | (tracker.getInsentientData(entityId) & 0x4))); // New attacking metadata - metadata.setValue(tracker.getInsentientData(entityId)); - } - } - - if (type.isOrHasParent(EntityTypes1_14.PLAYER)) { + filter().type(EntityTypes1_14.PLAYER).handler((event, meta) -> { + EntityTracker1_14 tracker = tracker(event.user()); + int entityId = event.entityId(); if (entityId != tracker.clientEntityId()) { - if (metadata.id() == 0) { - byte flags = ((Number) metadata.getValue()).byteValue(); + if (meta.id() == 0) { + byte flags = ((Number) meta.getValue()).byteValue(); // Mojang overrides the client-side pose updater, see OtherPlayerEntity#updateSize tracker.setEntityFlags(entityId, flags); - } else if (metadata.id() == 7) { - tracker.setRiptide(entityId, (((Number) metadata.getValue()).byteValue() & 0x4) != 0); + } else if (meta.id() == 7) { + tracker.setRiptide(entityId, (((Number) meta.getValue()).byteValue() & 0x4) != 0); } - if (metadata.id() == 0 || metadata.id() == 7) { - metadatas.add(new Metadata(6, Types1_14.META_TYPES.poseType, recalculatePlayerPose(entityId, tracker))); + if (meta.id() == 0 || meta.id() == 7) { + event.createExtraMeta(new Metadata(6, Types1_14.META_TYPES.poseType, recalculatePlayerPose(entityId, tracker))); } } - } else if (type.isOrHasParent(EntityTypes1_14.ZOMBIE)) { - if (metadata.id() == 16) { + }); + + filter().type(EntityTypes1_14.ZOMBIE).handler((event, meta) -> { + if (meta.id() == 16) { + EntityTracker1_14 tracker = tracker(event.user()); + int entityId = event.entityId(); tracker.setInsentientData(entityId, (byte) ((tracker.getInsentientData(entityId) & ~0x4) - | ((boolean) metadata.getValue() ? 0x4 : 0))); // New attacking - metadatas.remove(metadata); // "Are hands held up" - metadatas.add(new Metadata(13, Types1_14.META_TYPES.byteType, tracker.getInsentientData(entityId))); - } else if (metadata.id() > 16) { - metadata.setId(metadata.id() - 1); + | ((boolean) meta.getValue() ? 0x4 : 0))); // New attacking + event.createExtraMeta(new Metadata(13, Types1_14.META_TYPES.byteType, tracker.getInsentientData(entityId))); + event.cancel(); // "Are hands held up" + } else if (meta.id() > 16) { + meta.setId(meta.id() - 1); } - } + }); - if (type.isOrHasParent(EntityTypes1_14.MINECART_ABSTRACT)) { - if (metadata.id() == 10) { - // New block format - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + filter().type(EntityTypes1_14.MINECART_ABSTRACT).index(10).handler((event, meta) -> { + int data = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + }); + + filter().type(EntityTypes1_14.HORSE).index(18).handler((event, meta) -> { + event.cancel(); + + int armorType = meta.value(); + Item armorItem = null; + if (armorType == 1) { //iron armor + armorItem = new DataItem(protocol.getMappingData().getNewItemId(727), (byte) 1, (short) 0, null); + } else if (armorType == 2) { //gold armor + armorItem = new DataItem(protocol.getMappingData().getNewItemId(728), (byte) 1, (short) 0, null); + } else if (armorType == 3) { //diamond armor + armorItem = new DataItem(protocol.getMappingData().getNewItemId(729), (byte) 1, (short) 0, null); } - } else if (type.is(EntityTypes1_14.HORSE)) { - if (metadata.id() == 18) { - metadatas.remove(metadata); - int armorType = (int) metadata.getValue(); - Item armorItem = null; - if (armorType == 1) { //iron armor - armorItem = new DataItem(protocol.getMappingData().getNewItemId(727), (byte) 1, (short) 0, null); - } else if (armorType == 2) { //gold armor - armorItem = new DataItem(protocol.getMappingData().getNewItemId(728), (byte) 1, (short) 0, null); - } else if (armorType == 3) { //diamond armor - armorItem = new DataItem(protocol.getMappingData().getNewItemId(729), (byte) 1, (short) 0, null); - } - - PacketWrapper equipmentPacket = PacketWrapper.create(ClientboundPackets1_14.ENTITY_EQUIPMENT, null, connection); - equipmentPacket.write(Type.VAR_INT, entityId); - equipmentPacket.write(Type.VAR_INT, 4); - equipmentPacket.write(Type.ITEM1_13_2, armorItem); + PacketWrapper equipmentPacket = PacketWrapper.create(ClientboundPackets1_14.ENTITY_EQUIPMENT, null, event.user()); + equipmentPacket.write(Type.VAR_INT, event.entityId()); + equipmentPacket.write(Type.VAR_INT, 4); + equipmentPacket.write(Type.ITEM1_13_2, armorItem); + try { equipmentPacket.scheduleSend(Protocol1_14To1_13_2.class); + } catch (final Exception e) { + throw new RuntimeException(e); } - } else if (type.is(EntityTypes1_14.VILLAGER)) { - if (metadata.id() == 15) { - // plains - metadata.setTypeAndValue(Types1_14.META_TYPES.villagerDatatType, new VillagerData(2, getNewProfessionId((int) metadata.getValue()), 0)); + }); + + filter().type(EntityTypes1_14.VILLAGER).index(15).handler((event, meta) -> { + meta.setTypeAndValue(Types1_14.META_TYPES.villagerDatatType, new VillagerData(2, getNewProfessionId(meta.value()), 0)); + }); + + filter().type(EntityTypes1_14.ZOMBIE_VILLAGER).index(18).handler((event, meta) -> { + meta.setTypeAndValue(Types1_14.META_TYPES.villagerDatatType, new VillagerData(2, getNewProfessionId(meta.value()), 0)); + }); + + filter().type(EntityTypes1_14.ABSTRACT_ARROW).addIndex(9); // Piercing level added + + filter().type(EntityTypes1_14.FIREWORK_ROCKET).index(8).handler((event, meta) -> { + }); + + filter().type(EntityTypes1_14.HORSE).index(18).handler((event, meta) -> { + meta.setMetaType(Types1_14.META_TYPES.optionalVarIntType); + if (meta.getValue().equals(0)) { + meta.setValue(null); // https://bugs.mojang.com/browse/MC-111480 } - } else if (type.is(EntityTypes1_14.ZOMBIE_VILLAGER)) { - if (metadata.id() == 18) { - // plains - metadata.setTypeAndValue(Types1_14.META_TYPES.villagerDatatType, new VillagerData(2, getNewProfessionId((int) metadata.getValue()), 0)); - } - } else if (type.isOrHasParent(EntityTypes1_14.ABSTRACT_ARROW)) { - if (metadata.id() >= 9) { // New piercing - metadata.setId(metadata.id() + 1); - } - } else if (type.is(EntityTypes1_14.FIREWORK_ROCKET)) { - if (metadata.id() == 8) { - metadata.setMetaType(Types1_14.META_TYPES.optionalVarIntType); - if (metadata.getValue().equals(0)) { - metadata.setValue(null); // https://bugs.mojang.com/browse/MC-111480 + }); + + filter().type(EntityTypes1_14.ABSTRACT_SKELETON).index(14).handler((event, meta) -> { + EntityTracker1_14 tracker = tracker(event.user()); + int entityId = event.entityId(); + tracker.setInsentientData(entityId, (byte) ((tracker.getInsentientData(entityId) & ~0x4) + | ((boolean) meta.getValue() ? 0x4 : 0))); // New attacking + event.createExtraMeta(new Metadata(13, Types1_14.META_TYPES.byteType, tracker.getInsentientData(entityId))); + event.cancel(); // "Is swinging arms" + }); + + filter().type(EntityTypes1_14.ABSTRACT_ILLAGER_BASE).index(14).handler((event, meta) -> { + EntityTracker1_14 tracker = tracker(event.user()); + int entityId = event.entityId(); + tracker.setInsentientData(entityId, (byte) ((tracker.getInsentientData(entityId) & ~0x4) + | (((Number) meta.getValue()).byteValue() != 0 ? 0x4 : 0))); // New attacking + event.createExtraMeta(new Metadata(13, Types1_14.META_TYPES.byteType, tracker.getInsentientData(entityId))); + event.cancel(); // "Has target (aggressive state)" + }); + + filter().handler((event, meta) -> { + EntityType type = event.entityType(); + if (type.is(EntityTypes1_14.WITCH) || type.is(EntityTypes1_14.RAVAGER) || type.isOrHasParent(EntityTypes1_14.ABSTRACT_ILLAGER_BASE)) { + if (meta.id() >= 14) { // 19w13 added a new boolean (raid participant - is celebrating) with id 14 + meta.setId(meta.id() + 1); } } - } else if (type.isOrHasParent(EntityTypes1_14.ABSTRACT_SKELETON)) { - if (metadata.id() == 14) { - tracker.setInsentientData(entityId, (byte) ((tracker.getInsentientData(entityId) & ~0x4) - | ((boolean) metadata.getValue() ? 0x4 : 0))); // New attacking - metadatas.remove(metadata); // "Is swinging arms" - metadatas.add(new Metadata(13, Types1_14.META_TYPES.byteType, tracker.getInsentientData(entityId))); - } - } - - if (type.isOrHasParent(EntityTypes1_14.ABSTRACT_ILLAGER_BASE)) { - if (metadata.id() == 14) { - tracker.setInsentientData(entityId, (byte) ((tracker.getInsentientData(entityId) & ~0x4) - | (((Number) metadata.getValue()).byteValue() != 0 ? 0x4 : 0))); // New attacking - metadatas.remove(metadata); // "Has target (aggressive state)" - metadatas.add(new Metadata(13, Types1_14.META_TYPES.byteType, tracker.getInsentientData(entityId))); - } - } - - if (type.is(EntityTypes1_14.WITCH) || type.is(EntityTypes1_14.RAVAGER) || type.isOrHasParent(EntityTypes1_14.ABSTRACT_ILLAGER_BASE)) { - if (metadata.id() >= 14) { // 19w13 added a new boolean (raid participant - is celebrating) with id 14 - metadata.setId(metadata.id() + 1); - } - } + }); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java index c1cfc668c..296e94eec 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java @@ -17,10 +17,11 @@ */ package com.viaversion.viaversion.protocols.protocol1_14to1_13_2.packets; +import com.viaversion.viaversion.api.minecraft.ClientWorld; import com.viaversion.viaversion.api.minecraft.Position; +import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_13; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_14; -import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.metadata.Metadata; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; @@ -32,7 +33,6 @@ import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPacke import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.metadata.MetadataRewriter1_14To1_13_2; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.storage.EntityTracker1_14; -import com.viaversion.viaversion.api.minecraft.ClientWorld; import java.util.LinkedList; import java.util.List; @@ -41,6 +41,18 @@ public class EntityPackets { public static void register(Protocol1_14To1_13_2 protocol) { MetadataRewriter1_14To1_13_2 metadataRewriter = protocol.get(MetadataRewriter1_14To1_13_2.class); + protocol.registerClientbound(ClientboundPackets1_13.SPAWN_EXPERIENCE_ORB, wrapper -> { + int entityId = wrapper.passthrough(Type.VAR_INT); + metadataRewriter.tracker(wrapper.user()).addEntity(entityId, EntityTypes1_14.EXPERIENCE_ORB); + }); + + protocol.registerClientbound(ClientboundPackets1_13.SPAWN_GLOBAL_ENTITY, wrapper -> { + int entityId = wrapper.passthrough(Type.VAR_INT); + if (wrapper.passthrough(Type.BYTE) == 1) { + metadataRewriter.tracker(wrapper.user()).addEntity(entityId, EntityTypes1_14.LIGHTNING_BOLT); + } + }); + protocol.registerClientbound(ClientboundPackets1_13.SPAWN_ENTITY, new PacketHandlers() { @Override public void register() { @@ -144,6 +156,7 @@ public class EntityPackets { map(Type.VAR_INT); map(Type.POSITION1_8, Type.POSITION1_14); map(Type.BYTE); + handler(wrapper -> metadataRewriter.tracker(wrapper.user()).addEntity(wrapper.get(Type.VAR_INT, 0), EntityTypes1_14.PAINTING)); } }); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java index 4d22f363f..357a17b10 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java @@ -48,8 +48,7 @@ public class Protocol1_15To1_14_4 extends AbstractProtocol { @@ -37,42 +32,15 @@ public class MetadataRewriter1_15To1_14_4 extends EntityRewriter metadatas, UserConnection connection) throws Exception { - if (metadata.metaType() == Types1_14.META_TYPES.itemType) { - protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue()); - } else if (metadata.metaType() == Types1_14.META_TYPES.blockStateType) { - // Convert to new block id - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (metadata.metaType() == Types1_14.META_TYPES.particleType) { - rewriteParticle((Particle) metadata.getValue()); - } + protected void registerRewrites() { + registerMetaTypeHandler(Types1_14.META_TYPES.itemType, Types1_14.META_TYPES.blockStateType, null, Types1_14.META_TYPES.particleType); + filter().type(EntityTypes1_15.MINECART_ABSTRACT).index(10).handler((metadatas, meta) -> { + int data = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + }); - if (type == null) return; - - if (type.isOrHasParent(EntityTypes1_15.MINECART_ABSTRACT) - && metadata.id() == 10) { - // Convert to new block id - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } - - // Metadata 12 added to abstract_living - if (metadata.id() > 11 && type.isOrHasParent(EntityTypes1_15.LIVINGENTITY)) { - metadata.setId(metadata.id() + 1); - } - - //NOTES: - //new boolean with id 11 for trident, default = false, added in 19w45a - //new boolean with id 17 for enderman - - if (type.isOrHasParent(EntityTypes1_15.WOLF)) { - if (metadata.id() == 18) { - metadatas.remove(metadata); - } else if (metadata.id() > 18) { - metadata.setId(metadata.id() - 1); - } - } + filter().type(EntityTypes1_15.LIVINGENTITY).addIndex(12); + filter().type(EntityTypes1_15.WOLF).removeIndex(18); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java index 7cc7da13d..e1332ff4b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java @@ -47,8 +47,7 @@ public class Protocol1_16_2To1_16_1 extends AbstractProtocol { @@ -38,32 +33,19 @@ public class MetadataRewriter1_16_2To1_16_1 extends EntityRewriter metadatas, UserConnection connection) throws Exception { - if (metadata.metaType() == Types1_16.META_TYPES.itemType) { - protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue()); - } else if (metadata.metaType() == Types1_16.META_TYPES.blockStateType) { - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (metadata.metaType() == Types1_16.META_TYPES.particleType) { - rewriteParticle((Particle) metadata.getValue()); - } - - if (type == null) return; - - if (type.isOrHasParent(EntityTypes1_16_2.MINECART_ABSTRACT) - && metadata.id() == 10) { - // Convert to new block id - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } - - if (type.isOrHasParent(EntityTypes1_16_2.ABSTRACT_PIGLIN)) { - if (metadata.id() == 15) { - metadata.setId(16); - } else if (metadata.id() == 16) { - metadata.setId(15); + protected void registerRewrites() { + registerMetaTypeHandler(Types1_16.META_TYPES.itemType, Types1_16.META_TYPES.blockStateType, null, Types1_16.META_TYPES.particleType); + filter().type(EntityTypes1_16_2.MINECART_ABSTRACT).index(10).handler((metadatas, meta) -> { + int data = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + }); + filter().type(EntityTypes1_16_2.ABSTRACT_PIGLIN).handler((metadatas, meta) -> { + if (meta.id() == 15) { + meta.setId(16); + } else if (meta.id() == 16) { + meta.setId(15); } - } + }); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java index 004b94711..222565f19 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java @@ -69,8 +69,7 @@ public class Protocol1_16To1_15_2 extends AbstractProtocol { @@ -39,41 +35,18 @@ public class MetadataRewriter1_16To1_15_2 extends EntityRewriter metadatas, UserConnection connection) throws Exception { - metadata.setMetaType(Types1_16.META_TYPES.byId(metadata.metaType().typeId())); - if (metadata.metaType() == Types1_16.META_TYPES.itemType) { - protocol.getItemRewriter().handleItemToClient((Item) metadata.getValue()); - } else if (metadata.metaType() == Types1_16.META_TYPES.blockStateType) { - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (metadata.metaType() == Types1_16.META_TYPES.particleType) { - rewriteParticle((Particle) metadata.getValue()); - } - - if (type == null) return; - - if (type.isOrHasParent(EntityTypes1_16.MINECART_ABSTRACT) - && metadata.id() == 10) { - // Convert to new block id - int data = (int) metadata.getValue(); - metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } - - if (type.isOrHasParent(EntityTypes1_16.ABSTRACT_ARROW)) { - if (metadata.id() == 8) { - metadatas.remove(metadata); - } else if (metadata.id() > 8) { - metadata.setId(metadata.id() - 1); - } - } - - if (type == EntityTypes1_16.WOLF) { - if (metadata.id() == 16) { - byte mask = metadata.value(); - int angerTime = (mask & 0x02) != 0 ? Integer.MAX_VALUE : 0; - metadatas.add(new Metadata(20, Types1_16.META_TYPES.varIntType, angerTime)); - } - } + protected void registerRewrites() { + registerMetaTypeHandler(Types1_16.META_TYPES.itemType, Types1_16.META_TYPES.blockStateType, null, Types1_16.META_TYPES.particleType); + filter().type(EntityTypes1_16.MINECART_ABSTRACT).index(10).handler((metadatas, meta) -> { + int data = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + }); + filter().type(EntityTypes1_16.ABSTRACT_ARROW).removeIndex(8); + filter().type(EntityTypes1_16.WOLF).index(16).handler((event, meta) -> { + byte mask = meta.value(); + int angerTime = (mask & 0x02) != 0 ? Integer.MAX_VALUE : 0; + event.createExtraMeta(new Metadata(20, Types1_16.META_TYPES.varIntType, angerTime)); + }); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java index af9bc4e6a..4404fdaa7 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java @@ -151,23 +151,20 @@ public final class EntityPackets extends EntityRewriter { - meta.setMetaType(Types1_17.META_TYPES.byId(meta.metaType().typeId())); - - if (meta.metaType() == Types1_17.META_TYPES.poseType) { - int pose = meta.value(); - if (pose > 5) { - // Added LONG_JUMP at 6 - meta.setValue(pose + 1); - } + filter().mapMetaType(Types1_17.META_TYPES::byId); + filter().metaType(Types1_17.META_TYPES.poseType).handler((event, meta) -> { + int pose = meta.value(); + if (pose > 5) { + // Added LONG_JUMP at 6 + meta.setValue(pose + 1); } }); registerMetaTypeHandler(Types1_17.META_TYPES.itemType, Types1_17.META_TYPES.blockStateType, null, Types1_17.META_TYPES.particleType); // Ticks frozen added with id 7 - filter().filterFamily(EntityTypes1_17.ENTITY).addIndex(7); + filter().type(EntityTypes1_17.ENTITY).addIndex(7); - filter().filterFamily(EntityTypes1_17.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_17.MINECART_ABSTRACT).index(11).handler((event, meta) -> { // Convert to new block id int data = (int) meta.getValue(); meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/EntityPackets.java index 053754f09..ac4654ff3 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/EntityPackets.java @@ -81,18 +81,16 @@ public final class EntityPackets extends EntityRewriter { - meta.setMetaType(Types1_18.META_TYPES.byId(meta.metaType().typeId())); - if (meta.metaType() == Types1_18.META_TYPES.particleType) { - final Particle particle = (Particle) meta.getValue(); - if (particle.getId() == 2) { // Barrier - particle.setId(3); // Block marker - particle.add(Type.VAR_INT, 7754); // Barrier state - } else if (particle.getId() == 3) { // Light block - particle.add(Type.VAR_INT, 7786); // Light block state - } else { - rewriteParticle(particle); - } + filter().mapMetaType(Types1_18.META_TYPES::byId); + filter().metaType(Types1_18.META_TYPES.particleType).handler((event, meta) -> { + final Particle particle = (Particle) meta.getValue(); + if (particle.getId() == 2) { // Barrier + particle.setId(3); // Block marker + particle.add(Type.VAR_INT, 7754); // Barrier state + } else if (particle.getId() == 3) { // Light block + particle.add(Type.VAR_INT, 7786); // Light block state + } else { + rewriteParticle(particle); } }); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_3to1_19_1/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_3to1_19_1/packets/EntityPackets.java index 8ffb68f18..f320cc951 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_3to1_19_1/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_3to1_19_1/packets/EntityPackets.java @@ -42,6 +42,8 @@ public final class EntityPackets extends EntityRewriter { // Also enable vanilla features final PacketWrapper enableFeaturesPacket = wrapper.create(ClientboundPackets1_19_3.UPDATE_ENABLED_FEATURES); @@ -149,20 +152,17 @@ public final class EntityPackets extends EntityRewriter { - final int id = meta.metaType().typeId(); - meta.setMetaType(Types1_19_3.META_TYPES.byId(id >= 2 ? id + 1 : id)); // long added - }); + filter().mapMetaType(typeId -> Types1_19_3.META_TYPES.byId(typeId >= 2 ? typeId + 1 : typeId)); // Long added registerMetaTypeHandler(Types1_19_3.META_TYPES.itemType, Types1_19_3.META_TYPES.blockStateType, null, Types1_19_3.META_TYPES.particleType); - filter().index(6).handler((event, meta) -> { + filter().type(EntityTypes1_19_3.ENTITY).index(6).handler((event, meta) -> { // Sitting pose added final int pose = meta.value(); if (pose >= 10) { meta.setValue(pose + 1); } }); - filter().filterFamily(EntityTypes1_19_3.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_19_3.MINECART_ABSTRACT).index(11).handler((event, meta) -> { // Convert to new block id final int data = (int) meta.getValue(); meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java index 87b7fdda3..aaebf5a40 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java @@ -17,7 +17,11 @@ */ package com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.packets; -import com.github.steveice10.opennbt.tag.builtin.*; +import com.github.steveice10.opennbt.tag.builtin.ByteTag; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; @@ -222,28 +226,22 @@ public final class EntityPackets extends EntityRewriter { - int id = meta.metaType().typeId(); - if (id >= 14) { // Optional block state (and map block state=14 to optional block state) - id++; - } - meta.setMetaType(Types1_19_4.META_TYPES.byId(id)); - }); + filter().mapMetaType(typeId -> Types1_19_4.META_TYPES.byId(typeId >= 14 ? typeId + 1 : typeId)); // Optional block state (and map block state=14 to optional block state) registerMetaTypeHandler(Types1_19_4.META_TYPES.itemType, Types1_19_4.META_TYPES.blockStateType, Types1_19_4.META_TYPES.optionalBlockStateType, Types1_19_4.META_TYPES.particleType); - filter().filterFamily(EntityTypes1_19_4.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_19_4.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); - filter().filterFamily(EntityTypes1_19_4.BOAT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_19_4.BOAT).index(11).handler((event, meta) -> { final int boatType = meta.value(); if (boatType > 4) { // Cherry added meta.setValue(boatType + 1); } }); - filter().filterFamily(EntityTypes1_19_4.ABSTRACT_HORSE).removeIndex(18); // Owner UUID + filter().type(EntityTypes1_19_4.ABSTRACT_HORSE).removeIndex(18); // Owner UUID } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java index ad467afbe..a632bad7c 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java @@ -46,8 +46,11 @@ import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.storage.Dimensio import com.viaversion.viaversion.rewriter.EntityRewriter; import com.viaversion.viaversion.util.Key; import com.viaversion.viaversion.util.Pair; - -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public final class EntityPackets extends EntityRewriter { @@ -349,37 +352,33 @@ public final class EntityPackets extends EntityRewriter { - meta.setMetaType(Types1_19.META_TYPES.byId(meta.metaType().typeId())); + filter().mapMetaType(Types1_19.META_TYPES::byId); + filter().metaType(Types1_19.META_TYPES.particleType).handler((event, meta) -> { + final Particle particle = (Particle) meta.getValue(); + final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings(); + if (particle.getId() == particleMappings.id("vibration")) { + // Remove the position + particle.getArguments().remove(0); - final MetaType type = meta.metaType(); - if (type == Types1_19.META_TYPES.particleType) { - final Particle particle = (Particle) meta.getValue(); - final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings(); - if (particle.getId() == particleMappings.id("vibration")) { - // Remove the position - particle.getArguments().remove(0); - - final String resourceLocation = Key.stripMinecraftNamespace(particle.getArgument(0).getValue()); - if (resourceLocation.equals("entity")) { - // Add Y offset - particle.getArguments().add(2, new Particle.ParticleData<>(Type.FLOAT, 0F)); - } + final String resourceLocation = Key.stripMinecraftNamespace(particle.getArgument(0).getValue()); + if (resourceLocation.equals("entity")) { + // Add Y offset + particle.getArguments().add(2, new Particle.ParticleData<>(Type.FLOAT, 0F)); } - - rewriteParticle(particle); } + + rewriteParticle(particle); }); registerMetaTypeHandler(Types1_19.META_TYPES.itemType, Types1_19.META_TYPES.blockStateType, null, null); - filter().filterFamily(EntityTypes1_19.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_19.MINECART_ABSTRACT).index(11).handler((event, meta) -> { // Convert to new block id final int data = (int) meta.getValue(); meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); }); - filter().type(EntityTypes1_19.CAT).index(19).handler((event, meta) -> meta.setMetaType(Types1_19.META_TYPES.catVariantType)); + filter().type(EntityTypes1_19.CAT).index(19).mapMetaType(typeId -> Types1_19.META_TYPES.catVariantType); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/EntityPacketRewriter1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/EntityPacketRewriter1_20_2.java index 6f4359744..74da9ce3f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/EntityPacketRewriter1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/EntityPacketRewriter1_20_2.java @@ -174,12 +174,12 @@ public final class EntityPacketRewriter1_20_2 extends EntityRewriter meta.setMetaType(Types1_20_2.META_TYPES.byId(meta.metaType().typeId()))); + filter().mapMetaType(Types1_20_2.META_TYPES::byId); registerMetaTypeHandler(Types1_20_2.META_TYPES.itemType, Types1_20_2.META_TYPES.blockStateType, Types1_20_2.META_TYPES.optionalBlockStateType, Types1_20_2.META_TYPES.particleType); - filter().filterFamily(EntityTypes1_19_4.DISPLAY).addIndex(10); + filter().type(EntityTypes1_19_4.DISPLAY).addIndex(10); - filter().filterFamily(EntityTypes1_19_4.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_19_4.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java index 8f6f74385..3c5742ecc 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java @@ -106,25 +106,25 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriterremoveArgument(0).getValue(); - if (Key.stripMinecraftNamespace(resourceLocation).equals("block")) { - particle.add(0, Type.VAR_INT, 0); - } else { // Entity - particle.add(0, Type.VAR_INT, 1); - } - } - - rewriteParticle(particle); - meta.setMetaType(Types1_20_3.META_TYPES.particleType); } else { meta.setMetaType(Types1_20_3.META_TYPES.byId(type.typeId())); } }); + filter().metaType(Types1_20_3.META_TYPES.particleType).handler((event, meta) -> { + final Particle particle = meta.value(); + final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings(); + if (particle.getId() == particleMappings.id("vibration")) { + // Change the type of the resource key argument + final String resourceLocation = particle.removeArgument(0).getValue(); + if (Key.stripMinecraftNamespace(resourceLocation).equals("block")) { + particle.add(0, Type.VAR_INT, 0); + } else { // Entity + particle.add(0, Type.VAR_INT, 1); + } + } + + rewriteParticle(particle); + }); registerMetaTypeHandler( Types1_20_3.META_TYPES.itemType, @@ -133,7 +133,7 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriter { + filter().type(EntityTypes1_20_3.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/EntityPackets.java index 931dfeee8..8f242781e 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/EntityPackets.java @@ -17,7 +17,12 @@ */ package com.viaversion.viaversion.protocols.protocol1_20to1_19_4.packets; -import com.github.steveice10.opennbt.tag.builtin.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.FloatTag; +import com.github.steveice10.opennbt.tag.builtin.IntTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.minecraft.Quaternion; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; @@ -123,11 +128,11 @@ public final class EntityPackets extends EntityRewriter meta.setMetaType(Types1_20.META_TYPES.byId(meta.metaType().typeId()))); + filter().mapMetaType(Types1_20.META_TYPES::byId); registerMetaTypeHandler(Types1_20.META_TYPES.itemType, Types1_20.META_TYPES.blockStateType, Types1_20.META_TYPES.optionalBlockStateType, Types1_20.META_TYPES.particleType); // Rotate item display by 180 degrees around the Y axis - filter().filterFamily(EntityTypes1_19_4.ITEM_DISPLAY).handler((event, meta) -> { + filter().type(EntityTypes1_19_4.ITEM_DISPLAY).handler((event, meta) -> { if (event.trackedEntity().hasSentMetadata() || event.hasExtraMeta()) { return; } @@ -136,12 +141,12 @@ public final class EntityPackets extends EntityRewriter { + filter().type(EntityTypes1_19_4.ITEM_DISPLAY).index(12).handler((event, meta) -> { final Quaternion quaternion = meta.value(); meta.setValue(rotateY180(quaternion)); }); - filter().filterFamily(EntityTypes1_19_4.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + filter().type(EntityTypes1_19_4.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java index 1bda7868a..11baedfe1 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java @@ -95,7 +95,7 @@ public class Protocol1_9To1_8 extends AbstractProtocol { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java index b11211b7a..ed2e8a62c 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java @@ -17,11 +17,10 @@ */ package com.viaversion.viaversion.protocols.protocol1_9to1_8.metadata; -import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.EulerAngle; import com.viaversion.viaversion.api.minecraft.Vector; -import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_10; import com.viaversion.viaversion.api.minecraft.entities.EntityType; +import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_10; import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; import com.viaversion.viaversion.api.minecraft.metadata.Metadata; @@ -30,7 +29,7 @@ import com.viaversion.viaversion.protocols.protocol1_8.ClientboundPackets1_8; import com.viaversion.viaversion.protocols.protocol1_9to1_8.ItemRewriter; import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8; import com.viaversion.viaversion.rewriter.EntityRewriter; -import java.util.List; +import com.viaversion.viaversion.rewriter.meta.MetaHandlerEvent; import java.util.UUID; public class MetadataRewriter1_9To1_8 extends EntityRewriter { @@ -40,14 +39,21 @@ public class MetadataRewriter1_9To1_8 extends EntityRewriter metadatas, UserConnection connection) throws Exception { + protected void registerRewrites() { + filter().handler(this::handleMetadata); + } + + private void handleMetadata(MetaHandlerEvent event, Metadata metadata) { + EntityType type = event.entityType(); MetaIndex metaIndex = MetaIndex.searchIndex(type, metadata.id()); if (metaIndex == null) { - throw new Exception("Could not find valid metadata"); + // Almost certainly bad data, remove it + event.cancel(); + return; } if (metaIndex.getNewType() == null) { - metadatas.remove(metadata); + event.cancel(); return; } @@ -72,7 +78,7 @@ public class MetadataRewriter1_9To1_8 extends EntityRewriter extraMeta = event != null ? event.extraMeta() : null; - if (extraMeta != null) { + if (event != null && event.hasExtraMeta()) { // Finally, add newly created meta - metadataList.addAll(extraMeta); + metadataList.addAll(event.extraMeta()); } } @@ -149,31 +143,6 @@ public abstract class EntityRewriter metadataList, UserConnection connection) { - try { - handleMetadata(entityId, type, metadata, metadataList, connection); - return true; - } catch (Exception e) { - logException(e, type, metadataList, metadata); - return false; - } - } - - /** - * To be overridden to handle metadata. - * - * @param entityId entity id - * @param type entity type, or null if not tracked - * @param metadata current metadata - * @param metadatas full, mutable list of metadata - * @param connection user connection - * @deprecated use {@link #filter()} - */ - @Deprecated - protected void handleMetadata(int entityId, @Nullable EntityType type, Metadata metadata, List metadatas, UserConnection connection) throws Exception { - } - @Override public int newEntityId(int id) { return typeMappings != null ? typeMappings.getNewIdOrDefault(id, id) : id; @@ -567,16 +536,6 @@ public abstract class EntityRewriter metadataList) { - for (Metadata metadata : metadataList) { - if (metadata.id() == index) { - return metadata; - } - } - return null; - } - protected void rewriteParticle(Particle particle) { ParticleMappings mappings = protocol.getMappingData().getParticleMappings(); int id = particle.getId(); diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaFilter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaFilter.java index 85d0ab754..28433d69a 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaFilter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaFilter.java @@ -20,20 +20,24 @@ package com.viaversion.viaversion.rewriter.meta; import com.google.common.base.Preconditions; import com.viaversion.viaversion.api.minecraft.entities.EntityType; +import com.viaversion.viaversion.api.minecraft.metadata.MetaType; import com.viaversion.viaversion.api.minecraft.metadata.Metadata; import com.viaversion.viaversion.rewriter.EntityRewriter; +import it.unimi.dsi.fastutil.ints.Int2ObjectFunction; import java.util.Objects; import org.checkerframework.checker.nullness.qual.Nullable; public class MetaFilter { private final MetaHandler handler; private final EntityType type; + private final MetaType metaType; private final int index; private final boolean filterFamily; - public MetaFilter(@Nullable EntityType type, boolean filterFamily, int index, MetaHandler handler) { + public MetaFilter(@Nullable EntityType type, boolean filterFamily, @Nullable MetaType metaType, int index, MetaHandler handler) { Preconditions.checkNotNull(handler, "MetaHandler cannot be null"); this.type = type; + this.metaType = metaType; this.filterFamily = filterFamily; this.index = index; this.handler = handler; @@ -57,6 +61,15 @@ public class MetaFilter { return type; } + /** + * Returns the meta type to filter, or null. + * + * @return the meta type to filter, or null if unset + */ + public @Nullable MetaType metaType() { + return metaType; + } + /** * Returns the metadata handler. * @@ -86,7 +99,8 @@ public class MetaFilter { // Check if no specific index is filtered or the indexes are equal // Then check if the filter has no entity type or the type is equal to or part of the filtered parent type return (this.index == -1 || metadata.id() == this.index) - && (this.type == null || matchesType(type)); + && (this.type == null || matchesType(type)) + && (this.metaType == null || metadata.metaType() == this.metaType); } private boolean matchesType(@Nullable EntityType type) { @@ -101,6 +115,7 @@ public class MetaFilter { if (index != that.index) return false; if (filterFamily != that.filterFamily) return false; if (!handler.equals(that.handler)) return false; + if (!Objects.equals(metaType, that.metaType)) return false; return Objects.equals(type, that.type); } @@ -108,6 +123,7 @@ public class MetaFilter { public int hashCode() { int result = handler.hashCode(); result = 31 * result + (type != null ? type.hashCode() : 0); + result = 31 * result + (metaType != null ? metaType.hashCode() : 0); result = 31 * result + index; result = 31 * result + (filterFamily ? 1 : 0); return result; @@ -118,6 +134,7 @@ public class MetaFilter { return "MetaFilter{" + "type=" + type + ", filterFamily=" + filterFamily + + ", metaType=" + metaType + ", index=" + index + ", handler=" + handler + '}'; @@ -126,6 +143,7 @@ public class MetaFilter { public static final class Builder { private final EntityRewriter rewriter; private EntityType type; + private MetaType metaType; private int index = -1; private boolean filterFamily; private MetaHandler handler; @@ -134,9 +152,43 @@ public class MetaFilter { this.rewriter = rewriter; } + public Builder metaType(MetaType metaType) { + Preconditions.checkArgument(this.metaType == null); + this.metaType = metaType; + return this; + } + + /** + * Sets the type to filter, including subtypes. + *

+ * You should always register a type when accessing specific indexes, + * even if it is the base entity type, to avoid metadata from unregistered + * entities causing issues. + * + * @param type entity type to filter + * @return this builder + */ public Builder type(EntityType type) { Preconditions.checkArgument(this.type == null); this.type = type; + this.filterFamily = true; + return this; + } + + /** + * Sets the type to filter, not including subtypes. + *

+ * You should always register a type when accessing specific indexes, + * even if it is the base entity type, to avoid metadata from unregistered + * entities causing issues. + * + * @param type exact entity type to filter + * @return this builder + */ + public Builder exactType(EntityType type) { + Preconditions.checkArgument(this.type == null); + this.type = type; + this.filterFamily = false; return this; } @@ -146,13 +198,6 @@ public class MetaFilter { return this; } - public Builder filterFamily(EntityType type) { - Preconditions.checkArgument(this.type == null); - this.type = type; - this.filterFamily = true; - return this; - } - public Builder handlerNoRegister(MetaHandler handler) { Preconditions.checkArgument(this.handler == null); this.handler = handler; @@ -172,6 +217,17 @@ public class MetaFilter { register(); } + public void mapMetaType(Int2ObjectFunction updateFunction) { + handler((event, meta) -> { + MetaType mappedType = updateFunction.apply(meta.metaType().typeId()); + if (mappedType != null) { + meta.setMetaType(mappedType); + } else { + event.cancel(); + } + }); + } + /** * Sets a handler to remove metadata at the given index without affecting any other indexes and registers the filter. * Should always be called last. @@ -243,7 +299,7 @@ public class MetaFilter { * @return created meta filter */ public MetaFilter build() { - return new MetaFilter(type, filterFamily, index, handler); + return new MetaFilter(type, filterFamily, metaType, index, handler); } } } diff --git a/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java b/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java index 1b3ad3083..92f266811 100644 --- a/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java +++ b/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java @@ -84,12 +84,12 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter { - int id = meta.metaType().typeId(); + filter().mapMetaType(typeId -> { + int id = typeId; if (id >= SomeAddedIndex) { id++; } - meta.setMetaType(Types1_20_3.META_TYPES.byId(id)); + return Types1_20_3.META_TYPES.byId(id); });*/ // Registers registry type id changes @@ -101,7 +101,7 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter { + filter().type(EntityTypes1_20_3.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); });