Skip to content

Commit

Permalink
Backport boat movement to 1.15
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Jul 27, 2020
1 parent 8639c0a commit d46aad7
Show file tree
Hide file tree
Showing 2 changed files with 178 additions and 14 deletions.
Expand Up @@ -732,7 +732,10 @@ public void hologram(CommandContext args, CommandSender sender, NPC npc) throws
output += "<br> [[" + 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);
}
Expand Down
Expand Up @@ -14,9 +14,17 @@
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 {
Expand Down Expand Up @@ -44,6 +52,12 @@ public NPC getNPC() {
}

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<? extends EntityBoat> types, World world) {
Expand All @@ -70,6 +84,19 @@ public boolean d(NBTTagCompound save) {
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) {
Expand All @@ -92,17 +119,113 @@ public void h(double x, double y, double z) {
// 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
Expand All @@ -114,12 +237,50 @@ public void updateSize() {
}
}

@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();
}
}
}
}
Expand Down

0 comments on commit d46aad7

Please sign in to comment.