package openblocks.common.tileentity;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import openblocks.OpenBlocks;
import openblocks.client.gui.GuiBigButton;
import openblocks.common.container.ContainerBigButton;
import openmods.api.IActivateAwareTile;
import openmods.api.IHasGui;
import openmods.api.ISurfaceAttachment;
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.SyncableFlags;
import openmods.tileentity.SyncedTileEntity;
public class TileEntityBigButton extends SyncedTileEntity implements IActivateAwareTile, ISurfaceAttachment, IHasGui, IInventoryProvider, ISyncListener {
private int tickCounter = 0;
public enum Flags {
active
}
private SyncableFlags flags;
private final GenericInventory inventory = registerInventoryCallback(new TileEntityInventory(this, "bigbutton", true, 1));
public TileEntityBigButton() {
syncMap.addUpdateListener(createRenderUpdateListener());
syncMap.addSyncListener(this);
}
@Override
protected void createSyncedFields() {
flags = SyncableFlags.create(Flags.values().length);
}
@Override
public void updateEntity() {
super.updateEntity();
if (!worldObj.isRemote) {
if (tickCounter > 0) {
tickCounter--;
if (tickCounter <= 0) {
worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.click", 0.3F, 0.5F);
flags.off(Flags.active);
sync();
}
}
}
}
@Override
public Object getServerGui(EntityPlayer player) {
return new ContainerBigButton(player.inventory, this);
}
@Override
public Object getClientGui(EntityPlayer player) {
return new GuiBigButton(new ContainerBigButton(player.inventory, this));
}
@Override
public boolean canOpenGui(EntityPlayer player) {
return false;
}
public int getTickTime() {
ItemStack stack = inventory.getStackInSlot(0);
return stack == null? 1 : stack.stackSize;
}
@Override
public boolean onBlockActivated(EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if (!worldObj.isRemote) {
if (player.isSneaking()) {
openGui(OpenBlocks.instance, player);
} else {
flags.on(Flags.active);
tickCounter = getTickTime();
worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.click", 0.3F, 0.6F);
sync();
}
}
return true;
}
@Override
public ForgeDirection getSurfaceDirection() {
return getOrientation().north();
}
@Override
@SideOnly(Side.CLIENT)
public void prepareForInventoryRender(Block block, int metadata) {
super.prepareForInventoryRender(block, metadata);
}
public boolean isButtonActive() {
return flags.get(Flags.active);
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
inventory.writeToNBT(tag);
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
inventory.readFromNBT(tag);
}
@Override
@IncludeInterface
public IInventory getInventory() {
return inventory;
}
@Override
public void onSync(Set<ISyncableObject> changes) {
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, OpenBlocks.Blocks.bigButton);
final ForgeDirection rot = getOrientation().north();
worldObj.notifyBlocksOfNeighborChange(xCoord + rot.offsetX, yCoord + rot.offsetY, zCoord + rot.offsetZ, OpenBlocks.Blocks.bigButton);
}
}