Try redoing 1.19.4 minecraft navigation as first step

This commit is contained in:
fullwall 2024-08-31 00:54:14 +08:00
parent ceb8d10cd2
commit 5e6dabe825
9 changed files with 223 additions and 176 deletions

View File

@ -208,7 +208,7 @@ public class EntityNavigation extends NavigationAbstract {
if (this.c != null && !this.c.c() && var0.contains(this.p))
return this.c;
this.b.getMethodProfiler().enter("pathfind");
float var4 = (float) this.a.b(GenericAttributes.FOLLOW_RANGE);
float var4 = (float) this.followRange.getValue();
BlockPosition var5 = var2 ? this.a.getChunkCoordinates().up() : this.a.getChunkCoordinates();
int var6 = (int) (var4 + var1);
ChunkCache var7 = new ChunkCache(this.b, var5.b(-var6, -var6, -var6), var5.b(var6, var6, var6));

View File

@ -227,7 +227,7 @@ public class EntityNavigation extends PathNavigation {
@Override
protected Path createPath(Set<BlockPos> var0, int var1, boolean var2, int var3) {
return createPath(var0, var1, var2, var3, (float) this.mob.getAttributeValue(Attributes.FOLLOW_RANGE));
return createPath(var0, var1, var2, var3, (float) this.followRange.getValue());
}
@Override

View File

@ -156,7 +156,7 @@ public class EntityNavigation extends PathNavigation {
}
return true;
}
private boolean canWalkOn(int var0, int var1, int var2, int var3, int var4, int var5, Vec3 var6, double var7,
double var9) {
int var11 = var0 - var3 / 2;
@ -226,7 +226,7 @@ public class EntityNavigation extends PathNavigation {
@Override
protected Path createPath(Set<BlockPos> var0, int var1, boolean var2, int var3) {
return createPath(var0, var1, var2, var3, (float) this.mob.getAttributeValue(Attributes.FOLLOW_RANGE));
return createPath(var0, var1, var2, var3, (float) this.followRange.getValue());
}
@Override

View File

@ -93,38 +93,38 @@ public class EntityMoveControl extends MoveControl {
@Override
public void tick() {
this.entity.zza = 0;
if (this.moving) {
this.moving = false;
double dX = this.tx - this.entity.getX();
double dZ = this.tz - this.entity.getZ();
double dY = this.ty - this.entity.getY();
double dXZ = Math.sqrt(dX * dX + dZ * dZ);
double dXYZ = Math.sqrt(dX * dX + dY * dY + dZ * dZ);
if (dXYZ < 2.500000277905201E-7)
// this.entity.zza = 0.0F;
return;
if (dXZ > 0.4) {
float f = (float) Math.toDegrees(Mth.atan2(dZ, dX)) - 90.0F;
entity.setYRot(rotlerp(this.entity.getYRot(), f, 90.0F));
NMS.setHeadYaw(entity.getBukkitEntity(), entity.getYRot());
}
this.entity.zza = (float) (this.speedMod * entity.getAttribute(Attributes.MOVEMENT_SPEED).getBaseValue());
if (entity instanceof Slime && jumpTicks-- <= 0) {
this.jumpTicks = new Random().nextInt(20) + 10;
if (((Slime) entity).isAggressive()) {
this.jumpTicks /= 3;
}
((Slime) entity).getJumpControl().jump();
return;
}
BlockPos pos = entity.blockPosition();
BlockState bs = entity.level.getBlockState(pos);
VoxelShape vs = bs.getCollisionShape(entity.level, pos);
if (dY >= entity.maxUpStep() && dXZ < Math.max(1.0F, entity.getBbWidth())
|| !vs.isEmpty() && entity.getY() < vs.max(Axis.Y) + pos.getY() && !bs.is(BlockTags.DOORS)
&& !bs.is(BlockTags.FENCES)) {
NMS.setShouldJump(entity.getBukkitEntity());
if (!this.moving)
return;
this.moving = false;
double dX = this.tx - this.entity.getX();
double dZ = this.tz - this.entity.getZ();
double dY = this.ty - this.entity.getY();
double dXZ = Math.sqrt(dX * dX + dZ * dZ);
double dXYZ = Math.sqrt(dX * dX + dY * dY + dZ * dZ);
if (dXYZ < 2.500000277905201E-7)
// this.entity.zza = 0.0F;
return;
if (dXZ > 0.4) {
float f = (float) Math.toDegrees(Mth.atan2(dZ, dX)) - 90.0F;
entity.setYRot(rotlerp(this.entity.getYRot(), f, 90.0F));
NMS.setHeadYaw(entity.getBukkitEntity(), entity.getYRot());
}
this.entity.zza = (float) (this.speedMod * entity.getAttribute(Attributes.MOVEMENT_SPEED).getBaseValue());
if (entity instanceof Slime && jumpTicks-- <= 0) {
this.jumpTicks = new Random().nextInt(20) + 10;
if (((Slime) entity).isAggressive()) {
this.jumpTicks /= 3;
}
((Slime) entity).getJumpControl().jump();
return;
}
BlockPos pos = entity.blockPosition();
BlockState bs = entity.level.getBlockState(pos);
VoxelShape vs = bs.getCollisionShape(entity.level, pos);
if (dY >= entity.maxUpStep() && dXZ < Math.max(1.0F, entity.getBbWidth()) || !vs.isEmpty()
&& entity.getY() < vs.max(Axis.Y) + pos.getY() && !bs.is(BlockTags.DOORS) && !bs.is(BlockTags.FENCES)) {
NMS.setShouldJump(entity.getBukkitEntity());
}
}
}

View File

@ -65,9 +65,9 @@ public class EntityNavigation extends PathNavigation {
}
@Override
public boolean canCutCorner(BlockPathTypes pathtype) {
return pathtype != BlockPathTypes.DANGER_FIRE && pathtype != BlockPathTypes.DANGER_POWDER_SNOW
&& pathtype != BlockPathTypes.DANGER_OTHER && pathtype != BlockPathTypes.WALKABLE_DOOR;
public boolean canCutCorner(BlockPathTypes var0) {
return var0 != BlockPathTypes.DANGER_FIRE && var0 != BlockPathTypes.DANGER_OTHER
&& var0 != BlockPathTypes.WALKABLE_DOOR;
}
@Override
@ -154,7 +154,7 @@ public class EntityNavigation extends PathNavigation {
}
return true;
}
private boolean canWalkOn(int var0, int var1, int var2, int var3, int var4, int var5, Vec3 var6, double var7,
double var9) {
int var11 = var0 - var3 / 2;
@ -184,27 +184,27 @@ public class EntityNavigation extends PathNavigation {
return true;
}*/ @Override
public Path createPath(BlockPos var0, int var1) {
BlockPos var2;
if (this.level.getBlockState(var0).isAir()) {
BlockPos var2 = var0.below();
while (var2.getY() > this.level.getMinBuildHeight() && this.level.getBlockState(var2).isAir()) {
var2 = var2.below();
for (var2 = var0.below(); var2.getY() > this.level.getMinBuildHeight()
&& this.level.getBlockState(var2).isAir(); var2 = var2.below()) {
}
if (var2.getY() > this.level.getMinBuildHeight())
if (var2.getY() > this.level.getMinBuildHeight()) {
return supercreatePath(var2.above(), var1);
}
while (var2.getY() < this.level.getMaxBuildHeight() && this.level.getBlockState(var2).isAir()) {
var2 = var2.above();
}
var0 = var2;
}
if (this.level.getBlockState(var0).getMaterial().isSolid()) {
BlockPos var2 = var0.above();
while (var2.getY() < this.level.getMaxBuildHeight()
&& this.level.getBlockState(var2).getMaterial().isSolid()) {
var2 = var2.above();
if (!this.level.getBlockState(var0).getMaterial().isSolid()) {
return supercreatePath(var0, var1);
} else {
for (var2 = var0.above(); var2.getY() < this.level.getMaxBuildHeight()
&& this.level.getBlockState(var2).getMaterial().isSolid(); var2 = var2.above()) {
}
return supercreatePath(var2, var1);
}
return supercreatePath(var0, var1);
}
@Override
@ -224,28 +224,34 @@ public class EntityNavigation extends PathNavigation {
@Override
protected Path createPath(Set<BlockPos> var0, int var1, boolean var2, int var3) {
return createPath(var0, var1, var2, var3, (float) this.mob.getAttributeValue(Attributes.FOLLOW_RANGE));
return createPath(var0, var1, var2, var3, (float) followRange.getValue());
}
@Override
protected Path createPath(Set<BlockPos> var0, int var1, boolean var2, int var3, float var4) {
if (var0.isEmpty() || this.mob.getY() < this.level.getMinBuildHeight() || !canUpdatePath())
if (var0.isEmpty()) {
return null;
if (this.path != null && !this.path.isDone() && var0.contains(this.targetPos))
} else if (this.mob.getY() < this.level.getMinBuildHeight()) {
return null;
} else if (!this.canUpdatePath()) {
return null;
} else if (this.path != null && !this.path.isDone() && var0.contains(this.targetPos)) {
return this.path;
this.level.getProfiler().push("pathfind");
BlockPos var5 = var2 ? this.mob.blockPosition().above() : this.mob.blockPosition();
int var6 = (int) (var4 + var1);
PathNavigationRegion var7 = new PathNavigationRegion(this.level, var5.offset(-var6, -var6, -var6),
var5.offset(var6, var6, var6));
Path var8 = this.pathFinder.findPath(var7, this.mob, var0, var4, var3, this.maxVisitedNodesMultiplier);
this.level.getProfiler().pop();
if (var8 != null && var8.getTarget() != null) {
this.targetPos = var8.getTarget();
this.reachRange = var3;
this.resetStuckTimeout();
} else {
this.level.getProfiler().push("pathfind");
BlockPos var5 = var2 ? this.mob.blockPosition().above() : this.mob.blockPosition();
int var6 = (int) (var4 + var1);
PathNavigationRegion var7 = new PathNavigationRegion(this.level, var5.offset(-var6, -var6, -var6),
var5.offset(var6, var6, var6));
Path var8 = this.pathFinder.findPath(var7, this.mob, var0, var4, var3, this.maxVisitedNodesMultiplier);
this.level.getProfiler().pop();
if (var8 != null && var8.getTarget() != null) {
this.targetPos = var8.getTarget();
this.reachRange = var3;
this.resetStuckTimeout();
}
return var8;
}
return var8;
}
@Override
@ -261,9 +267,11 @@ public class EntityNavigation extends PathNavigation {
@Override
protected void doStuckDetection(Vec3 var0) {
if (this.tick - this.lastStuckCheck > 100) {
if (var0.distanceToSqr(this.lastStuckCheckPos) < 2.25D) {
float var1 = this.mob.getSpeed() >= 1.0F ? this.mob.getSpeed() : this.mob.getSpeed() * this.mob.getSpeed();
float var2 = var1 * 100.0F * 0.25F;
if (var0.distanceToSqr(this.lastStuckCheckPos) < var2 * var2) {
this.isStuck = true;
stop();
this.stop();
} else {
this.isStuck = false;
}
@ -271,35 +279,43 @@ public class EntityNavigation extends PathNavigation {
this.lastStuckCheckPos = var0;
}
if (this.path != null && !this.path.isDone()) {
BlockPos blockPos = this.path.getNextNodePos();
if (blockPos.equals(this.timeoutCachedNode)) {
this.timeoutTimer += System.currentTimeMillis() - this.lastTimeoutCheck;
Vec3i var1 = this.path.getNextNodePos();
long var2 = this.level.getGameTime();
if (var1.equals(this.timeoutCachedNode)) {
this.timeoutTimer += var2 - this.lastTimeoutCheck;
} else {
this.timeoutCachedNode = blockPos;
double var2 = var0.distanceTo(Vec3.atBottomCenterOf(this.timeoutCachedNode));
this.timeoutLimit = this.mob.getSpeed() > 0.0F ? var2 / this.mob.getSpeed() * 1000.0D : 0.0D;
this.timeoutCachedNode = var1;
double var4 = var0.distanceTo(Vec3.atBottomCenterOf(this.timeoutCachedNode));
this.timeoutLimit = this.mob.getSpeed() > 0.0F ? var4 / this.mob.getSpeed() * 20.0 : 0.0;
}
if (this.timeoutLimit > 0.0D && this.timeoutTimer > this.timeoutLimit * 3.0D) {
timeoutPath();
if (this.timeoutLimit > 0.0 && this.timeoutTimer > this.timeoutLimit * 3.0) {
this.timeoutPath();
}
this.lastTimeoutCheck = System.currentTimeMillis();
this.lastTimeoutCheck = var2;
}
}
@Override
protected void followThePath() {
Vec3 var0 = getTempMobPos();
Vec3 var0 = this.getTempMobPos();
this.maxDistanceToWaypoint = this.mob.getBbWidth() > 0.75F ? this.mob.getBbWidth() / 2.0F
: 0.75F - this.mob.getBbWidth() / 2.0F;
BlockPos blockPos = this.path.getNextNodePos();
double var2 = Math.abs(this.mob.getX() - (blockPos.getX() + 0.5D));
double var4 = Math.abs(this.mob.getY() - blockPos.getY());
double var6 = Math.abs(this.mob.getZ() - (blockPos.getZ() + 0.5D));
boolean var8 = var2 < this.maxDistanceToWaypoint && var6 < this.maxDistanceToWaypoint && var4 < 1.0D;
if (var8 || canCutCorner(this.path.getNextNode().type) && shouldTargetNextNodeInDirection(var0)) {
Vec3i var1 = this.path.getNextNodePos();
double var2 = Math.abs(this.mob.getX() - (var1.getX() + 0.5));
double var4 = Math.abs(this.mob.getY() - var1.getY());
double var6 = Math.abs(this.mob.getZ() - (var1.getZ() + 0.5));
boolean var8 = var2 < this.maxDistanceToWaypoint && var6 < this.maxDistanceToWaypoint && var4 < 1.0;
if (var8 || this.canCutCorner(this.path.getNextNode().type) && this.shouldTargetNextNodeInDirection(var0)) {
this.path.advance();
}
doStuckDetection(var0);
this.doStuckDetection(var0);
}
@Override
protected double getGroundY(Vec3 var0) {
BlockPos var1 = BlockPos.containing(var0);
return this.level.getBlockState(var1.below()).isAir() ? var0.y
: EntityNodeEvaluator.getFloorLevel(this.level, var1);
}
@Override
@ -328,16 +344,17 @@ public class EntityNavigation extends PathNavigation {
int var2 = 0;
do {
if (!var1.is(Blocks.WATER))
if (!var1.is(Blocks.WATER)) {
return var0;
}
++var0;
var1 = this.level.getBlockState(BlockPos.containing(this.mob.getX(), var0, this.mob.getZ()));
++var2;
} while (var2 <= 16);
return this.mob.getBlockY();
} else
} else {
return Mth.floor(this.mob.getY() + 0.5);
}
}
@Override
@ -351,10 +368,13 @@ public class EntityNavigation extends PathNavigation {
}
protected boolean hasValidPathType(BlockPathTypes var0) {
if (var0 == BlockPathTypes.WATER || var0 == BlockPathTypes.LAVA)
if (var0 == BlockPathTypes.WATER) {
return false;
else
} else if (var0 == BlockPathTypes.LAVA) {
return false;
} else {
return var0 != BlockPathTypes.OPEN;
}
}
@Override
@ -403,16 +423,19 @@ public class EntityNavigation extends PathNavigation {
if (!var0.sameAs(this.path)) {
this.path = var0;
}
if (isDone())
if (this.isDone()) {
return false;
trimPath();
if (this.path.getNodeCount() <= 0)
}
this.trimPath();
if (this.path.getNodeCount() <= 0) {
return false;
this.speedModifier = var1;
Vec3 var3 = getTempMobPos();
this.lastStuckCheck = this.tick;
this.lastStuckCheckPos = var3;
return true;
} else {
this.speedModifier = var1;
Vec3 var3 = this.getTempMobPos();
this.lastStuckCheck = this.tick;
this.lastStuckCheckPos = var3;
return true;
}
}
@Override
@ -474,13 +497,15 @@ public class EntityNavigation extends PathNavigation {
@Override
public boolean shouldRecomputePath(BlockPos var0) {
if (this.hasDelayedRecomputation || this.path == null || this.path.isDone() || this.path.getNodeCount() == 0)
if (this.hasDelayedRecomputation) {
return false;
else {
} else if (this.path != null && !this.path.isDone() && this.path.getNodeCount() != 0) {
Node var1 = this.path.getEndNode();
Vec3 var2 = new Vec3((var1.x + this.mob.getX()) / 2.0D, (var1.y + this.mob.getY()) / 2.0D,
(var1.z + this.mob.getZ()) / 2.0D);
Vec3 var2 = new Vec3((var1.x + this.mob.getX()) / 2.0, (var1.y + this.mob.getY()) / 2.0,
(var1.z + this.mob.getZ()) / 2.0);
return var0.closerToCenterThan(var2, this.path.getNodeCount() - this.path.getNextNodeIndex());
} else {
return false;
}
}

View File

@ -50,8 +50,9 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
for (int var4 = 1; var4 <= var3; ++var4) {
var1 = var1.move(var2);
if (this.hasCollisions(var1))
if (this.hasCollisions(var1)) {
return false;
}
}
return true;
}
@ -89,9 +90,9 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
Node var8 = null;
BlockPos.MutableBlockPos var9 = new BlockPos.MutableBlockPos();
double var10 = this.getFloorLevel(var9.set(var0, var1, var2));
if (var10 - var4 > this.getMobJumpHeight())
if (var10 - var4 > this.getMobJumpHeight()) {
return null;
else {
} else {
BlockPathTypes var12 = this.getCachedBlockType(this.mob, var0, var1, var2);
float var13 = this.mvmt.getPathfindingMalus(var12);
double var14 = this.mob.getBbWidth() / 2.0;
@ -103,6 +104,8 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
var8 = null;
}
if (var12 == BlockPathTypes.WALKABLE || this.isAmphibious() && var12 == BlockPathTypes.WATER) {
return var8;
} else {
if ((var8 == null || var8.costMalus < 0.0F) && var3 > 0
&& (var12 != BlockPathTypes.FENCE || this.canWalkOverFences())
&& var12 != BlockPathTypes.UNPASSABLE_RAIL && var12 != BlockPathTypes.TRAPDOOR
@ -125,15 +128,15 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
}
}
if (!this.isAmphibious() && var12 == BlockPathTypes.WATER && !this.canFloat()) {
if (this.getCachedBlockType(this.mob, var0, var1 - 1, var2) != BlockPathTypes.WATER)
if (this.getCachedBlockType(this.mob, var0, var1 - 1, var2) != BlockPathTypes.WATER) {
return var8;
}
while (var1 > this.mob.level.getMinBuildHeight()) {
--var1;
var12 = this.getCachedBlockType(this.mob, var0, var1, var2);
if (var12 != BlockPathTypes.WATER)
if (var12 != BlockPathTypes.WATER) {
return var8;
}
var8 = this.getNodeAndUpdateCostToMax(var0, var1, var2, var12,
this.mvmt.getPathfindingMalus(var12));
}
@ -144,20 +147,21 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
while (var12 == BlockPathTypes.OPEN) {
--var1;
if (var1 < this.mob.level.getMinBuildHeight())
if (var1 < this.mob.level.getMinBuildHeight()) {
return this.getBlockedNode(var0, var17, var2);
if (var16++ >= this.mob.getMaxFallDistance())
}
if (var16++ >= this.mob.getMaxFallDistance()) {
return this.getBlockedNode(var0, var1, var2);
}
var12 = this.getCachedBlockType(this.mob, var0, var1, var2);
var13 = this.mvmt.getPathfindingMalus(var12);
if (var12 != BlockPathTypes.OPEN && var13 >= 0.0F) {
var8 = this.getNodeAndUpdateCostToMax(var0, var1, var2, var12, var13);
break;
}
if (var13 < 0.0F)
if (var13 < 0.0F) {
return this.getBlockedNode(var0, var1, var2);
}
}
}
if (doesBlockHavePartialCollision(var12) && var8 == null) {
@ -166,8 +170,8 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
var8.type = var12;
var8.costMalus = var12.getMalus();
}
return var8;
}
return var8;
}
}
@ -187,27 +191,28 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
EnumSet var5 = EnumSet.noneOf(BlockPathTypes.class);
BlockPathTypes var6 = BlockPathTypes.BLOCKED;
var6 = this.getBlockPathTypes(var0, var1, var2, var3, var5, var6, var4.blockPosition());
if (var5.contains(BlockPathTypes.FENCE))
if (var5.contains(BlockPathTypes.FENCE)) {
return BlockPathTypes.FENCE;
else if (var5.contains(BlockPathTypes.UNPASSABLE_RAIL))
} else if (var5.contains(BlockPathTypes.UNPASSABLE_RAIL)) {
return BlockPathTypes.UNPASSABLE_RAIL;
else {
} else {
BlockPathTypes var7 = BlockPathTypes.BLOCKED;
Iterator var9 = var5.iterator();
while (var9.hasNext()) {
BlockPathTypes varr9 = (BlockPathTypes) var9.next();
if (mvmt.getPathfindingMalus(varr9) < 0.0F)
if (mvmt.getPathfindingMalus(varr9) < 0.0F) {
return varr9;
}
if (mvmt.getPathfindingMalus(varr9) >= mvmt.getPathfindingMalus(var7)) {
var7 = varr9;
}
}
if (var6 == BlockPathTypes.OPEN && mvmt.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1)
if (var6 == BlockPathTypes.OPEN && mvmt.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1) {
return BlockPathTypes.OPEN;
else
} else {
return var7;
}
}
}
@ -216,27 +221,28 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
EnumSet var5 = EnumSet.noneOf(BlockPathTypes.class);
BlockPathTypes var6 = BlockPathTypes.BLOCKED;
var6 = this.getBlockPathTypes(var0, var1, var2, var3, var5, var6, var4.blockPosition());
if (var5.contains(BlockPathTypes.FENCE))
if (var5.contains(BlockPathTypes.FENCE)) {
return BlockPathTypes.FENCE;
else if (var5.contains(BlockPathTypes.UNPASSABLE_RAIL))
} else if (var5.contains(BlockPathTypes.UNPASSABLE_RAIL)) {
return BlockPathTypes.UNPASSABLE_RAIL;
else {
} else {
BlockPathTypes var7 = BlockPathTypes.BLOCKED;
Iterator var9 = var5.iterator();
while (var9.hasNext()) {
BlockPathTypes varr9 = (BlockPathTypes) var9.next();
if (var4.getPathfindingMalus(varr9) < 0.0F)
if (mvmt.getPathfindingMalus(varr9) < 0.0F) {
return varr9;
if (var4.getPathfindingMalus(varr9) >= var4.getPathfindingMalus(var7)) {
}
if (mvmt.getPathfindingMalus(varr9) >= mvmt.getPathfindingMalus(var7)) {
var7 = varr9;
}
}
if (var6 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1)
if (var6 == BlockPathTypes.OPEN && mvmt.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1) {
return BlockPathTypes.OPEN;
else
} else {
return var7;
}
}
}
@ -377,8 +383,9 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
if (this.canStartAt(var1.set(var4.minX, var0, var4.minZ))
|| this.canStartAt(var1.set(var4.minX, var0, var4.maxZ))
|| this.canStartAt(var1.set(var4.maxX, var0, var4.minZ))
|| this.canStartAt(var1.set(var4.maxX, var0, var4.maxZ)))
|| this.canStartAt(var1.set(var4.maxX, var0, var4.maxZ))) {
return this.getStartNode(var1);
}
}
return this.getStartNode(new BlockPos(var3.getX(), var0, var3.getZ()));
}
@ -399,19 +406,25 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
}
protected boolean isDiagonalValid(Node var0, Node var1, Node var2, Node var3) {
if (var3 == null || var2 == null || var1 == null || var3.closed)
return false;
else if (var2.y <= var0.y && var1.y <= var0.y) {
if (var1.type != BlockPathTypes.WALKABLE_DOOR && var2.type != BlockPathTypes.WALKABLE_DOOR
&& var3.type != BlockPathTypes.WALKABLE_DOOR) {
boolean var4 = var2.type == BlockPathTypes.FENCE && var1.type == BlockPathTypes.FENCE
&& this.mob.getBbWidth() < 0.5;
return var3.costMalus >= 0.0F && (var2.y < var0.y || var2.costMalus >= 0.0F || var4)
&& (var1.y < var0.y || var1.costMalus >= 0.0F || var4);
} else
if (var3 != null && var2 != null && var1 != null) {
if (var3.closed) {
return false;
} else
} else if (var2.y <= var0.y && var1.y <= var0.y) {
if (var1.type != BlockPathTypes.WALKABLE_DOOR && var2.type != BlockPathTypes.WALKABLE_DOOR
&& var3.type != BlockPathTypes.WALKABLE_DOOR) {
boolean var4 = var2.type == BlockPathTypes.FENCE && var1.type == BlockPathTypes.FENCE
&& this.mob.getBbWidth() < 0.5;
return var3.costMalus >= 0.0F && (var2.y < var0.y || var2.costMalus >= 0.0F || var4)
&& (var1.y < var0.y || var1.costMalus >= 0.0F || var4);
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
protected boolean isNeighborValid(Node var0, Node var1) {
@ -546,7 +559,6 @@ public class EntityNodeEvaluator extends EntityNodeEvaluatorBase {
|| CampfireBlock.isLitCampfire(var0) || var0.is(Blocks.LAVA_CAULDRON);
}
private static final double DEFAULT_MOB_JUMP_HEIGHT = 1.125;
public static final double SPACE_BETWEEN_WALL_POSTS = 0.5;
}

View File

@ -1,14 +1,15 @@
package net.citizensnpcs.nms.v1_19_R3.util;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@ -61,55 +62,64 @@ public class EntityPathfinder extends PathFinder {
return var8;
}
private Path findPath(ProfilerFiller var0, Node var1, Map<Target, BlockPos> var2, float var3, int var4,
private Path findPath(ProfilerFiller var0, Node var1, Map<Target, BlockPos> var2, float range, int reachRange,
float var5) {
Set<Target> var6 = var2.keySet();
var1.g = 0.0F;
var1.h = getBestH(var1, var6);
var1.h = this.getBestH(var1, var6);
var1.f = var1.h;
this.openSet.clear();
this.openSet.insert(var1);
Set<Target> var7 = ImmutableSet.of();
int var8 = 0;
Set<Target> var9 = Sets.newHashSetWithExpectedSize(var6.size());
int var10 = (int) (this.maxVisitedNodes * var5);
while (!this.openSet.isEmpty() && ++var8 < var10) {
Node node = this.openSet.pop();
node.closed = true;
for (Target target : var6) {
if (node.distanceManhattan(target) <= var4) {
target.setReached();
var9.add(target);
while (!this.openSet.isEmpty()) {
++var8;
if (var8 >= var10) {
break;
}
Node var11 = this.openSet.pop();
var11.closed = true;
Iterator var13 = var6.iterator();
while (var13.hasNext()) {
Target var13t = (Target) var13.next();
if (var11.distanceManhattan(var13t) <= reachRange) {
var13t.setReached();
var9.add(var13t);
}
}
if (!var9.isEmpty()) {
break;
}
if (node.distanceTo(var1) >= var3) {
continue;
}
int i = this.nodeEvaluator.getNeighbors(this.neighbors, node);
for (int var13 = 0; var13 < i; var13++) {
Node var14 = this.neighbors[var13];
float var15 = node.distanceTo(var14);
node.walkedDistance += var15;
float var16 = node.g + var15 + var14.costMalus;
if (var14.walkedDistance < var3 && (!var14.inOpenSet() || var16 < var14.g)) {
var14.cameFrom = node;
var14.g = var16;
var14.h = getBestH(var14, var6) * 1.5F;
if (var14.inOpenSet()) {
this.openSet.changeCost(var14, var14.g + var14.h);
} else {
var14.f = var14.g + var14.h;
this.openSet.insert(var14);
if (var11.distanceTo(var1) < range) {
int var12 = this.nodeEvaluator.getNeighbors(this.neighbors, var11);
for (int i = 0; i < var12; ++i) {
Node var14 = this.neighbors[i];
float var15 = this.distance(var11, var14);
var14.walkedDistance = var11.walkedDistance + var15;
float var16 = var11.g + var15 + var14.costMalus;
if (var14.walkedDistance < range && (!var14.inOpenSet() || var16 < var14.g)) {
var14.cameFrom = var11;
var14.g = var16;
var14.h = this.getBestH(var14, var6) * 1.5F;
if (var14.inOpenSet()) {
this.openSet.changeCost(var14, var14.g + var14.h);
} else {
var14.f = var14.g + var14.h;
this.openSet.insert(var14);
}
}
}
}
}
Optional<Path> var11 = !var9.isEmpty()
? var9.stream().map(p -> reconstructPath(p.getBestNode(), var2.get(p), true)).min(
? var9.stream().map(var1x -> this.reconstructPath(var1x.getBestNode(), var2.get(var1x), true)).min(
Comparator.comparingInt(Path::getNodeCount))
: getFallbackDestinations(var2, var6).findFirst();
: getFallbackDestinations(var2, var6);
if (!var11.isPresent())
return null;
Path var12 = var11.get();
@ -126,11 +136,11 @@ public class EntityPathfinder extends PathFinder {
return var2;
}
public Stream<Path> getFallbackDestinations(Map<Target, BlockPos> var1, Set<Target> var5) {
public Optional<Path> getFallbackDestinations(Map<Target, BlockPos> var1, Set<Target> var5) {
if (Setting.DISABLE_MC_NAVIGATION_FALLBACK.asBoolean())
return Stream.empty();
return Optional.empty();
return var5.stream().map(var1x -> this.reconstructPath(var1x.getBestNode(), var1.get(var1x), false))
.sorted(Comparator.comparingDouble(Path::getDistToTarget).thenComparingInt(Path::getNodeCount));
.min(Comparator.comparingDouble(Path::getDistToTarget).thenComparingInt(Path::getNodeCount));
}
private Path reconstructPath(Node var0, BlockPos var1, boolean var2) {

View File

@ -189,7 +189,7 @@ public class EntityNavigation extends PathNavigation {
@Override
protected Path createPath(Set<BlockPos> var0, int var1, boolean var2, int reachRange) {
return createPath(var0, var1, var2, reachRange, (float) this.mob.getAttributeValue(Attributes.FOLLOW_RANGE));
return createPath(var0, var1, var2, reachRange, (float) this.followRange.getValue());
}
@Override

View File

@ -189,7 +189,7 @@ public class EntityNavigation extends PathNavigation {
@Override
protected Path createPath(Set<BlockPos> var0, int var1, boolean var2, int reachRange) {
return createPath(var0, var1, var2, reachRange, (float) this.mob.getAttributeValue(Attributes.FOLLOW_RANGE));
return createPath(var0, var1, var2, reachRange, (float) this.followRange.getValue());
}
@Override