package mekanism.common; import java.util.List; import mekanism.api.Coord4D; import mekanism.api.MekanismConfig.general; import mekanism.api.Pos3D; import mekanism.api.lasers.ILaserReceptor; import mekanism.api.util.CapabilityUtils; import mekanism.common.capabilities.Capabilities; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.BlockEvent; public class LaserManager { public static LaserInfo fireLaser(TileEntity from, EnumFacing direction, double energy, World world) { return fireLaser(new Pos3D(from).centre().translate(direction, 0.501), direction, energy, world); } public static LaserInfo fireLaser(Pos3D from, EnumFacing direction, double energy, World world) { Pos3D to = from.clone().translate(direction, general.laserRange - 0.002); RayTraceResult mop = world.rayTraceBlocks(from, to); if(mop != null) { to = new Pos3D(mop.hitVec); Coord4D toCoord = new Coord4D(mop.getBlockPos(), world); TileEntity tile = toCoord.getTileEntity(world); if(isReceptor(tile, mop.sideHit)) { ILaserReceptor receptor = getReceptor(tile, mop.sideHit); if(!(receptor.canLasersDig())) { receptor.receiveLaserEnergy(energy, mop.sideHit); } } } from.translateExcludingSide(direction, -0.1); to.translateExcludingSide(direction, 0.1); boolean foundEntity = false; for(Entity e : (List<Entity>)world.getEntitiesWithinAABB(Entity.class, Pos3D.getAABB(from, to))) { foundEntity = true; if(!e.isImmuneToFire()) { e.setFire((int)(energy / 1000)); } if(energy > 256) { e.attackEntityFrom(DamageSource.generic, (float)energy/1000F); } } return new LaserInfo(mop, foundEntity); } public static List<ItemStack> breakBlock(Coord4D blockCoord, boolean dropAtBlock, World world) { if(!general.aestheticWorldDamage) { return null; } List<ItemStack> ret = null; IBlockState state = blockCoord.getBlockState(world); Block blockHit = state.getBlock(); EntityPlayer dummy = Mekanism.proxy.getDummyPlayer((WorldServer)world, blockCoord.xCoord, blockCoord.yCoord, blockCoord.zCoord).get(); BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, blockCoord.getPos(), state, dummy); MinecraftForge.EVENT_BUS.post(event); if(event.isCanceled()) { return null; } if(dropAtBlock) { blockHit.dropBlockAsItem(world, blockCoord.getPos(), state, 0); } else { ret = blockHit.getDrops(world, blockCoord.getPos(), state, 0); } blockHit.breakBlock(world, blockCoord.getPos(), state); world.setBlockToAir(blockCoord.getPos()); world.playEvent(2001, blockCoord.getPos(), Block.getStateId(state)); return ret; } public static RayTraceResult fireLaserClient(TileEntity from, EnumFacing direction, double energy, World world) { return fireLaserClient(new Pos3D(from).centre().translate(direction, 0.501), direction, energy, world); } public static RayTraceResult fireLaserClient(Pos3D from, EnumFacing direction, double energy, World world) { Pos3D to = from.clone().translate(direction, general.laserRange - 0.002); RayTraceResult mop = world.rayTraceBlocks(from, to); if(mop != null) { to = new Pos3D(mop.hitVec); } from.translate(direction, -0.501); Mekanism.proxy.renderLaser(world, from, to, direction, energy); return mop; } public static boolean isReceptor(TileEntity tile, EnumFacing side) { return CapabilityUtils.hasCapability(tile, Capabilities.LASER_RECEPTOR_CAPABILITY, side); } public static ILaserReceptor getReceptor(TileEntity tile, EnumFacing side) { return CapabilityUtils.getCapability(tile, Capabilities.LASER_RECEPTOR_CAPABILITY, side); } public static class LaserInfo { public RayTraceResult movingPos; public boolean foundEntity; public LaserInfo(RayTraceResult mop, boolean b) { movingPos = mop; foundEntity = b; } } }