From 31f7bde35fd0efe4d7f3025a12733b7e58e58dbb Mon Sep 17 00:00:00 2001 From: KennyTV Date: Mon, 10 Aug 2020 18:32:23 +0200 Subject: [PATCH] Some MetadataRewriter cleanup --- .../api/rewriters/MetadataRewriter.java | 49 +++++++++++++------ .../types/minecraft/MetaListTypeTemplate.java | 3 +- .../types/minecraft/ModernMetaListType.java | 1 + .../metadata/MetadataRewriter1_11To1_10.java | 16 +++--- .../MetadataRewriter1_13To1_12_2.java | 9 ++-- .../metadata/MetadataRewriter1_9To1_8.java | 6 +-- 6 files changed, 52 insertions(+), 32 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java index a9dfb16ef..fd514ee48 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java @@ -16,10 +16,7 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.logging.Logger; public abstract class MetadataRewriter { @@ -35,16 +32,9 @@ public abstract class MetadataRewriter { public final void handleMetadata(int entityId, List metadatas, UserConnection connection) { EntityType type = connection.get(entityTrackerClass).getEntity(entityId); - Map metadataMap = new HashMap<>(metadatas.size()); - for (Metadata metadata : metadatas) { - metadataMap.put(metadata.getId(), metadata); - } - - metadataMap = Collections.unmodifiableMap(metadataMap); - for (Metadata metadata : new ArrayList<>(metadatas)) { try { - handleMetadata(entityId, type, metadata, metadatas, metadataMap, connection); + handleMetadata(entityId, type, metadata, metadatas, connection); } catch (Exception e) { metadatas.remove(metadata); if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { @@ -270,20 +260,49 @@ public abstract class MetadataRewriter { }; } + // --------------------------------------------------------------------------- + protected abstract EntityType getTypeFromId(int type); + /** + * Returns the entity type from the given id. + * From 1.14 and onwards, this is the same exact value as {@link #getTypeFromId(int)}. + * + * @param type entity type id + * @return EntityType from id + */ protected EntityType getObjectTypeFromId(int type) { return getTypeFromId(type); } + /** + * Returns the mapped entitiy (or the same if it has not changed). + * + * @param oldId old entity id + * @return mapped entity id + */ public int getNewEntityId(int oldId) { return typeMapping != null ? typeMapping.getOrDefault(oldId, oldId) : oldId; } - protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, UserConnection connection) throws Exception { - } + /** + * 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 + */ + protected abstract void handleMetadata(int entityId, @Nullable EntityType type, Metadata metadata, List metadatas, UserConnection connection) throws Exception; - protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, Map metadataMap, UserConnection connection) throws Exception { - handleMetadata(entityId, type, metadata, metadatas, connection); + @Nullable + protected Metadata getMetaByIndex(int index, List metadataList) { + for (Metadata metadata : metadataList) { + if (metadata.getId() == index) { + return metadata; + } + } + return null; } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java index 187d0c436..4391a1e5e 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java @@ -6,7 +6,8 @@ import us.myles.ViaVersion.api.type.Type; import java.util.List; public abstract class MetaListTypeTemplate extends Type> { - public MetaListTypeTemplate() { + + protected MetaListTypeTemplate() { super("MetaData List", List.class); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ModernMetaListType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ModernMetaListType.java index cd8c0b17b..7940162d7 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ModernMetaListType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ModernMetaListType.java @@ -5,6 +5,7 @@ import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.type.Type; public abstract class ModernMetaListType extends AbstractMetaListType { + @Override protected void writeEnd(final Type type, final ByteBuf buffer) throws Exception { type.write(buffer, null); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java index c5c3c1c20..6681b8e0d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java @@ -15,7 +15,6 @@ import us.myles.ViaVersion.protocols.protocol1_11to1_10.Protocol1_11To1_10; import us.myles.ViaVersion.protocols.protocol1_11to1_10.storage.EntityTracker1_11; import java.util.List; -import java.util.Map; import java.util.Optional; public class MetadataRewriter1_11To1_10 extends MetadataRewriter { @@ -25,7 +24,7 @@ public class MetadataRewriter1_11To1_10 extends MetadataRewriter { } @Override - protected void handleMetadata(int entityId, us.myles.ViaVersion.api.entities.EntityType type, Metadata metadata, List metadatas, Map metadataMap, UserConnection connection) { + protected void handleMetadata(int entityId, us.myles.ViaVersion.api.entities.EntityType type, Metadata metadata, List metadatas, UserConnection connection) { if (metadata.getValue() instanceof Item) { // Apply rewrite EntityIdRewriter.toClientItem((Item) metadata.getValue()); @@ -100,15 +99,14 @@ public class MetadataRewriter1_11To1_10 extends MetadataRewriter { } if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) { - Optional flags = Optional.ofNullable(metadataMap.get(11)); - Optional customName = Optional.ofNullable(metadataMap.get(2)); - Optional customNameVisible = Optional.ofNullable(metadataMap.get(3)); - if (metadata.getId() == 0 && flags.isPresent() && customName.isPresent() && customNameVisible.isPresent()) { - Metadata meta = flags.get(); + Metadata flags = getMetaByIndex(11, metadatas); + Metadata customName = getMetaByIndex(2, metadatas); + Metadata customNameVisible = getMetaByIndex(3, metadatas); + if (metadata.getId() == 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) meta.getValue() & 0x01) == 0x01 - && !((String) customName.get().getValue()).isEmpty() && (boolean) customNameVisible.get().getValue()) { + if ((data & 0x20) == 0x20 && ((byte) flags.getValue() & 0x01) == 0x01 + && !((String) customName.getValue()).isEmpty() && (boolean) customNameVisible.getValue()) { EntityTracker1_11 tracker = connection.get(EntityTracker1_11.class); if (!tracker.isHologram(entityId)) { tracker.addHologram(entityId); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java index ad234da35..c63234010 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java @@ -17,7 +17,6 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.WorldPackets; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.EntityTracker1_13; import java.util.List; -import java.util.Map; public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter { @@ -26,7 +25,7 @@ public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter { } @Override - protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, Map metadataMap, UserConnection connection) throws Exception { + protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, UserConnection connection) throws Exception { // Handle new MetaTypes if (metadata.getMetaType().getTypeID() > 4) { metadata.setMetaType(MetaType1_13.byId(metadata.getMetaType().getTypeID() + 1)); @@ -80,8 +79,10 @@ public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter { if (type == Entity1_13Types.EntityType.AREA_EFFECT_CLOUD) { if (metadata.getId() == 9) { int particleId = (int) metadata.getValue(); - int parameter1 = metadataMap.containsKey(10) ? (int) metadataMap.get(10).getValue() : 0; - int parameter2 = metadataMap.containsKey(11) ? (int) metadataMap.get(11).getValue() : 0; + Metadata parameter1Meta = getMetaByIndex(10, metadatas); + Metadata parameter2Meta = getMetaByIndex(11, metadatas); + int parameter1 = parameter1Meta != null ? (int) parameter1Meta.getValue() : 0; + int parameter2 = parameter2Meta != null ? (int) parameter2Meta.getValue() : 0; Particle particle = ParticleRewriter.rewriteParticle(particleId, new Integer[]{parameter1, parameter2}); if (particle != null && particle.getId() != -1) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java index b295c787f..94d4a5b09 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter1_9To1_8.java @@ -16,7 +16,6 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9; import java.util.List; -import java.util.Map; import java.util.UUID; public class MetadataRewriter1_9To1_8 extends MetadataRewriter { @@ -26,7 +25,7 @@ public class MetadataRewriter1_9To1_8 extends MetadataRewriter { } @Override - protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, Map metadataMap, UserConnection connection) throws Exception { + protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, UserConnection connection) throws Exception { MetaIndex metaIndex = MetaIndex.searchIndex(type, metadata.getId()); if (metaIndex == null) { throw new Exception("Could not find valid metadata"); @@ -43,7 +42,8 @@ public class MetadataRewriter1_9To1_8 extends MetadataRewriter { if (type == Entity1_10Types.EntityType.ENDERMAN && metaIndex.getNewType() == MetaType1_9.BlockID) { if (metaIndex.getOldType() == MetaType1_8.Short) { int id = (Short) metadata.getValue(); - int data = metadataMap.containsKey(17) ? (Byte) metadataMap.get(17).getValue() : 0; + Metadata meta = getMetaByIndex(17, metadatas); + int data = meta != null ? (Byte) meta.getValue() : 0; int combined = (id << 4) | (data & 0xF); metadata.setValue(combined); } else {