First pass at fall damage

This commit is contained in:
fullwall 2021-10-25 00:22:19 +08:00
parent 21e924f04c
commit 840f32469b
9 changed files with 107 additions and 34 deletions

View File

@ -71,7 +71,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private final CitizensNPC npc; private final CitizensNPC npc;
private final Location packetLocationCache = new Location(null, 0, 0, 0); private final Location packetLocationCache = new Location(null, 0, 0, 0);
private final SkinPacketTracker skinTracker; private final SkinPacketTracker skinTracker;
private int updateCounter = 0; private int updateCounter = 0;
public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile,
@ -152,7 +151,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
public void run() { public void run() {
world.removeEntity(EntityHumanNPC.this); world.removeEntity(EntityHumanNPC.this);
} }
}, 35); // give enough time for death and smoke animation }, 15); // give enough time for death and smoke animation
} }
@Override @Override
@ -284,7 +283,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
g(0, 0); moveWithFallDamage(0, 0);
} }
if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) { if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) {
motX = motY = motZ = 0; motX = motY = motZ = 0;
@ -351,13 +350,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
bf *= 0.98F; bf *= 0.98F;
bg *= 0.98F; bg *= 0.98F;
bh *= 0.9F; bh *= 0.9F;
g(bf, bg); // movement method moveWithFallDamage(bf, bg); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(float mx, float my) {
double y = this.locY;
g(mx, my);
if (!npc.isProtected()) {
a(this.locY - y, onGround);
}
}
public void setMoveDestination(double x, double y, double z, double speed) { public void setMoveDestination(double x, double y, double z, double speed) {
controllerMove.a(x, y, z, speed); controllerMove.a(x, y, z, speed);
} }
@ -510,7 +518,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
} }
} }
private static final float EPSILON = 0.005F; private static final float EPSILON = 0.003F;
private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0);
} }

View File

@ -73,7 +73,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private final CitizensNPC npc; private final CitizensNPC npc;
private final Location packetLocationCache = new Location(null, 0, 0, 0); private final Location packetLocationCache = new Location(null, 0, 0, 0);
private final SkinPacketTracker skinTracker; private final SkinPacketTracker skinTracker;
private int updateCounter = 0; private int updateCounter = 0;
public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile,
@ -171,7 +170,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
public void run() { public void run() {
world.removeEntity(EntityHumanNPC.this); world.removeEntity(EntityHumanNPC.this);
} }
}, 35); // give enough time for death and smoke animation }, 15); // give enough time for death and smoke animation
} }
@Override @Override
@ -322,13 +321,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
be *= 0.98F; be *= 0.98F;
bf *= 0.98F; bf *= 0.98F;
bg *= 0.9F; bg *= 0.9F;
g(be, bf); // movement method moveWithFallDamage(be, bf); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(float mx, float my) {
double y = this.locY;
g(mx, my);
if (!npc.isProtected()) {
a(this.locY - y, onGround);
}
}
@Override @Override
public void playerTick() { public void playerTick() {
if (npc == null) { if (npc == null) {
@ -340,7 +348,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
g(0, 0); moveWithFallDamage(0, 0);
} }
if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) { if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) {
motX = motY = motZ = 0; motX = motY = motZ = 0;
@ -518,6 +526,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
} }
} }
private static final float EPSILON = 0.005F; private static final float EPSILON = 0.003F;
private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0);
} }

View File

@ -77,7 +77,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private final Location packetLocationCache = new Location(null, 0, 0, 0); private final Location packetLocationCache = new Location(null, 0, 0, 0);
private final SkinPacketTracker skinTracker; private final SkinPacketTracker skinTracker;
private PlayerlistTrackerEntry trackerEntry; private PlayerlistTrackerEntry trackerEntry;
private int updateCounter = 0; private int updateCounter = 0;
public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile,
@ -349,13 +348,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
be *= 0.98F; be *= 0.98F;
bg *= 0.98F; bg *= 0.98F;
bh *= 0.9F; bh *= 0.9F;
a(be, bf, bg); // movement method moveWithFallDamage(be, bf, bg); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(double mx, double my, double mz) {
double y = this.locY;
a(mx, my, mz);
if (!npc.isProtected()) {
a(this.locY - y, onGround);
}
}
@Override @Override
public void playerTick() { public void playerTick() {
if (npc == null) { if (npc == null) {
@ -367,7 +375,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
a(0, 0, 0); moveWithFallDamage(0, 0, 0);
} }
if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) { if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) {
motX = motY = motZ = 0; motX = motY = motZ = 0;

View File

@ -77,7 +77,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private final Location packetLocationCache = new Location(null, 0, 0, 0); private final Location packetLocationCache = new Location(null, 0, 0, 0);
private final SkinPacketTracker skinTracker; private final SkinPacketTracker skinTracker;
private PlayerlistTrackerEntry trackerEntry; private PlayerlistTrackerEntry trackerEntry;
private int updateCounter = 0; private int updateCounter = 0;
public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile,
@ -323,13 +322,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
bh *= 0.98F; bh *= 0.98F;
bj *= 0.98F; bj *= 0.98F;
bk *= 0.9F; bk *= 0.9F;
a(bh, bi, bj); // movement method moveWithFallDamage(bh, bi, bj); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(double mx, double my, double mz) {
double y = this.locY;
a(mx, my, mz);
if (!npc.isProtected()) {
a(this.locY - y, onGround);
}
}
@Override @Override
public void playerTick() { public void playerTick() {
if (npc == null) { if (npc == null) {
@ -341,7 +349,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
a(0, 0, 0); moveWithFallDamage(0, 0, 0);
} }
if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) { if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) {
motX = motY = motZ = 0; motX = motY = motZ = 0;

View File

@ -76,7 +76,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private final Location packetLocationCache = new Location(null, 0, 0, 0); private final Location packetLocationCache = new Location(null, 0, 0, 0);
private PlayerlistTracker playerlistTracker; private PlayerlistTracker playerlistTracker;
private final SkinPacketTracker skinTracker; private final SkinPacketTracker skinTracker;
private int updateCounter = 0; private int updateCounter = 0;
public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile,
@ -170,7 +169,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
public void run() { public void run() {
((WorldServer) world).removeEntity(EntityHumanNPC.this); ((WorldServer) world).removeEntity(EntityHumanNPC.this);
} }
}, 35); // give enough time for death and smoke animation }, 15); // give enough time for death and smoke animation
} }
@Override @Override
@ -319,13 +318,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
bb *= 0.98F; bb *= 0.98F;
bd *= 0.98F; bd *= 0.98F;
be *= 0.9F; be *= 0.9F;
e(new Vec3D(this.bb, this.bc, this.bd)); // movement method moveWithFallDamage(new Vec3D(this.bb, this.bc, this.bd)); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(Vec3D vec) {
double y = this.locY;
e(vec);
if (!npc.isProtected()) {
a(this.locY - y, onGround);
}
}
@Override @Override
public Packet<?> N() { public Packet<?> N() {
if (playerlistTracker != null) { if (playerlistTracker != null) {
@ -345,7 +353,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
e(new Vec3D(0, 0, 0)); moveWithFallDamage(new Vec3D(0, 0, 0));
} }
Vec3D mot = getMot(); Vec3D mot = getMot();
if (Math.abs(mot.getX()) < EPSILON && Math.abs(mot.getY()) < EPSILON && Math.abs(mot.getZ()) < EPSILON) { if (Math.abs(mot.getX()) < EPSILON && Math.abs(mot.getY()) < EPSILON && Math.abs(mot.getZ()) < EPSILON) {

View File

@ -326,13 +326,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
} }
aZ *= 0.98F; aZ *= 0.98F;
bb *= 0.98F; bb *= 0.98F;
e(new Vec3D(this.aZ, this.ba, this.bb)); // movement method moveWithFallDamage(new Vec3D(this.aZ, this.ba, this.bb)); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(Vec3D vec) {
double y = this.locY();
e(vec);
if (!npc.isProtected()) {
a(this.locY() - y, onGround);
}
}
@Override @Override
public void playerTick() { public void playerTick() {
if (npc == null) { if (npc == null) {
@ -344,7 +353,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
e(new Vec3D(0, 0, 0)); moveWithFallDamage(new Vec3D(0, 0, 0));
} }
Vec3D mot = getMot(); Vec3D mot = getMot();
if (Math.abs(mot.getX()) < EPSILON && Math.abs(mot.getY()) < EPSILON && Math.abs(mot.getZ()) < EPSILON) { if (Math.abs(mot.getX()) < EPSILON && Math.abs(mot.getY()) < EPSILON && Math.abs(mot.getZ()) < EPSILON) {

View File

@ -348,13 +348,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
} }
aR *= 0.98F; aR *= 0.98F;
aT *= 0.98F; aT *= 0.98F;
g(new Vec3D(this.aR, this.aS, this.aT)); // movement method moveWithFallDamage(new Vec3D(this.aR, this.aS, this.aT)); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(Vec3D vec) {
double y = this.locY();
g(vec);
if (!npc.isProtected()) {
a(this.locY() - y, onGround);
}
}
@Override @Override
public Packet<?> P() { public Packet<?> P() {
if (playerlistTracker != null) { if (playerlistTracker != null) {
@ -374,7 +383,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
g(new Vec3D(0, 0, 0)); moveWithFallDamage(new Vec3D(0, 0, 0));
} }
Vec3D mot = getMot(); Vec3D mot = getMot();
if (Math.abs(mot.getX()) < EPSILON && Math.abs(mot.getY()) < EPSILON && Math.abs(mot.getZ()) < EPSILON) { if (Math.abs(mot.getX()) < EPSILON && Math.abs(mot.getY()) < EPSILON && Math.abs(mot.getZ()) < EPSILON) {
@ -584,6 +593,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private static final MethodHandle ATTRIBUTE_MAP = NMS.getGetter(AttributeMapBase.class, "d"); private static final MethodHandle ATTRIBUTE_MAP = NMS.getGetter(AttributeMapBase.class, "d");
private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getGetter(AttributeProvider.class, "a"); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getGetter(AttributeProvider.class, "a");
private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFinalSetter(AttributeProvider.class, "a"); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFinalSetter(AttributeProvider.class, "a");
private static final float EPSILON = 0.005F; private static final float EPSILON = 0.003F;
private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0);
} }

View File

@ -174,7 +174,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
travel(Vec3.ZERO); moveWithFallDamage(Vec3.ZERO);
} }
Vec3 mot = getDeltaMovement(); Vec3 mot = getDeltaMovement();
@ -385,13 +385,21 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
} }
xxa *= 0.98F; xxa *= 0.98F;
zza *= 0.98F; zza *= 0.98F;
travel(new Vec3(this.xxa, this.yya, this.zza)); moveWithFallDamage(new Vec3(this.xxa, this.yya, this.zza));
NMS.setHeadYaw(getBukkitEntity(), getYRot()); NMS.setHeadYaw(getBukkitEntity(), getYRot());
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(Vec3 vec) {
double y = getY();
travel(vec);
if (!npc.isProtected()) {
doCheckFallDamage(getY() - y, onGround);
}
}
@Override @Override
public boolean onClimbable() { public boolean onClimbable() {
if (npc == null || !npc.isFlyable()) { if (npc == null || !npc.isFlyable()) {
@ -610,7 +618,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFinalSetter(AttributeSupplier.class, "a"); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFinalSetter(AttributeSupplier.class, "a");
private static final MethodHandle ATTRIBUTE_SUPPLIER = NMS.getFirstGetter(AttributeMap.class, private static final MethodHandle ATTRIBUTE_SUPPLIER = NMS.getFirstGetter(AttributeMap.class,
AttributeSupplier.class); AttributeSupplier.class);
private static final float EPSILON = 0.005F; private static final float EPSILON = 0.003F;
private static final MethodHandle GAMEMODE_SETTING = NMS.getFirstMethodHandle(ServerPlayerGameMode.class, true, private static final MethodHandle GAMEMODE_SETTING = NMS.getFirstMethodHandle(ServerPlayerGameMode.class, true,
GameType.class, GameType.class); GameType.class, GameType.class);
private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0);

View File

@ -68,7 +68,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
private final Location packetLocationCache = new Location(null, 0, 0, 0); private final Location packetLocationCache = new Location(null, 0, 0, 0);
private final SkinPacketTracker skinTracker; private final SkinPacketTracker skinTracker;
private PlayerlistTrackerEntry trackerEntry; private PlayerlistTrackerEntry trackerEntry;
private int updateCounter = 0; private int updateCounter = 0;
public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile,
@ -146,7 +145,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
public void run() { public void run() {
world.removeEntity(EntityHumanNPC.this); world.removeEntity(EntityHumanNPC.this);
} }
}, 35); // give enough time for death and smoke animation }, 15); // give enough time for death and smoke animation
} }
@Override @Override
@ -290,7 +289,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
if (!navigating && getBukkitEntity() != null if (!navigating && getBukkitEntity() != null
&& (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity())
&& Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) { && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION))) {
g(0, 0); moveWithFallDamage(0, 0);
} }
if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) { if (Math.abs(motX) < EPSILON && Math.abs(motY) < EPSILON && Math.abs(motZ) < EPSILON) {
motX = motY = motZ = 0; motX = motY = motZ = 0;
@ -330,13 +329,22 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
aZ *= 0.98F; aZ *= 0.98F;
ba *= 0.98F; ba *= 0.98F;
bb *= 0.9F; bb *= 0.9F;
g(aZ, ba); // movement method moveWithFallDamage(aZ, ba); // movement method
NMS.setHeadYaw(getBukkitEntity(), yaw); NMS.setHeadYaw(getBukkitEntity(), yaw);
if (jumpTicks > 0) { if (jumpTicks > 0) {
jumpTicks--; jumpTicks--;
} }
} }
private void moveWithFallDamage(float mx, float my) {
double y = this.locY;
g(mx, my);
if (!npc.isProtected()) {
a(this.locY - y, onGround);
}
}
public void setMoveDestination(double x, double y, double z, double speed) { public void setMoveDestination(double x, double y, double z, double speed) {
controllerMove.a(x, y, z, speed); controllerMove.a(x, y, z, speed);
} }
@ -509,6 +517,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable
} }
} }
private static final float EPSILON = 0.005F; private static final float EPSILON = 0.003F;
private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0);
} }