aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java')
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
new file mode 100644
index 0000000000..5263549264
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
@@ -0,0 +1,200 @@
+package gregtech.api.net;
+
+import static gregtech.api.enums.GT_Values.B;
+
+import com.google.common.io.ByteArrayDataInput;
+import gregtech.GT_Mod;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.multitileentity.MultiTileEntityBlock;
+import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.IBlockAccess;
+
+public class GT_Packet_MultiTileEntity extends GT_Packet_New {
+ public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3];
+
+ private int features = 0;
+
+ private int mX, mZ;
+ private int mC0 = 0, mC1 = 0, mC2 = 0, mC3 = 0, mC4 = 0, mC5 = 0;
+ private short mY, mID, mRID;
+ private byte mCommonData, mTexturePage, mUpdate, mRedstone, mColor;
+ private ChunkCoordinates mTargetPos = null;
+
+ // MultiBlockPart
+ private byte mMode;
+ private int mAllowedModes;
+
+ public GT_Packet_MultiTileEntity() {
+ super(true);
+ }
+
+ // For multi tiles
+ public GT_Packet_MultiTileEntity(
+ int aFeatures, int aX, short aY, int aZ, short aRID, short aID, byte aCommonData, byte aColor) {
+ super(false);
+ features = aFeatures;
+
+ mX = aX;
+ mY = aY;
+ mZ = aZ;
+ mRID = aRID;
+ mID = aID;
+ mCommonData = aCommonData;
+ mColor = aColor;
+ }
+
+ public void setCoverData(int aC0, int aC1, int aC2, int aC3, int aC4, int aC5) {
+ features |= COVERS;
+
+ mC0 = aC0;
+ mC1 = aC1;
+ mC2 = aC2;
+ mC3 = aC3;
+ mC4 = aC4;
+ mC5 = aC5;
+ }
+
+ public void setRedstoneData(byte aRedstoneData) {
+ features |= REDSTONE;
+
+ mRedstone = aRedstoneData;
+ }
+
+ public void setModes(byte aMode, int aAllowedModes) {
+ features |= MODES;
+ mMode = aMode;
+ mAllowedModes = aAllowedModes;
+ }
+
+ public void setTargetPos(int aX, short aY, int aZ) {
+ features |= CONTROLLER;
+ mTargetPos = new ChunkCoordinates(aX, aY, aZ);
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ // Features
+ aOut.writeInt(features);
+
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeShort(mRID);
+ aOut.writeShort(mID);
+ aOut.writeByte(mCommonData);
+ aOut.writeByte(mColor);
+
+ if ((features & COVERS) == COVERS) {
+ aOut.writeInt(mC0);
+ aOut.writeInt(mC1);
+ aOut.writeInt(mC2);
+ aOut.writeInt(mC3);
+ aOut.writeInt(mC4);
+ aOut.writeInt(mC5);
+ }
+ if ((features & REDSTONE) == REDSTONE) {
+ aOut.writeByte(mRedstone);
+ }
+ if ((features & MODES) == MODES) {
+ aOut.writeByte(mMode);
+ aOut.writeInt(mAllowedModes);
+ }
+ if ((features & CONTROLLER) == CONTROLLER) {
+ aOut.writeInt(mTargetPos.posX);
+ aOut.writeShort(mTargetPos.posY);
+ aOut.writeInt(mTargetPos.posZ);
+ }
+
+ if (false) {
+ aOut.writeByte(mTexturePage);
+ aOut.writeByte(mUpdate);
+ aOut.writeByte(mColor);
+ }
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ final int packetFeatures = aData.readInt();
+
+ final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(
+ packetFeatures,
+ // Coords
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ // Registry & ID
+ aData.readShort(),
+ aData.readShort(),
+ // Common Data
+ aData.readByte(),
+ aData.readByte());
+ if ((packetFeatures & COVERS) == COVERS) {
+ packet.setCoverData(
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt());
+ }
+ if ((packetFeatures & REDSTONE) == REDSTONE) {
+ packet.setRedstoneData(aData.readByte());
+ }
+ if ((packetFeatures & MODES) == MODES) {
+ packet.setModes(aData.readByte(), aData.readInt());
+ }
+ if ((packetFeatures & CONTROLLER) == CONTROLLER) {
+ packet.setTargetPos(aData.readInt(), aData.readShort(), aData.readInt());
+ }
+
+ return packet;
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld == null) return;
+ final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ);
+ try {
+ final Block tBlock = aWorld.getBlock(mX, mY, mZ);
+ if (tBlock instanceof MultiTileEntityBlock) {
+ final MultiTileEntityBlock mteBlock = (MultiTileEntityBlock) tBlock;
+ final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID);
+ if (mte == null) return;
+ mte.receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData);
+ mte.receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, mColor);
+
+ if ((features & COVERS) == COVERS) {
+ mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5);
+ }
+ if ((features & REDSTONE) == REDSTONE) {
+ mte.receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone);
+ }
+
+ if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes) {
+ final IMultiTileEntity.IMTE_HasModes mteModes = (IMultiTileEntity.IMTE_HasModes) mte;
+ mteModes.setMode(mMode);
+ mteModes.setAllowedModes(mAllowedModes);
+ }
+
+ if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) {
+ final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
+ mtePart.setTargetPos(mTargetPos);
+ }
+ }
+ } catch (Exception e) {
+ GT_Mod.GT_FML_LOGGER.error(
+ "Exception setting tile entity data for tile entity {} at ({}, {}, {})", tTileEntity, mX, mY, mZ);
+ }
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 18;
+ }
+}