package mods.immibis.microblocks.api.util; import mods.immibis.microblocks.api.IMicroblockCoverSystem; import mods.immibis.microblocks.api.IMicroblockSupporterTile; import mods.immibis.microblocks.api.IMicroblockSystem; import mods.immibis.microblocks.api.MicroblockAPIUtils; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; /** * Convenience class for microblock supporting tiles. * Handles creating an ICoverSystem, saving and loading it, * and implements getCollidingBoundingBoxes and collisionRayTrace. */ public abstract class TileCoverableBase extends TileEntity implements IMicroblockSupporterTile { protected IMicroblockCoverSystem cover; public TileCoverableBase() { IMicroblockSystem ims = MicroblockAPIUtils.getMicroblockSystem(); if(ims != null) cover = ims.createMicroblockCoverSystem(this); } @Override public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); if(cover != null) cover.writeToNBT(tag); } @Override public Packet getDescriptionPacket() { if(cover == null) return null; NBTTagCompound tag = new NBTTagCompound(); tag.setByteArray("C", cover.writeDescriptionBytes()); S35PacketUpdateTileEntity p = new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, tag); return p; } @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { if(cover != null) cover.readDescriptionBytes(pkt.func_148857_g().getByteArray("C"), 0); } @Override public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); if(cover != null) cover.readFromNBT(tag); } @Override public IMicroblockCoverSystem getCoverSystem() { return cover; } @Override public void onMicroblocksChanged() { worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } public void convertToCoverContainerBlock() { if(getCoverSystem() != null) getCoverSystem().convertToContainerBlock(); else worldObj.setBlockToAir(xCoord, yCoord, zCoord); } }