Mekanism-tilera-Edition/src/main/java/mekanism/common/tile/TileEntityLaser.java

169 lines
3.9 KiB
Java
Raw Normal View History

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;
import java.util.ArrayList;
2015-02-27 16:09:28 +01:00
import java.util.EnumSet;
2014-07-13 03:43:42 +02:00
import mekanism.api.Coord4D;
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;
import mekanism.api.lasers.ILaserReceptor;
import mekanism.common.LaserManager;
import mekanism.common.Mekanism;
2015-02-27 07:57:54 +01:00
import mekanism.common.base.IActiveState;
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
2015-02-27 07:57:54 +01:00
import mekanism.common.util.MekanismUtils;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
2015-02-27 07:57:54 +01:00
import net.minecraft.nbt.NBTTagCompound;
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
{
public Coord4D digging;
public double diggingProgress;
2015-02-27 07:57:54 +01:00
public boolean isActive;
public boolean clientActive;
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);
inventory = new ItemStack[0];
2014-07-13 03:43:42 +02:00
}
@Override
public void onUpdate()
{
super.onUpdate();
if(worldObj.isRemote)
{
2015-02-27 07:57:54 +01:00
if(isActive)
{
2014-09-14 06:20:16 +02:00
LaserManager.fireLaserClient(this, ForgeDirection.getOrientation(facing), usage.laserUsage, worldObj);
}
}
else {
2014-08-04 21:42:04 +02:00
if(getEnergy() >= usage.laserUsage)
{
2015-02-27 07:57:54 +01:00
setActive(true);
2014-07-23 02:25:10 +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);
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)
{
LaserManager.breakBlock(hitCoord, true, worldObj);
diggingProgress = 0;
}
else {
Minecraft.getMinecraft().effectRenderer.addBlockHitEffects(hitCoord.xCoord, hitCoord.yCoord, hitCoord.zCoord, mop);
}
}
}
2014-08-04 21:42:04 +02:00
setEnergy(getEnergy() - usage.laserUsage);
}
2015-02-27 07:57:54 +01:00
else {
setActive(false);
diggingProgress = 0;
}
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
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;
}
@Override
public ArrayList getNetworkedData(ArrayList data)
{
super.getNetworkedData(data);
2015-02-27 07:57:54 +01:00
data.add(isActive);
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-13 03:43:42 +02:00
}