package kpc.common.computer;
import kawa.standard.Scheme;
import kpc.api.ComputerPosition;
import kpc.api.State;
import kpc.api.computer.OperatingSystem;
import kpc.api.fs.FileSystem;
import kpc.common.KPComputers;
import kpc.common.net.KPCPacket;
import kpc.common.utils.INBTTaggable;
import kpc.common.utils.NBTUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
public final class ServerComputer
implements kpc.api.computer.Computer,
INBTTaggable{
private final int id;
private final Terminal terminal;
private final Computer computer;
private final ComputerPosition pos;
public ServerComputer(ComputerPosition pos, int id){
this.id = id;
this.terminal = new Terminal();
this.computer = new Computer(pos, this.terminal);
this.pos = pos;
}
@Override
public State state() {
return this.computer.state();
}
@Override
public int id() {
return this.id;
}
@Override
public void turnOn(){
this.computer.turnOn();
}
@Override
public void shutdown(){
this.computer.shutdown();
}
@Override
public void reboot(){
}
@Override
public void queueEvent(String event, Object... params) {
this.computer.queueEvent(event, params);
}
@Override
public Terminal terminal() {
return this.terminal;
}
@Override
public OperatingSystem os() {
return this.computer.os;
}
@Override
public Scheme scheme() {
return this.computer.scheme;
}
@Override
public FileSystem fs() {
return this.computer.fs;
}
@Override
public ComputerPosition pos() {
return this.pos;
}
public void broadcastState(){
KPCPacket packet = new KPCPacket();
packet.id = KPCPacket.PACKET_COMPUPDATE;
packet.dataInt = new int[]{this.id};
packet.dataNBT = new NBTTagCompound();
this.writeDescription(packet.dataNBT);
KPComputers.channel.sendToAll(KPComputers.encode(packet));
}
public void sendState(EntityPlayer player){
KPCPacket packet = new KPCPacket();
packet.id = KPCPacket.PACKET_COMPUPDATE;
packet.dataInt = new int[]{this.id};
packet.dataNBT = new NBTTagCompound();
this.writeDescription(packet.dataNBT);
KPComputers.channel.sendTo(KPComputers.encode(packet), (EntityPlayerMP) player);
}
public void writeDescription(NBTTagCompound comp) {
NBTTagCompound termComp = new NBTTagCompound();
termComp.setInteger("width", this.terminal.width);
termComp.setInteger("height", this.terminal.height);
this.terminal.writeToNBT(termComp);
comp.setTag("terminal", termComp);
}
public void broadcastDelete(){
KPCPacket packet = new KPCPacket();
packet.id = KPCPacket.PACKET_COMPDELETED;
packet.dataInt = new int[]{this.id};
KPComputers.channel.sendToAll(KPComputers.encode(packet));
}
public void handlePacket(KPCPacket packet, EntityPlayer sender){
switch(packet.id){
case KPCPacket.PACKET_TURNON:{
this.turnOn();
break;
}
case KPCPacket.PACKET_REBOOT:{
this.reboot();
break;
}
case KPCPacket.PACKET_SHUTDOWN:{
this.shutdown();
break;
}
case KPCPacket.PACKET_REQUESTUPDATE:{
this.sendState(sender);
break;
}
case KPCPacket.PACKET_QUEUEEVENT:{
String event = packet.dataString[0];
Object[] args = null;
if(packet.dataNBT != null){
args = NBTUtils.decode(packet.dataNBT);
}
this.queueEvent(event, args);
break;
}
}
}
@Override
public void readFromNBT(NBTTagCompound comp) {
this.computer.readFromNBT(comp);
}
@Override
public void writeToNBT(NBTTagCompound comp) {
this.computer.writeToNBT(comp);
}
}