From bc89f57088d0b634b04e2ca2ad3ec46699de1a2c Mon Sep 17 00:00:00 2001 From: KennyTV Date: Tue, 25 May 2021 22:51:37 +0200 Subject: [PATCH] Slightly improve metadata iteration, remove redundant MetaHandlerEvent index Lazily create the event if needed and share it with other filters when handling a metadata entry. Lastly, only add the additionally created meta once after the filter list, not once per filter. --- .../viaversion/rewriter/EntityRewriter.java | 56 ++++++++++--------- .../viaversion/rewriter/meta/MetaFilter.java | 6 +- .../viaversion/rewriter/meta/MetaHandler.java | 2 +- .../rewriter/meta/MetaHandlerEvent.java | 20 +++---- .../rewriter/meta/MetaHandlerEventImpl.java | 22 +------- 5 files changed, 46 insertions(+), 60 deletions(-) diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java index 74ef78e74..935c4fbbc 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java @@ -110,37 +110,41 @@ public abstract class EntityRewriter extends RewriterBase continue; } + MetaHandlerEvent event = null; for (MetaFilter filter : metadataFilters) { - if (filter.isFiltered(type, metadata)) { - MetaHandlerEvent event = new MetaHandlerEventImpl(connection, type, entityId, metadata.id(), metadata, metadataList); - try { - filter.handler().handle(event, metadata); - } catch (Exception e) { - logException(e, type, metadataList, metadata); - metadataList.remove(i--); - break; - } - - if (event.cancelled()) { - // Remove meta, decrease list index counter, and break current filter loop - metadataList.remove(i--); - break; - } - - Preconditions.checkArgument(event.index() == event.meta().id(), "Meta event id desync: Calls to meta().setId() are illegal"); - if (event.extraMeta() != null) { - // Add newly created meta - metadataList.addAll(event.extraMeta()); - event.clearExtraMeta(); - } + if (!filter.isFiltered(type, metadata)) { + continue; } + if (event == null) { + // Only initialize when needed and share event instance + event = new MetaHandlerEventImpl(connection, type, entityId, metadata, metadataList); + } + + try { + filter.handler().handle(event, metadata); + } catch (Exception e) { + logException(e, type, metadataList, metadata); + metadataList.remove(i--); + break; + } + + if (event.cancelled()) { + // Remove meta, decrease list index counter, and break current filter loop + metadataList.remove(i--); + break; + } + } + + if (event != null && event.extraMeta() != null) { + // Finally add newly created meta + metadataList.addAll(event.extraMeta()); } i++; } } @Deprecated - private boolean callOldMetaHandler(int entityId, EntityType type, Metadata metadata, List metadataList, UserConnection connection) { + private boolean callOldMetaHandler(int entityId, @Nullable EntityType type, Metadata metadata, List metadataList, UserConnection connection) { try { handleMetadata(entityId, type, metadata, metadataList, connection); return true; @@ -498,14 +502,14 @@ public abstract class EntityRewriter extends RewriterBase * Returns the entity tracker for the current protocol. * * @param connection user connection - * @param entity tracker type + * @param entity tracker type * @return entity tracker */ - public T tracker(UserConnection connection) { + public E tracker(UserConnection connection) { return connection.getEntityTracker(protocol.getClass()); } - private void logException(Exception e, EntityType type, List metadataList, Metadata metadata) { + private void logException(Exception e, @Nullable EntityType type, List metadataList, Metadata metadata) { if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { Logger logger = Via.getPlatform().getLogger(); logger.warning("An error occurred with entity metadata handler"); 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 59b21ac6e..0448b3bae 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 @@ -83,10 +83,12 @@ public class MetaFilter { * @param metadata metadata * @return whether the meta should be filtered */ - public boolean isFiltered(EntityType type, Metadata metadata) { + public boolean isFiltered(@Nullable EntityType type, Metadata metadata) { // First check if the filter has no type or the type is equal or part of the filtered parent types // Applicable if no specific index is filtered or the indexes are equal - return (this.type == null || (filterFamily ? type.isOrHasParent(this.type) : this.type == type)) && (index == -1 || metadata.id() == index); + return (this.type == null + || type != null && (this.filterFamily ? type.isOrHasParent(this.type) : this.type == type)) + && (this.index == -1 || metadata.id() == this.index); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandler.java b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandler.java index e5869b864..6b22d5c7f 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandler.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandler.java @@ -27,7 +27,7 @@ public interface MetaHandler { * Handles a metadata entry of an entity. * * @param event metadata event - * @param meta metadata, convenience field for {@link MetaHandlerEvent#meta()} + * @param meta metadata, convenience parameter for {@link MetaHandlerEvent#meta()} */ void handle(MetaHandlerEvent event, Metadata meta); } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEvent.java b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEvent.java index bd9ec03a4..90e879e3e 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEvent.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEvent.java @@ -41,25 +41,29 @@ public interface MetaHandlerEvent { int entityId(); /** - * Returns the entity type of the entity the metadata belongs to. + * Returns the entity type of the entity the metadata belongs to if tracked. * - * @return entity type of the entity + * @return entity type of the entity if tracked, else null */ - EntityType entityType(); + @Nullable EntityType entityType(); /** * Returns the metadata index. * * @return return meta index */ - int index(); + default int index() { + return meta().id(); + } /** * Sets the metadata index. * * @param index new metadata index */ - void setIndex(int index); + default void setIndex(int index) { + meta().setId(index); + } /** * Returns the metadata by the given index if present. @@ -71,7 +75,6 @@ public interface MetaHandlerEvent { /** * Returns the metadata. - * Do NOT call {@link Metadata#setId(int)} and instead use {@link MetaHandlerEvent#setIndex(int)}. * * @return return metadata */ @@ -113,9 +116,4 @@ public interface MetaHandlerEvent { * @param metadata metadata */ void createExtraMeta(Metadata metadata); - - /** - * Clears the additional metadata. - */ - void clearExtraMeta(); } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEventImpl.java b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEventImpl.java index f8655bff4..53db567f3 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEventImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/meta/MetaHandlerEventImpl.java @@ -34,14 +34,12 @@ public class MetaHandlerEventImpl implements MetaHandlerEvent { private final List metadataList; private final Metadata meta; private List extraData; - private int index; private boolean cancel; - public MetaHandlerEventImpl(UserConnection connection, EntityType entityType, int entityId, int index, Metadata meta, List metadataList) { + public MetaHandlerEventImpl(UserConnection connection, @Nullable EntityType entityType, int entityId, Metadata meta, List metadataList) { this.connection = connection; this.entityType = entityType; this.entityId = entityId; - this.index = index; this.meta = meta; this.metadataList = metadataList; } @@ -67,21 +65,10 @@ public class MetaHandlerEventImpl implements MetaHandlerEvent { } @Override - public EntityType entityType() { + public @Nullable EntityType entityType() { return entityType; } - @Override - public int index() { - return index; - } - - @Override - public void setIndex(int index) { - this.index = index; - meta.setId(index); - } - @Override public Metadata meta() { return meta; @@ -111,9 +98,4 @@ public class MetaHandlerEventImpl implements MetaHandlerEvent { public void createExtraMeta(Metadata metadata) { (extraData != null ? extraData : (extraData = new ArrayList<>())).add(metadata); } - - @Override - public void clearExtraMeta() { - extraData = null; - } }