From d46aad717f6aafa9df51ed304fdd1cbd8fee3768 Mon Sep 17 00:00:00 2001 From: fullwall Date: Mon, 27 Jul 2020 17:42:30 +0800 Subject: [PATCH] Backport boat movement to 1.15 --- .../citizensnpcs/commands/NPCCommands.java | 5 +- .../entity/nonliving/BoatController.java | 187 ++++++++++++++++-- 2 files changed, 178 insertions(+), 14 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index d54e2daae..2fed97f23 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -732,7 +732,10 @@ public class NPCCommands { output += "
[[" + i + "]] - " + line; } Messaging.send(sender, output); - } else if (args.getString(1).equalsIgnoreCase("set")) { + return; + } + + if (args.getString(1).equalsIgnoreCase("set")) { if (args.argsLength() == 2) { throw new CommandException(Messages.HOLOGRAM_INVALID_LINE); } diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/nonliving/BoatController.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/nonliving/BoatController.java index 47534b99a..6cb7a55b6 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/nonliving/BoatController.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/nonliving/BoatController.java @@ -14,9 +14,17 @@ import net.citizensnpcs.nms.v1_15_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_15_R1.AxisAlignedBB; +import net.minecraft.server.v1_15_R1.BlockPosition; import net.minecraft.server.v1_15_R1.EntityBoat; +import net.minecraft.server.v1_15_R1.EntityHuman; import net.minecraft.server.v1_15_R1.EntityTypes; +import net.minecraft.server.v1_15_R1.EnumMoveType; +import net.minecraft.server.v1_15_R1.Fluid; +import net.minecraft.server.v1_15_R1.MathHelper; import net.minecraft.server.v1_15_R1.NBTTagCompound; +import net.minecraft.server.v1_15_R1.TagsFluid; +import net.minecraft.server.v1_15_R1.Vec3D; import net.minecraft.server.v1_15_R1.World; public class BoatController extends MobEntityController { @@ -44,6 +52,12 @@ public class BoatController extends MobEntityController { } public static class EntityBoatNPC extends EntityBoat implements NPCHolder { + private double aD; + private float aE; + private EnumStatus aF; + private EnumStatus aG; + private float aq; + private float as; private final CitizensNPC npc; public EntityBoatNPC(EntityTypes types, World world) { @@ -70,6 +84,19 @@ public class BoatController extends MobEntityController { return npc == null ? super.d(save) : false; } + @Override + public CraftEntity getBukkitEntity() { + if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { + NMSImpl.setBukkitEntity(this, new BoatNPC(this)); + } + return super.getBukkitEntity(); + } + + @Override + public NPC getNPC() { + return npc; + } + @Override public void h(double x, double y, double z) { if (npc == null) { @@ -92,17 +119,113 @@ public class BoatController extends MobEntityController { // cancelled. } - @Override - public CraftEntity getBukkitEntity() { - if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { - NMSImpl.setBukkitEntity(this, new BoatNPC(this)); + private EnumStatus s() { + EnumStatus entityboat_enumstatus = v(); + if (entityboat_enumstatus != null) { + this.aD = (getBoundingBox()).maxY; + return entityboat_enumstatus; } - return super.getBukkitEntity(); + if (u()) + return EnumStatus.IN_WATER; + float f = l(); + if (f > 0.0F) { + this.aE = f; + return EnumStatus.ON_LAND; + } + return EnumStatus.IN_AIR; } @Override - public NPC getNPC() { - return npc; + public void tick() { + if (npc != null) { + npc.update(); + this.aG = this.aF; + this.aF = s(); + double d1 = isNoGravity() ? 0.0D : -0.04D; + double d2 = 0.0D; + this.aq = 0.05F; + if (this.aG == EnumStatus.IN_AIR && this.aF != EnumStatus.IN_AIR && this.aF != EnumStatus.ON_LAND) { + this.aD = e(1.0D); + setPosition(locX(), (k() - getHeight()) + 0.101D, locZ()); + setMot(getMot().d(1.0D, 0.0D, 1.0D)); + this.aF = EnumStatus.IN_WATER; + } else { + if (this.aF == EnumStatus.IN_WATER) { + d2 = (this.aD - locY()) / getHeight(); + this.aq = 0.9F; + } else if (this.aF == EnumStatus.UNDER_FLOWING_WATER) { + d1 = -7.0E-4D; + this.aq = 0.9F; + } else if (this.aF == EnumStatus.UNDER_WATER) { + d2 = 0.01D; + this.aq = 0.45F; + } else if (this.aF == EnumStatus.IN_AIR) { + this.aq = 0.9F; + } else if (this.aF == EnumStatus.ON_LAND) { + this.aq = this.aE; + if (getRidingPassenger() instanceof EntityHuman) + this.aE /= 2.0F; + } + Vec3D vec3d = getMot(); + setMot(vec3d.x * this.aq, vec3d.y + d1, vec3d.z * this.aq); + this.as *= this.aq; + if (d2 > 0.0D) { + Vec3D vec3d1 = getMot(); + setMot(vec3d1.x, (vec3d1.y + d2 * 0.0615D) * 0.75D, vec3d1.z); + } + } + move(EnumMoveType.SELF, getMot()); + if (isVehicle()) { + this.yaw += this.as; + } + } else { + super.tick(); + } + } + + private boolean u() { + boolean m = false; + AxisAlignedBB axisalignedbb = getBoundingBox(); + int i = MathHelper.floor(axisalignedbb.minX); + int j = MathHelper.f(axisalignedbb.maxX); + int k = MathHelper.floor(axisalignedbb.minY); + int l = MathHelper.f(axisalignedbb.minY + 0.001D); + int i1 = MathHelper.floor(axisalignedbb.minZ); + int j1 = MathHelper.f(axisalignedbb.maxZ); + boolean flag = false; + this.aD = Double.MIN_VALUE; + BlockPosition.PooledBlockPosition blockposition_pooledblockposition = BlockPosition.PooledBlockPosition.r(); + Throwable throwable = null; + try { + for (int k1 = i; k1 < j; k1++) { + for (int l1 = k; l1 < l; l1++) { + for (int i2 = i1; i2 < j1; i2++) { + blockposition_pooledblockposition.d(k1, l1, i2); + Fluid fluid = this.world.getFluid(blockposition_pooledblockposition); + if (fluid.a(TagsFluid.WATER)) { + float f = l1 + fluid.getHeight(this.world, blockposition_pooledblockposition); + this.aD = Math.max(f, this.aD); + m = flag | ((axisalignedbb.minY < f) ? true : false); + } + } + } + } + } catch (Throwable throwable1) { + throwable = throwable1; + throw throwable1; + } finally { + if (blockposition_pooledblockposition != null) + if (throwable != null) { + try { + blockposition_pooledblockposition.close(); + } catch (Throwable throwable2) { + throwable.addSuppressed(throwable2); + } + } else { + blockposition_pooledblockposition.close(); + } + } + return m; } @Override @@ -114,12 +237,50 @@ public class BoatController extends MobEntityController { } } - @Override - public void tick() { - if (npc != null) { - npc.update(); - } else { - super.tick(); + private EnumStatus v() { + AxisAlignedBB axisalignedbb = getBoundingBox(); + double d0 = axisalignedbb.maxY + 0.001D; + int i = MathHelper.floor(axisalignedbb.minX); + int j = MathHelper.f(axisalignedbb.maxX); + int k = MathHelper.floor(axisalignedbb.maxY); + int l = MathHelper.f(d0); + int i1 = MathHelper.floor(axisalignedbb.minZ); + int j1 = MathHelper.f(axisalignedbb.maxZ); + boolean flag = false; + BlockPosition.PooledBlockPosition blockposition_pooledblockposition = BlockPosition.PooledBlockPosition.r(); + Throwable throwable = null; + try { + for (int k1 = i; k1 < j; k1++) { + for (int l1 = k; l1 < l; l1++) { + for (int i2 = i1; i2 < j1; i2++) { + blockposition_pooledblockposition.d(k1, l1, i2); + Fluid fluid = this.world.getFluid(blockposition_pooledblockposition); + if (fluid.a(TagsFluid.WATER) && d0 < (blockposition_pooledblockposition.getY() + + fluid.getHeight(this.world, blockposition_pooledblockposition))) { + if (!fluid.isSource()) { + EnumStatus entityboat_enumstatus = EnumStatus.UNDER_FLOWING_WATER; + return entityboat_enumstatus; + } + flag = true; + } + } + } + } + return flag ? EnumStatus.UNDER_WATER : null; + } catch (Throwable throwable1) { + throwable = throwable1; + throw throwable1; + } finally { + if (blockposition_pooledblockposition != null) + if (throwable != null) { + try { + blockposition_pooledblockposition.close(); + } catch (Throwable throwable2) { + throwable.addSuppressed(throwable2); + } + } else { + blockposition_pooledblockposition.close(); + } } } }