Есть ли возможность реализовать нанесение урона при падении игрока в воду?
Насколько я понял, урон при падении в воду не наносится по данной причине:
- в методе updateFallState класса EntityLivingBase вызывается метод handleWaterMovement
- в методе handleWaterMovement класса Entity при проверке на падение в воду [this.world.handleMaterialAcceleration(this.getEntityBoundingBox().grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D), Material.WATER, this)] устанавливается this.fallDistance = 0.0F;
- в связи с тем, что теперь this.fallDistance = 0.0F, то проверка if (this.fallDistance > 0.0F) в методе updateFallState класса Entity не выполняется
- из-за этого не вызывается state.getBlock().onFallenUpon(this.world, pos, this, this.fallDistance); (т.к. метод находится внутри блока с данным условием)
- и поэтому не вызывется метод fall класса Block (т.к. вызов происходит в onFallenUpon, который не вызывался)
- а так как собственно сам урон от падения наносится в методе fall, то из-за того, что данный метод не был вызван, урон при падении в воду и не наносится
Не могу придумать, как это обойти. Буду рад предложенным идеям)
Насколько я понял, урон при падении в воду не наносится по данной причине:
- в методе updateFallState класса EntityLivingBase вызывается метод handleWaterMovement
Java:
protected void updateFallState(double y, boolean onGroundIn, IBlockState state, BlockPos pos)
{
if (!this.isInWater())
{
this.handleWaterMovement();
}
if (!this.world.isRemote && this.fallDistance > 3.0F && onGroundIn)
{
float f = (float)MathHelper.ceil(this.fallDistance - 3.0F);
if (!state.getBlock().isAir(state, world, pos))
{
double d0 = Math.min((double)(0.2F + f / 15.0F), 2.5D);
int i = (int)(150.0D * d0);
if (!state.getBlock().addLandingEffects(state, (WorldServer)this.world, pos, state, this, i))
((WorldServer)this.world).spawnParticle(EnumParticleTypes.BLOCK_DUST, this.posX, this.posY, this.posZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, Block.getStateId(state));
}
}
super.updateFallState(y, onGroundIn, state, pos);
}
- в методе handleWaterMovement класса Entity при проверке на падение в воду [this.world.handleMaterialAcceleration(this.getEntityBoundingBox().grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D), Material.WATER, this)] устанавливается this.fallDistance = 0.0F;
Java:
public boolean handleWaterMovement()
{
if (this.getRidingEntity() instanceof EntityBoat)
{
this.inWater = false;
}
else if (this.world.handleMaterialAcceleration(this.getEntityBoundingBox().grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D), Material.WATER, this))
{
if (!this.inWater && !this.firstUpdate)
{
this.doWaterSplashEffect();
}
this.fallDistance = 0.0F;
this.inWater = true;
this.extinguish();
}
else
{
this.inWater = false;
}
return this.inWater;
}
- в связи с тем, что теперь this.fallDistance = 0.0F, то проверка if (this.fallDistance > 0.0F) в методе updateFallState класса Entity не выполняется
Java:
protected void updateFallState(double y, boolean onGroundIn, IBlockState state, BlockPos pos)
{
if (onGroundIn)
{
if (this.fallDistance > 0.0F)
{
state.getBlock().onFallenUpon(this.world, pos, this, this.fallDistance);
}
this.fallDistance = 0.0F;
}
else if (y < 0.0D)
{
this.fallDistance = (float)((double)this.fallDistance - y);
}
}
- из-за этого не вызывается state.getBlock().onFallenUpon(this.world, pos, this, this.fallDistance); (т.к. метод находится внутри блока с данным условием)
- и поэтому не вызывется метод fall класса Block (т.к. вызов происходит в onFallenUpon, который не вызывался)
Код:
public void onFallenUpon(World worldIn, BlockPos pos, Entity entityIn, float fallDistance)
{
entityIn.fall(fallDistance, 1.0F);
}
- а так как собственно сам урон от падения наносится в методе fall, то из-за того, что данный метод не был вызван, урон при падении в воду и не наносится
Не могу придумать, как это обойти. Буду рад предложенным идеям)