package zmaster587.advancedRocketry.network;
import java.io.IOException;
import java.util.logging.Logger;
import zmaster587.advancedRocketry.api.stations.ISpaceObject;
import zmaster587.advancedRocketry.dimension.DimensionManager;
import zmaster587.advancedRocketry.dimension.DimensionProperties;
import zmaster587.advancedRocketry.stations.SpaceObject;
import zmaster587.advancedRocketry.stations.SpaceObjectManager;
import zmaster587.libVulpes.network.BasePacket;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.common.util.ForgeDirection;
public class PacketSpaceStationInfo extends BasePacket {
SpaceObject spaceObject;
int stationNumber;
public PacketSpaceStationInfo() {}
public PacketSpaceStationInfo(int stationNumber, ISpaceObject spaceObject) {
this.spaceObject = (SpaceObject)spaceObject;
this.stationNumber = stationNumber;
}
@Override
public void write(ByteBuf out) {
NBTTagCompound nbt = new NBTTagCompound();
out.writeInt(stationNumber);
boolean flag = false; //TODO //dimProperties == null;
if(!flag) {
//Try to send the nbt data of the dimension to the client, if it fails(probably due to non existent Biome ids) then remove the dimension
try {
spaceObject.getProperties().writeToNBT(nbt);
PacketBuffer packetBuffer = new PacketBuffer(out);
out.writeBoolean(false);
//TODO: error handling
try {
packetBuffer.writeStringToBuffer(SpaceObjectManager.getSpaceManager().getItentifierFromClass(spaceObject.getClass()));
packetBuffer.writeNBTTagCompoundToBuffer(nbt);
} catch (IOException e) {
e.printStackTrace();
}
packetBuffer.writeBoolean(spaceObject.hasWarpCores);
out.writeInt(spaceObject.getForwardDirection().ordinal());
} catch(NullPointerException e) {
out.writeBoolean(true);
Logger.getLogger("advancedRocketry").warning("Dimension " + stationNumber + " has thrown an exception trying to write NBT, deleting!");
DimensionManager.getInstance().deleteDimension(stationNumber);
}
}
else
out.writeBoolean(flag);
}
@Override
public void readClient(ByteBuf in) {
PacketBuffer packetBuffer = new PacketBuffer(in);
NBTTagCompound nbt;
stationNumber = in.readInt();
//Is dimension being deleted
if(in.readBoolean()) {
if(DimensionManager.getInstance().isDimensionCreated(stationNumber)) {
DimensionManager.getInstance().deleteDimension(stationNumber);
}
}
else {
//TODO: error handling
int direction;
String clazzId;
try {
clazzId = packetBuffer.readStringFromBuffer(127);
nbt = packetBuffer.readNBTTagCompoundFromBuffer();
} catch (IOException e) {
e.printStackTrace();
return;
}
boolean hasWarpCores = in.readBoolean();
direction = in.readInt();
ISpaceObject iObject = SpaceObjectManager.getSpaceManager().getSpaceStation(stationNumber);
//TODO: interface
spaceObject = (SpaceObject)iObject;
//Station needs to be created
if( iObject == null ) {
ISpaceObject object = SpaceObjectManager.getSpaceManager().getNewSpaceObjectFromIdentifier(clazzId);
object.setProperties(DimensionProperties.createFromNBT(stationNumber, nbt));
((SpaceObject)object).setForwardDirection(ForgeDirection.values()[direction]);
((SpaceObject)object).hasWarpCores = hasWarpCores;
SpaceObjectManager.getSpaceManager().registerSpaceObjectClient(object, object.getOrbitingPlanetId(), stationNumber);
}
else {
iObject.setProperties(DimensionProperties.createFromNBT(stationNumber, nbt));
((SpaceObject)iObject).setForwardDirection(ForgeDirection.values()[direction]);
((SpaceObject)iObject).hasWarpCores = hasWarpCores;
}
}
}
@Override
public void read(ByteBuf in) {
//Should never be read on the server!
}
@Override
public void executeClient(EntityPlayer thePlayer) {}
@Override
public void executeServer(EntityPlayerMP player) {}
}