mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-06-26 14:35:03 +02:00
Backport boat movement to 1.15
This commit is contained in:
parent
8639c0ab27
commit
d46aad717f
|
@ -732,7 +732,10 @@ public class NPCCommands {
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -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<? extends EntityBoat> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user