bop boats now extends BoatEntity
This commit is contained in:
parent
c341b1d687
commit
ce1cdff408
6 changed files with 123 additions and 235 deletions
|
@ -8,8 +8,9 @@
|
||||||
package biomesoplenty.api.entity;
|
package biomesoplenty.api.entity;
|
||||||
|
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.entity.item.BoatEntity;
|
||||||
|
|
||||||
public class BOPEntities
|
public class BOPEntities
|
||||||
{
|
{
|
||||||
public static EntityType<?> boat_bop;
|
public static EntityType<? extends BoatEntity> boat_bop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import biomesoplenty.api.item.BOPItems;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.LilyPadBlock;
|
import net.minecraft.block.LilyPadBlock;
|
||||||
import net.minecraft.client.entity.player.ClientPlayerEntity;
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
@ -26,7 +25,11 @@ import net.minecraft.network.datasync.EntityDataManager;
|
||||||
import net.minecraft.network.play.client.CSteerBoatPacket;
|
import net.minecraft.network.play.client.CSteerBoatPacket;
|
||||||
import net.minecraft.particles.ParticleTypes;
|
import net.minecraft.particles.ParticleTypes;
|
||||||
import net.minecraft.tags.FluidTags;
|
import net.minecraft.tags.FluidTags;
|
||||||
import net.minecraft.util.*;
|
import net.minecraft.util.DamageSource;
|
||||||
|
import net.minecraft.util.EntityPredicates;
|
||||||
|
import net.minecraft.util.IndirectEntityDamageSource;
|
||||||
|
import net.minecraft.util.SoundEvent;
|
||||||
|
import net.minecraft.util.SoundEvents;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
@ -44,7 +47,7 @@ import net.minecraftforge.fml.network.NetworkHooks;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class BoatEntityBOP extends Entity {
|
public class BoatEntityBOP extends BoatEntity {
|
||||||
private static final DataParameter<Integer> TIME_SINCE_HIT = EntityDataManager.createKey(BoatEntityBOP.class, DataSerializers.VARINT);
|
private static final DataParameter<Integer> TIME_SINCE_HIT = EntityDataManager.createKey(BoatEntityBOP.class, DataSerializers.VARINT);
|
||||||
private static final DataParameter<Integer> FORWARD_DIRECTION = EntityDataManager.createKey(BoatEntityBOP.class, DataSerializers.VARINT);
|
private static final DataParameter<Integer> FORWARD_DIRECTION = EntityDataManager.createKey(BoatEntityBOP.class, DataSerializers.VARINT);
|
||||||
private static final DataParameter<Float> DAMAGE_TAKEN = EntityDataManager.createKey(BoatEntityBOP.class, DataSerializers.FLOAT);
|
private static final DataParameter<Float> DAMAGE_TAKEN = EntityDataManager.createKey(BoatEntityBOP.class, DataSerializers.FLOAT);
|
||||||
|
@ -68,8 +71,8 @@ public class BoatEntityBOP extends Entity {
|
||||||
private boolean backInputDown;
|
private boolean backInputDown;
|
||||||
private double waterLevel;
|
private double waterLevel;
|
||||||
private float boatGlide;
|
private float boatGlide;
|
||||||
private BoatEntityBOP.Status status;
|
private Status status;
|
||||||
private BoatEntityBOP.Status previousStatus;
|
private Status previousStatus;
|
||||||
private double lastYd;
|
private double lastYd;
|
||||||
private boolean rocking;
|
private boolean rocking;
|
||||||
private boolean field_203060_aN;
|
private boolean field_203060_aN;
|
||||||
|
@ -77,7 +80,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
private float rockingAngle;
|
private float rockingAngle;
|
||||||
private float prevRockingAngle;
|
private float prevRockingAngle;
|
||||||
|
|
||||||
public BoatEntityBOP(EntityType<?> p_i50129_1_, World p_i50129_2_) {
|
public BoatEntityBOP(EntityType<? extends BoatEntity> p_i50129_1_, World p_i50129_2_) {
|
||||||
super(p_i50129_1_, p_i50129_2_);
|
super(p_i50129_1_, p_i50129_2_);
|
||||||
this.preventEntitySpawning = true;
|
this.preventEntitySpawning = true;
|
||||||
}
|
}
|
||||||
|
@ -95,14 +98,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
this(BOPEntities.boat_bop, world);
|
this(BOPEntities.boat_bop, world);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
|
|
||||||
* prevent them from trampling crops
|
|
||||||
*/
|
|
||||||
protected boolean canTriggerWalking() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void registerData() {
|
protected void registerData() {
|
||||||
this.dataManager.register(TIME_SINCE_HIT, 0);
|
this.dataManager.register(TIME_SINCE_HIT, 0);
|
||||||
this.dataManager.register(FORWARD_DIRECTION, 1);
|
this.dataManager.register(FORWARD_DIRECTION, 1);
|
||||||
|
@ -113,37 +109,10 @@ public class BoatEntityBOP extends Entity {
|
||||||
this.dataManager.register(ROCKING_TICKS, 0);
|
this.dataManager.register(ROCKING_TICKS, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a boundingBox used to collide the entity with other entities and blocks. This enables the entity to be
|
|
||||||
* pushable on contact, like boats or minecarts.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
public AxisAlignedBB getCollisionBox(Entity entityIn) {
|
|
||||||
return entityIn.canBePushed() ? entityIn.getBoundingBox() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public AxisAlignedBB getCollisionBoundingBox() {
|
|
||||||
return this.getBoundingBox();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this entity should push and be pushed by other entities when colliding.
|
|
||||||
*/
|
|
||||||
public boolean canBePushed() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the Y offset from the entity's position for any entity riding this one.
|
|
||||||
*/
|
|
||||||
public double getMountedYOffset() {
|
|
||||||
return -0.1D;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the entity is attacked.
|
* Called when the entity is attacked.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean attackEntityFrom(DamageSource source, float amount) {
|
public boolean attackEntityFrom(DamageSource source, float amount) {
|
||||||
if (this.isInvulnerableTo(source)) {
|
if (this.isInvulnerableTo(source)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -163,7 +132,6 @@ public class BoatEntityBOP extends Entity {
|
||||||
|
|
||||||
this.remove();
|
this.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -171,6 +139,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void onEnterBubbleColumnWithAirAbove(boolean downwards) {
|
public void onEnterBubbleColumnWithAirAbove(boolean downwards) {
|
||||||
if (!this.world.isRemote) {
|
if (!this.world.isRemote) {
|
||||||
this.rocking = true;
|
this.rocking = true;
|
||||||
|
@ -179,30 +148,15 @@ public class BoatEntityBOP extends Entity {
|
||||||
this.setRockingTicks(60);
|
this.setRockingTicks(60);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.world.addParticle(ParticleTypes.SPLASH, this.posX + (double) this.rand.nextFloat(), this.posY + 0.7D, this.posZ + (double) this.rand.nextFloat(), 0.0D, 0.0D, 0.0D);
|
this.world.addParticle(ParticleTypes.SPLASH, this.posX + (double) this.rand.nextFloat(), this.posY + 0.7D, this.posZ + (double) this.rand.nextFloat(), 0.0D, 0.0D, 0.0D);
|
||||||
if (this.rand.nextInt(20) == 0) {
|
if (this.rand.nextInt(20) == 0) {
|
||||||
this.world.playSound(this.posX, this.posY, this.posZ, this.getSplashSound(), this.getSoundCategory(), 1.0F, 0.8F + 0.4F * this.rand.nextFloat(), false);
|
this.world.playSound(this.posX, this.posY, this.posZ, this.getSplashSound(), this.getSoundCategory(), 1.0F, 0.8F + 0.4F * this.rand.nextFloat(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a velocity to the entities, to push them away from eachother.
|
|
||||||
*/
|
|
||||||
public void applyEntityCollision(Entity entityIn) {
|
|
||||||
if (entityIn instanceof BoatEntity) {
|
|
||||||
if (entityIn.getBoundingBox().minY < this.getBoundingBox().maxY) {
|
|
||||||
super.applyEntityCollision(entityIn);
|
|
||||||
}
|
|
||||||
} else if (entityIn.getBoundingBox().minY <= this.getBoundingBox().minY) {
|
|
||||||
super.applyEntityCollision(entityIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Item getItemBoat() {
|
public Item getItemBoat() {
|
||||||
switch(this.getBoatType()) {
|
switch (this.getBoatModel()) {
|
||||||
case FIR:
|
case FIR:
|
||||||
default:
|
default:
|
||||||
return BOPItems.fir_boat;
|
return BOPItems.fir_boat;
|
||||||
|
@ -234,6 +188,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Setups the entity to do the hurt animation. Only used by packets in multiplayer.
|
* Setups the entity to do the hurt animation. Only used by packets in multiplayer.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
public void performHurtAnimation() {
|
public void performHurtAnimation() {
|
||||||
this.setForwardDirection(-this.getForwardDirection());
|
this.setForwardDirection(-this.getForwardDirection());
|
||||||
|
@ -241,50 +196,14 @@ public class BoatEntityBOP extends Entity {
|
||||||
this.setDamageTaken(this.getDamageTaken() * 11.0F);
|
this.setDamageTaken(this.getDamageTaken() * 11.0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if other Entities should be prevented from moving through this Entity.
|
|
||||||
*/
|
|
||||||
public boolean canBeCollidedWith() {
|
|
||||||
return !this.removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a target for the client to interpolate towards over the next few ticks
|
|
||||||
*/
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void setPositionAndRotationDirect(double x, double y, double z, float yaw, float pitch, int posRotationIncrements, boolean teleport) {
|
|
||||||
this.lerpX = x;
|
|
||||||
this.lerpY = y;
|
|
||||||
this.lerpZ = z;
|
|
||||||
this.lerpYaw = (double)yaw;
|
|
||||||
this.lerpPitch = (double)pitch;
|
|
||||||
this.lerpSteps = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the horizontal facing direction of this Entity, adjusted to take specially-treated entity types into account.
|
|
||||||
*/
|
|
||||||
public Direction getAdjustedHorizontalFacing() {
|
|
||||||
return this.getHorizontalFacing().rotateY();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called to update the entity's position/logic.
|
* Called to update the entity's position/logic.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
if (this.world.isRemote) {
|
|
||||||
Entity rider = getControllingPassenger();
|
|
||||||
if (rider instanceof PlayerEntity) {
|
|
||||||
ClientPlayerEntity player = (ClientPlayerEntity) rider;
|
|
||||||
updateInputs(player.movementInput.leftKeyDown, player.movementInput.rightKeyDown, player.movementInput.forwardKeyDown, player.movementInput.backKeyDown);
|
|
||||||
player.rowingBoat |= player.movementInput.leftKeyDown || player.movementInput.rightKeyDown || player.movementInput.forwardKeyDown || player.movementInput.backKeyDown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.previousStatus = this.status;
|
this.previousStatus = this.status;
|
||||||
this.status = this.getBoatStatus();
|
this.status = this.getBoatStatus();
|
||||||
if (this.status != BoatEntityBOP.Status.UNDER_WATER && this.status != BoatEntityBOP.Status.UNDER_FLOWING_WATER) {
|
if (this.status != Status.UNDER_WATER && this.status != Status.UNDER_FLOWING_WATER) {
|
||||||
this.outOfControlTicks = 0.0F;
|
this.outOfControlTicks = 0.0F;
|
||||||
} else {
|
} else {
|
||||||
++this.outOfControlTicks;
|
++this.outOfControlTicks;
|
||||||
|
@ -305,7 +224,13 @@ public class BoatEntityBOP extends Entity {
|
||||||
this.prevPosX = this.posX;
|
this.prevPosX = this.posX;
|
||||||
this.prevPosY = this.posY;
|
this.prevPosY = this.posY;
|
||||||
this.prevPosZ = this.posZ;
|
this.prevPosZ = this.posZ;
|
||||||
super.tick();
|
|
||||||
|
// !!! this is the super of BoatEntity !!!
|
||||||
|
if (!this.world.isRemote) {
|
||||||
|
this.setFlag(6, this.isGlowing());
|
||||||
|
}
|
||||||
|
baseTick();
|
||||||
|
|
||||||
this.tickLerp();
|
this.tickLerp();
|
||||||
if (this.canPassengerSteer()) {
|
if (this.canPassengerSteer()) {
|
||||||
if (this.getPassengers().isEmpty() || !(this.getPassengers().get(0) instanceof PlayerEntity)) {
|
if (this.getPassengers().isEmpty() || !(this.getPassengers().get(0) instanceof PlayerEntity)) {
|
||||||
|
@ -359,7 +284,6 @@ public class BoatEntityBOP extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRocking() {
|
private void updateRocking() {
|
||||||
|
@ -398,9 +322,9 @@ public class BoatEntityBOP extends Entity {
|
||||||
this.rocking = false;
|
this.rocking = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
protected SoundEvent getPaddleSound() {
|
protected SoundEvent getPaddleSound() {
|
||||||
switch (this.getBoatStatus()) {
|
switch (this.getBoatStatus()) {
|
||||||
|
@ -430,11 +354,13 @@ public class BoatEntityBOP extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setPaddleState(boolean left, boolean right) {
|
public void setPaddleState(boolean left, boolean right) {
|
||||||
this.dataManager.set(field_199704_e, left);
|
this.dataManager.set(field_199704_e, left);
|
||||||
this.dataManager.set(field_199705_f, right);
|
this.dataManager.set(field_199705_f, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
public float getRowingTime(int side, float limbSwing) {
|
public float getRowingTime(int side, float limbSwing) {
|
||||||
return this.getPaddleState(side) ? (float) MathHelper.clampedLerp((double) this.paddlePositions[side] - (double) ((float) Math.PI / 8F), (double) this.paddlePositions[side], (double) limbSwing) : 0.0F;
|
return this.getPaddleState(side) ? (float) MathHelper.clampedLerp((double) this.paddlePositions[side] - (double) ((float) Math.PI / 8F), (double) this.paddlePositions[side], (double) limbSwing) : 0.0F;
|
||||||
|
@ -443,24 +369,25 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Determines whether the boat is in water, gliding on land, or in air
|
* Determines whether the boat is in water, gliding on land, or in air
|
||||||
*/
|
*/
|
||||||
private BoatEntityBOP.Status getBoatStatus() {
|
private Status getBoatStatus() {
|
||||||
BoatEntityBOP.Status boatentity$status = this.getUnderwaterStatus();
|
Status boatentity$status = this.getUnderwaterStatus();
|
||||||
if (boatentity$status != null) {
|
if (boatentity$status != null) {
|
||||||
this.waterLevel = this.getBoundingBox().maxY;
|
this.waterLevel = this.getBoundingBox().maxY;
|
||||||
return boatentity$status;
|
return boatentity$status;
|
||||||
} else if (this.checkInWater()) {
|
} else if (this.checkInWater()) {
|
||||||
return BoatEntityBOP.Status.IN_WATER;
|
return Status.IN_WATER;
|
||||||
} else {
|
} else {
|
||||||
float f = this.getBoatGlide();
|
float f = this.getBoatGlide();
|
||||||
if (f > 0.0F) {
|
if (f > 0.0F) {
|
||||||
this.boatGlide = f;
|
this.boatGlide = f;
|
||||||
return BoatEntityBOP.Status.ON_LAND;
|
return Status.ON_LAND;
|
||||||
} else {
|
} else {
|
||||||
return BoatEntityBOP.Status.IN_AIR;
|
return Status.IN_AIR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public float getWaterLevelAbove() {
|
public float getWaterLevelAbove() {
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
||||||
int i = MathHelper.floor(axisalignedbb.minX);
|
int i = MathHelper.floor(axisalignedbb.minX);
|
||||||
|
@ -503,6 +430,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Decides how much the boat should be gliding on the land (based on any slippery blocks)
|
* Decides how much the boat should be gliding on the land (based on any slippery blocks)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public float getBoatGlide() {
|
public float getBoatGlide() {
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
||||||
AxisAlignedBB axisalignedbb1 = new AxisAlignedBB(axisalignedbb.minX, axisalignedbb.minY - 0.001D, axisalignedbb.minZ, axisalignedbb.maxX, axisalignedbb.minY, axisalignedbb.maxZ);
|
AxisAlignedBB axisalignedbb1 = new AxisAlignedBB(axisalignedbb.minX, axisalignedbb.minY - 0.001D, axisalignedbb.minZ, axisalignedbb.maxX, axisalignedbb.minY, axisalignedbb.maxZ);
|
||||||
|
@ -573,7 +501,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
* Decides whether the boat is currently underwater.
|
* Decides whether the boat is currently underwater.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
private BoatEntityBOP.Status getUnderwaterStatus() {
|
private Status getUnderwaterStatus() {
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
||||||
double d0 = axisalignedbb.maxY + 0.001D;
|
double d0 = axisalignedbb.maxY + 0.001D;
|
||||||
int i = MathHelper.floor(axisalignedbb.minX);
|
int i = MathHelper.floor(axisalignedbb.minX);
|
||||||
|
@ -592,8 +520,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
IFluidState ifluidstate = this.world.getFluidState(blockpos$pooledmutableblockpos);
|
IFluidState ifluidstate = this.world.getFluidState(blockpos$pooledmutableblockpos);
|
||||||
if (ifluidstate.isTagged(FluidTags.WATER) && d0 < (double) ((float) blockpos$pooledmutableblockpos.getY() + ifluidstate.func_215679_a(this.world, blockpos$pooledmutableblockpos))) {
|
if (ifluidstate.isTagged(FluidTags.WATER) && d0 < (double) ((float) blockpos$pooledmutableblockpos.getY() + ifluidstate.func_215679_a(this.world, blockpos$pooledmutableblockpos))) {
|
||||||
if (!ifluidstate.isSource()) {
|
if (!ifluidstate.isSource()) {
|
||||||
BoatEntityBOP.Status boatentity$status = BoatEntityBOP.Status.UNDER_FLOWING_WATER;
|
return Status.UNDER_FLOWING_WATER;
|
||||||
return boatentity$status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flag = true;
|
flag = true;
|
||||||
|
@ -603,36 +530,36 @@ public class BoatEntityBOP extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return flag ? BoatEntityBOP.Status.UNDER_WATER : null;
|
return flag ? Status.UNDER_WATER : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the boat's speed, based on momentum.
|
* Update the boat's speed, based on momentum.
|
||||||
*/
|
*/
|
||||||
private void updateMotion() {
|
private void updateMotion() {
|
||||||
double d0 = (double)-0.04F;
|
double gravity = (double) -0.04F;
|
||||||
double d1 = this.hasNoGravity() ? 0.0D : (double)-0.04F;
|
double d1 = this.hasNoGravity() ? 0.0D : gravity;
|
||||||
double d2 = 0.0D;
|
double d2 = 0.0D;
|
||||||
this.momentum = 0.05F;
|
this.momentum = 0.05F;
|
||||||
if (this.previousStatus == BoatEntityBOP.Status.IN_AIR && this.status != BoatEntityBOP.Status.IN_AIR && this.status != BoatEntityBOP.Status.ON_LAND) {
|
if (this.previousStatus == Status.IN_AIR && this.status != Status.IN_AIR && this.status != Status.ON_LAND) {
|
||||||
this.waterLevel = this.getBoundingBox().minY + (double) this.getHeight();
|
this.waterLevel = this.getBoundingBox().minY + (double) this.getHeight();
|
||||||
this.setPosition(this.posX, (double) (this.getWaterLevelAbove() - this.getHeight()) + 0.101D, this.posZ);
|
this.setPosition(this.posX, (double) (this.getWaterLevelAbove() - this.getHeight()) + 0.101D, this.posZ);
|
||||||
this.setMotion(this.getMotion().mul(1.0D, 0.0D, 1.0D));
|
this.setMotion(this.getMotion().mul(1.0D, 0.0D, 1.0D));
|
||||||
this.lastYd = 0.0D;
|
this.lastYd = 0.0D;
|
||||||
this.status = BoatEntityBOP.Status.IN_WATER;
|
this.status = Status.IN_WATER;
|
||||||
} else {
|
} else {
|
||||||
if (this.status == BoatEntityBOP.Status.IN_WATER) {
|
if (this.status == Status.IN_WATER) {
|
||||||
d2 = (this.waterLevel - this.getBoundingBox().minY) / (double) this.getHeight();
|
d2 = (this.waterLevel - this.getBoundingBox().minY) / (double) this.getHeight();
|
||||||
this.momentum = 0.9F;
|
this.momentum = 0.9F;
|
||||||
} else if (this.status == BoatEntityBOP.Status.UNDER_FLOWING_WATER) {
|
} else if (this.status == Status.UNDER_FLOWING_WATER) {
|
||||||
d1 = -7.0E-4D;
|
d1 = -7.0E-4D;
|
||||||
this.momentum = 0.9F;
|
this.momentum = 0.9F;
|
||||||
} else if (this.status == BoatEntityBOP.Status.UNDER_WATER) {
|
} else if (this.status == Status.UNDER_WATER) {
|
||||||
d2 = (double) 0.01F;
|
d2 = (double) 0.01F;
|
||||||
this.momentum = 0.45F;
|
this.momentum = 0.45F;
|
||||||
} else if (this.status == BoatEntityBOP.Status.IN_AIR) {
|
} else if (this.status == Status.IN_AIR) {
|
||||||
this.momentum = 0.9F;
|
this.momentum = 0.9F;
|
||||||
} else if (this.status == BoatEntityBOP.Status.ON_LAND) {
|
} else if (this.status == Status.ON_LAND) {
|
||||||
this.momentum = this.boatGlide;
|
this.momentum = this.boatGlide;
|
||||||
if (this.getControllingPassenger() instanceof PlayerEntity) {
|
if (this.getControllingPassenger() instanceof PlayerEntity) {
|
||||||
this.boatGlide /= 2.0F;
|
this.boatGlide /= 2.0F;
|
||||||
|
@ -647,7 +574,6 @@ public class BoatEntityBOP extends Entity {
|
||||||
this.setMotion(vec3d1.x, (vec3d1.y + d2 * 0.06153846016296973D) * 0.75D, vec3d1.z);
|
this.setMotion(vec3d1.x, (vec3d1.y + d2 * 0.06153846016296973D) * 0.75D, vec3d1.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void controlBoat() {
|
private void controlBoat() {
|
||||||
|
@ -679,6 +605,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void updatePassenger(Entity passenger) {
|
public void updatePassenger(Entity passenger) {
|
||||||
if (this.isPassenger(passenger)) {
|
if (this.isPassenger(passenger)) {
|
||||||
float f = 0.0F;
|
float f = 0.0F;
|
||||||
|
@ -706,13 +633,13 @@ public class BoatEntityBOP extends Entity {
|
||||||
passenger.setRenderYawOffset(((AnimalEntity) passenger).renderYawOffset + (float) j);
|
passenger.setRenderYawOffset(((AnimalEntity) passenger).renderYawOffset + (float) j);
|
||||||
passenger.setRotationYawHead(passenger.getRotationYawHead() + (float) j);
|
passenger.setRotationYawHead(passenger.getRotationYawHead() + (float) j);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies this boat's yaw to the given entity. Used to update the orientation of its passenger.
|
* Applies this boat's yaw to the given entity. Used to update the orientation of its passenger.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected void applyYawToEntity(Entity entityToUpdate) {
|
protected void applyYawToEntity(Entity entityToUpdate) {
|
||||||
entityToUpdate.setRenderYawOffset(this.rotationYaw);
|
entityToUpdate.setRenderYawOffset(this.rotationYaw);
|
||||||
float f = MathHelper.wrapDegrees(entityToUpdate.rotationYaw - this.rotationYaw);
|
float f = MathHelper.wrapDegrees(entityToUpdate.rotationYaw - this.rotationYaw);
|
||||||
|
@ -725,6 +652,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Applies this entity's orientation (pitch/yaw) to another entity. Used to update passenger orientation.
|
* Applies this entity's orientation (pitch/yaw) to another entity. Used to update passenger orientation.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
public void applyOrientationToEntity(Entity entityToUpdate) {
|
public void applyOrientationToEntity(Entity entityToUpdate) {
|
||||||
this.applyYawToEntity(entityToUpdate);
|
this.applyYawToEntity(entityToUpdate);
|
||||||
|
@ -732,7 +660,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void writeAdditional(CompoundNBT compound) {
|
protected void writeAdditional(CompoundNBT compound) {
|
||||||
compound.putString("Type", this.getBoatType().getName());
|
compound.putString("Type", this.getBoatModel().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -741,20 +669,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
@Override
|
@Override
|
||||||
protected void readAdditional(CompoundNBT compound) {
|
protected void readAdditional(CompoundNBT compound) {
|
||||||
if (compound.contains("Type", 8)) {
|
if (compound.contains("Type", 8)) {
|
||||||
this.setBoatType(Type.getTypeFromString(compound.getString("Type")));
|
setBoatModel(Type.getTypeFromString(compound.getString("Type")));
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean processInitialInteract(PlayerEntity player, Hand hand) {
|
|
||||||
if (player.isSneaking()) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
if (!this.world.isRemote && this.outOfControlTicks < 60.0F) {
|
|
||||||
player.startRiding(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -788,10 +703,10 @@ public class BoatEntityBOP extends Entity {
|
||||||
} else if (!this.world.getFluidState((new BlockPos(this)).down()).isTagged(FluidTags.WATER) && y < 0.0D) {
|
} else if (!this.world.getFluidState((new BlockPos(this)).down()).isTagged(FluidTags.WATER) && y < 0.0D) {
|
||||||
this.fallDistance = (float) ((double) this.fallDistance - y);
|
this.fallDistance = (float) ((double) this.fallDistance - y);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean getPaddleState(int side) {
|
public boolean getPaddleState(int side) {
|
||||||
return this.dataManager.<Boolean>get(side == 0 ? field_199704_e : field_199705_f) && this.getControllingPassenger() != null;
|
return this.dataManager.<Boolean>get(side == 0 ? field_199704_e : field_199705_f) && this.getControllingPassenger() != null;
|
||||||
}
|
}
|
||||||
|
@ -799,6 +714,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Sets the damage taken from the last hit.
|
* Sets the damage taken from the last hit.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setDamageTaken(float damageTaken) {
|
public void setDamageTaken(float damageTaken) {
|
||||||
this.dataManager.set(DAMAGE_TAKEN, damageTaken);
|
this.dataManager.set(DAMAGE_TAKEN, damageTaken);
|
||||||
}
|
}
|
||||||
|
@ -806,6 +722,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Gets the damage taken from the last hit.
|
* Gets the damage taken from the last hit.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public float getDamageTaken() {
|
public float getDamageTaken() {
|
||||||
return this.dataManager.get(DAMAGE_TAKEN);
|
return this.dataManager.get(DAMAGE_TAKEN);
|
||||||
}
|
}
|
||||||
|
@ -813,6 +730,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Sets the time to count down from since the last time entity was hit.
|
* Sets the time to count down from since the last time entity was hit.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setTimeSinceHit(int timeSinceHit) {
|
public void setTimeSinceHit(int timeSinceHit) {
|
||||||
this.dataManager.set(TIME_SINCE_HIT, timeSinceHit);
|
this.dataManager.set(TIME_SINCE_HIT, timeSinceHit);
|
||||||
}
|
}
|
||||||
|
@ -820,6 +738,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Gets the time since the last hit.
|
* Gets the time since the last hit.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public int getTimeSinceHit() {
|
public int getTimeSinceHit() {
|
||||||
return this.dataManager.get(TIME_SINCE_HIT);
|
return this.dataManager.get(TIME_SINCE_HIT);
|
||||||
}
|
}
|
||||||
|
@ -832,6 +751,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
return this.dataManager.get(ROCKING_TICKS);
|
return this.dataManager.get(ROCKING_TICKS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
public float getRockingAngle(float partialTicks) {
|
public float getRockingAngle(float partialTicks) {
|
||||||
return MathHelper.lerp(partialTicks, this.prevRockingAngle, this.rockingAngle);
|
return MathHelper.lerp(partialTicks, this.prevRockingAngle, this.rockingAngle);
|
||||||
|
@ -840,6 +760,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Sets the forward direction of the entity.
|
* Sets the forward direction of the entity.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setForwardDirection(int forwardDirection) {
|
public void setForwardDirection(int forwardDirection) {
|
||||||
this.dataManager.set(FORWARD_DIRECTION, forwardDirection);
|
this.dataManager.set(FORWARD_DIRECTION, forwardDirection);
|
||||||
}
|
}
|
||||||
|
@ -847,32 +768,20 @@ public class BoatEntityBOP extends Entity {
|
||||||
/**
|
/**
|
||||||
* Gets the forward direction of the entity.
|
* Gets the forward direction of the entity.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public int getForwardDirection() {
|
public int getForwardDirection() {
|
||||||
return this.dataManager.get(FORWARD_DIRECTION);
|
return this.dataManager.get(FORWARD_DIRECTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBoatType(Type boatType) {
|
public void setBoatModel(Type boatType) {
|
||||||
this.dataManager.set(BOAT_TYPE, boatType.ordinal());
|
this.dataManager.set(BOAT_TYPE, boatType.ordinal());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type getBoatType() {
|
public Type getBoatModel() {
|
||||||
return Type.byId(this.dataManager.get(BOAT_TYPE));
|
return Type.byId(this.dataManager.get(BOAT_TYPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean canFitPassenger(Entity passenger) {
|
@Override
|
||||||
return this.getPassengers().size() < 2 && !this.areEyesInFluid(FluidTags.WATER);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For vehicles, the first passenger is generally considered the controller and "drives" the vehicle. For example,
|
|
||||||
* Pigs, Horses, and Boats are generally "steered" by the controlling passenger.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
public Entity getControllingPassenger() {
|
|
||||||
List<Entity> list = this.getPassengers();
|
|
||||||
return list.isEmpty() ? null : list.get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
public void updateInputs(boolean p_184442_1_, boolean p_184442_2_, boolean p_184442_3_, boolean p_184442_4_) {
|
public void updateInputs(boolean p_184442_1_, boolean p_184442_2_, boolean p_184442_3_, boolean p_184442_4_) {
|
||||||
this.leftInputDown = p_184442_1_;
|
this.leftInputDown = p_184442_1_;
|
||||||
|
@ -886,29 +795,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
return NetworkHooks.getEntitySpawningPacket(this);
|
return NetworkHooks.getEntitySpawningPacket(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forge: Fix MC-119811 by instantly completing lerp on board
|
public enum Type {
|
||||||
@Override
|
|
||||||
protected void addPassenger(Entity passenger) {
|
|
||||||
super.addPassenger(passenger);
|
|
||||||
if (this.canPassengerSteer() && this.lerpSteps > 0) {
|
|
||||||
this.lerpSteps = 0;
|
|
||||||
this.posX = this.lerpX;
|
|
||||||
this.posY = this.lerpY;
|
|
||||||
this.posZ = this.lerpZ;
|
|
||||||
this.rotationYaw = (float)this.lerpYaw;
|
|
||||||
this.rotationPitch = (float)this.lerpPitch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static enum Status {
|
|
||||||
IN_WATER,
|
|
||||||
UNDER_WATER,
|
|
||||||
UNDER_FLOWING_WATER,
|
|
||||||
ON_LAND,
|
|
||||||
IN_AIR;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static enum Type {
|
|
||||||
FIR(BOPBlocks.fir_planks, "fir"),
|
FIR(BOPBlocks.fir_planks, "fir"),
|
||||||
REDWOOD(BOPBlocks.redwood_planks, "redwood"),
|
REDWOOD(BOPBlocks.redwood_planks, "redwood"),
|
||||||
CHERRY(BOPBlocks.cherry_planks, "cherry"),
|
CHERRY(BOPBlocks.cherry_planks, "cherry"),
|
||||||
|
@ -944,6 +831,7 @@ public class BoatEntityBOP extends Entity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a boat type by it's enum ordinal
|
* Get a boat type by it's enum ordinal
|
||||||
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static Type byId(int id) {
|
public static Type byId(int id) {
|
||||||
|
@ -951,7 +839,6 @@ public class BoatEntityBOP extends Entity {
|
||||||
if (id < 0 || id >= aboatentity$type.length) {
|
if (id < 0 || id >= aboatentity$type.length) {
|
||||||
id = 0;
|
id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return aboatentity$type[id];
|
return aboatentity$type[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -963,7 +850,6 @@ public class BoatEntityBOP extends Entity {
|
||||||
return aboatentity$type[i];
|
return aboatentity$type[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return aboatentity$type[0];
|
return aboatentity$type[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class BoatRendererBOP extends EntityRenderer<BoatEntityBOP> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ResourceLocation getEntityTexture(BoatEntityBOP entity) {
|
protected ResourceLocation getEntityTexture(BoatEntityBOP entity) {
|
||||||
return BOAT_TEXTURES[entity.getBoatType().ordinal()];
|
return BOAT_TEXTURES[entity.getBoatModel().ordinal()];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
@javax.annotation.ParametersAreNonnullByDefault
|
||||||
|
@mcp.MethodsReturnNonnullByDefault
|
||||||
|
package biomesoplenty.common.entity.item;
|
|
@ -56,7 +56,7 @@ public class BoatItemBOP extends Item {
|
||||||
if (raytraceresult.getType() == RayTraceResult.Type.BLOCK) {
|
if (raytraceresult.getType() == RayTraceResult.Type.BLOCK) {
|
||||||
|
|
||||||
BoatEntityBOP boatentity = new BoatEntityBOP(worldIn, raytraceresult.getHitVec().x, raytraceresult.getHitVec().y, raytraceresult.getHitVec().z);
|
BoatEntityBOP boatentity = new BoatEntityBOP(worldIn, raytraceresult.getHitVec().x, raytraceresult.getHitVec().y, raytraceresult.getHitVec().z);
|
||||||
boatentity.setBoatType(this.type);
|
boatentity.setBoatModel(this.type);
|
||||||
boatentity.rotationYaw = playerIn.rotationYaw;
|
boatentity.rotationYaw = playerIn.rotationYaw;
|
||||||
if (!worldIn.isCollisionBoxesEmpty(boatentity, boatentity.getBoundingBox().grow(-0.1D))) {
|
if (!worldIn.isCollisionBoxesEmpty(boatentity, boatentity.getBoundingBox().grow(-0.1D))) {
|
||||||
return new ActionResult<>(ActionResultType.FAIL, itemstack);
|
return new ActionResult<>(ActionResultType.FAIL, itemstack);
|
||||||
|
|
|
@ -16,5 +16,3 @@ public-f net.minecraft.item.AxeItem field_203176_a # BLOCK_STRIPPING_MAP
|
||||||
# server.properties world type hackery
|
# server.properties world type hackery
|
||||||
public-f net.minecraft.server.dedicated.ServerProperties *
|
public-f net.minecraft.server.dedicated.ServerProperties *
|
||||||
public net.minecraft.server.dedicated.PropertyManager *
|
public net.minecraft.server.dedicated.PropertyManager *
|
||||||
|
|
||||||
public net.minecraft.client.entity.player.ClientPlayerEntity field_184844_co # rowingBoat
|
|
||||||
|
|
Loading…
Reference in a new issue