From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wangxyper Date: Sun, 8 Jan 2023 21:14:07 +0800 Subject: [PATCH] Hearse: Pathfiner changes Original license: MIT Original project: https://github.com/NaturalCodeClub/HearseRewrite diff --git a/src/main/java/net/minecraft/world/level/pathfinder/BinaryHeap.java b/src/main/java/net/minecraft/world/level/pathfinder/BinaryHeap.java index 27b9cefc172b391824ead382a712b8b9b1ddfe45..4b65331a9192b7ac75141183493126ee730e697e 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/BinaryHeap.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/BinaryHeap.java @@ -4,9 +4,9 @@ public class BinaryHeap { private Node[] heap = new Node[128]; private int size; - public Node insert(Node node) { + public synchronized Node insert(Node node) { if (node.heapIdx >= 0) { - throw new IllegalStateException("OW KNOWS!"); + return node; } else { if (this.size == this.heap.length) { Node[] nodes = new Node[this.size << 1]; @@ -21,15 +21,15 @@ public class BinaryHeap { } } - public void clear() { + public synchronized void clear() { this.size = 0; } - public Node peek() { + public synchronized Node peek() { return this.heap[0]; } - public Node pop() { + public synchronized Node pop() { Node node = this.heap[0]; this.heap[0] = this.heap[--this.size]; this.heap[this.size] = null; @@ -41,7 +41,7 @@ public class BinaryHeap { return node; } - public void remove(Node node) { + public synchronized void remove(Node node) { this.heap[node.heapIdx] = this.heap[--this.size]; this.heap[this.size] = null; if (this.size > node.heapIdx) { @@ -55,7 +55,7 @@ public class BinaryHeap { node.heapIdx = -1; } - public void changeCost(Node node, float weight) { + public synchronized void changeCost(Node node, float weight) { float f = node.f; node.f = weight; if (weight < f) { @@ -66,11 +66,14 @@ public class BinaryHeap { } - public int size() { + public synchronized int size() { return this.size; } private void upHeap(int index) { + if(index == -1){ + return; + } Node node = this.heap[index]; int i; @@ -90,6 +93,9 @@ public class BinaryHeap { } private void downHeap(int index) { + if(index == -1){ + return; + } Node node = this.heap[index]; float f = node.f; @@ -135,11 +141,11 @@ public class BinaryHeap { node.heapIdx = index; } - public boolean isEmpty() { + public synchronized boolean isEmpty() { return this.size == 0; } - public Node[] getHeap() { + public synchronized Node[] getHeap() { Node[] nodes = new Node[this.size()]; System.arraycopy(this.heap, 0, nodes, 0, this.size()); return nodes; diff --git a/src/main/java/net/minecraft/world/level/pathfinder/FlyNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/FlyNodeEvaluator.java index b0bae04ab5a93dd4cf1eeeb02bed1e508e1f2913..d427735eff0056c171591709829d0bb76f7bb6f3 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/FlyNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/FlyNodeEvaluator.java @@ -1,6 +1,7 @@ package net.minecraft.world.level.pathfinder; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import java.util.EnumSet; import java.util.List; @@ -15,7 +16,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; public class FlyNodeEvaluator extends WalkNodeEvaluator { - private final Long2ObjectMap pathTypeByPosCache = new Long2ObjectOpenHashMap<>(); + private final Long2ObjectMap pathTypeByPosCache = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap<>()); private static final float SMALL_MOB_INFLATED_START_NODE_BOUNDING_BOX = 1.5F; private static final int MAX_START_NODE_CANDIDATES = 10; diff --git a/src/main/java/net/minecraft/world/level/pathfinder/NodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/NodeEvaluator.java index a8a2594b8f5b3ebf6a1f918c7d822ad35b051b17..c614bcfc2bbbbccc7c4aac9389d4780478e739d2 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/NodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/NodeEvaluator.java @@ -1,6 +1,7 @@ package net.minecraft.world.level.pathfinder; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; @@ -11,7 +12,7 @@ import net.minecraft.world.level.PathNavigationRegion; public abstract class NodeEvaluator { protected PathNavigationRegion level; protected Mob mob; - protected final Int2ObjectMap nodes = new Int2ObjectOpenHashMap<>(); + protected final Int2ObjectMap nodes = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>()); protected int entityWidth; protected int entityHeight; protected int entityDepth; diff --git a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java index a8af51a25b0f99c3a64d9150fdfcd6b818aa7581..cd2592552339a79361d2a4e7936731330e15f6fa 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java @@ -31,7 +31,7 @@ public class PathFinder { } @Nullable - public Path findPath(PathNavigationRegion world, Mob mob, Set positions, float followRange, int distance, float rangeMultiplier) { + public synchronized Path findPath(PathNavigationRegion world, Mob mob, Set positions, float followRange, int distance, float rangeMultiplier) { this.openSet.clear(); this.nodeEvaluator.prepare(world, mob); Node node = this.nodeEvaluator.getStart(); diff --git a/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java index 6084631b5b502279b84f190dc62fc76b770e368e..f526adbd31e65fc74af48f6137d293a7a7ceafbb 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java @@ -2,6 +2,7 @@ package net.minecraft.world.level.pathfinder; import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import java.util.Map; import javax.annotation.Nullable; @@ -17,7 +18,7 @@ import net.minecraft.world.level.material.FluidState; public class SwimNodeEvaluator extends NodeEvaluator { private final boolean allowBreaching; - private final Long2ObjectMap pathTypesByPosCache = new Long2ObjectOpenHashMap<>(); + private final Long2ObjectMap pathTypesByPosCache = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap<>()); public SwimNodeEvaluator(boolean canJumpOutOfWater) { this.allowBreaching = canJumpOutOfWater; diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java index 894881018c659d874f28f5744f0b8247cfecb1c1..ae06f7ef9c4b8147508984f8b46176de46171285 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java @@ -1,8 +1,10 @@ package net.minecraft.world.level.pathfinder; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanMaps; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import java.util.EnumSet; import javax.annotation.Nullable; @@ -33,8 +35,8 @@ public class WalkNodeEvaluator extends NodeEvaluator { public static final double SPACE_BETWEEN_WALL_POSTS = 0.5D; private static final double DEFAULT_MOB_JUMP_HEIGHT = 1.125D; protected float oldWaterCost; - private final Long2ObjectMap pathTypesByPosCache = new Long2ObjectOpenHashMap<>(); - private final Object2BooleanMap collisionCache = new Object2BooleanOpenHashMap<>(); + private final Long2ObjectMap pathTypesByPosCache = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap<>()); + private final Object2BooleanMap collisionCache = Object2BooleanMaps.synchronize(new Object2BooleanOpenHashMap<>()); @Override public void prepare(PathNavigationRegion cachedWorld, Mob entity) {