package de.ellpeck.actuallyadditions.mod.blocks; import java.util.ArrayList; import java.util.Collections; import java.util.List; import de.ellpeck.actuallyadditions.mod.blocks.base.BlockContainerBase; import de.ellpeck.actuallyadditions.mod.tile.TileEntityShockSuppressor; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.ExplosionEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class BlockShockSuppressor extends BlockContainerBase { public BlockShockSuppressor(String name) { super(Material.ROCK, name); this.setHarvestLevel("pickaxe", 0); this.setHardness(20.0F); this.setResistance(2000.0F); this.setSoundType(SoundType.STONE); MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onExplosion(ExplosionEvent.Detonate event) { World world = event.getWorld(); if (!world.isRemote) { List affectedBlocks = event.getAffectedBlocks(); List affectedEntities = event.getAffectedEntities(); int rangeSq = TileEntityShockSuppressor.RANGE * TileEntityShockSuppressor.RANGE; int use = TileEntityShockSuppressor.USE_PER; for (TileEntityShockSuppressor suppressor : TileEntityShockSuppressor.SUPPRESSORS) { if (!suppressor.isRedstonePowered) { BlockPos supPos = suppressor.getPos(); List entitiesToRemove = new ArrayList<>(); List posesToRemove = new ArrayList<>(); for (BlockPos pos : affectedBlocks) { if (pos.distanceSq(supPos) <= rangeSq) { posesToRemove.add(pos); } } for (Entity entity : affectedEntities) { if (entity.getPositionVector().squareDistanceTo(supPos.getX(), supPos.getY(), supPos.getZ()) <= rangeSq) { entitiesToRemove.add(entity); } } Collections.shuffle(entitiesToRemove); Collections.shuffle(posesToRemove); for (BlockPos pos : posesToRemove) { if (suppressor.storage.getEnergyStored() >= use) { suppressor.storage.extractEnergyInternal(use, false); affectedBlocks.remove(pos); } else { break; } } for (Entity entity : entitiesToRemove) { if (suppressor.storage.getEnergyStored() >= use) { suppressor.storage.extractEnergyInternal(use, false); affectedEntities.remove(entity); } else { break; } } } } } } @Override public EnumRarity getRarity(ItemStack stack) { return EnumRarity.EPIC; } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityShockSuppressor(); } }