150 lines
5.5 KiB
Java
150 lines
5.5 KiB
Java
package net.citizensnpcs.nms.v1_16_R3.util;
|
|
|
|
import java.util.Comparator;
|
|
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;
|
|
|
|
import net.citizensnpcs.Settings.Setting;
|
|
import net.minecraft.server.v1_16_R3.BlockPosition;
|
|
import net.minecraft.server.v1_16_R3.ChunkCache;
|
|
import net.minecraft.server.v1_16_R3.EntityInsentient;
|
|
import net.minecraft.server.v1_16_R3.EntityLiving;
|
|
import net.minecraft.server.v1_16_R3.Path;
|
|
import net.minecraft.server.v1_16_R3.PathDestination;
|
|
import net.minecraft.server.v1_16_R3.PathEntity;
|
|
import net.minecraft.server.v1_16_R3.PathPoint;
|
|
import net.minecraft.server.v1_16_R3.Pathfinder;
|
|
|
|
public class EntityPathfinder extends Pathfinder {
|
|
private final PathPoint[] a = new PathPoint[32];
|
|
private final int b;
|
|
private final EntityPathfinderNormal c;
|
|
private final Path d = new Path();
|
|
|
|
public EntityPathfinder(EntityPathfinderNormal var0, int var1) {
|
|
super(var0, var1);
|
|
this.c = var0;
|
|
this.b = var1;
|
|
}
|
|
|
|
@Override
|
|
public PathEntity a(ChunkCache var0, EntityInsentient var1, Set<BlockPosition> var2, float var3, int var4,
|
|
float var5) {
|
|
this.d.a();
|
|
this.c.a(var0, var1);
|
|
PathPoint var6 = this.c.b();
|
|
Map var7 = var2.stream().collect(Collectors.toMap((var0x) -> {
|
|
return this.c.a((double) var0x.getX(), (double) var0x.getY(), (double) var0x.getZ());
|
|
}, Function.identity()));
|
|
PathEntity var8 = this.a(var6, var7, var3, var4, var5);
|
|
this.c.a();
|
|
return var8;
|
|
}
|
|
|
|
public PathEntity a(ChunkCache var0, EntityLiving var1, Set<BlockPosition> var2, float var3, int var4, float var5) {
|
|
this.d.a();
|
|
this.c.a(var0, var1);
|
|
PathPoint var6 = this.c.b();
|
|
Map var7 = var2.stream().collect(Collectors.toMap((var0x) -> {
|
|
return this.c.a((double) var0x.getX(), (double) var0x.getY(), (double) var0x.getZ());
|
|
}, Function.identity()));
|
|
PathEntity var8 = this.a(var6, var7, var3, var4, var5);
|
|
this.c.a();
|
|
return var8;
|
|
}
|
|
|
|
private PathEntity a(PathPoint var0, BlockPosition var1, boolean var2) {
|
|
List<PathPoint> var3 = Lists.newArrayList();
|
|
PathPoint var4 = var0;
|
|
var3.add(0, var4);
|
|
while (var4.h != null) {
|
|
var4 = var4.h;
|
|
var3.add(0, var4);
|
|
}
|
|
return new PathEntity(var3, var1, var2);
|
|
}
|
|
|
|
private PathEntity a(PathPoint var0, Map var1, float var2, int var3, float var4) {
|
|
Set<PathDestination> var5 = var1.keySet();
|
|
var0.e = 0.0F;
|
|
var0.f = a(var0, var5);
|
|
var0.g = var0.f;
|
|
this.d.a();
|
|
this.d.a(var0);
|
|
ImmutableSet immutableSet = ImmutableSet.of();
|
|
int var7 = 0;
|
|
Set<PathDestination> var8 = Sets.newHashSetWithExpectedSize(var5.size());
|
|
int var9 = (int) (this.b * var4);
|
|
while (!this.d.e() && ++var7 < var9) {
|
|
PathPoint pathPoint = this.d.c();
|
|
pathPoint.i = true;
|
|
for (PathDestination pathDestination : var5) {
|
|
if (pathPoint.c(pathDestination) <= var3) {
|
|
pathDestination.e();
|
|
var8.add(pathDestination);
|
|
}
|
|
}
|
|
if (!var8.isEmpty())
|
|
break;
|
|
if (pathPoint.a(var0) >= var2)
|
|
continue;
|
|
int i = this.c.a(this.a, pathPoint);
|
|
for (int var12 = 0; var12 < i; var12++) {
|
|
PathPoint var13 = this.a[var12];
|
|
float var14 = pathPoint.a(var13);
|
|
pathPoint.j += var14;
|
|
float var15 = pathPoint.e + var14 + var13.k;
|
|
if (var13.j < var2 && (!var13.c() || var15 < var13.e)) {
|
|
var13.h = pathPoint;
|
|
var13.e = var15;
|
|
var13.f = a(var13, var5) * 1.5F;
|
|
if (var13.c()) {
|
|
this.d.a(var13, var13.e + var13.f);
|
|
} else {
|
|
var13.g = var13.e + var13.f;
|
|
this.d.a(var13);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Optional var10 = !var8.isEmpty() ? var8.stream().map((var1x) -> {
|
|
return this.a(var1x.d(), (BlockPosition) var1.get(var1x), true);
|
|
}).min(Comparator.comparingInt(PathEntity::e)) : getFallbackDestinations(var1, var5).findFirst();
|
|
if (!var10.isPresent()) {
|
|
return null;
|
|
} else {
|
|
PathEntity var11 = (PathEntity) var10.get();
|
|
return var11;
|
|
}
|
|
}
|
|
|
|
private float a(PathPoint var0, Set<PathDestination> var1) {
|
|
float var2 = Float.MAX_VALUE;
|
|
for (PathDestination var4 : var1) {
|
|
float var5 = var0.a(var4);
|
|
var4.a(var5, var0);
|
|
var2 = Math.min(var5, var2);
|
|
}
|
|
return var2;
|
|
}
|
|
|
|
public Stream<PathEntity> getFallbackDestinations(Map<PathDestination, BlockPosition> var1,
|
|
Set<PathDestination> var5) {
|
|
if (Setting.DISABLE_MC_NAVIGATION_FALLBACK.asBoolean()) {
|
|
return Stream.empty();
|
|
}
|
|
return var5.stream().map((var1x) -> {
|
|
return this.a(var1x.d(), var1.get(var1x), false);
|
|
}).sorted(Comparator.comparingDouble(PathEntity::n).thenComparingInt(PathEntity::e));
|
|
}
|
|
}
|