Various fixes
This commit is contained in:
parent
14a709ee00
commit
c54f209808
|
@ -8,10 +8,9 @@
|
||||||
package biomesoplenty.api.entity;
|
package biomesoplenty.api.entity;
|
||||||
|
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.projectile.ProjectileItemEntity;
|
|
||||||
|
|
||||||
public class BOPEntities
|
public class BOPEntities
|
||||||
{
|
{
|
||||||
public static EntityType<ProjectileItemEntity> mudball;
|
public static EntityType<?> mudball;
|
||||||
public static EntityType<?> boat_bop;
|
public static EntityType<?> boat_bop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,954 +0,0 @@
|
||||||
package biomesoplenty.common.entity.item;
|
|
||||||
|
|
||||||
import biomesoplenty.api.block.BOPBlocks;
|
|
||||||
import biomesoplenty.api.entity.BOPEntities;
|
|
||||||
import biomesoplenty.api.item.BOPItems;
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.block.LilyPadBlock;
|
|
||||||
import net.minecraft.entity.Entity;
|
|
||||||
import net.minecraft.entity.EntityType;
|
|
||||||
import net.minecraft.entity.LivingEntity;
|
|
||||||
import net.minecraft.entity.MoverType;
|
|
||||||
import net.minecraft.entity.item.BoatEntity;
|
|
||||||
import net.minecraft.entity.passive.AnimalEntity;
|
|
||||||
import net.minecraft.entity.passive.WaterMobEntity;
|
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
|
||||||
import net.minecraft.fluid.IFluidState;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.Items;
|
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
|
||||||
import net.minecraft.network.IPacket;
|
|
||||||
import net.minecraft.network.datasync.DataParameter;
|
|
||||||
import net.minecraft.network.datasync.DataSerializers;
|
|
||||||
import net.minecraft.network.datasync.EntityDataManager;
|
|
||||||
import net.minecraft.network.play.client.CSteerBoatPacket;
|
|
||||||
import net.minecraft.network.play.server.SSpawnObjectPacket;
|
|
||||||
import net.minecraft.particles.ParticleTypes;
|
|
||||||
import net.minecraft.tags.FluidTags;
|
|
||||||
import net.minecraft.util.*;
|
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import net.minecraft.util.math.shapes.IBooleanFunction;
|
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
|
||||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class EntityBoatBOP extends BoatEntity
|
|
||||||
{
|
|
||||||
private static final DataParameter<Integer> TIME_SINCE_HIT = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.VARINT);
|
|
||||||
private static final DataParameter<Integer> FORWARD_DIRECTION = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.VARINT);
|
|
||||||
private static final DataParameter<Float> DAMAGE_TAKEN = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.FLOAT);
|
|
||||||
private static final DataParameter<Integer> BOAT_TYPE = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.VARINT);
|
|
||||||
private static final DataParameter<Boolean> field_199704_e = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.BOOLEAN);
|
|
||||||
private static final DataParameter<Boolean> field_199705_f = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.BOOLEAN);
|
|
||||||
private static final DataParameter<Integer> ROCKING_TICKS = EntityDataManager.createKey(EntityBoatBOP.class, DataSerializers.VARINT);
|
|
||||||
private final float[] paddlePositions = new float[2];
|
|
||||||
private float momentum;
|
|
||||||
private float outOfControlTicks;
|
|
||||||
private float deltaRotation;
|
|
||||||
private int lerpSteps;
|
|
||||||
private double lerpX;
|
|
||||||
private double lerpY;
|
|
||||||
private double lerpZ;
|
|
||||||
private double lerpYaw;
|
|
||||||
private double lerpPitch;
|
|
||||||
private boolean leftInputDown;
|
|
||||||
private boolean rightInputDown;
|
|
||||||
private boolean forwardInputDown;
|
|
||||||
private boolean backInputDown;
|
|
||||||
private double waterLevel;
|
|
||||||
private float boatGlide;
|
|
||||||
private EntityBoatBOP.Status status;
|
|
||||||
private EntityBoatBOP.Status previousStatus;
|
|
||||||
private double lastYd;
|
|
||||||
private boolean rocking;
|
|
||||||
private boolean field_203060_aN;
|
|
||||||
private float rockingIntensity;
|
|
||||||
private float rockingAngle;
|
|
||||||
private float prevRockingAngle;
|
|
||||||
|
|
||||||
public EntityBoatBOP(EntityType<? extends EntityBoatBOP> p_i50129_1_, World p_i50129_2_) {
|
|
||||||
super(p_i50129_1_, p_i50129_2_);
|
|
||||||
this.preventEntitySpawning = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public EntityBoatBOP(World worldIn, double x, double y, double z) {
|
|
||||||
this((EntityType<EntityBoatBOP>)BOPEntities.boat_bop, worldIn);
|
|
||||||
this.setPosition(x, y, z);
|
|
||||||
this.setMotion(Vec3d.ZERO);
|
|
||||||
this.prevPosX = x;
|
|
||||||
this.prevPosY = y;
|
|
||||||
this.prevPosZ = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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() {
|
|
||||||
this.dataManager.register(TIME_SINCE_HIT, 0);
|
|
||||||
this.dataManager.register(FORWARD_DIRECTION, 1);
|
|
||||||
this.dataManager.register(DAMAGE_TAKEN, 0.0F);
|
|
||||||
this.dataManager.register(BOAT_TYPE, EntityBoatBOP.Type.FIR.ordinal());
|
|
||||||
this.dataManager.register(field_199704_e, false);
|
|
||||||
this.dataManager.register(field_199705_f, false);
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
public boolean attackEntityFrom(DamageSource source, float amount) {
|
|
||||||
if (this.isInvulnerableTo(source)) {
|
|
||||||
return false;
|
|
||||||
} else if (!this.world.isRemote && !this.removed) {
|
|
||||||
if (source instanceof IndirectEntityDamageSource && source.getTrueSource() != null && this.isPassenger(source.getTrueSource())) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
this.setForwardDirection(-this.getForwardDirection());
|
|
||||||
this.setTimeSinceHit(10);
|
|
||||||
this.setDamageTaken(this.getDamageTaken() + amount * 10.0F);
|
|
||||||
this.markVelocityChanged();
|
|
||||||
boolean flag = source.getTrueSource() instanceof PlayerEntity && ((PlayerEntity)source.getTrueSource()).abilities.isCreativeMode;
|
|
||||||
if (flag || this.getDamageTaken() > 40.0F) {
|
|
||||||
if (!flag && this.world.getGameRules().getBoolean("doEntityDrops")) {
|
|
||||||
this.entityDropItem(this.getItemBoat());
|
|
||||||
}
|
|
||||||
|
|
||||||
this.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onEnterBubbleColumnWithAirAbove(boolean downwards) {
|
|
||||||
if (!this.world.isRemote) {
|
|
||||||
this.rocking = true;
|
|
||||||
this.field_203060_aN = downwards;
|
|
||||||
if (this.getRockingTicks() == 0) {
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a velocity to the entities, to push them away from eachother.
|
|
||||||
*/
|
|
||||||
public void applyEntityCollision(Entity entityIn) {
|
|
||||||
if (entityIn instanceof EntityBoatBOP) {
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
switch(this.getBOPBoatType())
|
|
||||||
{
|
|
||||||
case FIR:
|
|
||||||
default:
|
|
||||||
return BOPItems.fir_boat;
|
|
||||||
case REDWOOD:
|
|
||||||
return BOPItems.redwood_boat;
|
|
||||||
case CHERRY:
|
|
||||||
return BOPItems.cherry_boat;
|
|
||||||
case MAHOGANY:
|
|
||||||
return BOPItems.mahogany_boat;
|
|
||||||
case JACARANDA:
|
|
||||||
return BOPItems.jacaranda_boat;
|
|
||||||
case PALM:
|
|
||||||
return BOPItems.palm_boat;
|
|
||||||
case WILLOW:
|
|
||||||
return BOPItems.willow_boat;
|
|
||||||
case DEAD:
|
|
||||||
return BOPItems.dead_boat;
|
|
||||||
case MAGIC:
|
|
||||||
return BOPItems.magic_boat;
|
|
||||||
case UMBRAN:
|
|
||||||
return BOPItems.umbran_boat;
|
|
||||||
case HELLBARK:
|
|
||||||
return BOPItems.hellbark_boat;
|
|
||||||
case ETHEREAL:
|
|
||||||
return BOPItems.ethereal_boat;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setups the entity to do the hurt animation. Only used by packets in multiplayer.
|
|
||||||
*/
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void performHurtAnimation() {
|
|
||||||
this.setForwardDirection(-this.getForwardDirection());
|
|
||||||
this.setTimeSinceHit(10);
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
public void tick() {
|
|
||||||
this.previousStatus = this.status;
|
|
||||||
this.status = this.getBoatStatus();
|
|
||||||
if (this.status != EntityBoatBOP.Status.UNDER_WATER && this.status != EntityBoatBOP.Status.UNDER_FLOWING_WATER) {
|
|
||||||
this.outOfControlTicks = 0.0F;
|
|
||||||
} else {
|
|
||||||
++this.outOfControlTicks;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.world.isRemote && this.outOfControlTicks >= 60.0F) {
|
|
||||||
this.removePassengers();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getTimeSinceHit() > 0) {
|
|
||||||
this.setTimeSinceHit(this.getTimeSinceHit() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getDamageTaken() > 0.0F) {
|
|
||||||
this.setDamageTaken(this.getDamageTaken() - 1.0F);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.prevPosX = this.posX;
|
|
||||||
this.prevPosY = this.posY;
|
|
||||||
this.prevPosZ = this.posZ;
|
|
||||||
super.tick();
|
|
||||||
this.tickLerp();
|
|
||||||
if (this.canPassengerSteer()) {
|
|
||||||
if (this.getPassengers().isEmpty() || !(this.getPassengers().get(0) instanceof PlayerEntity)) {
|
|
||||||
this.setPaddleState(false, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateMotion();
|
|
||||||
if (this.world.isRemote) {
|
|
||||||
this.controlBoat();
|
|
||||||
this.world.sendPacketToServer(new CSteerBoatPacket(this.getPaddleState(0), this.getPaddleState(1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.move(MoverType.SELF, this.getMotion());
|
|
||||||
} else {
|
|
||||||
this.setMotion(Vec3d.ZERO);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateRocking();
|
|
||||||
|
|
||||||
for(int i = 0; i <= 1; ++i) {
|
|
||||||
if (this.getPaddleState(i)) {
|
|
||||||
if (!this.isSilent() && (double)(this.paddlePositions[i] % ((float)Math.PI * 2F)) <= (double)((float)Math.PI / 4F) && ((double)this.paddlePositions[i] + (double)((float)Math.PI / 8F)) % (double)((float)Math.PI * 2F) >= (double)((float)Math.PI / 4F)) {
|
|
||||||
SoundEvent soundevent = this.getPaddleSound();
|
|
||||||
if (soundevent != null) {
|
|
||||||
Vec3d vec3d = this.getLook(1.0F);
|
|
||||||
double d0 = i == 1 ? -vec3d.z : vec3d.z;
|
|
||||||
double d1 = i == 1 ? vec3d.x : -vec3d.x;
|
|
||||||
this.world.playSound((PlayerEntity)null, this.posX + d0, this.posY, this.posZ + d1, soundevent, this.getSoundCategory(), 1.0F, 0.8F + 0.4F * this.rand.nextFloat());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.paddlePositions[i] = (float)((double)this.paddlePositions[i] + (double)((float)Math.PI / 8F));
|
|
||||||
} else {
|
|
||||||
this.paddlePositions[i] = 0.0F;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.doBlockCollisions();
|
|
||||||
List<Entity> list = this.world.getEntitiesInAABBexcluding(this, this.getBoundingBox().grow((double)0.2F, (double)-0.01F, (double)0.2F), EntityPredicates.pushableBy(this));
|
|
||||||
if (!list.isEmpty()) {
|
|
||||||
boolean flag = !this.world.isRemote && !(this.getControllingPassenger() instanceof PlayerEntity);
|
|
||||||
|
|
||||||
for(int j = 0; j < list.size(); ++j) {
|
|
||||||
Entity entity = list.get(j);
|
|
||||||
if (!entity.isPassenger(this)) {
|
|
||||||
if (flag && this.getPassengers().size() < 2 && !entity.isPassenger() && entity.getWidth() < this.getWidth() && entity instanceof LivingEntity && !(entity instanceof WaterMobEntity) && !(entity instanceof PlayerEntity)) {
|
|
||||||
entity.startRiding(this);
|
|
||||||
} else {
|
|
||||||
this.applyEntityCollision(entity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateRocking() {
|
|
||||||
if (this.world.isRemote) {
|
|
||||||
int i = this.getRockingTicks();
|
|
||||||
if (i > 0) {
|
|
||||||
this.rockingIntensity += 0.05F;
|
|
||||||
} else {
|
|
||||||
this.rockingIntensity -= 0.1F;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.rockingIntensity = MathHelper.clamp(this.rockingIntensity, 0.0F, 1.0F);
|
|
||||||
this.prevRockingAngle = this.rockingAngle;
|
|
||||||
this.rockingAngle = 10.0F * (float)Math.sin((double)(0.5F * (float)this.world.getGameTime())) * this.rockingIntensity;
|
|
||||||
} else {
|
|
||||||
if (!this.rocking) {
|
|
||||||
this.setRockingTicks(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int k = this.getRockingTicks();
|
|
||||||
if (k > 0) {
|
|
||||||
--k;
|
|
||||||
this.setRockingTicks(k);
|
|
||||||
int j = 60 - k - 1;
|
|
||||||
if (j > 0 && k == 0) {
|
|
||||||
this.setRockingTicks(0);
|
|
||||||
Vec3d vec3d = this.getMotion();
|
|
||||||
if (this.field_203060_aN) {
|
|
||||||
this.setMotion(vec3d.add(0.0D, -0.7D, 0.0D));
|
|
||||||
this.removePassengers();
|
|
||||||
} else {
|
|
||||||
this.setMotion(vec3d.x, this.isPassenger(PlayerEntity.class) ? 2.7D : 0.6D, vec3d.z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.rocking = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected SoundEvent getPaddleSound() {
|
|
||||||
switch(this.getBoatStatus()) {
|
|
||||||
case IN_WATER:
|
|
||||||
case UNDER_WATER:
|
|
||||||
case UNDER_FLOWING_WATER:
|
|
||||||
return SoundEvents.ENTITY_BOAT_PADDLE_WATER;
|
|
||||||
case ON_LAND:
|
|
||||||
return SoundEvents.ENTITY_BOAT_PADDLE_LAND;
|
|
||||||
case IN_AIR:
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void tickLerp() {
|
|
||||||
if (this.lerpSteps > 0 && !this.canPassengerSteer()) {
|
|
||||||
double d0 = this.posX + (this.lerpX - this.posX) / (double)this.lerpSteps;
|
|
||||||
double d1 = this.posY + (this.lerpY - this.posY) / (double)this.lerpSteps;
|
|
||||||
double d2 = this.posZ + (this.lerpZ - this.posZ) / (double)this.lerpSteps;
|
|
||||||
double d3 = MathHelper.wrapDegrees(this.lerpYaw - (double)this.rotationYaw);
|
|
||||||
this.rotationYaw = (float)((double)this.rotationYaw + d3 / (double)this.lerpSteps);
|
|
||||||
this.rotationPitch = (float)((double)this.rotationPitch + (this.lerpPitch - (double)this.rotationPitch) / (double)this.lerpSteps);
|
|
||||||
--this.lerpSteps;
|
|
||||||
this.setPosition(d0, d1, d2);
|
|
||||||
this.setRotation(this.rotationYaw, this.rotationPitch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPaddleState(boolean left, boolean right) {
|
|
||||||
this.dataManager.set(field_199704_e, left);
|
|
||||||
this.dataManager.set(field_199705_f, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines whether the boat is in water, gliding on land, or in air
|
|
||||||
*/
|
|
||||||
private EntityBoatBOP.Status getBoatStatus() {
|
|
||||||
EntityBoatBOP.Status boatentity$status = this.getUnderwaterStatus();
|
|
||||||
if (boatentity$status != null) {
|
|
||||||
this.waterLevel = this.getBoundingBox().maxY;
|
|
||||||
return boatentity$status;
|
|
||||||
} else if (this.checkInWater()) {
|
|
||||||
return EntityBoatBOP.Status.IN_WATER;
|
|
||||||
} else {
|
|
||||||
float f = this.getBoatGlide();
|
|
||||||
if (f > 0.0F) {
|
|
||||||
this.boatGlide = f;
|
|
||||||
return EntityBoatBOP.Status.ON_LAND;
|
|
||||||
} else {
|
|
||||||
return EntityBoatBOP.Status.IN_AIR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getWaterLevelAbove() {
|
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
|
||||||
int i = MathHelper.floor(axisalignedbb.minX);
|
|
||||||
int j = MathHelper.ceil(axisalignedbb.maxX);
|
|
||||||
int k = MathHelper.floor(axisalignedbb.maxY);
|
|
||||||
int l = MathHelper.ceil(axisalignedbb.maxY - this.lastYd);
|
|
||||||
int i1 = MathHelper.floor(axisalignedbb.minZ);
|
|
||||||
int j1 = MathHelper.ceil(axisalignedbb.maxZ);
|
|
||||||
|
|
||||||
try (BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos = BlockPos.PooledMutableBlockPos.retain()) {
|
|
||||||
label161:
|
|
||||||
for(int k1 = k; k1 < l; ++k1) {
|
|
||||||
float f = 0.0F;
|
|
||||||
|
|
||||||
for(int l1 = i; l1 < j; ++l1) {
|
|
||||||
for(int i2 = i1; i2 < j1; ++i2) {
|
|
||||||
blockpos$pooledmutableblockpos.setPos(l1, k1, i2);
|
|
||||||
IFluidState ifluidstate = this.world.getFluidState(blockpos$pooledmutableblockpos);
|
|
||||||
if (ifluidstate.isTagged(FluidTags.WATER)) {
|
|
||||||
f = Math.max(f, ifluidstate.func_215679_a(this.world, blockpos$pooledmutableblockpos));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f >= 1.0F) {
|
|
||||||
continue label161;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f < 1.0F) {
|
|
||||||
float f2 = (float)blockpos$pooledmutableblockpos.getY() + f;
|
|
||||||
return f2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float f1 = (float)(l + 1);
|
|
||||||
return f1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decides how much the boat should be gliding on the land (based on any slippery blocks)
|
|
||||||
*/
|
|
||||||
public float getBoatGlide() {
|
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
|
||||||
AxisAlignedBB axisalignedbb1 = new AxisAlignedBB(axisalignedbb.minX, axisalignedbb.minY - 0.001D, axisalignedbb.minZ, axisalignedbb.maxX, axisalignedbb.minY, axisalignedbb.maxZ);
|
|
||||||
int i = MathHelper.floor(axisalignedbb1.minX) - 1;
|
|
||||||
int j = MathHelper.ceil(axisalignedbb1.maxX) + 1;
|
|
||||||
int k = MathHelper.floor(axisalignedbb1.minY) - 1;
|
|
||||||
int l = MathHelper.ceil(axisalignedbb1.maxY) + 1;
|
|
||||||
int i1 = MathHelper.floor(axisalignedbb1.minZ) - 1;
|
|
||||||
int j1 = MathHelper.ceil(axisalignedbb1.maxZ) + 1;
|
|
||||||
VoxelShape voxelshape = VoxelShapes.create(axisalignedbb1);
|
|
||||||
float f = 0.0F;
|
|
||||||
int k1 = 0;
|
|
||||||
|
|
||||||
try (BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos = BlockPos.PooledMutableBlockPos.retain()) {
|
|
||||||
for(int l1 = i; l1 < j; ++l1) {
|
|
||||||
for(int i2 = i1; i2 < j1; ++i2) {
|
|
||||||
int j2 = (l1 != i && l1 != j - 1 ? 0 : 1) + (i2 != i1 && i2 != j1 - 1 ? 0 : 1);
|
|
||||||
if (j2 != 2) {
|
|
||||||
for(int k2 = k; k2 < l; ++k2) {
|
|
||||||
if (j2 <= 0 || k2 != k && k2 != l - 1) {
|
|
||||||
blockpos$pooledmutableblockpos.setPos(l1, k2, i2);
|
|
||||||
BlockState blockstate = this.world.getBlockState(blockpos$pooledmutableblockpos);
|
|
||||||
if (!(blockstate.getBlock() instanceof LilyPadBlock) && VoxelShapes.compare(blockstate.getCollisionShape(this.world, blockpos$pooledmutableblockpos).withOffset((double)l1, (double)k2, (double)i2), voxelshape, IBooleanFunction.AND)) {
|
|
||||||
f += blockstate.getSlipperiness(this.world, blockpos$pooledmutableblockpos, this);
|
|
||||||
++k1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return f / (float)k1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkInWater() {
|
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
|
||||||
int i = MathHelper.floor(axisalignedbb.minX);
|
|
||||||
int j = MathHelper.ceil(axisalignedbb.maxX);
|
|
||||||
int k = MathHelper.floor(axisalignedbb.minY);
|
|
||||||
int l = MathHelper.ceil(axisalignedbb.minY + 0.001D);
|
|
||||||
int i1 = MathHelper.floor(axisalignedbb.minZ);
|
|
||||||
int j1 = MathHelper.ceil(axisalignedbb.maxZ);
|
|
||||||
boolean flag = false;
|
|
||||||
this.waterLevel = Double.MIN_VALUE;
|
|
||||||
|
|
||||||
try (BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos = BlockPos.PooledMutableBlockPos.retain()) {
|
|
||||||
for(int k1 = i; k1 < j; ++k1) {
|
|
||||||
for(int l1 = k; l1 < l; ++l1) {
|
|
||||||
for(int i2 = i1; i2 < j1; ++i2) {
|
|
||||||
blockpos$pooledmutableblockpos.setPos(k1, l1, i2);
|
|
||||||
IFluidState ifluidstate = this.world.getFluidState(blockpos$pooledmutableblockpos);
|
|
||||||
if (ifluidstate.isTagged(FluidTags.WATER)) {
|
|
||||||
float f = (float)l1 + ifluidstate.func_215679_a(this.world, blockpos$pooledmutableblockpos);
|
|
||||||
this.waterLevel = Math.max((double)f, this.waterLevel);
|
|
||||||
flag |= axisalignedbb.minY < (double)f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decides whether the boat is currently underwater.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
private EntityBoatBOP.Status getUnderwaterStatus() {
|
|
||||||
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
|
||||||
double d0 = axisalignedbb.maxY + 0.001D;
|
|
||||||
int i = MathHelper.floor(axisalignedbb.minX);
|
|
||||||
int j = MathHelper.ceil(axisalignedbb.maxX);
|
|
||||||
int k = MathHelper.floor(axisalignedbb.maxY);
|
|
||||||
int l = MathHelper.ceil(d0);
|
|
||||||
int i1 = MathHelper.floor(axisalignedbb.minZ);
|
|
||||||
int j1 = MathHelper.ceil(axisalignedbb.maxZ);
|
|
||||||
boolean flag = false;
|
|
||||||
|
|
||||||
try (BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos = BlockPos.PooledMutableBlockPos.retain()) {
|
|
||||||
for(int k1 = i; k1 < j; ++k1) {
|
|
||||||
for(int l1 = k; l1 < l; ++l1) {
|
|
||||||
for(int i2 = i1; i2 < j1; ++i2) {
|
|
||||||
blockpos$pooledmutableblockpos.setPos(k1, l1, i2);
|
|
||||||
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.isSource()) {
|
|
||||||
EntityBoatBOP.Status boatentity$status = EntityBoatBOP.Status.UNDER_FLOWING_WATER;
|
|
||||||
return boatentity$status;
|
|
||||||
}
|
|
||||||
|
|
||||||
flag = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return flag ? EntityBoatBOP.Status.UNDER_WATER : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the boat's speed, based on momentum.
|
|
||||||
*/
|
|
||||||
private void updateMotion() {
|
|
||||||
double d0 = (double)-0.04F;
|
|
||||||
double d1 = this.hasNoGravity() ? 0.0D : (double)-0.04F;
|
|
||||||
double d2 = 0.0D;
|
|
||||||
this.momentum = 0.05F;
|
|
||||||
if (this.previousStatus == EntityBoatBOP.Status.IN_AIR && this.status != EntityBoatBOP.Status.IN_AIR && this.status != EntityBoatBOP.Status.ON_LAND) {
|
|
||||||
this.waterLevel = this.getBoundingBox().minY + (double)this.getHeight();
|
|
||||||
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.lastYd = 0.0D;
|
|
||||||
this.status = EntityBoatBOP.Status.IN_WATER;
|
|
||||||
} else {
|
|
||||||
if (this.status == EntityBoatBOP.Status.IN_WATER) {
|
|
||||||
d2 = (this.waterLevel - this.getBoundingBox().minY) / (double)this.getHeight();
|
|
||||||
this.momentum = 0.9F;
|
|
||||||
} else if (this.status == EntityBoatBOP.Status.UNDER_FLOWING_WATER) {
|
|
||||||
d1 = -7.0E-4D;
|
|
||||||
this.momentum = 0.9F;
|
|
||||||
} else if (this.status == EntityBoatBOP.Status.UNDER_WATER) {
|
|
||||||
d2 = (double)0.01F;
|
|
||||||
this.momentum = 0.45F;
|
|
||||||
} else if (this.status == EntityBoatBOP.Status.IN_AIR) {
|
|
||||||
this.momentum = 0.9F;
|
|
||||||
} else if (this.status == EntityBoatBOP.Status.ON_LAND) {
|
|
||||||
this.momentum = this.boatGlide;
|
|
||||||
if (this.getControllingPassenger() instanceof PlayerEntity) {
|
|
||||||
this.boatGlide /= 2.0F;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Vec3d vec3d = this.getMotion();
|
|
||||||
this.setMotion(vec3d.x * (double)this.momentum, vec3d.y + d1, vec3d.z * (double)this.momentum);
|
|
||||||
this.deltaRotation *= this.momentum;
|
|
||||||
if (d2 > 0.0D) {
|
|
||||||
Vec3d vec3d1 = this.getMotion();
|
|
||||||
this.setMotion(vec3d1.x, (vec3d1.y + d2 * 0.06153846016296973D) * 0.75D, vec3d1.z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void controlBoat() {
|
|
||||||
if (this.isBeingRidden()) {
|
|
||||||
float f = 0.0F;
|
|
||||||
if (this.leftInputDown) {
|
|
||||||
--this.deltaRotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.rightInputDown) {
|
|
||||||
++this.deltaRotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.rightInputDown != this.leftInputDown && !this.forwardInputDown && !this.backInputDown) {
|
|
||||||
f += 0.005F;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.rotationYaw += this.deltaRotation;
|
|
||||||
if (this.forwardInputDown) {
|
|
||||||
f += 0.04F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.backInputDown) {
|
|
||||||
f -= 0.005F;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setMotion(this.getMotion().add((double)(MathHelper.sin(-this.rotationYaw * ((float)Math.PI / 180F)) * f), 0.0D, (double)(MathHelper.cos(this.rotationYaw * ((float)Math.PI / 180F)) * f)));
|
|
||||||
this.setPaddleState(this.rightInputDown && !this.leftInputDown || this.forwardInputDown, this.leftInputDown && !this.rightInputDown || this.forwardInputDown);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updatePassenger(Entity passenger) {
|
|
||||||
if (this.isPassenger(passenger)) {
|
|
||||||
float f = 0.0F;
|
|
||||||
float f1 = (float)((this.removed ? (double)0.01F : this.getMountedYOffset()) + passenger.getYOffset());
|
|
||||||
if (this.getPassengers().size() > 1) {
|
|
||||||
int i = this.getPassengers().indexOf(passenger);
|
|
||||||
if (i == 0) {
|
|
||||||
f = 0.2F;
|
|
||||||
} else {
|
|
||||||
f = -0.6F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (passenger instanceof AnimalEntity) {
|
|
||||||
f = (float)((double)f + 0.2D);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Vec3d vec3d = (new Vec3d((double)f, 0.0D, 0.0D)).rotateYaw(-this.rotationYaw * ((float)Math.PI / 180F) - ((float)Math.PI / 2F));
|
|
||||||
passenger.setPosition(this.posX + vec3d.x, this.posY + (double)f1, this.posZ + vec3d.z);
|
|
||||||
passenger.rotationYaw += this.deltaRotation;
|
|
||||||
passenger.setRotationYawHead(passenger.getRotationYawHead() + this.deltaRotation);
|
|
||||||
this.applyYawToEntity(passenger);
|
|
||||||
if (passenger instanceof AnimalEntity && this.getPassengers().size() > 1) {
|
|
||||||
int j = passenger.getEntityId() % 2 == 0 ? 90 : 270;
|
|
||||||
passenger.setRenderYawOffset(((AnimalEntity)passenger).renderYawOffset + (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.
|
|
||||||
*/
|
|
||||||
protected void applyYawToEntity(Entity entityToUpdate) {
|
|
||||||
entityToUpdate.setRenderYawOffset(this.rotationYaw);
|
|
||||||
float f = MathHelper.wrapDegrees(entityToUpdate.rotationYaw - this.rotationYaw);
|
|
||||||
float f1 = MathHelper.clamp(f, -105.0F, 105.0F);
|
|
||||||
entityToUpdate.prevRotationYaw += f1 - f;
|
|
||||||
entityToUpdate.rotationYaw += f1 - f;
|
|
||||||
entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies this entity's orientation (pitch/yaw) to another entity. Used to update passenger orientation.
|
|
||||||
*/
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void applyOrientationToEntity(Entity entityToUpdate) {
|
|
||||||
this.applyYawToEntity(entityToUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void writeAdditional(CompoundNBT compound) {
|
|
||||||
compound.putString("Type", this.getBoatType().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (abstract) Protected helper method to read subclass entity data from NBT.
|
|
||||||
*/
|
|
||||||
protected void readAdditional(CompoundNBT compound) {
|
|
||||||
if (compound.contains("Type", 8)) {
|
|
||||||
this.setBoatType(EntityBoatBOP.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateFallState(double y, boolean onGroundIn, BlockState state, BlockPos pos) {
|
|
||||||
this.lastYd = this.getMotion().y;
|
|
||||||
if (!this.isPassenger()) {
|
|
||||||
if (onGroundIn) {
|
|
||||||
if (this.fallDistance > 3.0F) {
|
|
||||||
if (this.status != EntityBoatBOP.Status.ON_LAND) {
|
|
||||||
this.fallDistance = 0.0F;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.fall(this.fallDistance, 1.0F);
|
|
||||||
if (!this.world.isRemote && !this.removed) {
|
|
||||||
this.remove();
|
|
||||||
if (this.world.getGameRules().getBoolean("doEntityDrops")) {
|
|
||||||
for(int i = 0; i < 3; ++i) {
|
|
||||||
this.entityDropItem(this.getBoatType().asPlank());
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int j = 0; j < 2; ++j) {
|
|
||||||
this.entityDropItem(Items.STICK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.fallDistance = 0.0F;
|
|
||||||
} else if (!this.world.getFluidState((new BlockPos(this)).down()).isTagged(FluidTags.WATER) && y < 0.0D) {
|
|
||||||
this.fallDistance = (float)((double)this.fallDistance - y);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getPaddleState(int side) {
|
|
||||||
return this.dataManager.<Boolean>get(side == 0 ? field_199704_e : field_199705_f) && this.getControllingPassenger() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the damage taken from the last hit.
|
|
||||||
*/
|
|
||||||
public void setDamageTaken(float damageTaken) {
|
|
||||||
this.dataManager.set(DAMAGE_TAKEN, damageTaken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the damage taken from the last hit.
|
|
||||||
*/
|
|
||||||
public float getDamageTaken() {
|
|
||||||
return this.dataManager.get(DAMAGE_TAKEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the time to count down from since the last time entity was hit.
|
|
||||||
*/
|
|
||||||
public void setTimeSinceHit(int timeSinceHit) {
|
|
||||||
this.dataManager.set(TIME_SINCE_HIT, timeSinceHit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the time since the last hit.
|
|
||||||
*/
|
|
||||||
public int getTimeSinceHit() {
|
|
||||||
return this.dataManager.get(TIME_SINCE_HIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setRockingTicks(int p_203055_1_) {
|
|
||||||
this.dataManager.set(ROCKING_TICKS, p_203055_1_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getRockingTicks() {
|
|
||||||
return this.dataManager.get(ROCKING_TICKS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public float getRockingAngle(float partialTicks) {
|
|
||||||
return MathHelper.lerp(partialTicks, this.prevRockingAngle, this.rockingAngle);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the forward direction of the entity.
|
|
||||||
*/
|
|
||||||
public void setForwardDirection(int forwardDirection) {
|
|
||||||
this.dataManager.set(FORWARD_DIRECTION, forwardDirection);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the forward direction of the entity.
|
|
||||||
*/
|
|
||||||
public int getForwardDirection() {
|
|
||||||
return this.dataManager.get(FORWARD_DIRECTION);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBoatType(EntityBoatBOP.Type boatType) {
|
|
||||||
this.dataManager.set(BOAT_TYPE, boatType.ordinal());
|
|
||||||
}
|
|
||||||
|
|
||||||
public EntityBoatBOP.Type getBOPBoatType()
|
|
||||||
{
|
|
||||||
return EntityBoatBOP.Type.byId(this.dataManager.get(BOAT_TYPE));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean canFitPassenger(Entity passenger) {
|
|
||||||
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)
|
|
||||||
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.rightInputDown = p_184442_2_;
|
|
||||||
this.forwardInputDown = p_184442_3_;
|
|
||||||
this.backInputDown = p_184442_4_;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IPacket<?> createSpawnPacket() {
|
|
||||||
return new SSpawnObjectPacket(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forge: Fix MC-119811 by instantly completing lerp on board
|
|
||||||
@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"),
|
|
||||||
REDWOOD(BOPBlocks.redwood_planks, "redwood"),
|
|
||||||
CHERRY(BOPBlocks.cherry_planks, "cherry"),
|
|
||||||
MAHOGANY(BOPBlocks.mahogany_planks, "mahogany"),
|
|
||||||
JACARANDA(BOPBlocks.jacaranda_planks, "jacaranda"),
|
|
||||||
PALM(BOPBlocks.palm_planks, "palm"),
|
|
||||||
WILLOW(BOPBlocks.willow_planks, "willow"),
|
|
||||||
DEAD(BOPBlocks.dead_planks, "dead"),
|
|
||||||
MAGIC(BOPBlocks.magic_planks, "magic"),
|
|
||||||
UMBRAN(BOPBlocks.umbran_planks, "umbran"),
|
|
||||||
HELLBARK(BOPBlocks.hellbark_planks, "hellbark"),
|
|
||||||
ETHEREAL(BOPBlocks.ethereal_planks, "ethereal");
|
|
||||||
|
|
||||||
private final String name;
|
|
||||||
private final Block block;
|
|
||||||
|
|
||||||
private Type(Block p_i48146_3_, String p_i48146_4_) {
|
|
||||||
this.name = p_i48146_4_;
|
|
||||||
this.block = p_i48146_3_;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Block asPlank() {
|
|
||||||
return this.block;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a boat type by it's enum ordinal
|
|
||||||
*/
|
|
||||||
public static EntityBoatBOP.Type byId(int id) {
|
|
||||||
EntityBoatBOP.Type[] aentityboat$type = values();
|
|
||||||
if (id < 0 || id >= aentityboat$type.length) {
|
|
||||||
id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return aentityboat$type[id];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EntityBoatBOP.Type getTypeFromString(String nameIn) {
|
|
||||||
EntityBoatBOP.Type[] aentityboat$type = values();
|
|
||||||
|
|
||||||
for(int i = 0; i < aentityboat$type.length; ++i) {
|
|
||||||
if (aentityboat$type[i].getName().equals(nameIn)) {
|
|
||||||
return aentityboat$type[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return aentityboat$type[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,90 +0,0 @@
|
||||||
package biomesoplenty.common.entity.item;
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.GlStateManager;
|
|
||||||
import net.minecraft.client.renderer.entity.EntityRenderer;
|
|
||||||
import net.minecraft.client.renderer.entity.EntityRendererManager;
|
|
||||||
import net.minecraft.client.renderer.entity.model.BoatModel;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public class RenderBoatBOP extends EntityRenderer<EntityBoatBOP>
|
|
||||||
{
|
|
||||||
private static final ResourceLocation[] BOAT_TEXTURES = new ResourceLocation[]{new ResourceLocation("biomesoplenty:textures/entity/boat/fir.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/redwood.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/cherry.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/mahogany.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/jacaranda.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/palm.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/willow.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/dead.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/magic.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/umbran.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/hellbark.png"), new ResourceLocation("biomesoplenty:textures/entity/boat/ethereal.png")};
|
|
||||||
/** instance of ModelBoat for rendering */
|
|
||||||
protected BoatModel modelBoat = new BoatModel();
|
|
||||||
|
|
||||||
public RenderBoatBOP(EntityRendererManager renderManagerIn) {
|
|
||||||
super(renderManagerIn);
|
|
||||||
this.shadowSize = 0.5F;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the desired {@code T} type Entity.
|
|
||||||
*/
|
|
||||||
public void doRender(EntityBoatBOP entity, double x, double y, double z, float entityYaw, float partialTicks) {
|
|
||||||
GlStateManager.pushMatrix();
|
|
||||||
this.setupTranslation(x, y, z);
|
|
||||||
this.setupRotation(entity, entityYaw, partialTicks);
|
|
||||||
this.bindEntityTexture(entity);
|
|
||||||
if (this.renderOutlines) {
|
|
||||||
GlStateManager.enableColorMaterial();
|
|
||||||
GlStateManager.setupSolidRenderingTextureCombine(this.getTeamColor(entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.modelBoat.render(entity, partialTicks, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
|
|
||||||
if (this.renderOutlines) {
|
|
||||||
GlStateManager.tearDownSolidRenderingTextureCombine();
|
|
||||||
GlStateManager.disableColorMaterial();
|
|
||||||
}
|
|
||||||
|
|
||||||
GlStateManager.popMatrix();
|
|
||||||
super.doRender(entity, x, y, z, entityYaw, partialTicks);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setupRotation(EntityBoatBOP entityIn, float entityYaw, float partialTicks) {
|
|
||||||
GlStateManager.rotatef(180.0F - entityYaw, 0.0F, 1.0F, 0.0F);
|
|
||||||
float f = (float)entityIn.getTimeSinceHit() - partialTicks;
|
|
||||||
float f1 = entityIn.getDamageTaken() - partialTicks;
|
|
||||||
if (f1 < 0.0F) {
|
|
||||||
f1 = 0.0F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f > 0.0F) {
|
|
||||||
GlStateManager.rotatef(MathHelper.sin(f) * f * f1 / 10.0F * (float)entityIn.getForwardDirection(), 1.0F, 0.0F, 0.0F);
|
|
||||||
}
|
|
||||||
|
|
||||||
float f2 = entityIn.func_203056_b(partialTicks);
|
|
||||||
if (!MathHelper.epsilonEquals(f2, 0.0F)) {
|
|
||||||
GlStateManager.rotatef(entityIn.func_203056_b(partialTicks), 1.0F, 0.0F, 1.0F);
|
|
||||||
}
|
|
||||||
|
|
||||||
GlStateManager.scalef(-1.0F, -1.0F, 1.0F);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setupTranslation(double x, double y, double z) {
|
|
||||||
GlStateManager.translatef((float)x, (float)y + 0.375F, (float)z);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
|
|
||||||
*/
|
|
||||||
protected ResourceLocation getEntityTexture(EntityBoatBOP entity) {
|
|
||||||
return BOAT_TEXTURES[entity.getBoatType().ordinal()];
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isMultipass() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void renderMultipass(EntityBoatBOP entityIn, double x, double y, double z, float entityYaw, float partialTicks) {
|
|
||||||
GlStateManager.pushMatrix();
|
|
||||||
this.setupTranslation(x, y, z);
|
|
||||||
this.setupRotation(entityIn, entityYaw, partialTicks);
|
|
||||||
this.bindEntityTexture(entityIn);
|
|
||||||
this.modelBoat.renderMultipass(entityIn, partialTicks, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
|
|
||||||
GlStateManager.popMatrix();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,107 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright 2014-2019, the Biomes O' Plenty Team
|
|
||||||
*
|
|
||||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
|
|
||||||
*
|
|
||||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
|
|
||||||
******************************************************************************/
|
|
||||||
package biomesoplenty.common.item;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import biomesoplenty.common.entity.item.EntityBoatBOP;
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.entity.Entity;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.stats.StatList;
|
|
||||||
import net.minecraft.util.ActionResult;
|
|
||||||
import net.minecraft.util.EnumActionResult;
|
|
||||||
import net.minecraft.util.EnumHand;
|
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import net.minecraft.util.math.RayTraceFluidMode;
|
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
public class ItemBoatBOP extends Item
|
|
||||||
{
|
|
||||||
private final EntityBoatBOP.Type type;
|
|
||||||
|
|
||||||
public ItemBoatBOP(EntityBoatBOP.Type typeIn, Item.Properties properties)
|
|
||||||
{
|
|
||||||
super(properties);
|
|
||||||
this.type = typeIn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called to trigger the item's "innate" right click behavior. To handle when this item is used on a Block, see
|
|
||||||
* {@link #onItemUse}.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
|
|
||||||
ItemStack itemstack = playerIn.getHeldItem(handIn);
|
|
||||||
float f = 1.0F;
|
|
||||||
float f1 = playerIn.prevRotationPitch + (playerIn.rotationPitch - playerIn.prevRotationPitch) * 1.0F;
|
|
||||||
float f2 = playerIn.prevRotationYaw + (playerIn.rotationYaw - playerIn.prevRotationYaw) * 1.0F;
|
|
||||||
double d0 = playerIn.prevPosX + (playerIn.posX - playerIn.prevPosX) * 1.0D;
|
|
||||||
double d1 = playerIn.prevPosY + (playerIn.posY - playerIn.prevPosY) * 1.0D + (double)playerIn.getEyeHeight();
|
|
||||||
double d2 = playerIn.prevPosZ + (playerIn.posZ - playerIn.prevPosZ) * 1.0D;
|
|
||||||
Vec3d vec3d = new Vec3d(d0, d1, d2);
|
|
||||||
float f3 = MathHelper.cos(-f2 * ((float)Math.PI / 180F) - (float)Math.PI);
|
|
||||||
float f4 = MathHelper.sin(-f2 * ((float)Math.PI / 180F) - (float)Math.PI);
|
|
||||||
float f5 = -MathHelper.cos(-f1 * ((float)Math.PI / 180F));
|
|
||||||
float f6 = MathHelper.sin(-f1 * ((float)Math.PI / 180F));
|
|
||||||
float f7 = f4 * f5;
|
|
||||||
float f8 = f3 * f5;
|
|
||||||
double d3 = 5.0D;
|
|
||||||
Vec3d vec3d1 = vec3d.add((double)f7 * 5.0D, (double)f6 * 5.0D, (double)f8 * 5.0D);
|
|
||||||
RayTraceResult raytraceresult = worldIn.rayTraceBlocks(vec3d, vec3d1, RayTraceFluidMode.ALWAYS);
|
|
||||||
if (raytraceresult == null) {
|
|
||||||
return new ActionResult<>(EnumActionResult.PASS, itemstack);
|
|
||||||
} else {
|
|
||||||
Vec3d vec3d2 = playerIn.getLook(1.0F);
|
|
||||||
boolean flag = false;
|
|
||||||
List<Entity> list = worldIn.getEntitiesWithinAABBExcludingEntity(playerIn, playerIn.getBoundingBox().expand(vec3d2.x * 5.0D, vec3d2.y * 5.0D, vec3d2.z * 5.0D).grow(1.0D));
|
|
||||||
|
|
||||||
for(int i = 0; i < list.size(); ++i) {
|
|
||||||
Entity entity = list.get(i);
|
|
||||||
if (entity.canBeCollidedWith()) {
|
|
||||||
AxisAlignedBB axisalignedbb = entity.getBoundingBox().grow((double)entity.getCollisionBorderSize());
|
|
||||||
if (axisalignedbb.contains(vec3d)) {
|
|
||||||
flag = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flag) {
|
|
||||||
return new ActionResult<>(EnumActionResult.PASS, itemstack);
|
|
||||||
} else if (raytraceresult.type == RayTraceResult.Type.BLOCK) {
|
|
||||||
BlockPos blockpos = raytraceresult.getBlockPos();
|
|
||||||
Block block = worldIn.getBlockState(blockpos).getBlock();
|
|
||||||
EntityBoatBOP entityboat = new EntityBoatBOP(worldIn, raytraceresult.hitVec.x, raytraceresult.hitVec.y, raytraceresult.hitVec.z);
|
|
||||||
entityboat.setBoatType(this.type);
|
|
||||||
entityboat.rotationYaw = playerIn.rotationYaw;
|
|
||||||
if (!worldIn.isCollisionBoxesEmpty(entityboat, entityboat.getBoundingBox().grow(-0.1D))) {
|
|
||||||
return new ActionResult<>(EnumActionResult.FAIL, itemstack);
|
|
||||||
} else {
|
|
||||||
if (!worldIn.isRemote) {
|
|
||||||
worldIn.spawnEntity(entityboat);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!playerIn.abilities.isCreativeMode) {
|
|
||||||
itemstack.shrink(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
playerIn.addStat(StatList.ITEM_USED.get(this));
|
|
||||||
return new ActionResult<>(EnumActionResult.SUCCESS, itemstack);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return new ActionResult<>(EnumActionResult.PASS, itemstack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,106 +1,84 @@
|
||||||
package biomesoplenty.common.item;
|
package biomesoplenty.common.item;
|
||||||
|
|
||||||
import biomesoplenty.api.block.BOPBlocks;
|
|
||||||
import net.minecraft.advancements.CriteriaTriggers;
|
import net.minecraft.advancements.CriteriaTriggers;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.material.Material;
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
|
||||||
import net.minecraft.fluid.IFluidState;
|
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.init.Fluids;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.init.SoundEvents;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemBlock;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.item.ItemUseContext;
|
import net.minecraft.item.ItemUseContext;
|
||||||
import net.minecraft.stats.StatList;
|
import net.minecraft.stats.Stats;
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.util.*;
|
||||||
import net.minecraft.util.EnumActionResult;
|
|
||||||
import net.minecraft.util.EnumHand;
|
|
||||||
import net.minecraft.util.SoundCategory;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.BlockRayTraceResult;
|
||||||
|
import net.minecraft.util.math.RayTraceContext;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class ItemWaterPlant extends BlockItem
|
public class ItemWaterPlant extends BlockItem
|
||||||
{
|
{
|
||||||
private Block block;
|
|
||||||
|
|
||||||
public ItemWaterPlant(Block blockIn, Item.Properties builder)
|
public ItemWaterPlant(Block blockIn, Item.Properties builder)
|
||||||
{
|
{
|
||||||
super(blockIn, builder);
|
super(blockIn, builder);
|
||||||
this.block = blockIn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when this item is used when targetting a Block
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public EnumActionResult onItemUse(ItemUseContext context)
|
public ActionResultType onItemUse(ItemUseContext context)
|
||||||
{
|
{
|
||||||
return EnumActionResult.PASS;
|
return ActionResultType.PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called to trigger the item's "innate" right click behavior. To handle when this item is used on a Block, see
|
|
||||||
* {@link #onItemUse}.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
|
public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn)
|
||||||
{
|
{
|
||||||
ItemStack itemstack = playerIn.getHeldItem(handIn);
|
ItemStack itemstack = playerIn.getHeldItem(handIn);
|
||||||
RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, true);
|
RayTraceResult raytraceresult = rayTrace(worldIn, playerIn, RayTraceContext.FluidMode.SOURCE_ONLY);
|
||||||
if (raytraceresult == null)
|
if (raytraceresult.getType() == RayTraceResult.Type.MISS) {
|
||||||
{
|
return new ActionResult<>(ActionResultType.PASS, itemstack);
|
||||||
return new ActionResult<>(EnumActionResult.PASS, itemstack);
|
} else {
|
||||||
}
|
if (raytraceresult.getType() == RayTraceResult.Type.BLOCK) {
|
||||||
else
|
BlockRayTraceResult blockraytraceresult = (BlockRayTraceResult)raytraceresult;
|
||||||
{
|
BlockPos blockpos = blockraytraceresult.getPos();
|
||||||
if (raytraceresult.type == RayTraceResult.Type.BLOCK)
|
Direction direction = blockraytraceresult.getFace();
|
||||||
{
|
if (!worldIn.isBlockModifiable(playerIn, blockpos) || !playerIn.canPlayerEdit(blockpos.offset(direction), direction, itemstack)) {
|
||||||
BlockPos blockpos = raytraceresult.getBlockPos();
|
return new ActionResult<>(ActionResultType.FAIL, itemstack);
|
||||||
if (!worldIn.isBlockModifiable(playerIn, blockpos) || !playerIn.canPlayerEdit(blockpos.offset(raytraceresult.sideHit), raytraceresult.sideHit, itemstack))
|
|
||||||
{
|
|
||||||
return new ActionResult<>(EnumActionResult.FAIL, itemstack);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockPos blockpos1 = blockpos.up();
|
BlockPos blockpos1 = blockpos.up();
|
||||||
BlockState BlockState = worldIn.getBlockState(blockpos);
|
BlockState blockstate = worldIn.getBlockState(blockpos);
|
||||||
Material material = BlockState.getMaterial();
|
Material material = blockstate.getMaterial();
|
||||||
IFluidState ifluidstate = worldIn.getFluidState(blockpos);
|
IFluidState ifluidstate = worldIn.getFluidState(blockpos);
|
||||||
Block ground = worldIn.getBlockState(blockpos.down()).getBlock();
|
if ((ifluidstate.getFluid() == Fluids.WATER || material == Material.ICE) && worldIn.isAirBlock(blockpos1)) {
|
||||||
if ((ifluidstate.getFluid() == Fluids.WATER || material == Material.ICE) && worldIn.isAirBlock(blockpos1) && (ground == Blocks.DIORITE || ground == Blocks.GRANITE || ground == Blocks.ANDESITE || ground == Blocks.STONE || ground == Blocks.DIRT || ground == Blocks.COARSE_DIRT || ground == Blocks.GRASS_BLOCK || ground == Blocks.GRAVEL || ground == Blocks.SAND || ground == Blocks.RED_SAND || ground == BOPBlocks.white_sand || ground == BOPBlocks.mud || ground == BOPBlocks.dried_sand))
|
|
||||||
{
|
|
||||||
|
|
||||||
// special case for handling block placement with water lilies
|
// special case for handling block placement with water lilies
|
||||||
net.minecraftforge.common.util.BlockSnapshot blocksnapshot = net.minecraftforge.common.util.BlockSnapshot.getBlockSnapshot(worldIn, blockpos1);
|
net.minecraftforge.common.util.BlockSnapshot blocksnapshot = net.minecraftforge.common.util.BlockSnapshot.getBlockSnapshot(worldIn, blockpos1);
|
||||||
worldIn.setBlockState(blockpos1, this.block.getDefaultState(), 11);
|
worldIn.setBlockState(blockpos1, Blocks.LILY_PAD.getDefaultState(), 11);
|
||||||
if (net.minecraftforge.event.ForgeEventFactory.onBlockPlace(playerIn, blocksnapshot, net.minecraft.util.Direction.UP))
|
if (net.minecraftforge.event.ForgeEventFactory.onBlockPlace(playerIn, blocksnapshot, net.minecraft.util.Direction.UP)) {
|
||||||
{
|
|
||||||
blocksnapshot.restore(true, false);
|
blocksnapshot.restore(true, false);
|
||||||
return new ActionResult<ItemStack>(EnumActionResult.FAIL, itemstack);
|
return new ActionResult<ItemStack>(ActionResultType.FAIL, itemstack);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playerIn instanceof EntityPlayerMP)
|
if (playerIn instanceof ServerPlayerEntity) {
|
||||||
{
|
CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity)playerIn, blockpos1, itemstack);
|
||||||
CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) playerIn, blockpos1, itemstack);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!playerIn.abilities.isCreativeMode)
|
if (!playerIn.abilities.isCreativeMode) {
|
||||||
{
|
|
||||||
itemstack.shrink(1);
|
itemstack.shrink(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
playerIn.addStat(StatList.ITEM_USED.get(this));
|
playerIn.addStat(Stats.ITEM_USED.get(this));
|
||||||
worldIn.playSound(playerIn, blockpos, SoundEvents.BLOCK_LILY_PAD_PLACE, SoundCategory.BLOCKS, 1.0F, 1.0F);
|
worldIn.playSound(playerIn, blockpos, SoundEvents.BLOCK_LILY_PAD_PLACE, SoundCategory.BLOCKS, 1.0F, 1.0F);
|
||||||
return new ActionResult<>(EnumActionResult.SUCCESS, itemstack);
|
return new ActionResult<>(ActionResultType.SUCCESS, itemstack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ActionResult<>(EnumActionResult.FAIL, itemstack);
|
return new ActionResult<>(ActionResultType.FAIL, itemstack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,103 +1,77 @@
|
||||||
package biomesoplenty.common.world;
|
package biomesoplenty.common.world;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
|
|
||||||
import biomesoplenty.api.biome.BOPBiomes;
|
import biomesoplenty.api.biome.BOPBiomes;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.world.biome.Biomes;
|
|
||||||
import net.minecraft.util.SharedSeedRandom;
|
import net.minecraft.util.SharedSeedRandom;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.world.biome.Biome;
|
import net.minecraft.world.biome.Biome;
|
||||||
|
import net.minecraft.world.biome.Biomes;
|
||||||
import net.minecraft.world.biome.provider.BiomeProvider;
|
import net.minecraft.world.biome.provider.BiomeProvider;
|
||||||
import net.minecraft.world.biome.provider.EndBiomeProviderSettings;
|
import net.minecraft.world.biome.provider.EndBiomeProviderSettings;
|
||||||
import net.minecraft.world.gen.NoiseGeneratorSimplex;
|
import net.minecraft.world.gen.SimplexNoiseGenerator;
|
||||||
import net.minecraft.world.gen.feature.structure.Structure;
|
import net.minecraft.world.gen.feature.structure.Structure;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class BOPEndBiomeProvider extends BiomeProvider {
|
public class BOPEndBiomeProvider extends BiomeProvider {
|
||||||
private final NoiseGeneratorSimplex field_201546_a;
|
private final SimplexNoiseGenerator generator;
|
||||||
private final SharedSeedRandom random;
|
private final SharedSeedRandom random;
|
||||||
private final Biome[] field_205009_d = new Biome[]{Biomes.THE_END, Biomes.END_HIGHLANDS, Biomes.END_MIDLANDS, Biomes.SMALL_END_ISLANDS, Biomes.END_BARRENS, BOPBiomes.end_plains.get()};
|
private final Biome[] field_205009_d = new Biome[]{Biomes.THE_END, Biomes.END_HIGHLANDS, Biomes.END_MIDLANDS, Biomes.SMALL_END_ISLANDS, Biomes.END_BARRENS, BOPBiomes.end_plains.get()};
|
||||||
|
|
||||||
public BOPEndBiomeProvider(EndBiomeProviderSettings p_i48970_1_) {
|
public BOPEndBiomeProvider(EndBiomeProviderSettings p_i48970_1_) {
|
||||||
this.random = new SharedSeedRandom(p_i48970_1_.getSeed());
|
this.random = new SharedSeedRandom(p_i48970_1_.getSeed());
|
||||||
this.random.skip(17292);
|
this.random.skip(17292);
|
||||||
this.field_201546_a = new NoiseGeneratorSimplex(this.random);
|
this.generator = new SimplexNoiseGenerator(this.random);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(BlockPos pos, @Nullable Biome defaultBiome) {
|
public Biome getBiome(int p_201545_1_, int p_201545_2_)
|
||||||
return this.func_201545_a(pos.getX() >> 4, pos.getZ() >> 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Biome func_201545_a(int p_201545_1_, int p_201545_2_) {
|
|
||||||
if ((long)p_201545_1_ * (long)p_201545_1_ + (long)p_201545_2_ * (long)p_201545_2_ <= 4096L)
|
|
||||||
{
|
{
|
||||||
|
int lvt_3_1_ = p_201545_1_ >> 4;
|
||||||
|
int lvt_4_1_ = p_201545_2_ >> 4;
|
||||||
|
if ((long)lvt_3_1_ * (long)lvt_3_1_ + (long)lvt_4_1_ * (long)lvt_4_1_ <= 4096L) {
|
||||||
return Biomes.THE_END;
|
return Biomes.THE_END;
|
||||||
}
|
} else {
|
||||||
else
|
float lvt_5_1_ = this.func_222365_c(lvt_3_1_ * 2 + 1, lvt_4_1_ * 2 + 1);
|
||||||
{
|
if (lvt_5_1_ > 40.0F) {
|
||||||
float f = this.getHeightValue(p_201545_1_, p_201545_2_, 1, 1);
|
|
||||||
double d0 = Biome.INFO_NOISE.getValue((double)p_201545_1_ * 0.005D, (double)p_201545_2_ * 0.005D);
|
|
||||||
|
|
||||||
if (f > 40.0F)
|
|
||||||
{
|
|
||||||
if (d0 > 0.01D)
|
|
||||||
{
|
|
||||||
return Biomes.END_HIGHLANDS;
|
return Biomes.END_HIGHLANDS;
|
||||||
}
|
} else if (lvt_5_1_ >= 0.0F) {
|
||||||
else
|
|
||||||
{
|
|
||||||
return BOPBiomes.end_plains.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (f >= 0.0F)
|
|
||||||
{
|
|
||||||
return Biomes.END_MIDLANDS;
|
return Biomes.END_MIDLANDS;
|
||||||
}
|
} else {
|
||||||
else
|
return lvt_5_1_ < -20.0F ? Biomes.SMALL_END_ISLANDS : Biomes.END_BARRENS;
|
||||||
{
|
|
||||||
return f < -20.0F ? Biomes.SMALL_END_ISLANDS : Biomes.END_BARRENS;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome[] getBiomes(int startX, int startZ, int xSize, int zSize) {
|
public Biome[] getBiomes(int p_201537_1_, int p_201537_2_, int p_201537_3_, int p_201537_4_, boolean p_201537_5_) {
|
||||||
return this.getBiomeBlock(startX, startZ, xSize, zSize);
|
Biome[] lvt_6_1_ = new Biome[p_201537_3_ * p_201537_4_];
|
||||||
|
Long2ObjectMap<Biome> lvt_7_1_ = new Long2ObjectOpenHashMap();
|
||||||
|
|
||||||
|
for(int lvt_8_1_ = 0; lvt_8_1_ < p_201537_3_; ++lvt_8_1_) {
|
||||||
|
for(int lvt_9_1_ = 0; lvt_9_1_ < p_201537_4_; ++lvt_9_1_) {
|
||||||
|
int lvt_10_1_ = lvt_8_1_ + p_201537_1_;
|
||||||
|
int lvt_11_1_ = lvt_9_1_ + p_201537_2_;
|
||||||
|
long lvt_12_1_ = ChunkPos.asLong(lvt_10_1_, lvt_11_1_);
|
||||||
|
Biome lvt_14_1_ = lvt_7_1_.get(lvt_12_1_);
|
||||||
|
if (lvt_14_1_ == null) {
|
||||||
|
lvt_14_1_ = this.getBiome(lvt_10_1_, lvt_11_1_);
|
||||||
|
lvt_7_1_.put(lvt_12_1_, lvt_14_1_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
lvt_6_1_[lvt_8_1_ + lvt_9_1_ * p_201537_3_] = lvt_14_1_;
|
||||||
public Biome[] getBiomes(int x, int z, int width, int length, boolean cacheFlag) {
|
|
||||||
Biome[] abiome = new Biome[width * length];
|
|
||||||
Long2ObjectMap<Biome> long2objectmap = new Long2ObjectOpenHashMap<>();
|
|
||||||
|
|
||||||
for(int i = 0; i < width; ++i) {
|
|
||||||
for(int j = 0; j < length; ++j) {
|
|
||||||
int k = i + x >> 4;
|
|
||||||
int l = j + z >> 4;
|
|
||||||
long i1 = ChunkPos.asLong(k, l);
|
|
||||||
Biome biome = long2objectmap.get(i1);
|
|
||||||
if (biome == null) {
|
|
||||||
biome = this.func_201545_a(k, l);
|
|
||||||
long2objectmap.put(i1, biome);
|
|
||||||
}
|
|
||||||
|
|
||||||
abiome[i + j * width] = biome;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return abiome;
|
return lvt_6_1_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -140,28 +114,30 @@ public class BOPEndBiomeProvider extends BiomeProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getHeightValue(int p_201536_1_, int p_201536_2_, int p_201536_3_, int p_201536_4_) {
|
public float func_222365_c(int p_222365_1_, int p_222365_2_) {
|
||||||
float f = (float)(p_201536_1_ * 2 + p_201536_3_);
|
int lvt_3_1_ = p_222365_1_ / 2;
|
||||||
float f1 = (float)(p_201536_2_ * 2 + p_201536_4_);
|
int lvt_4_1_ = p_222365_2_ / 2;
|
||||||
float f2 = 100.0F - MathHelper.sqrt(f * f + f1 * f1) * 8.0F;
|
int lvt_5_1_ = p_222365_1_ % 2;
|
||||||
f2 = MathHelper.clamp(f2, -100.0F, 80.0F);
|
int lvt_6_1_ = p_222365_2_ % 2;
|
||||||
|
float lvt_7_1_ = 100.0F - MathHelper.sqrt((float)(p_222365_1_ * p_222365_1_ + p_222365_2_ * p_222365_2_)) * 8.0F;
|
||||||
|
lvt_7_1_ = MathHelper.clamp(lvt_7_1_, -100.0F, 80.0F);
|
||||||
|
|
||||||
for(int i = -12; i <= 12; ++i) {
|
for(int lvt_8_1_ = -12; lvt_8_1_ <= 12; ++lvt_8_1_) {
|
||||||
for(int j = -12; j <= 12; ++j) {
|
for(int lvt_9_1_ = -12; lvt_9_1_ <= 12; ++lvt_9_1_) {
|
||||||
long k = (long)(p_201536_1_ + i);
|
long lvt_10_1_ = (long)(lvt_3_1_ + lvt_8_1_);
|
||||||
long l = (long)(p_201536_2_ + j);
|
long lvt_12_1_ = (long)(lvt_4_1_ + lvt_9_1_);
|
||||||
if (k * k + l * l > 4096L && this.field_201546_a.getValue((double)k, (double)l) < (double)-0.9F) {
|
if (lvt_10_1_ * lvt_10_1_ + lvt_12_1_ * lvt_12_1_ > 4096L && this.generator.getValue((double)lvt_10_1_, (double)lvt_12_1_) < -0.8999999761581421D) {
|
||||||
float f3 = (MathHelper.abs((float)k) * 3439.0F + MathHelper.abs((float)l) * 147.0F) % 13.0F + 9.0F;
|
float lvt_14_1_ = (MathHelper.abs((float)lvt_10_1_) * 3439.0F + MathHelper.abs((float)lvt_12_1_) * 147.0F) % 13.0F + 9.0F;
|
||||||
f = (float)(p_201536_3_ - i * 2);
|
float lvt_15_1_ = (float)(lvt_5_1_ - lvt_8_1_ * 2);
|
||||||
f1 = (float)(p_201536_4_ - j * 2);
|
float lvt_16_1_ = (float)(lvt_6_1_ - lvt_9_1_ * 2);
|
||||||
float f4 = 100.0F - MathHelper.sqrt(f * f + f1 * f1) * f3;
|
float lvt_17_1_ = 100.0F - MathHelper.sqrt(lvt_15_1_ * lvt_15_1_ + lvt_16_1_ * lvt_16_1_) * lvt_14_1_;
|
||||||
f4 = MathHelper.clamp(f4, -100.0F, 80.0F);
|
lvt_17_1_ = MathHelper.clamp(lvt_17_1_, -100.0F, 80.0F);
|
||||||
f2 = Math.max(f2, f4);
|
lvt_7_1_ = Math.max(lvt_7_1_, lvt_17_1_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return f2;
|
return lvt_7_1_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -33,12 +33,12 @@ public class ModBlocks
|
||||||
white_sandstone_slab = registerBlock(new BlockSlabBOP(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).hardnessAndResistance(2.0F, 6.0F)), "white_sandstone_slab");
|
white_sandstone_slab = registerBlock(new BlockSlabBOP(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).hardnessAndResistance(2.0F, 6.0F)), "white_sandstone_slab");
|
||||||
white_sandstone_stairs = registerBlock(new BlockStairsBOP(white_sandstone.getDefaultState(), Block.Properties.from(white_sandstone)), "white_sandstone_stairs");
|
white_sandstone_stairs = registerBlock(new BlockStairsBOP(white_sandstone.getDefaultState(), Block.Properties.from(white_sandstone)), "white_sandstone_stairs");
|
||||||
|
|
||||||
mud = registerBlock(new BlockMud(Block.Properties.create(Material.GROUND, MaterialColor.BROWN_TERRACOTTA).hardnessAndResistance(0.6F)), "mud");
|
mud = registerBlock(new BlockMud(Block.Properties.create(Material.EARTH, MaterialColor.BROWN_TERRACOTTA).hardnessAndResistance(0.6F)), "mud");
|
||||||
mud_brick_block = registerBlock(new Block(Block.Properties.create(Material.ROCK, MaterialColor.BROWN_TERRACOTTA).hardnessAndResistance(1.0F)), "mud_brick_block");
|
mud_brick_block = registerBlock(new Block(Block.Properties.create(Material.ROCK, MaterialColor.BROWN_TERRACOTTA).hardnessAndResistance(1.0F)), "mud_brick_block");
|
||||||
mud_brick_slab = registerBlock(new BlockSlabBOP(Block.Properties.create(Material.ROCK, MaterialColor.BROWN_TERRACOTTA).hardnessAndResistance(2.0F, 6.0F)), "mud_brick_slab");
|
mud_brick_slab = registerBlock(new BlockSlabBOP(Block.Properties.create(Material.ROCK, MaterialColor.BROWN_TERRACOTTA).hardnessAndResistance(2.0F, 6.0F)), "mud_brick_slab");
|
||||||
mud_brick_stairs = registerBlock(new BlockStairsBOP(mud_brick_block.getDefaultState(), Block.Properties.from(mud_brick_block)), "mud_brick_stairs");
|
mud_brick_stairs = registerBlock(new BlockStairsBOP(mud_brick_block.getDefaultState(), Block.Properties.from(mud_brick_block)), "mud_brick_stairs");
|
||||||
|
|
||||||
dried_sand = registerBlock(new BlockDriedSand(Block.Properties.create(Material.GROUND, MaterialColor.WOOD).hardnessAndResistance(1.0F)), "dried_sand");
|
dried_sand = registerBlock(new BlockDriedSand(Block.Properties.create(Material.EARTH, MaterialColor.WOOD).hardnessAndResistance(1.0F)), "dried_sand");
|
||||||
ash_block = registerBlock(new BlockAsh(Block.Properties.create(Material.SAND, MaterialColor.BLACK_TERRACOTTA).hardnessAndResistance(0.4F).sound(SoundType.SAND)), "ash_block");
|
ash_block = registerBlock(new BlockAsh(Block.Properties.create(Material.SAND, MaterialColor.BLACK_TERRACOTTA).hardnessAndResistance(0.4F).sound(SoundType.SAND)), "ash_block");
|
||||||
flesh = registerBlock(new BlockFlesh(Block.Properties.create(Material.SPONGE, MaterialColor.RED_TERRACOTTA).hardnessAndResistance(0.4F).sound(SoundType.SLIME)), "flesh");
|
flesh = registerBlock(new BlockFlesh(Block.Properties.create(Material.SPONGE, MaterialColor.RED_TERRACOTTA).hardnessAndResistance(0.4F).sound(SoundType.SLIME)), "flesh");
|
||||||
|
|
||||||
|
@ -260,14 +260,14 @@ public class ModBlocks
|
||||||
wilted_lily = registerBlock(new BlockFlowerBOP(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "wilted_lily");
|
wilted_lily = registerBlock(new BlockFlowerBOP(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "wilted_lily");
|
||||||
burning_blossom = registerBlock(new BlockFlowerBOP(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT).lightValue(8)), "burning_blossom");
|
burning_blossom = registerBlock(new BlockFlowerBOP(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT).lightValue(8)), "burning_blossom");
|
||||||
|
|
||||||
willow_vine = registerBlock(new BlockVineBOP(Block.Properties.create(Material.VINE).doesNotBlockMovement().tickRandomly().hardnessAndResistance(0.2F).sound(SoundType.PLANT)), "willow_vine");
|
willow_vine = registerBlock(new BlockVineBOP(Block.Properties.create(Material.TALL_PLANTS).doesNotBlockMovement().tickRandomly().hardnessAndResistance(0.2F).sound(SoundType.PLANT)), "willow_vine");
|
||||||
|
|
||||||
bush = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.VINE).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "bush");
|
bush = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.TALL_PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "bush");
|
||||||
barley = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.VINE, MaterialColor.YELLOW_TERRACOTTA).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "barley");
|
barley = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.TALL_PLANTS, MaterialColor.YELLOW_TERRACOTTA).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "barley");
|
||||||
dune_grass = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.VINE, MaterialColor.LIME_TERRACOTTA).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "dune_grass");
|
dune_grass = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.TALL_PLANTS, MaterialColor.LIME_TERRACOTTA).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "dune_grass");
|
||||||
desert_grass = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.VINE, MaterialColor.ORANGE_TERRACOTTA).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "desert_grass");
|
desert_grass = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.TALL_PLANTS, MaterialColor.ORANGE_TERRACOTTA).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "desert_grass");
|
||||||
dead_grass = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.VINE, MaterialColor.WOOD).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "dead_grass");
|
dead_grass = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.TALL_PLANTS, MaterialColor.WOOD).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "dead_grass");
|
||||||
spectral_fern = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.VINE, MaterialColor.RED).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "spectral_fern");
|
spectral_fern = registerBlock(new BlockFoliageBOP(Block.Properties.create(Material.TALL_PLANTS, MaterialColor.RED).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "spectral_fern");
|
||||||
|
|
||||||
tiny_cactus = registerBlock(new BlockPlantBOP(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "tiny_cactus");
|
tiny_cactus = registerBlock(new BlockPlantBOP(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "tiny_cactus");
|
||||||
cattail = registerBlock(new BlockWatersidePlant(Block.Properties.create(Material.PLANTS, MaterialColor.DIRT).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "cattail");
|
cattail = registerBlock(new BlockWatersidePlant(Block.Properties.create(Material.PLANTS, MaterialColor.DIRT).doesNotBlockMovement().zeroHardnessAndResistance().sound(SoundType.PLANT)), "cattail");
|
||||||
|
|
|
@ -7,8 +7,7 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package biomesoplenty.init;
|
package biomesoplenty.init;
|
||||||
|
|
||||||
import biomesoplenty.common.entity.item.EntityBoatBOP;
|
import biomesoplenty.api.entity.BOPEntities;
|
||||||
import biomesoplenty.common.entity.item.RenderBoatBOP;
|
|
||||||
import biomesoplenty.common.entity.projectile.EntityMudball;
|
import biomesoplenty.common.entity.projectile.EntityMudball;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.entity.SpriteRenderer;
|
import net.minecraft.client.renderer.entity.SpriteRenderer;
|
||||||
|
@ -21,21 +20,21 @@ import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
import net.minecraftforge.fml.client.registry.RenderingRegistry;
|
import net.minecraftforge.fml.client.registry.RenderingRegistry;
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
import net.minecraftforge.registries.ForgeRegistries;
|
||||||
|
|
||||||
import static biomesoplenty.api.entity.BOPEntities.boat_bop;
|
|
||||||
import static biomesoplenty.api.entity.BOPEntities.mudball;
|
|
||||||
|
|
||||||
public class ModEntities
|
public class ModEntities
|
||||||
{
|
{
|
||||||
public static void init()
|
public static void init()
|
||||||
{
|
{
|
||||||
mudball = createEntity(EntityMudball::new, EntityClassification.MISC, "mudball", 64, 10, true);
|
EntityType<EntityMudball> mudball = createEntity(EntityMudball::new, EntityClassification.MISC, "mudball", 64, 10, true);
|
||||||
boat_bop = createEntity(EntityBoatBOP::new, EntityClassification.MISC, "boat_bop", 80, 3, true);
|
//EntityType<EntityBoatBOP> boat_bop = createEntity(EntityBoatBOP::new, EntityClassification.MISC, "boat_bop", 80, 3, true);
|
||||||
|
|
||||||
|
BOPEntities.mudball = mudball;
|
||||||
|
//BOPEntities.boat_bop = boat_bop;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends Entity> EntityType<T> createEntity(EntityType.IFactory<T> factory, EntityClassification classification, String name, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates)
|
public static <T extends Entity> EntityType<T> createEntity(EntityType.IFactory<T> factory, EntityClassification classification, String name, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates)
|
||||||
{
|
{
|
||||||
ResourceLocation location = new ResourceLocation("biomesoplenty", name);
|
ResourceLocation location = new ResourceLocation("biomesoplenty", name);
|
||||||
EntityType<T> type = EntityType.Builder.create(factory, classification).setTrackingRange(trackingRange).setUpdateInterval(updateFrequency).setShouldReceiveVelocityUpdates(sendsVelocityUpdates).build(location.toString());
|
EntityType<T> type = EntityType.Builder.<T>create(factory, classification).setTrackingRange(trackingRange).setUpdateInterval(updateFrequency).setShouldReceiveVelocityUpdates(sendsVelocityUpdates).build(location.toString());
|
||||||
type.setRegistryName(name);
|
type.setRegistryName(name);
|
||||||
ForgeRegistries.ENTITIES.register(type);
|
ForgeRegistries.ENTITIES.register(type);
|
||||||
return type;
|
return type;
|
||||||
|
@ -45,6 +44,6 @@ public class ModEntities
|
||||||
public static void registerRendering()
|
public static void registerRendering()
|
||||||
{
|
{
|
||||||
RenderingRegistry.registerEntityRenderingHandler(EntityMudball.class, manager -> new SpriteRenderer<>(manager, Minecraft.getInstance().getItemRenderer()));
|
RenderingRegistry.registerEntityRenderingHandler(EntityMudball.class, manager -> new SpriteRenderer<>(manager, Minecraft.getInstance().getItemRenderer()));
|
||||||
RenderingRegistry.registerEntityRenderingHandler(EntityBoatBOP.class, manager -> new RenderBoatBOP(manager));
|
//RenderingRegistry.registerEntityRenderingHandler(EntityBoatBOP.class, manager -> new RenderBoatBOP(manager));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ import static biomesoplenty.api.item.BOPItems.willow_boat;
|
||||||
|
|
||||||
import biomesoplenty.api.sound.BOPSounds;
|
import biomesoplenty.api.sound.BOPSounds;
|
||||||
import biomesoplenty.common.entity.item.EntityBoatBOP;
|
import biomesoplenty.common.entity.item.EntityBoatBOP;
|
||||||
import biomesoplenty.common.item.ItemBoatBOP;
|
|
||||||
import biomesoplenty.common.item.ItemMudball;
|
import biomesoplenty.common.item.ItemMudball;
|
||||||
import biomesoplenty.common.item.ItemRecordBOP;
|
import biomesoplenty.common.item.ItemRecordBOP;
|
||||||
import biomesoplenty.common.util.inventory.ItemGroupBOP;
|
import biomesoplenty.common.util.inventory.ItemGroupBOP;
|
||||||
|
|
|
@ -3,10 +3,10 @@ public net.minecraft.block.Block$Properties *()
|
||||||
|
|
||||||
public net.minecraft.block.Block field_181083_K # materialColor
|
public net.minecraft.block.Block field_181083_K # materialColor
|
||||||
|
|
||||||
public net.minecraft.block.BlockStairs <init>(Lnet/minecraft/block/BlockState;Lnet/minecraft/block/Block$Properties;)V #BlockStairs
|
public net.minecraft.block.StairsBlock <init>(Lnet/minecraft/block/BlockState;Lnet/minecraft/block/Block$Properties;)V #StairsBlock
|
||||||
public net.minecraft.block.BlockDoor <init>(Lnet/minecraft/block/Block$Properties;)V # BlockDoor
|
public net.minecraft.block.DoorBlock <init>(Lnet/minecraft/block/Block$Properties;)V # DoorBlock
|
||||||
public net.minecraft.block.BlockFarmland <init>(Lnet/minecraft/block/Block$Properties;)V # BlockFarmland
|
public net.minecraft.block.FarmlandBlock <init>(Lnet/minecraft/block/Block$Properties;)V # FarmlandBlock
|
||||||
public net.minecraft.block.BlockGrassPath <init>(Lnet/minecraft/block/Block$Properties;)V # BlockGrassPath
|
public net.minecraft.block.GrassPathBlock <init>(Lnet/minecraft/block/Block$Properties;)V # GrassPathBlock
|
||||||
public net.minecraft.block.BlockTrapDoor <init>(Lnet/minecraft/block/Block$Properties;)V # BlockTrapDoor
|
public net.minecraft.block.TrapDoorBlock <init>(Lnet/minecraft/block/Block$Properties;)V # TrapDoorBlock
|
||||||
public net.minecraft.block.BlockButtonWood <init>(Lnet/minecraft/block/Block$Properties;)V # BlockButtonWood
|
public net.minecraft.block.WoodButtonBlock <init>(Lnet/minecraft/block/Block$Properties;)V # WoodButtonBlock
|
||||||
public net.minecraft.block.BlockPressurePlate <init>(Lnet/minecraft/block/BlockPressurePlate$Sensitivity;Lnet/minecraft/block/Block$Properties;)V # BlockPressurePlate
|
public net.minecraft.block.PressurePlateBlock <init>(Lnet/minecraft/block/PressurePlateBlock$Sensitivity;Lnet/minecraft/block/Block$Properties;)V # PressurePlateBlock
|
||||||
|
|
Loading…
Reference in New Issue