I want to disable crop trampling. The two relevant pieces of code are:
BlockFarmland.class
/**
* Block's chance to react to a living entity falling on it.
*/
public void onFallenUpon(World worldIn, BlockPos pos, Entity entityIn, float fallDistance)
{
if (!worldIn.isRemote && entityIn.canTrample(worldIn, this, pos, fallDistance)) // Forge: Move logic to Entity#canTrample
{
this.turnToDirt(worldIn, pos);
}
super.onFallenUpon(worldIn, pos, entityIn, fallDistance);
}
Entity.class
public boolean canTrample(World world, Block block, BlockPos pos, float fallDistance)
{
return world.rand.nextFloat() < fallDistance - 0.5F
&& this instanceof EntityLivingBase
&& (this instanceof EntityPlayer || world.getGameRules().getBoolean("mobGriefing"))
&& this.width * this.width * this.height > 0.512F;
}
The only way I can think of to turn off trampling globally is to create a new subclass Entity for every Entity in the game, override the canTrample method, and then replace all the default spawns with my new subclass. This... seems like a bad idea. (Maybe there is an easier way, but I don't see any place here for a global override)
I suggest adding an event to onFallenUpon. First fire the TrampledEvent where it could be set to Result.Deny. If left on Result.Default, it would call the Entity.canTrample method to produce the default behavior. This would allow for not only global overrides, but also more detailed behavior like allowing/denying based off what's growing.