package openblocks.common.tileentity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import openblocks.client.gui.GuiProjector; import openblocks.common.HeightMapData; import openblocks.common.MapDataManager; import openblocks.common.block.BlockProjector; import openblocks.common.container.ContainerProjector; import openblocks.common.item.ItemEmptyMap; import openblocks.common.item.ItemHeightMap; import openblocks.rpc.IRotatable; import openmods.api.IHasGui; import openmods.include.IncludeInterface; import openmods.inventory.GenericInventory; import openmods.inventory.IInventoryProvider; import openmods.inventory.TileEntityInventory; import openmods.sync.ISyncListener; import openmods.sync.ISyncableObject; import openmods.sync.SyncableByte; import openmods.sync.SyncableInt; import openmods.tileentity.SyncedTileEntity; import openmods.utils.BlockNotifyFlags; import openmods.utils.ByteUtils; public class TileEntityProjector extends SyncedTileEntity implements IHasGui, IInventoryProvider, ISyncListener, IRotatable { private final GenericInventory inventory = new TileEntityInventory(this, "openblocks.projector", false, 1) { @Override public boolean isItemValidForSlot(int i, ItemStack stack) { if (stack == null) return false; Item item = stack.getItem(); return item instanceof ItemHeightMap || item instanceof ItemEmptyMap; } @Override public int getInventoryStackLimit() { return 1; } @Override public void onInventoryChanged(int slotNumber) { super.onInventoryChanged(slotNumber); if (!isInvalid()) { if (!worldObj.isRemote) { ItemStack stack = getStackInSlot(slotNumber); if (stack != null && stack.stackSize == 1) { Item item = stack.getItem(); if (item instanceof ItemHeightMap) { int mapId = stack.getItemDamage(); TileEntityProjector.this.mapId.set(mapId); } else if (item instanceof ItemEmptyMap && worldObj != null) { ItemStack newStack = ItemEmptyMap.upgradeToMap(worldObj, stack); setInventorySlotContents(slotNumber, newStack); } else TileEntityProjector.this.mapId.set(-1); } else TileEntityProjector.this.mapId.set(-1); sync(); final int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); final boolean isActive = TileEntityProjector.this.mapId() >= 0; final int newMeta = ByteUtils.set(meta, BlockProjector.META_BIT_ACTIVE, isActive); if (newMeta != meta) { worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, BlockNotifyFlags.ALL); worldObj.func_147451_t(xCoord, yCoord, zCoord); } } markUpdated(); } } }; private SyncableByte rotation; private SyncableInt mapId; public TileEntityProjector() { syncMap.addUpdateListener(this); } @Override protected void createSyncedFields() { rotation = new SyncableByte(); mapId = new SyncableInt(-1); } @Override @SideOnly(Side.CLIENT) public AxisAlignedBB getRenderBoundingBox() { return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 5, zCoord + 1); } @Override public boolean shouldRenderInPass(int pass) { return pass == 0 || pass == 1; } @Override public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); inventory.readFromNBT(tag); } @Override public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); inventory.writeToNBT(tag); } @Override public Object getServerGui(EntityPlayer player) { return new ContainerProjector(player.inventory, this); } @Override public Object getClientGui(EntityPlayer player) { return new GuiProjector(new ContainerProjector(player.inventory, this)); } @Override public boolean canOpenGui(EntityPlayer player) { return true; } @Override public void onSync(Set<ISyncableObject> changes) { if (changes.contains(mapId)) { int mapId = this.mapId.get(); if (mapId >= 0 && MapDataManager.getMapData(worldObj, mapId).isEmpty()) MapDataManager.requestMapData(worldObj, mapId); } } @Override public void rotate(int delta) { int value = rotation.get() + delta; rotation.set((byte)(value & 0x3)); sync(); } public byte rotation() { return rotation.get(); } public int mapId() { return mapId.get(); } public HeightMapData getMap() { int mapId = this.mapId.get(); if (worldObj == null || mapId < 0) return null; return MapDataManager.getMapData(worldObj, mapId); } public void markMapDirty() { int mapId = this.mapId.get(); if (worldObj != null || mapId < 0) MapDataManager.instance.markDataUpdated(worldObj, mapId); } @Override @IncludeInterface public IInventory getInventory() { return inventory; } @Override public boolean canUpdate() { return false; } }