package zmaster587.advancedRocketry.tile.station; import io.netty.buffer.ByteBuf; import java.io.IOException; import java.util.LinkedList; import java.util.List; import cpw.mods.fml.relauncher.Side; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import zmaster587.advancedRocketry.api.Configuration; import zmaster587.advancedRocketry.api.EntityRocketBase; import zmaster587.advancedRocketry.api.stations.ISpaceObject; import zmaster587.advancedRocketry.stations.SpaceObject; import zmaster587.advancedRocketry.stations.SpaceObjectManager; import zmaster587.libVulpes.inventory.modules.IGuiCallback; import zmaster587.libVulpes.inventory.modules.IModularInventory; import zmaster587.libVulpes.inventory.modules.ModuleBase; import zmaster587.libVulpes.inventory.modules.ModuleText; import zmaster587.libVulpes.inventory.modules.ModuleTextBox; import zmaster587.libVulpes.network.PacketHandler; import zmaster587.libVulpes.network.PacketMachine; import zmaster587.libVulpes.util.INetworkMachine; public class TileDockingPort extends TileEntity implements IModularInventory, IGuiCallback, INetworkMachine { ModuleTextBox myId, targetId; String targetIdStr, myIdStr; public TileDockingPort() { targetIdStr = ""; myIdStr = ""; } public String getTargetId() { return targetIdStr; } public String getMyId() { return myIdStr; } @Override public List<ModuleBase> getModules(int id, EntityPlayer player) { List<ModuleBase> modules = new LinkedList<ModuleBase>(); modules.add(new ModuleText(20, 50, "Target Id", 0x2a2a2a)); if(worldObj.isRemote) { myId = new ModuleTextBox(this, 20, 30, 60, 12, 9); targetId = new ModuleTextBox(this, 20, 60, 60, 12, 9); targetId.setText(targetIdStr); myId.setText(myIdStr); modules.add(targetId); modules.add(myId); } modules.add(new ModuleText(20, 20, "My Id", 0x2a2a2a)); return modules; } @Override public Packet getDescriptionPacket() { NBTTagCompound nbt = new NBTTagCompound(); writeToNBT(nbt); return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0,nbt); } @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { readFromNBT(pkt.func_148857_g()); if(targetId != null) { targetId.setText(targetIdStr); myId.setText(myIdStr); } } @Override public void onModuleUpdated(ModuleBase module) { if(module == myId) { myIdStr = myId.getText(); PacketHandler.sendToServer(new PacketMachine(this, (byte)0)); } else if(module == targetId) { targetIdStr = targetId.getText(); PacketHandler.sendToServer(new PacketMachine(this, (byte)1)); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); if(!myIdStr.isEmpty()) nbt.setString("myId", myIdStr); if(!targetIdStr.isEmpty()) nbt.setString("targetId", targetIdStr); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); myIdStr = nbt.getString("myId"); targetIdStr = nbt.getString("targetId"); } @Override public boolean canInteractWithContainer(EntityPlayer entity) { return true; } @Override public void invalidate() { unregisterTileWithStation(worldObj, xCoord, yCoord, zCoord); } @Override public String getModularInventoryName() { return "tile.stationMarker.name"; } public void registerTileWithStation(World world, int x, int y, int z) { if(!world.isRemote && world.provider.dimensionId == Configuration.spaceDimId) { ISpaceObject spaceObj = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(x, z); if(spaceObj instanceof SpaceObject) { ((SpaceObject)spaceObj).addDockingPosition(x, y, z, myIdStr); } } } public void unregisterTileWithStation(World world, int x, int y, int z) { if(!world.isRemote && world.provider.dimensionId == Configuration.spaceDimId) { ISpaceObject spaceObj = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(x, z); if(spaceObj instanceof SpaceObject) ((SpaceObject)spaceObj).removeDockingPosition(x, y, z); } } @Override public void writeDataToNetwork(ByteBuf out, byte id) { if(id == 0) { PacketBuffer buff = new PacketBuffer(out); try { buff.writeInt(myIdStr.length()); buff.writeStringToBuffer(myIdStr); } catch (IOException e) { //Silent } } else if(id == 1) { PacketBuffer buff = new PacketBuffer(out); try { buff.writeInt(targetIdStr.length()); buff.writeStringToBuffer(targetIdStr); } catch (IOException e) { //Silent } } } @Override public void readDataFromNetwork(ByteBuf in, byte packetId, NBTTagCompound nbt) { int len = in.readInt(); PacketBuffer buff = new PacketBuffer(in); try { nbt.setString("id", buff.readStringFromBuffer(len)); } catch (IOException e) { } } @Override public void useNetworkData(EntityPlayer player, Side side, byte id, NBTTagCompound nbt) { if(id == 0) { myIdStr = nbt.getString("id"); if(!worldObj.isRemote && worldObj.provider.dimensionId == Configuration.spaceDimId) { ISpaceObject spaceObj = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(xCoord, zCoord); if(spaceObj instanceof SpaceObject) { ((SpaceObject)spaceObj).addDockingPosition(xCoord, yCoord, zCoord, myIdStr); } } } else if(id == 1) { targetIdStr = nbt.getString("id"); } this.markDirty(); worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } }