From ad43ef6000620a81cfd191ae9b60ab31b422b4da Mon Sep 17 00:00:00 2001 From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com> Date: Sat, 29 Jul 2023 22:57:38 +0200 Subject: [PATCH] Add async pathfinding to WaterBound mobs & Strider --- .../server/0043-Async-path-processing.patch | 115 +++++++++++++++--- 1 file changed, 99 insertions(+), 16 deletions(-) diff --git a/patches/server/0043-Async-path-processing.patch b/patches/server/0043-Async-path-processing.patch index 94a537c..8f2c0cc 100644 --- a/patches/server/0043-Async-path-processing.patch +++ b/patches/server/0043-Async-path-processing.patch @@ -420,22 +420,28 @@ index 0000000000000000000000000000000000000000..bfa6cf5aa317a56eadb77c3bda60c884 +} diff --git a/src/main/java/dev/kaiijumc/kaiiju/path/NodeEvaluatorFeatures.java b/src/main/java/dev/kaiijumc/kaiiju/path/NodeEvaluatorFeatures.java new file mode 100644 -index 0000000000000000000000000000000000000000..87b453ae5c7abc03c42a3401a976983438733edb +index 0000000000000000000000000000000000000000..640a38877b9f98f429284e2a3eb196e02ddb08be --- /dev/null +++ b/src/main/java/dev/kaiijumc/kaiiju/path/NodeEvaluatorFeatures.java -@@ -0,0 +1,33 @@ +@@ -0,0 +1,41 @@ +package dev.kaiijumc.kaiiju.path; + +import net.minecraft.world.level.pathfinder.NodeEvaluator; ++import net.minecraft.world.level.pathfinder.SwimNodeEvaluator; + -+public record NodeEvaluatorFeatures(boolean canPassDoors, boolean canFloat, boolean canWalkOverFences, boolean canOpenDoors) { ++public record NodeEvaluatorFeatures(boolean canPassDoors, ++ boolean canFloat, ++ boolean canWalkOverFences, ++ boolean canOpenDoors, ++ boolean allowBreaching) { + public static NodeEvaluatorFeatures fromLocalNodeEvaluator(NodeEvaluator localNodeEvaluator) { -+ return new NodeEvaluatorFeatures( -+ localNodeEvaluator.canPassDoors(), -+ localNodeEvaluator.canFloat(), -+ localNodeEvaluator.canWalkOverFences(), -+ localNodeEvaluator.canOpenDoors() -+ ); ++ boolean canPassDoors = localNodeEvaluator.canPassDoors(); ++ boolean canFloat = localNodeEvaluator.canFloat(); ++ boolean canWalkOverFences = localNodeEvaluator.canWalkOverFences(); ++ boolean canOpenDoors = localNodeEvaluator.canOpenDoors(); ++ boolean allowBreaching = localNodeEvaluator instanceof SwimNodeEvaluator swimNodeEvaluator && swimNodeEvaluator.allowBreaching; ++ ++ return new NodeEvaluatorFeatures(canPassDoors, canFloat, canWalkOverFences, canOpenDoors, allowBreaching); + } + + @Override @@ -443,18 +449,20 @@ index 0000000000000000000000000000000000000000..87b453ae5c7abc03c42a3401a9769834 + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NodeEvaluatorFeatures that = (NodeEvaluatorFeatures) o; -+ return canPassDoors == that.canPassDoors && -+ canFloat == that.canFloat && -+ canWalkOverFences == that.canWalkOverFences && -+ canOpenDoors == that.canOpenDoors; ++ return canPassDoors == that.canPassDoors ++ && canFloat == that.canFloat ++ && canWalkOverFences == that.canWalkOverFences ++ && canOpenDoors == that.canOpenDoors ++ && allowBreaching == that.allowBreaching; + } + + @Override + public int hashCode() { + return (canPassDoors ? 1 : 0) -+ + (canFloat ? 2 : 0) -+ + (canWalkOverFences ? 4 : 0) -+ + (canOpenDoors ? 8 : 0); ++ | (canFloat ? 2 : 0) ++ | (canWalkOverFences ? 4 : 0) ++ | (canOpenDoors ? 8 : 0) ++ | (allowBreaching ? 16 : 0); + } +} diff --git a/src/main/java/dev/kaiijumc/kaiiju/path/NodeEvaluatorGenerator.java b/src/main/java/dev/kaiijumc/kaiiju/path/NodeEvaluatorGenerator.java @@ -879,6 +887,37 @@ index 2549b81eb5fa1a021edac960170f5e0d513dae97..6ab583960167412a925095991827d781 Node node = this.path.getEndNode(); Vec3 vec3 = new Vec3(((double)node.x + this.mob.getX()) / 2.0D, ((double)node.y + this.mob.getY()) / 2.0D, ((double)node.z + this.mob.getZ()) / 2.0D); return pos.closerToCenterThan(vec3, (double)(this.path.getNodeCount() - this.path.getNextNodeIndex())); +diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java +index 87887916ff2f685346699989ba30c35ef7e5715f..e8b8abb31678517a89774d42710fe0973ce76f98 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java ++++ b/src/main/java/net/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation.java +@@ -15,10 +15,26 @@ public class WaterBoundPathNavigation extends PathNavigation { + super(entity, world); + } + ++ // Kaiiju start - petal - async path processing ++ private static final dev.kaiijumc.kaiiju.path.NodeEvaluatorGenerator nodeEvaluatorGenerator = (dev.kaiijumc.kaiiju.path.NodeEvaluatorFeatures nodeEvaluatorFeatures) -> { ++ SwimNodeEvaluator nodeEvaluator = new SwimNodeEvaluator(nodeEvaluatorFeatures.allowBreaching()); ++ nodeEvaluator.setCanPassDoors(nodeEvaluatorFeatures.canPassDoors()); ++ nodeEvaluator.setCanFloat(nodeEvaluatorFeatures.canFloat()); ++ nodeEvaluator.setCanWalkOverFences(nodeEvaluatorFeatures.canWalkOverFences()); ++ nodeEvaluator.setCanOpenDoors(nodeEvaluatorFeatures.canOpenDoors()); ++ return nodeEvaluator; ++ }; ++ // Kaiiju end ++ + @Override + protected PathFinder createPathFinder(int range) { + this.allowBreaching = this.mob.getType() == EntityType.DOLPHIN; + this.nodeEvaluator = new SwimNodeEvaluator(this.allowBreaching); ++ // Kaiiju start - async path processing ++ if (dev.kaiijumc.kaiiju.KaiijuConfig.asyncPathProcessing) ++ return new PathFinder(this.nodeEvaluator, range, nodeEvaluatorGenerator); ++ else ++ // Kaiiju end + return new PathFinder(this.nodeEvaluator, range); + } + diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java index 8db20db72cd51046213625fac46c35854c59ec5d..3eb5f87d2755727557b70d3910915ff4134b04bd 100644 --- a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java @@ -993,6 +1032,37 @@ index 991d728db2a3b64316fc2102cf3aee470327a62e..c99de04d082f7f9b08d25730460385c4 BlockPos blockposition = pathentity.getTarget(); if (blockposition != null) { +diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java +index ebf54d6e36fdee2833250816fae14195ac45eb67..367618db763f2f931451db4ead3d599ebd3bf5a2 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Strider.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java +@@ -565,10 +565,26 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { + super(entity, world); + } + ++ // Kaiiju start - petal - async path processing ++ private static final dev.kaiijumc.kaiiju.path.NodeEvaluatorGenerator nodeEvaluatorGenerator = (dev.kaiijumc.kaiiju.path.NodeEvaluatorFeatures nodeEvaluatorFeatures) -> { ++ WalkNodeEvaluator nodeEvaluator = new WalkNodeEvaluator(); ++ nodeEvaluator.setCanPassDoors(nodeEvaluatorFeatures.canPassDoors()); ++ nodeEvaluator.setCanFloat(nodeEvaluatorFeatures.canFloat()); ++ nodeEvaluator.setCanWalkOverFences(nodeEvaluatorFeatures.canWalkOverFences()); ++ nodeEvaluator.setCanOpenDoors(nodeEvaluatorFeatures.canOpenDoors()); ++ return nodeEvaluator; ++ }; ++ // Kaiiju end ++ + @Override + protected PathFinder createPathFinder(int range) { + this.nodeEvaluator = new WalkNodeEvaluator(); + this.nodeEvaluator.setCanPassDoors(true); ++ // Kaiiju start - async path processing ++ if (dev.kaiijumc.kaiiju.KaiijuConfig.asyncPathProcessing) ++ return new PathFinder(this.nodeEvaluator, range, nodeEvaluatorGenerator); ++ else ++ // Kaiiju end + return new PathFinder(this.nodeEvaluator, range); + } + diff --git a/src/main/java/net/minecraft/world/level/pathfinder/Path.java b/src/main/java/net/minecraft/world/level/pathfinder/Path.java index 2a335f277bd0e4b8ad0f60d8226eb8aaa80a871f..b2c3c459fae7d0cb5ef0fcbc2ff0e61c7b952087 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/Path.java @@ -1126,3 +1196,16 @@ index d23481453717f715124156b5d83f6448f720d049..00f2f9c8f6fa7f506146d8def594177b for(int l = 0; l < k; ++l) { Node node2 = this.neighbors[l]; +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 0e2b14e7dfedf209d63279c81723fd7955122d78..079b278e2e262af433bb5bd0c12b3d8db4fa12fc 100644 +--- a/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java ++++ b/src/main/java/net/minecraft/world/level/pathfinder/SwimNodeEvaluator.java +@@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.BlockState; + import net.minecraft.world.level.material.FluidState; + + public class SwimNodeEvaluator extends NodeEvaluator { +- private final boolean allowBreaching; ++ public final boolean allowBreaching; // Kaiiju - make this public + private final Long2ObjectMap pathTypesByPosCache = new Long2ObjectOpenHashMap<>(); + + public SwimNodeEvaluator(boolean canJumpOutOfWater) {