package zmaster587.advancedRocketry.network; import java.io.IOException; import java.util.logging.Logger; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import zmaster587.advancedRocketry.api.stations.ISpaceObject; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.event.PlanetEventHandler; import zmaster587.advancedRocketry.event.RocketEventHandler; import zmaster587.advancedRocketry.stations.SpaceObject; import zmaster587.advancedRocketry.stations.SpaceObjectManager; import zmaster587.libVulpes.network.BasePacket; public class PacketStationUpdate extends BasePacket { ISpaceObject spaceObject; int stationNumber; Type type; public enum Type { DEST_ORBIT_UPDATE, ORBIT_UPDATE, SIGNAL_WHITE_BURST, FUEL_UPDATE, ROTANGLE_UPDATE, DIM_PROPERTY_UPDATE, ALTITUDE_UPDATE } public PacketStationUpdate() {} public PacketStationUpdate(ISpaceObject dimProperties, Type type) { this.spaceObject = (SpaceObject)dimProperties; this.stationNumber = dimProperties.getId(); this.type = type; } @Override public void write(ByteBuf out) { out.writeInt(stationNumber); out.writeInt(type.ordinal()); switch(type) { case DEST_ORBIT_UPDATE: out.writeInt(spaceObject.getDestOrbitingBody()); break; case ORBIT_UPDATE: out.writeInt(spaceObject.getOrbitingPlanetId()); break; case FUEL_UPDATE: if(spaceObject instanceof SpaceObject) out.writeInt(((SpaceObject)spaceObject).getFuelAmount()); break; case ROTANGLE_UPDATE: out.writeDouble(spaceObject.getRotation()); out.writeDouble(spaceObject.getDeltaRotation()); break; case ALTITUDE_UPDATE: out.writeFloat(spaceObject.getOrbitalDistance()); break; case DIM_PROPERTY_UPDATE: NBTTagCompound nbt = new NBTTagCompound(); try { spaceObject.getProperties().writeToNBT(nbt); PacketBuffer packetBuffer = new PacketBuffer(out); //TODO: error handling try { packetBuffer.writeNBTTagCompoundToBuffer(nbt); } catch (IOException e) { e.printStackTrace(); } } 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); } default: } } @Override public void readClient(ByteBuf in) { stationNumber = in.readInt(); spaceObject = SpaceObjectManager.getSpaceManager().getSpaceStation(stationNumber); type = Type.values()[in.readInt()]; switch(type) { case DEST_ORBIT_UPDATE: spaceObject.setDestOrbitingBody(in.readInt()); break; case ORBIT_UPDATE: spaceObject.setOrbitingBody(in.readInt()); break; case FUEL_UPDATE: if(spaceObject instanceof SpaceObject) ((SpaceObject)spaceObject).setFuelAmount(in.readInt()); break; case ROTANGLE_UPDATE: spaceObject.setRotation(in.readDouble()); spaceObject.setDeltaRotation(in.readDouble()); break; case SIGNAL_WHITE_BURST: PlanetEventHandler.runBurst(Minecraft.getMinecraft().theWorld.getTotalWorldTime() + 20, 20); break; case ALTITUDE_UPDATE: spaceObject.setOrbitalDistance(in.readFloat()); break; case DIM_PROPERTY_UPDATE: PacketBuffer packetBuffer = new PacketBuffer(in); NBTTagCompound nbt; try { nbt = packetBuffer.readNBTTagCompoundFromBuffer(); } catch (IOException e) { e.printStackTrace(); return; } spaceObject.getProperties().readFromNBT(nbt); break; } } @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) {} }