Citizens2/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinder.java

150 lines
5.5 KiB
Java
Raw Normal View History

package net.citizensnpcs.nms.v1_16_R3.util;
2020-06-25 11:24:32 +02:00
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;
2023-02-22 17:06:13 +01:00
2020-06-25 11:24:32 +02:00
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
2023-02-22 17:06:13 +01:00
2020-06-25 11:24:32 +02:00
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;
2020-06-25 11:24:32 +02:00
public class EntityPathfinder extends Pathfinder {
2020-06-25 11:24:32 +02:00
private final PathPoint[] a = new PathPoint[32];
private final int b;
private final EntityPathfinderNormal c;
2020-06-25 11:24:32 +02:00
private final Path d = new Path();
public EntityPathfinder(EntityPathfinderNormal var0, int var1) {
2020-06-25 11:24:32 +02:00
super(var0, var1);
this.c = var0;
this.b = var1;
}
@Override
public PathEntity a(ChunkCache var0, EntityInsentient var1, Set<BlockPosition> var2, float var3, int var4,
2020-06-25 11:24:32 +02:00
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) {
2020-06-25 11:24:32 +02:00
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) {
2020-08-13 06:54:45 +02:00
List<PathPoint> var3 = Lists.newArrayList();
2020-06-25 11:24:32 +02:00
PathPoint var4 = var0;
2020-08-13 06:54:45 +02:00
var3.add(0, var4);
2020-06-25 11:24:32 +02:00
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) {
2020-08-13 06:54:45 +02:00
Set<PathDestination> var5 = var1.keySet();
2020-06-25 11:24:32 +02:00
var0.e = 0.0F;
2020-08-13 06:54:45 +02:00
var0.f = a(var0, var5);
2020-06-25 11:24:32 +02:00
var0.g = var0.f;
this.d.a();
this.d.a(var0);
2020-08-13 06:54:45 +02:00
ImmutableSet immutableSet = ImmutableSet.of();
2020-06-25 11:24:32 +02:00
int var7 = 0;
Set<PathDestination> var8 = Sets.newHashSetWithExpectedSize(var5.size());
int var9 = (int) (this.b * var4);
2020-08-13 06:54:45 +02:00
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);
2020-06-25 11:24:32 +02:00
}
}
2020-08-13 06:54:45 +02:00
if (!var8.isEmpty())
2020-06-25 11:24:32 +02:00
break;
2020-08-13 06:54:45 +02:00
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);
2020-06-25 11:24:32 +02:00
}
}
}
}
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;
}
}
2020-08-13 06:54:45 +02:00
private float a(PathPoint var0, Set<PathDestination> var1) {
2020-06-25 11:24:32 +02:00
float var2 = Float.MAX_VALUE;
2020-08-13 06:54:45 +02:00
for (PathDestination var4 : var1) {
float var5 = var0.a(var4);
var4.a(var5, var0);
var2 = Math.min(var5, var2);
2020-06-25 11:24:32 +02:00
}
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));
}
}