use of net.minecraft.server.v1_13_R2.PathPoint in project Citizens2 by CitizensDev.
the class PlayerPathfinderNormal method a.
private PathPoint a(int var0, int var1, int var2, int var3, double var4, EnumDirection var6) {
PathPoint var7 = null;
BlockPosition var8 = new BlockPosition(var0, var1, var2);
double var9 = a(this.a, var8);
if (var9 - var4 > 1.125D) {
return null;
} else {
PathType var11 = this.a(this.b, var0, var1, var2);
float var12 = this.b.a(var11);
double var13 = this.b.getWidth() / 2.0D;
if (var12 >= 0.0F) {
var7 = this.a(var0, var1, var2);
var7.l = var11;
var7.k = Math.max(var7.k, var12);
}
if (var11 == PathType.WALKABLE) {
return var7;
} else {
if ((var7 == null || var7.k < 0.0F) && var3 > 0 && var11 != PathType.FENCE && var11 != PathType.TRAPDOOR) {
var7 = this.a(var0, var1 + 1, var2, var3 - 1, var4, var6);
if (var7 != null && (var7.l == PathType.OPEN || var7.l == PathType.WALKABLE) && this.b.getWidth() < 1.0F) {
double var15 = var0 - var6.getAdjacentX() + 0.5D;
double var17 = var2 - var6.getAdjacentZ() + 0.5D;
AxisAlignedBB var19 = new AxisAlignedBB(var15 - var13, a(this.a, (new BlockPosition(var15, var1 + 1, var17))) + 0.001D, var17 - var13, var15 + var13, this.b.getHeight() + a(this.a, (new BlockPosition(var7.a, var7.b, var7.c))) - 0.002D, var17 + var13);
if (!this.a.getCubes(this.b, var19)) {
var7 = null;
}
}
}
if (var11 == PathType.WATER && !this.e()) {
if (this.a(this.b, var0, var1 - 1, var2) != PathType.WATER) {
return var7;
}
while (var1 > 0) {
--var1;
var11 = this.a(this.b, var0, var1, var2);
if (var11 != PathType.WATER) {
return var7;
}
var7 = this.a(var0, var1, var2);
var7.l = var11;
var7.k = Math.max(var7.k, this.b.a(var11));
}
}
if (var11 == PathType.OPEN) {
AxisAlignedBB var15 = new AxisAlignedBB(var0 - var13 + 0.5D, var1 + 0.001D, var2 - var13 + 0.5D, var0 + var13 + 0.5D, var1 + this.b.getHeight(), var2 + var13 + 0.5D);
if (!this.a.getCubes(this.b, var15)) {
return null;
}
if (this.b.getWidth() >= 1.0F) {
PathType var16 = this.a(this.b, var0, var1 - 1, var2);
if (var16 == PathType.BLOCKED) {
var7 = this.a(var0, var1, var2);
var7.l = PathType.WALKABLE;
var7.k = Math.max(var7.k, var12);
return var7;
}
}
int var16 = 0;
int var17 = var1;
while (var11 == PathType.OPEN) {
--var1;
PathPoint var18;
if (var1 < 0) {
var18 = this.a(var0, var17, var2);
var18.l = PathType.BLOCKED;
var18.k = -1.0F;
return var18;
}
var18 = this.a(var0, var1, var2);
if (var16++ >= Setting.MC_NAVIGATION_MAX_FALL_DISTANCE.asInt()) {
var18.l = PathType.BLOCKED;
var18.k = -1.0F;
return var18;
}
var11 = this.a(this.b, var0, var1, var2);
var12 = this.b.a(var11);
if (var11 != PathType.OPEN && var12 >= 0.0F) {
var7 = var18;
var18.l = var11;
var18.k = Math.max(var18.k, var12);
break;
}
if (var12 < 0.0F) {
var18.l = PathType.BLOCKED;
var18.k = -1.0F;
return var18;
}
}
}
return var7;
}
}
}
use of net.minecraft.server.v1_13_R2.PathPoint in project Citizens2 by CitizensDev.
the class PlayerNavigation method superF_.
protected void superF_() {
if (this.c != null) {
for (int var0 = 0; var0 < this.c.e(); ++var0) {
PathPoint var1 = this.c.a(var0);
PathPoint var2 = var0 + 1 < this.c.e() ? this.c.a(var0 + 1) : null;
IBlockData var3 = this.b.getType(new BlockPosition(var1.a, var1.b, var1.c));
Block var4 = var3.getBlock();
if (var4 == Blocks.CAULDRON) {
this.c.a(var0, var1.a(var1.a, var1.b + 1, var1.c));
if (var2 != null && var1.b >= var2.b) {
this.c.a(var0 + 1, var2.a(var2.a, var1.b + 1, var2.c));
}
}
}
}
}
use of net.minecraft.server.v1_13_R2.PathPoint in project Citizens2 by CitizensDev.
the class NMSImpl method getTargetNavigator.
private MCNavigator getTargetNavigator(final org.bukkit.entity.Entity entity, final NavigatorParameters params, final Function<NavigationAbstract, Boolean> function) {
net.minecraft.server.v1_16_R3.Entity raw = getHandle(entity);
raw.setOnGround(true);
// not sure of a better way around this - if onGround is false, then
// navigation won't execute, and calling entity.move doesn't
// entirely fix the problem.
final NavigationAbstract navigation = NMSImpl.getNavigation(entity);
final float oldWater = raw instanceof EntityPlayer ? ((EntityHumanNPC) raw).a(PathType.WATER) : ((EntityInsentient) raw).a(PathType.WATER);
if (params.avoidWater() && oldWater >= 0) {
if (raw instanceof EntityPlayer) {
((EntityHumanNPC) raw).a(PathType.WATER, oldWater + 1F);
} else {
((EntityInsentient) raw).a(PathType.WATER, oldWater + 1F);
}
}
return new MCNavigator() {
float lastSpeed;
CancelReason reason;
@Override
public CancelReason getCancelReason() {
return reason;
}
@Override
public Iterable<Vector> getPath() {
return new NavigationIterable(navigation);
}
@Override
public void stop() {
if (params.debug() && navigation.k() != null) {
for (Player player : Bukkit.getOnlinePlayers()) {
for (int i = 0; i < navigation.k().e(); i++) {
PathPoint pp = navigation.k().a(i);
org.bukkit.block.Block block = new Vector(pp.a, pp.b, pp.c).toLocation(player.getWorld()).getBlock();
player.sendBlockChange(block.getLocation(), block.getBlockData());
}
}
}
if (oldWater >= 0) {
if (raw instanceof EntityPlayer) {
((EntityHumanNPC) raw).a(PathType.WATER, oldWater);
} else {
((EntityInsentient) raw).a(PathType.WATER, oldWater);
}
}
stopNavigation(navigation);
}
@Override
public boolean update() {
if (params.speed() != lastSpeed) {
if (Messaging.isDebugging() && lastSpeed > 0) {
Messaging.debug("Repathfinding " + ((NPCHolder) entity).getNPC().getId() + " due to speed change from", lastSpeed, "to", params.speed());
}
Entity handle = getHandle(entity);
EntitySize size = null;
try {
size = (EntitySize) SIZE_FIELD_GETTER.invoke(handle);
if (handle instanceof EntityHorse) {
SIZE_FIELD_SETTER.invoke(handle, new EntitySize(Math.min(0.99F, size.width), size.height, false));
}
} catch (Throwable e) {
e.printStackTrace();
}
if (!function.apply(navigation)) {
reason = CancelReason.STUCK;
}
try {
SIZE_FIELD_SETTER.invoke(handle, size);
} catch (Throwable e) {
e.printStackTrace();
// minecraft requires that an entity fit onto both blocks if width >= 1f, but we'd prefer to
// make it just fit on 1 so hack around it a bit.
}
lastSpeed = params.speed();
}
if (params.debug() && !NMSImpl.isNavigationFinished(navigation)) {
BlockData data = Material.DANDELION.createBlockData();
for (Player player : Bukkit.getOnlinePlayers()) {
for (int i = 0; i < navigation.k().e(); i++) {
PathPoint pp = navigation.k().a(i);
player.sendBlockChange(new Vector(pp.a, pp.b, pp.c).toLocation(player.getWorld()), data);
}
}
}
navigation.a((double) params.speed());
return NMSImpl.isNavigationFinished(navigation);
}
};
}
use of net.minecraft.server.v1_13_R2.PathPoint in project Citizens2 by CitizensDev.
the class NMSImpl method getTargetNavigator.
@Override
public MCNavigator getTargetNavigator(org.bukkit.entity.Entity entity, Iterable<Vector> dest, final NavigatorParameters params) {
List<PathPoint> list = Lists.<PathPoint>newArrayList(Iterables.<Vector, PathPoint>transform(dest, new Function<Vector, PathPoint>() {
@Override
public PathPoint apply(Vector input) {
return new PathPoint(input.getBlockX(), input.getBlockY(), input.getBlockZ());
}
}));
PathPoint last = list.size() > 0 ? list.get(list.size() - 1) : null;
final PathEntity path = new PathEntity(list, last != null ? new BlockPosition(last.a, last.b, last.c) : null, true);
return getTargetNavigator(entity, params, new Function<NavigationAbstract, Boolean>() {
@Override
public Boolean apply(NavigationAbstract input) {
return input.a(path, params.speed());
}
});
}
use of net.minecraft.server.v1_13_R2.PathPoint in project Citizens2 by CitizensDev.
the class PlayerPathfinder method a.
@Override
public PathEntity a(IWorldReader var0, EntityInsentient var1, Set<BlockPosition> var2, float var3, int var4) {
this.a.a();
this.e.a(var0, var1);
PathPoint var5 = this.e.b();
Map var6 = var2.stream().collect(Collectors.toMap((var0x) -> {
return this.e.a((double) var0x.getX(), (double) var0x.getY(), (double) var0x.getZ());
}, Function.identity()));
PathEntity var7 = this.a(var5, var6, var3, var4);
this.e.a();
return var7;
}
Aggregations