resonant-induction/archive/java/resonantinduction/old/transport/encoder/TileEntityEncoder.java
2014-01-11 17:44:07 +08:00

263 lines
6.1 KiB
Java

package resonantinduction.old.transport.encoder;
import java.io.IOException;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.packet.Packet;
import resonantinduction.core.prefab.tile.TileEntityMachine;
import resonantinduction.electrical.armbot.Program;
import resonantinduction.electrical.armbot.command.TaskRotateTo;
import resonantinduction.old.api.coding.IProgram;
import resonantinduction.old.api.coding.ITask;
import resonantinduction.old.api.coding.TaskRegistry;
import resonantinduction.old.transport.ResonantInductionTransport;
import universalelectricity.api.vector.Vector2;
import calclavia.lib.network.PacketHandler;
import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;
public class TileEntityEncoder extends TileEntityMachine implements ISidedInventory
{
private ItemStack disk;
private IInventoryWatcher watcher;
public static final String PROGRAM_PACKET_ID = "program",
PROGRAM_CHANGE_PACKET_ID = "programChange", REMOVE_TASK_PACKET_ID = "removeTask",
NEW_TASK_PACKET_ID = "newTask";
protected IProgram program;
public TileEntityEncoder()
{
super();
this.hasGUI = true;
}
@Override
public void initiate()
{
super.initiate();
if (!this.worldObj.isRemote)
{
program = new Program();
program.setTaskAt(0, 0, new TaskRotateTo());
}
}
@Override
public void onInventoryChanged()
{
super.onInventoryChanged();
if (watcher != null)
{
watcher.inventoryChanged();
}
}
@Override
public String getInvName()
{
return "Encoder";
}
@Override
public int getInventoryStackLimit()
{
return 1;
}
public void setWatcher(IInventoryWatcher watcher)
{
this.watcher = watcher;
}
public IInventoryWatcher getWatcher()
{
return this.watcher;
}
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
if (this.disk != null)
{
NBTTagCompound diskNBT = new NBTTagCompound();
this.disk.writeToNBT(diskNBT);
nbt.setCompoundTag("disk", diskNBT);
}
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
NBTTagCompound diskNBT = nbt.getCompoundTag("disk");
if (diskNBT != null)
{
this.disk = ItemStack.loadItemStackFromNBT(diskNBT);
}
}
@Override
public boolean simplePacket(String id, ByteArrayDataInput dis, Player player)
{
try
{
boolean su = super.simplePacket(id, dis, player);
if (!su)
{
if (this.worldObj.isRemote)
{
if (id.equalsIgnoreCase(TileEntityEncoder.PROGRAM_PACKET_ID))
{
if (dis.readBoolean())
{
Program program = new Program();
program.load(PacketHandler.readNBTTagCompound(dis));
this.program = program;
}
else
{
this.program = null;
}
return true;
}
}
else
{
if (id.equalsIgnoreCase(TileEntityEncoder.PROGRAM_CHANGE_PACKET_ID))
{
ITask task = TaskRegistry.getCommand(dis.readUTF());
task.setPosition(dis.readInt(), dis.readInt());
task.load(PacketHandler.readNBTTagCompound(dis));
this.getProgram().setTaskAt(task.getCol(), task.getRow(), task);
this.sendGUIPacket();
return true;
}
else if (id.equalsIgnoreCase(TileEntityEncoder.NEW_TASK_PACKET_ID))
{
ITask task = TaskRegistry.getCommand(dis.readUTF());
task.setPosition(dis.readInt(), dis.readInt());
task.load(PacketHandler.readNBTTagCompound(dis));
this.getProgram().insertTask(task.getCol(), task.getRow(), task);
this.sendGUIPacket();
return true;
}
else if (id.equalsIgnoreCase(TileEntityEncoder.REMOVE_TASK_PACKET_ID))
{
this.getProgram().setTaskAt(dis.readInt(), dis.readInt(), null);
this.sendGUIPacket();
return true;
}
}
}
return su;
}
catch (IOException e)
{
e.printStackTrace();
return true;
}
}
/** Sends a gui packet only to the given player */
@Override
public Packet getGUIPacket()
{
return this.getDescriptionPacket();
}
@Override
public Packet getDescriptionPacket()
{
NBTTagCompound tag = new NBTTagCompound();
boolean exists = this.program != null;
if (exists)
{
this.program.save(tag);
}
return PacketHandler.instance().getTilePacket(ResonantInductionTransport.CHANNEL, TileEntityEncoder.PROGRAM_PACKET_ID, this, exists, tag);
}
public void removeTask(Vector2 vec)
{
if (vec != null)
{
if (this.worldObj.isRemote)
{
PacketDispatcher.sendPacketToServer(PacketHandler.instance().getTilePacket(ResonantInductionTransport.CHANNEL, TileEntityEncoder.REMOVE_TASK_PACKET_ID, this, vec.intX(), vec.intY()));
}
else
{
this.program.setTaskAt(vec.intX(), vec.intY(), null);
}
}
}
public void updateTask(ITask editTask)
{
if (editTask != null)
{
if (this.worldObj.isRemote)
{
NBTTagCompound nbt = new NBTTagCompound();
editTask.save(nbt);
PacketDispatcher.sendPacketToServer(PacketHandler.instance().getTilePacket(ResonantInductionTransport.CHANNEL, TileEntityEncoder.PROGRAM_CHANGE_PACKET_ID, this, editTask.getMethodName(), editTask.getCol(), editTask.getRow(), nbt));
}
else
{
this.program.setTaskAt(editTask.getCol(), editTask.getRow(), editTask);
}
}
}
public void insertTask(ITask editTask)
{
if (editTask != null)
{
if (this.worldObj.isRemote)
{
NBTTagCompound nbt = new NBTTagCompound();
editTask.save(nbt);
PacketDispatcher.sendPacketToServer(PacketHandler.instance().getTilePacket(ResonantInductionTransport.CHANNEL, TileEntityEncoder.NEW_TASK_PACKET_ID, this, editTask.getMethodName(), editTask.getCol(), editTask.getRow(), nbt));
}
else
{
this.program.insertTask(editTask.getCol(), editTask.getRow(), editTask);
}
}
}
@Override
public boolean isInvNameLocalized()
{
// TODO ?
return false;
}
public IProgram getProgram()
{
return this.program;
}
@Override
public Class<? extends Container> getContainer()
{
return ContainerEncoder.class;
}
}