package net.minecraft.world.level; import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderSet; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; public class SimpleExplosionDamageCalculator extends ExplosionDamageCalculator { private final boolean explodesBlocks; private final boolean damagesEntities; private final Optional knockbackMultiplier; private final Optional> immuneBlocks; public SimpleExplosionDamageCalculator( boolean explodesBlocks, boolean damagesEntities, Optional knockbackMultiplier, Optional> immuneBlocks ) { this.explodesBlocks = explodesBlocks; this.damagesEntities = damagesEntities; this.knockbackMultiplier = knockbackMultiplier; this.immuneBlocks = immuneBlocks; } @Override public Optional getBlockExplosionResistance(Explosion explosion, BlockGetter reader, BlockPos pos, BlockState state, FluidState fluid) { if (this.immuneBlocks.isPresent()) { return state.is((HolderSet)this.immuneBlocks.get()) ? Optional.of(3600000.0F) : Optional.empty(); } else { return super.getBlockExplosionResistance(explosion, reader, pos, state, fluid); } } @Override public boolean shouldBlockExplode(Explosion explosion, BlockGetter reader, BlockPos pos, BlockState state, float power) { return this.explodesBlocks; } @Override public boolean shouldDamageEntity(Explosion explosion, Entity entity) { return this.damagesEntities; } @Override public float getKnockbackMultiplier(Entity entity) { boolean bl = entity instanceof Player player && player.getAbilities().flying; return bl ? 0.0F : (Float)this.knockbackMultiplier.orElseGet(() -> super.getKnockbackMultiplier(entity)); } }