electrodynamics/electrical/src/main/scala/resonantinduction/electrical/encoder/TileEncoder.java
2014-03-23 17:19:47 +08:00

234 lines
5.3 KiB
Java

package resonantinduction.electrical.encoder;
import java.io.IOException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.packet.Packet;
import resonantinduction.core.ResonantInduction;
import resonantinduction.electrical.armbot.Program;
import resonantinduction.electrical.armbot.task.TaskRotateTo;
import resonantinduction.electrical.encoder.coding.IProgram;
import resonantinduction.electrical.encoder.coding.ITask;
import resonantinduction.electrical.encoder.coding.TaskRegistry;
import universalelectricity.api.vector.Vector2;
import calclavia.lib.network.IPacketReceiver;
import calclavia.lib.network.PacketHandler;
import calclavia.lib.prefab.tile.TileExternalInventory;
import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.network.PacketDispatcher;
public class TileEncoder extends TileExternalInventory implements ISidedInventory, IPacketReceiver
{
private ItemStack disk;
private IInventoryWatcher watcher;
public static final int PROGRAM_PACKET_ID = 0;
public static final int PROGRAM_CHANGE_PACKET_ID = 1;
public static final int REMOVE_TASK_PACKET_ID = 2;
public static final int NEW_TASK_PACKET_ID = 3;
protected IProgram program;
@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 void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra)
{
try
{
int readInt = data.readInt();
if (readInt == PROGRAM_PACKET_ID)
{
if (data.readBoolean())
{
Program program = new Program();
program.load(PacketHandler.readNBTTagCompound(data));
this.program = program;
}
else
{
this.program = null;
}
}
else if (readInt == PROGRAM_CHANGE_PACKET_ID)
{
ITask task = TaskRegistry.getCommand(data.readUTF());
task.setPosition(data.readInt(), data.readInt());
task.load(PacketHandler.readNBTTagCompound(data));
this.getProgram().setTaskAt(task.getCol(), task.getRow(), task);
this.sendGUIPacket();
}
else if (readInt == NEW_TASK_PACKET_ID)
{
ITask task = TaskRegistry.getCommand(data.readUTF());
task.setPosition(data.readInt(), data.readInt());
task.load(PacketHandler.readNBTTagCompound(data));
this.getProgram().insertTask(task.getCol(), task.getRow(), task);
this.sendGUIPacket();
}
else if (readInt == REMOVE_TASK_PACKET_ID)
{
this.getProgram().setTaskAt(data.readInt(), data.readInt(), null);
this.sendGUIPacket();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void sendGUIPacket()
{
// TODO Auto-generated method stub
}
@Override
public Packet getDescriptionPacket()
{
NBTTagCompound tag = new NBTTagCompound();
boolean exists = this.program != null;
if (exists)
{
this.program.save(tag);
}
return ResonantInduction.PACKET_TILE.getPacket(this, TileEncoder.PROGRAM_PACKET_ID, this, exists, tag);
}
public void removeTask(Vector2 vec)
{
if (vec != null)
{
if (this.worldObj.isRemote)
{
PacketDispatcher.sendPacketToServer(ResonantInduction.PACKET_TILE.getPacket(this, TileEncoder.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(ResonantInduction.PACKET_TILE.getPacket(this, 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(ResonantInduction.PACKET_TILE.getPacket(this, NEW_TASK_PACKET_ID, this, editTask.getMethodName(), editTask.getCol(), editTask.getRow(), nbt));
}
else
{
this.program.insertTask(editTask.getCol(), editTask.getRow(), editTask);
}
}
}
public IProgram getProgram()
{
if (this.program == null)
{
this.program = new Program();
}
return this.program;
}
}