From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Callahan <mr.callahhh@gmail.com>
Date: Wed, 8 Apr 2020 18:00:17 -0500
Subject: [PATCH] Port 20w15a Villager AI optimizations - DROP 1.16


diff --git a/src/main/java/net/minecraft/server/BehaviorController.java b/src/main/java/net/minecraft/server/BehaviorController.java
index 7c6e687707cdf32638eee41e549818a494cd45ab..396b64ea0fc8a04d9e0aac289033d3d82385b86e 100644
--- a/src/main/java/net/minecraft/server/BehaviorController.java
+++ b/src/main/java/net/minecraft/server/BehaviorController.java
@@ -38,30 +38,22 @@ public class BehaviorController<E extends EntityLiving> implements MinecraftSeri
         this.g = Sets.newHashSet();
         this.h = Activity.IDLE;
         this.i = -9999L;
-        collection.forEach((memorymoduletype) -> {
-            Optional optional = (Optional) this.memories.put(memorymoduletype, Optional.empty());
-        });
-        collection1.forEach((sensortype) -> {
-            Sensor sensor = (Sensor) this.sensors.put(sensortype, sensortype.a());
-        });
-        this.sensors.values().forEach((sensor) -> {
-            Iterator iterator = sensor.a().iterator();
-
-            while (iterator.hasNext()) {
-                MemoryModuleType<?> memorymoduletype = (MemoryModuleType) iterator.next();
-
-                this.memories.put(memorymoduletype, Optional.empty());
+        // Paper start - Port 20w15a pathfinder optimizations
+        for (final MemoryModuleType<?> memoryModuleType : collection) {
+            this.memories.put(memoryModuleType, Optional.empty());
+        }
+        for (final SensorType<? extends Sensor<? super E>> sensorType : collection1) {
+            this.sensors.put(sensorType, sensorType.a());
+        }
+        for (final Sensor<? super E> sensor : this.sensors.values()) {
+            for (final MemoryModuleType<?> memoryModuleType : sensor.a()) {
+                this.memories.put(memoryModuleType, Optional.empty());
             }
-
-        });
-        Iterator iterator = dynamic.get("memories").asMap(Function.identity(), Function.identity()).entrySet().iterator();
-
-        while (iterator.hasNext()) {
-            Entry<Dynamic<T>, Dynamic<T>> entry = (Entry) iterator.next();
-
-            this.a((MemoryModuleType) IRegistry.MEMORY_MODULE_TYPE.get(new MinecraftKey(((Dynamic) entry.getKey()).asString(""))), (Dynamic) entry.getValue());
         }
-
+        for (final Map.Entry<Dynamic<T>, Dynamic<T>> entry : dynamic.get("memories").asMap(Function.identity(), Function.identity()).entrySet()) {
+            this.a((MemoryModuleType) IRegistry.MEMORY_MODULE_TYPE.get(new MinecraftKey((entry.getKey()).asString(""))), entry.getValue());
+        }
+        // Paper end - Port 20w15a pathfinder optimizations
     }
 
     public boolean hasMemory(MemoryModuleType<?> memorymoduletype) {
@@ -69,7 +61,7 @@ public class BehaviorController<E extends EntityLiving> implements MinecraftSeri
     }
 
     private <T, U> void a(MemoryModuleType<U> memorymoduletype, Dynamic<T> dynamic) {
-        this.setMemory(memorymoduletype, ((Function) memorymoduletype.getSerializer().orElseThrow(RuntimeException::new)).apply(dynamic));
+        this.setMemory(memorymoduletype, (memorymoduletype.getSerializer().orElseThrow(RuntimeException::new)).apply(dynamic)); // Paper - decompile fix
     }
 
     public <U> void removeMemory(MemoryModuleType<U> memorymoduletype) {
@@ -113,13 +105,21 @@ public class BehaviorController<E extends EntityLiving> implements MinecraftSeri
         this.f = set;
     }
 
+    // Paper start - Port 20w15a pathfinder optimizations
     @Deprecated
-    public Stream<Behavior<? super E>> d() {
-        return this.c.values().stream().flatMap((map) -> {
-            return map.values().stream();
-        }).flatMap(Collection::stream).filter((behavior) -> {
-            return behavior.a() == Behavior.Status.RUNNING;
-        });
+    public java.util.List<Behavior<? super E>> d() {
+        final java.util.List<Behavior<? super E>> behaviorList = (java.util.List<Behavior<? super E>>) new it.unimi.dsi.fastutil.objects.ObjectArrayList();
+        for (final Map<Activity, Set<Behavior<? super E>>> map : this.c.values()) {
+            for (final Set<Behavior<? super E>> set : map.values()) {
+                for (final Behavior<? super E> behavior : set) {
+                    if (behavior.a() == Behavior.Status.RUNNING) {
+                        behaviorList.add(behavior);
+                    }
+                }
+            }
+        }
+        return behaviorList;
+        // Paper end - Port 20w15a pathfinder optimizations
     }
 
     public void a(Activity activity) {
@@ -168,12 +168,14 @@ public class BehaviorController<E extends EntityLiving> implements MinecraftSeri
 
     public BehaviorController<E> f() {
         BehaviorController<E> behaviorcontroller = new BehaviorController<>(this.memories.keySet(), this.sensors.keySet(), new Dynamic(DynamicOpsNBT.a, new NBTTagCompound()));
-
-        this.memories.forEach((memorymoduletype, optional) -> {
-            optional.ifPresent((object) -> {
-                Optional optional1 = (Optional) behaviorcontroller.memories.put(memorymoduletype, Optional.of(object));
-            });
-        });
+        // Paper start - Port 20w15a pathfinder optimizations
+        for (final Entry<MemoryModuleType<?>, Optional<?>> entry : this.memories.entrySet()) {
+            final MemoryModuleType<?> memoryModuleType = entry.getKey();
+            if (entry.getValue().isPresent()) {
+                behaviorcontroller.memories.put(memoryModuleType, entry.getValue());
+            }
+        }
+        // Paper end - Port 20w15a pathfinder optimizations
         return behaviorcontroller;
     }
 
@@ -186,14 +188,14 @@ public class BehaviorController<E extends EntityLiving> implements MinecraftSeri
     public void b(WorldServer worldserver, E e0) {
         long i = e0.world.getTime();
 
-        this.d().forEach((behavior) -> {
+        for(Behavior<? super E> behavior : this.d()) { // Paper - Port 20w15a pathfinder optimizations
             behavior.e(worldserver, e0, i);
-        });
+        }
     }
 
     @Override
     public <T> T a(DynamicOps<T> dynamicops) {
-        T t0 = dynamicops.createMap((Map) this.memories.entrySet().stream().filter((entry) -> {
+        T t0 = dynamicops.createMap(this.memories.entrySet().stream().filter((entry) -> { // Paper - decompile fix
             return ((MemoryModuleType) entry.getKey()).getSerializer().isPresent() && ((Optional) entry.getValue()).isPresent();
         }).map((entry) -> {
             return Pair.of(dynamicops.createString(IRegistry.MEMORY_MODULE_TYPE.getKey(entry.getKey()).toString()), ((MinecraftSerializable) ((Optional) entry.getValue()).get()).a(dynamicops));
@@ -210,33 +212,45 @@ public class BehaviorController<E extends EntityLiving> implements MinecraftSeri
 
     private void d(WorldServer worldserver, E e0) {
         long i = worldserver.getTime();
-
-        this.c.values().stream().flatMap((map) -> {
-            return map.entrySet().stream();
-        }).filter((entry) -> {
-            return this.g.contains(entry.getKey());
-        }).map(Entry::getValue).flatMap(Collection::stream).filter((behavior) -> {
-            return behavior.a() == Behavior.Status.STOPPED;
-        }).forEach((behavior) -> {
-            behavior.b(worldserver, e0, i);
-        });
+        // Paper start - Port 20w15a pathfinder optimizations
+        for (final Map<Activity, Set<Behavior<? super E>>> map : this.c.values()) {
+            for (final Map.Entry<Activity, Set<Behavior<? super E>>> entry : map.entrySet()) {
+                final Activity activity = entry.getKey();
+                if (this.g.contains(activity)) {
+                    final Set<Behavior<? super E>> set = entry.getValue();
+                    for (final Behavior<? super E> behavior : set) {
+                        if (behavior.a() == Behavior.Status.STOPPED) {
+                            behavior.b(worldserver, e0, i);
+                        }
+                    }
+                }
+            }
+        }
+        // Paper end - Port 20w15a pathfinder optimizations
     }
 
     private void e(WorldServer worldserver, E e0) {
         long i = worldserver.getTime();
 
-        this.d().forEach((behavior) -> {
+        for (final Behavior<? super E> behavior : this.d()) { // Paper - Port 20w15a pathfinder optimizations
             behavior.c(worldserver, e0, i);
-        });
+        }
     }
 
     private boolean d(Activity activity) {
-        return ((Set) this.e.get(activity)).stream().allMatch((pair) -> {
-            MemoryModuleType<?> memorymoduletype = (MemoryModuleType) pair.getFirst();
-            MemoryStatus memorystatus = (MemoryStatus) pair.getSecond();
-
-            return this.a(memorymoduletype, memorystatus);
-        });
+        // Paper start - Port 20w15a pathfinder optimizations
+        if (!this.e.containsKey(activity)) {
+            return false;
+        }
+        for (final Pair<MemoryModuleType<?>, MemoryStatus> pair : this.e.get(activity)) {
+            MemoryModuleType<?> memorymoduletype = pair.getFirst();
+            MemoryStatus memorystatus = pair.getSecond();
+            if (!this.a(memorymoduletype, memorystatus)) {
+                return false;
+            }
+        }
+        return true;
+        // Paper end - Port 20w15a pathfinder optimizations
     }
 
     private boolean a(Object object) {
