2014-07-13 03:43:42 +02:00
|
|
|
package mekanism.common.tile;
|
|
|
|
|
2015-02-27 07:57:54 +01:00
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
|
2014-07-22 23:34:19 +02:00
|
|
|
import java.util.ArrayList;
|
2015-02-27 16:09:28 +01:00
|
|
|
import java.util.EnumSet;
|
2014-07-22 23:34:19 +02:00
|
|
|
|
2014-07-13 03:43:42 +02:00
|
|
|
import mekanism.api.Coord4D;
|
2014-09-14 23:53:32 +02:00
|
|
|
import mekanism.api.MekanismConfig.general;
|
2014-08-04 21:42:04 +02:00
|
|
|
import mekanism.api.MekanismConfig.usage;
|
2015-02-27 07:57:54 +01:00
|
|
|
import mekanism.api.Range4D;
|
2014-09-14 23:53:32 +02:00
|
|
|
import mekanism.api.lasers.ILaserReceptor;
|
2014-08-04 15:10:40 +02:00
|
|
|
import mekanism.common.LaserManager;
|
2014-07-22 23:34:19 +02:00
|
|
|
import mekanism.common.Mekanism;
|
2015-02-27 07:57:54 +01:00
|
|
|
import mekanism.common.base.IActiveState;
|
2014-07-22 23:34:19 +02:00
|
|
|
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
2015-02-27 07:57:54 +01:00
|
|
|
import mekanism.common.util.MekanismUtils;
|
2014-09-14 23:53:32 +02:00
|
|
|
import net.minecraft.block.Block;
|
|
|
|
import net.minecraft.client.Minecraft;
|
2014-07-14 21:39:34 +02:00
|
|
|
import net.minecraft.item.ItemStack;
|
2015-02-27 07:57:54 +01:00
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
2014-09-14 23:53:32 +02:00
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import net.minecraft.util.MovingObjectPosition;
|
2014-07-13 03:43:42 +02:00
|
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
|
2015-02-27 07:57:54 +01:00
|
|
|
public class TileEntityLaser extends TileEntityNoisyElectricBlock implements IActiveState
|
2014-07-13 03:43:42 +02:00
|
|
|
{
|
2014-09-14 23:53:32 +02:00
|
|
|
public Coord4D digging;
|
|
|
|
public double diggingProgress;
|
2015-02-27 07:57:54 +01:00
|
|
|
|
|
|
|
public boolean isActive;
|
|
|
|
|
|
|
|
public boolean clientActive;
|
2014-07-22 23:34:19 +02:00
|
|
|
|
2014-07-13 03:43:42 +02:00
|
|
|
public TileEntityLaser()
|
|
|
|
{
|
2015-02-27 07:57:54 +01:00
|
|
|
super("machine.laser", "Laser", 2*usage.laserUsage);
|
2014-07-14 21:39:34 +02:00
|
|
|
inventory = new ItemStack[0];
|
2014-07-13 03:43:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onUpdate()
|
|
|
|
{
|
2014-07-14 21:39:34 +02:00
|
|
|
super.onUpdate();
|
|
|
|
|
2014-07-22 23:34:19 +02:00
|
|
|
if(worldObj.isRemote)
|
|
|
|
{
|
2015-02-27 07:57:54 +01:00
|
|
|
if(isActive)
|
2014-07-22 23:34:19 +02:00
|
|
|
{
|
2014-09-14 06:20:16 +02:00
|
|
|
LaserManager.fireLaserClient(this, ForgeDirection.getOrientation(facing), usage.laserUsage, worldObj);
|
2014-07-22 23:34:19 +02:00
|
|
|
}
|
|
|
|
}
|
2015-02-25 16:02:04 +01:00
|
|
|
else {
|
2014-08-04 21:42:04 +02:00
|
|
|
if(getEnergy() >= usage.laserUsage)
|
2014-07-22 23:34:19 +02:00
|
|
|
{
|
2015-02-27 07:57:54 +01:00
|
|
|
setActive(true);
|
2014-07-23 02:25:10 +02:00
|
|
|
|
2014-09-14 23:53:32 +02:00
|
|
|
MovingObjectPosition mop = LaserManager.fireLaser(this, ForgeDirection.getOrientation(facing), usage.laserUsage, worldObj);
|
|
|
|
Coord4D hitCoord = mop == null ? null : new Coord4D(mop.blockX, mop.blockY, mop.blockZ);
|
|
|
|
|
|
|
|
if(hitCoord == null || !hitCoord.equals(digging))
|
|
|
|
{
|
|
|
|
digging = hitCoord;
|
|
|
|
diggingProgress = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(hitCoord != null)
|
|
|
|
{
|
|
|
|
Block blockHit = hitCoord.getBlock(worldObj);
|
|
|
|
TileEntity tileHit = hitCoord.getTileEntity(worldObj);
|
|
|
|
float hardness = blockHit.getBlockHardness(worldObj, hitCoord.xCoord, hitCoord.yCoord, hitCoord.zCoord);
|
2015-02-25 16:02:04 +01:00
|
|
|
|
2014-09-14 23:53:32 +02:00
|
|
|
if(!(hardness < 0 || (tileHit instanceof ILaserReceptor && !((ILaserReceptor)tileHit).canLasersDig())))
|
|
|
|
{
|
|
|
|
diggingProgress += usage.laserUsage;
|
|
|
|
|
2015-02-27 07:57:54 +01:00
|
|
|
if(diggingProgress >= hardness*general.laserEnergyNeededPerHardness)
|
2014-09-14 23:53:32 +02:00
|
|
|
{
|
2014-09-15 04:47:59 +02:00
|
|
|
LaserManager.breakBlock(hitCoord, true, worldObj);
|
2014-09-14 23:53:32 +02:00
|
|
|
diggingProgress = 0;
|
|
|
|
}
|
2015-02-25 16:02:04 +01:00
|
|
|
else {
|
2014-09-14 23:53:32 +02:00
|
|
|
Minecraft.getMinecraft().effectRenderer.addBlockHitEffects(hitCoord.xCoord, hitCoord.yCoord, hitCoord.zCoord, mop);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-04 21:42:04 +02:00
|
|
|
setEnergy(getEnergy() - usage.laserUsage);
|
2014-07-22 23:34:19 +02:00
|
|
|
}
|
2015-02-27 07:57:54 +01:00
|
|
|
else {
|
|
|
|
setActive(false);
|
2014-09-16 03:29:00 +02:00
|
|
|
diggingProgress = 0;
|
2014-07-22 23:34:19 +02:00
|
|
|
}
|
2014-07-13 03:43:42 +02:00
|
|
|
}
|
|
|
|
}
|
2015-02-27 07:57:54 +01:00
|
|
|
|
2015-02-27 16:09:28 +01:00
|
|
|
@Override
|
2015-03-04 00:18:32 +01:00
|
|
|
public EnumSet<ForgeDirection> getConsumingSides()
|
2015-02-27 16:09:28 +01:00
|
|
|
{
|
|
|
|
return EnumSet.of(ForgeDirection.getOrientation(facing).getOpposite());
|
|
|
|
}
|
|
|
|
|
2015-02-27 07:57:54 +01:00
|
|
|
@Override
|
|
|
|
public void setActive(boolean active)
|
|
|
|
{
|
|
|
|
isActive = active;
|
|
|
|
|
|
|
|
if(clientActive != active)
|
|
|
|
{
|
|
|
|
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
|
|
|
|
clientActive = active;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean getActive()
|
|
|
|
{
|
|
|
|
return isActive;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean renderUpdate()
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean lightUpdate()
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
2014-07-22 23:34:19 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public ArrayList getNetworkedData(ArrayList data)
|
|
|
|
{
|
|
|
|
super.getNetworkedData(data);
|
|
|
|
|
2015-02-27 07:57:54 +01:00
|
|
|
data.add(isActive);
|
2014-07-22 23:34:19 +02:00
|
|
|
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void handlePacketData(ByteBuf dataStream)
|
|
|
|
{
|
|
|
|
super.handlePacketData(dataStream);
|
|
|
|
|
2015-02-27 07:57:54 +01:00
|
|
|
isActive = dataStream.readBoolean();
|
|
|
|
|
|
|
|
MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void readFromNBT(NBTTagCompound nbtTags)
|
|
|
|
{
|
|
|
|
super.readFromNBT(nbtTags);
|
|
|
|
|
|
|
|
isActive = nbtTags.getBoolean("isActive");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeToNBT(NBTTagCompound nbtTags)
|
|
|
|
{
|
|
|
|
super.writeToNBT(nbtTags);
|
|
|
|
|
|
|
|
nbtTags.setBoolean("isActive", isActive);
|
2014-07-22 23:34:19 +02:00
|
|
|
}
|
2014-07-13 03:43:42 +02:00
|
|
|
}
|