From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Paul Sauve Date: Sun, 9 May 2021 19:32:29 -0500 Subject: [PATCH] Use list for fast iteration over pathfinder goals diff --git a/src/main/java/gg/airplane/structs/LinkedHashSetArrayList.java b/src/main/java/gg/airplane/structs/LinkedHashSetArrayList.java new file mode 100644 index 0000000000000000000000000000000000000000..36eea0acd815e08e0be10bf55541ea0bb605b8f5 --- /dev/null +++ b/src/main/java/gg/airplane/structs/LinkedHashSetArrayList.java @@ -0,0 +1,35 @@ +package gg.airplane.structs; + +import java.util.AbstractSet; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/* + * Used when you want fast iteration more than fast contain/remove + */ +public class LinkedHashSetArrayList extends AbstractSet { + private final List internal = new ArrayList<>(); + + @Override + public boolean add(E e) { + if (this.internal.contains(e)) { + return false; + } + return this.internal.add(e); + } + + @Override + public Iterator iterator() { + return this.internal.iterator(); + } + + public E get(int index) { + return this.internal.get(index); + } + + @Override + public int size() { + return this.internal.size(); + } +} diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalSelector.java index 637928664f8c7b1c694a234e507c20724294e450..47a5a1bdf8f662877bb4556e30e5665805fe21b5 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalSelector.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalSelector.java @@ -28,7 +28,7 @@ public class PathfinderGoalSelector { } }; private final Map c = new EnumMap(PathfinderGoal.Type.class); - private final Set d = Sets.newLinkedHashSet(); public final Set getTasks() { return d; }// Paper - OBFHELPER // Paper - private -> public + private final gg.airplane.structs.LinkedHashSetArrayList d = new gg.airplane.structs.LinkedHashSetArrayList<>(); public final Set getTasks() { return d; }// Paper - OBFHELPER // Paper - private -> public // Airplane - it's a set, but it's an arraylist private final Supplier e; private final EnumSet f = EnumSet.noneOf(PathfinderGoal.Type.class); // Paper unused, but dummy to prevent plugins from crashing as hard. Theyll need to support paper in a special case if this is super important, but really doesn't seem like it would be. private final OptimizedSmallEnumSet goalTypes = new OptimizedSmallEnumSet<>(PathfinderGoal.Type.class); // Paper - remove streams from pathfindergoalselector @@ -80,8 +80,11 @@ public class PathfinderGoalSelector { gameprofilerfiller.enter("goalCleanup"); // Paper start - remove streams from pathfindergoalselector - for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { - PathfinderGoalWrapped wrappedGoal = iterator.next(); + // Airplane start - remove iterators from pathfindergoalselector + //for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { + // PathfinderGoalWrapped wrappedGoal = iterator.next(); + for (int goalIndex = 0; goalIndex < this.d.size(); goalIndex++) { + PathfinderGoalWrapped wrappedGoal = this.d.get(goalIndex); if (!wrappedGoal.g()) { continue; } @@ -100,8 +103,10 @@ public class PathfinderGoalSelector { gameprofilerfiller.exit(); gameprofilerfiller.enter("goalUpdate"); // Paper start - remove streams from pathfindergoalselector - goal_update_loop: for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { - PathfinderGoalWrapped wrappedGoal = iterator.next(); + // Airplane start - remove iterators from pathfindergoalselector + goal_update_loop: for (int goalIndex = 0; goalIndex < this.d.size(); goalIndex++) { //for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { + PathfinderGoalWrapped wrappedGoal = this.d.get(goalIndex); + // Airplane end if (wrappedGoal.g()) { continue; } @@ -144,8 +149,11 @@ public class PathfinderGoalSelector { gameprofilerfiller.exit(); gameprofilerfiller.enter("goalTick"); // Paper start - remove streams from pathfindergoalselector - for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { - PathfinderGoalWrapped wrappedGoal = iterator.next(); + // Airplane start - remove iterators from pathfindergoalselector + //for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { + // PathfinderGoalWrapped wrappedGoal = iterator.next(); + for (int goalIndex = 0; goalIndex < this.d.size(); goalIndex++) { PathfinderGoalWrapped wrappedGoal = this.d.get(goalIndex); + // Airplane end if (wrappedGoal.g()) { wrappedGoal.e(); }