diff options
Diffstat (limited to 'src/main/java/gregtech/api/net')
-rw-r--r-- | src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java | 112 | ||||
-rw-r--r-- | src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java | 74 |
2 files changed, 176 insertions, 10 deletions
diff --git a/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java b/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java new file mode 100644 index 0000000000..bf412c4400 --- /dev/null +++ b/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java @@ -0,0 +1,112 @@ +package gregtech.api.net; + +import com.google.common.io.ByteArrayDataInput; + +import gregtech.api.enums.GT_Values; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.common.GT_Proxy; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +/** + * Client -> Server: Request that the server opens a Gregtech GUI for us after providing us with the required data. + */ +public class GT_Packet_GtTileEntityGuiRequest extends GT_Packet_New { + + + protected int mX; + protected short mY; + protected int mZ; + + protected int guiId; + protected int dimId, playerId; + + protected int parentGuiId; + + public GT_Packet_GtTileEntityGuiRequest() { + super(true); + } + + public GT_Packet_GtTileEntityGuiRequest(int mX, short mY, int mZ, int guiId, int dimID, int playerID, int parentGuiId) { + super(false); + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + + this.guiId = guiId; + + this.dimId = dimID; + this.playerId = playerID; + + this.parentGuiId = parentGuiId; + } + + public GT_Packet_GtTileEntityGuiRequest(int mX, short mY, int mZ, int guiId, int dimID, int playerID) { + this(mX, mY, mZ, guiId, dimID, playerID, -1); + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + aOut.writeInt(guiId); + + aOut.writeInt(dimId); + aOut.writeInt(playerId); + + aOut.writeInt(parentGuiId); + } + + @Override + public GT_Packet_New decode(ByteArrayDataInput aData) { + return new GT_Packet_GtTileEntityGuiRequest( + aData.readInt(), + aData.readShort(), + aData.readInt(), + + aData.readInt(), + + aData.readInt(), + aData.readInt(), + + aData.readInt()); + } + + @Override + public byte getPacketID() { + return 15; + } + + @Override + public void process(IBlockAccess aWorld) { + World world = DimensionManager.getWorld(this.dimId); + if (world == null) return; + TileEntity tile = world.getTileEntity(this.mX, this.mY, this.mZ); + if (!(tile instanceof IGregTechTileEntity) || ((IGregTechTileEntity) tile).isDead()) return; + + IGregTechTileEntity gtTile = ((IGregTechTileEntity) tile); + EntityPlayerMP player = (EntityPlayerMP) world.getEntityByID(playerId); + // If the requested Gui ID corresponds to a cover, send the cover data to the client so they can open it. + if (GT_Proxy.GUI_ID_COVER_SIDE_BASE <= guiId && guiId < GT_Proxy.GUI_ID_COVER_SIDE_BASE+6) { + byte coverSide = (byte) (guiId - GT_Proxy.GUI_ID_COVER_SIDE_BASE); + GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI( + this.mX, this.mY, this.mZ, + coverSide, + gtTile.getCoverIDAtSide(coverSide), + gtTile.getComplexCoverDataAtSide(coverSide), + this.dimId, + this.playerId, + parentGuiId); + GT_Values.NW.sendToPlayer(packet, player); + } else if (guiId == 0) { + gtTile.openGUI(player); + } + } + +} diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java index e5cb184339..687bceb726 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java +++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java @@ -2,14 +2,15 @@ package gregtech.api.net; import com.google.common.io.ByteArrayDataInput; import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; +import gregtech.api.gui.GT_GUICover; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.ISerializableObject; -import gregtech.common.GT_Proxy; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; @@ -27,11 +28,14 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { protected int coverID, dimID, playerID; protected ISerializableObject coverData; + protected int parentGuiId; + public GT_Packet_TileEntityCoverGUI() { super(true); } - public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, byte coverSide, int coverID, int coverData, int dimID, int playerID) { + public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, byte coverSide, int coverID, int coverData, int dimID, + int playerID) { super(false); this.mX = mX; this.mY = mY; @@ -43,9 +47,26 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { this.dimID = dimID; this.playerID = playerID; + this.parentGuiId = -1; + } + + public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, byte coverSide, int coverID, + ISerializableObject coverData, int dimID, int playerID) { + super(false); + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + + this.side = coverSide; + this.coverID = coverID; + this.coverData = coverData; + this.dimID = dimID; + this.playerID = playerID; + this.parentGuiId = -1; } - public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, byte coverSide, int coverID, ISerializableObject coverData, int dimID, int playerID) { + public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, byte coverSide, int coverID, + ISerializableObject coverData, int dimID, int playerID, int parentGuiId) { super(false); this.mX = mX; this.mY = mY; @@ -56,6 +77,7 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { this.coverData = coverData; this.dimID = dimID; this.playerID = playerID; + this.parentGuiId = parentGuiId; } @@ -72,6 +94,7 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { this.dimID = tile.getWorld().provider.dimensionId; this.playerID = aPlayer.getEntityId(); + this.parentGuiId = -1; } public GT_Packet_TileEntityCoverGUI(byte coverSide, int coverID, int coverData, IGregTechTileEntity tile) { @@ -85,9 +108,11 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { this.coverData = new ISerializableObject.LegacyCoverData(coverData); this.dimID = tile.getWorld().provider.dimensionId; + this.parentGuiId = -1; } - public GT_Packet_TileEntityCoverGUI(byte side, int coverID, ISerializableObject coverData, ICoverable tile, EntityPlayerMP aPlayer) { + public GT_Packet_TileEntityCoverGUI(byte side, int coverID, ISerializableObject coverData, ICoverable tile, + EntityPlayerMP aPlayer) { super(false); this.mX = tile.getXCoord(); this.mY = tile.getYCoord(); @@ -99,6 +124,7 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { this.dimID = tile.getWorld().provider.dimensionId; this.playerID = aPlayer.getEntityId(); + this.parentGuiId = -1; } @Override @@ -118,6 +144,8 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { aOut.writeInt(dimID); aOut.writeInt(playerID); + + aOut.writeInt(parentGuiId); } @Override @@ -133,19 +161,45 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { GregTech_API.getCoverBehaviorNew(coverID).createDataObject().readFromPacket(aData, null), aData.readInt(), + aData.readInt(), + aData.readInt()); } @Override public void process(IBlockAccess aWorld) { if (aWorld instanceof World) { - EntityClientPlayerMP a = Minecraft.getMinecraft().thePlayer; + // Using EntityPlayer instead of EntityClientPlayerMP so both client and server can load this + EntityPlayer thePlayer = ((EntityPlayer) ((World)aWorld).getEntityByID(playerID)); TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); if (tile instanceof IGregTechTileEntity && !((IGregTechTileEntity) tile).isDead()) { - - ((IGregTechTileEntity) tile).setCoverDataAtSide(side, coverData); //Set it client side to read later. - a.openGui(GT_Values.GT, GT_Proxy.GUI_ID_COVER_SIDE_BASE + side, a.worldObj, mX, mY, mZ); + IGregTechTileEntity gtTile = ((IGregTechTileEntity) tile); + gtTile.setCoverDataAtSide(side, coverData); //Set it client side to read later. + + GuiScreen gui = (GuiScreen) getCoverGUI(side, thePlayer, thePlayer.worldObj, gtTile); + // If it's one of this mod's covers, tell it to exit to the GUI with the specified ID (-1 is ignored) + if (gui instanceof GT_GUICover) { + ((GT_GUICover) gui).setParentGuiId(parentGuiId); + } + Minecraft.getMinecraft().displayGuiScreen(gui); } } } + + /** + * Gets the specified cover's GUI object, if one exists + * @param aSide Block side (0 through 5) + * @param aPlayer Current player + * @param aWorld Current world + * @param aGtTile IGregTechTileEntity instance + * @return The specified cover's GUI, if one exists + */ + private Object getCoverGUI(byte aSide, EntityPlayer aPlayer, World aWorld, IGregTechTileEntity aGtTile) { + GT_CoverBehaviorBase<?> cover = aGtTile.getCoverBehaviorAtSideNew(aSide); + if (cover.hasCoverGUI()) { + return cover.getClientGUI( + aSide, aGtTile.getCoverIDAtSide(aSide), aGtTile.getComplexCoverDataAtSide(aSide), aGtTile, aPlayer, aWorld); + } + return null; + } } |