Citizens2/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/PlayerPathfinderNormal.java

210 lines
9.2 KiB
Java

package net.citizensnpcs.nms.v1_8_R3.util;
import net.minecraft.server.v1_8_R3.Block;
import net.minecraft.server.v1_8_R3.BlockCobbleWall;
import net.minecraft.server.v1_8_R3.BlockDoor;
import net.minecraft.server.v1_8_R3.BlockFence;
import net.minecraft.server.v1_8_R3.BlockFenceGate;
import net.minecraft.server.v1_8_R3.BlockMinecartTrackAbstract;
import net.minecraft.server.v1_8_R3.BlockPosition;
import net.minecraft.server.v1_8_R3.Blocks;
import net.minecraft.server.v1_8_R3.Entity;
import net.minecraft.server.v1_8_R3.IBlockAccess;
import net.minecraft.server.v1_8_R3.Material;
import net.minecraft.server.v1_8_R3.MathHelper;
import net.minecraft.server.v1_8_R3.PathPoint;
public class PlayerPathfinderNormal extends PlayerPathfinderAbstract {
private boolean f;
private boolean g;
private boolean h;
private boolean i;
private boolean j;
@Override
public void a() {
super.a();
this.h = this.j;
}
public void a(boolean paramBoolean) {
this.f = paramBoolean;
}
@Override
public PathPoint a(Entity paramEntity) {
int k;
if (this.i && paramEntity.V()) {
k = (int) paramEntity.getBoundingBox().b;
BlockPosition.MutableBlockPosition localMutableBlockPosition = new BlockPosition.MutableBlockPosition(
MathHelper.floor(paramEntity.locX), k, MathHelper.floor(paramEntity.locZ));
Block localBlock = this.a.getType(localMutableBlockPosition).getBlock();
while (localBlock == Blocks.FLOWING_WATER || localBlock == Blocks.WATER) {
k++;
localMutableBlockPosition.c(MathHelper.floor(paramEntity.locX), k, MathHelper.floor(paramEntity.locZ));
localBlock = this.a.getType(localMutableBlockPosition).getBlock();
}
this.h = false;
} else {
k = MathHelper.floor(paramEntity.getBoundingBox().b + 0.5D);
}
return a(MathHelper.floor(paramEntity.getBoundingBox().a), k, MathHelper.floor(paramEntity.getBoundingBox().c));
}
@Override
public PathPoint a(Entity paramEntity, double paramDouble1, double paramDouble2, double paramDouble3) {
return a(MathHelper.floor(paramDouble1 - paramEntity.width / 2.0F), MathHelper.floor(paramDouble2),
MathHelper.floor(paramDouble3 - paramEntity.width / 2.0F));
}
private int a(Entity paramEntity, int paramInt1, int paramInt2, int paramInt3) {
return a(this.a, paramEntity, paramInt1, paramInt2, paramInt3, this.c, this.d, this.e, this.h, this.g, this.f);
}
private PathPoint a(Entity paramEntity, int paramInt1, int paramInt2, int paramInt3, int paramInt4) {
PathPoint localPathPoint = null;
int k = a(paramEntity, paramInt1, paramInt2, paramInt3);
if (k == 2)
return a(paramInt1, paramInt2, paramInt3);
if (k == 1) {
localPathPoint = a(paramInt1, paramInt2, paramInt3);
}
if (localPathPoint == null && paramInt4 > 0 && k != -3 && k != -4
&& a(paramEntity, paramInt1, paramInt2 + paramInt4, paramInt3) == 1) {
localPathPoint = a(paramInt1, paramInt2 + paramInt4, paramInt3);
paramInt2 += paramInt4;
}
if (localPathPoint != null) {
int m = 0;
int n = 0;
while (paramInt2 > 0) {
n = a(paramEntity, paramInt1, paramInt2 - 1, paramInt3);
if (this.h && n == -1)
return null;
if (n == 1) {
if (m++ >= paramEntity.aE())
return null;
paramInt2--;
if (paramInt2 > 0) {
localPathPoint = a(paramInt1, paramInt2, paramInt3);
} else
return null;
} else {
break;
}
}
if (n == -2)
return null;
}
return localPathPoint;
}
@Override
public void a(IBlockAccess paramIBlockAccess, Entity paramEntity) {
super.a(paramIBlockAccess, paramEntity);
this.j = this.h;
}
@Override
public int a(PathPoint[] paramArrayOfPathPoint, Entity paramEntity, PathPoint paramPathPoint1,
PathPoint paramPathPoint2, float paramFloat) {
int k = 0;
int m = 0;
if (a(paramEntity, paramPathPoint1.a, paramPathPoint1.b + 1, paramPathPoint1.c) == 1) {
m = 1;
}
PathPoint localPathPoint1 = a(paramEntity, paramPathPoint1.a, paramPathPoint1.b, paramPathPoint1.c + 1, m);
PathPoint localPathPoint2 = a(paramEntity, paramPathPoint1.a - 1, paramPathPoint1.b, paramPathPoint1.c, m);
PathPoint localPathPoint3 = a(paramEntity, paramPathPoint1.a + 1, paramPathPoint1.b, paramPathPoint1.c, m);
PathPoint localPathPoint4 = a(paramEntity, paramPathPoint1.a, paramPathPoint1.b, paramPathPoint1.c - 1, m);
if (localPathPoint1 != null && !localPathPoint1.i && localPathPoint1.a(paramPathPoint2) < paramFloat) {
paramArrayOfPathPoint[k++] = localPathPoint1;
}
if (localPathPoint2 != null && !localPathPoint2.i && localPathPoint2.a(paramPathPoint2) < paramFloat) {
paramArrayOfPathPoint[k++] = localPathPoint2;
}
if (localPathPoint3 != null && !localPathPoint3.i && localPathPoint3.a(paramPathPoint2) < paramFloat) {
paramArrayOfPathPoint[k++] = localPathPoint3;
}
if (localPathPoint4 != null && !localPathPoint4.i && localPathPoint4.a(paramPathPoint2) < paramFloat) {
paramArrayOfPathPoint[k++] = localPathPoint4;
}
return k;
}
public boolean b() {
return this.f;
}
public void b(boolean paramBoolean) {
this.g = paramBoolean;
}
public void c(boolean paramBoolean) {
this.h = paramBoolean;
}
public boolean d() {
return this.i;
}
public void d(boolean paramBoolean) {
this.i = paramBoolean;
}
public boolean e() {
return this.h;
}
public static int a(IBlockAccess paramIBlockAccess, Entity paramEntity, int paramInt1, int paramInt2, int paramInt3,
int paramInt4, int paramInt5, int paramInt6, boolean paramBoolean1, boolean paramBoolean2,
boolean paramBoolean3) {
int k = 0;
BlockPosition localBlockPosition = new BlockPosition(paramEntity);
BlockPosition.MutableBlockPosition localMutableBlockPosition = new BlockPosition.MutableBlockPosition();
for (int m = paramInt1; m < paramInt1 + paramInt4; m++) {
for (int n = paramInt2; n < paramInt2 + paramInt5; n++) {
for (int i1 = paramInt3; i1 < paramInt3 + paramInt6; i1++) {
localMutableBlockPosition.c(m, n, i1);
Block localBlock = paramIBlockAccess.getType(localMutableBlockPosition).getBlock();
if (localBlock.getMaterial() != Material.AIR) {
if (localBlock == Blocks.TRAPDOOR || localBlock == Blocks.IRON_TRAPDOOR) {
k = 1;
} else if (localBlock == Blocks.FLOWING_WATER || localBlock == Blocks.WATER) {
if (paramBoolean1)
return -1;
k = 1;
} else if (!paramBoolean3 && localBlock instanceof BlockDoor
&& localBlock.getMaterial() == Material.WOOD)
return 0;
if (paramEntity.world.getType(localMutableBlockPosition)
.getBlock() instanceof BlockMinecartTrackAbstract) {
if (!(paramEntity.world.getType(localBlockPosition)
.getBlock() instanceof BlockMinecartTrackAbstract)
&& !(paramEntity.world.getType(localBlockPosition.down())
.getBlock() instanceof BlockMinecartTrackAbstract))
return -3;
} else if (!localBlock.b(paramIBlockAccess, localMutableBlockPosition)) {
if (!paramBoolean2 || !(localBlock instanceof BlockDoor)
|| localBlock.getMaterial() != Material.WOOD) {
if (localBlock instanceof BlockFence || localBlock instanceof BlockFenceGate
|| localBlock instanceof BlockCobbleWall)
return -3;
if (localBlock == Blocks.TRAPDOOR || localBlock == Blocks.IRON_TRAPDOOR)
return -4;
Material localMaterial = localBlock.getMaterial();
if (localMaterial == Material.LAVA) {
if (!paramEntity.ab())
return -2;
} else
return 0;
}
}
}
}
}
}
return k != 0 ? 2 : 1;
}
}