package mekanism.common.tile; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.api.Coord4D; import mekanism.api.Range4D; import mekanism.common.Mekanism; import mekanism.common.base.ITileNetwork; import mekanism.common.capabilities.Capabilities; import mekanism.common.network.PacketDataRequest.DataRequestMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork { public BlockPos mainPos = BlockPos.ORIGIN; public boolean receivedCoords; public int prevPower; public void setMainLocation(BlockPos pos) { receivedCoords = true; if(!worldObj.isRemote) { mainPos = pos; Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this))); } } @Override public void validate() { super.validate(); if(worldObj.isRemote) { Mekanism.packetHandler.sendToServer(new DataRequestMessage(Coord4D.get(this))); } } public void onNeighborChange(Block block) { TileEntity tile = worldObj.getTileEntity(mainPos); if(tile instanceof TileEntityBasicBlock) { TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)tile; int power = worldObj.isBlockIndirectlyGettingPowered(getPos()); if(prevPower != power) { if(power > 0) { onPower(); } else { onNoPower(); } prevPower = power; Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(tileEntity), tileEntity.getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this))); } } } public void onPower() {} public void onNoPower() {} @Override public void handlePacketData(ByteBuf dataStream) { if(worldObj.isRemote) { mainPos = new BlockPos(dataStream.readInt(), dataStream.readInt(), dataStream.readInt()); prevPower = dataStream.readInt(); } } @Override public void readFromNBT(NBTTagCompound nbtTags) { super.readFromNBT(nbtTags); mainPos = new BlockPos(nbtTags.getInteger("mainX"), nbtTags.getInteger("mainY"), nbtTags.getInteger("mainZ")); prevPower = nbtTags.getInteger("prevPower"); receivedCoords = nbtTags.getBoolean("receivedCoords"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbtTags) { super.writeToNBT(nbtTags); nbtTags.setInteger("mainX", mainPos.getX()); nbtTags.setInteger("mainY", mainPos.getY()); nbtTags.setInteger("mainZ", mainPos.getZ()); nbtTags.setInteger("prevPower", prevPower); nbtTags.setBoolean("receivedCoords", receivedCoords); return nbtTags; } @Override public ArrayList<Object> getNetworkedData(ArrayList<Object> data) { data.add(mainPos.getX()); data.add(mainPos.getY()); data.add(mainPos.getZ()); data.add(prevPower); return data; } @Override public boolean hasCapability(Capability<?> capability, EnumFacing facing) { return capability == Capabilities.TILE_NETWORK_CAPABILITY || super.hasCapability(capability, facing); } @Override public <T> T getCapability(Capability<T> capability, EnumFacing facing) { if(capability == Capabilities.TILE_NETWORK_CAPABILITY) { return (T)this; } return super.getCapability(capability, facing); } }