aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java12
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java74
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java63
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java11
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java13
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java499
-rw-r--r--src/main/java/gregtech/api/net/data/CasingData.java53
-rw-r--r--src/main/java/gregtech/api/net/data/CommonData.java50
-rw-r--r--src/main/java/gregtech/api/net/data/CoordinateData.java50
-rw-r--r--src/main/java/gregtech/api/net/data/MultiTileEntityData.java39
-rw-r--r--src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java54
-rw-r--r--src/main/java/gregtech/api/net/data/PacketData.java48
-rw-r--r--src/main/java/gregtech/api/net/data/Process.java6
-rw-r--r--src/main/java/gregtech/common/GT_Network.java2
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java9
15 files changed, 637 insertions, 346 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
index 5ea1069193..6ee760553e 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
@@ -12,6 +12,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
@@ -605,14 +608,15 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
return aTileEntity instanceof IMultiTileEntity mte ? mte.getPickBlock(aTarget) : null;
}
- public final IMultiTileEntity receiveMultiTileEntityData(IBlockAccess aWorld, int aX, short aY, int aZ, short aRID,
- short aID) {
+ @Nullable
+ public final IMultiTileEntity receiveMultiTileEntityData(@Nonnull IBlockAccess aWorld, int aX, int aY, int aZ,
+ int registryId, int aID) {
if (!(aWorld instanceof World)) return null;
TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- if (!(aTileEntity instanceof IMultiTileEntity mte) || mte.getMultiTileEntityRegistryID() != aRID
+ if (!(aTileEntity instanceof IMultiTileEntity mte) || mte.getMultiTileEntityRegistryID() != registryId
|| mte.getMultiTileEntityID() != aID) {
- final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(aRID);
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(registryId);
if (tRegistry == null) return null;
aTileEntity = tRegistry.getNewTileEntity((World) aWorld, aX, aY, aZ, aID);
diff --git a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
index 3d98663e6d..84ec63c26a 100644
--- a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
@@ -51,8 +51,12 @@ import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
import gregtech.api.multitileentity.MultiTileEntityClassContainer;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.SyncedMultiTileEntity;
import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.net.GT_Packet_New;
+import gregtech.api.net.data.CommonData;
+import gregtech.api.net.data.CoordinateData;
+import gregtech.api.net.data.MultiTileEntityData;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.objects.XSTR;
import gregtech.api.render.TextureFactory;
@@ -65,7 +69,7 @@ import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
public abstract class MultiTileEntity extends CoverableTileEntity
- implements IMultiTileEntity.IMTE_BreakBlock, MultiTileBasicRender {
+ implements IMultiTileEntity.IMTE_BreakBlock, MultiTileBasicRender, SyncedMultiTileEntity {
private ITexture baseTexture = null;
private ITexture topOverlayTexture = null;
@@ -101,6 +105,10 @@ public abstract class MultiTileEntity extends CoverableTileEntity
private UUID ownerUUID = GT_Utility.defaultUuid;
private boolean lockUpgrade = false;
+ private final GT_Packet_MultiTileEntity fullPacket = new GT_Packet_MultiTileEntity(false);
+ private final GT_Packet_MultiTileEntity timedPacket = new GT_Packet_MultiTileEntity(false);
+ private final GT_Packet_MultiTileEntity graphicPacket = new GT_Packet_MultiTileEntity(false);
+
public MultiTileEntity(boolean isTicking) {
this.isTicking = isTicking;
}
@@ -1028,30 +1036,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
*/
public GT_Packet_MultiTileEntity getClientDataPacket() {
- final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(
- 0,
- xCoord,
- (short) yCoord,
- zCoord,
- getMultiTileEntityRegistryID(),
- getMultiTileEntityID(),
- (byte) ((facing.ordinal() & 7) | (mRedstone ? 16 : 0)),
- color);
-
- packet.setCoverData(
- getCoverInfoAtSide(ForgeDirection.DOWN).getCoverID(),
- getCoverInfoAtSide(ForgeDirection.UP).getCoverID(),
- getCoverInfoAtSide(ForgeDirection.NORTH).getCoverID(),
- getCoverInfoAtSide(ForgeDirection.SOUTH).getCoverID(),
- getCoverInfoAtSide(ForgeDirection.WEST).getCoverID(),
- getCoverInfoAtSide(ForgeDirection.EAST).getCoverID());
-
- packet.setRedstoneData(
- (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0)
- | ((mSidedRedstone[2] > 0) ? 4 : 0)
- | ((mSidedRedstone[3] > 0) ? 8 : 0)
- | ((mSidedRedstone[4] > 0) ? 16 : 0)
- | ((mSidedRedstone[5] > 0) ? 32 : 0)));
+ final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(false);
return packet;
}
@@ -1353,4 +1338,43 @@ public abstract class MultiTileEntity extends CoverableTileEntity
return hasGlow;
}
}
+
+ @Override
+ public void getFullPacketData(GT_Packet_MultiTileEntity packet) {
+ packet.addData(new CoordinateData(getCoords()));
+ packet.addData(new CommonData(mStrongRedstone, color, (byte) 0));
+ packet.addData(new MultiTileEntityData(mteRegistry, blockMetadata));
+ }
+
+ @Override
+ public void getGraphicPacketData(GT_Packet_MultiTileEntity packet) {
+ packet.addData(new CoordinateData(getCoords()));
+ }
+
+ @Override
+ public void getTimedPacketData(GT_Packet_MultiTileEntity packet) {
+ packet.addData(new CoordinateData(getCoords()));
+ packet.addData(new MultiTileEntityData(mteRegistry, blockMetadata));
+ }
+
+ @Override
+ public void sendFullPacket(@Nonnull EntityPlayerMP player) {
+ fullPacket.clearData();
+ getFullPacketData(fullPacket);
+ GT_Values.NW.sendToPlayer(fullPacket, player);
+ }
+
+ @Override
+ public void sendGraphicPacket() {
+ graphicPacket.clearData();
+ getGraphicPacketData(graphicPacket);
+ GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, graphicPacket, getXCoord(), getZCoord());
+ }
+
+ @Override
+ public void sendTimedPacket() {
+ timedPacket.clearData();
+ getTimedPacketData(timedPacket);
+ GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, timedPacket, getXCoord(), getZCoord());
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java
new file mode 100644
index 0000000000..2045f28d67
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java
@@ -0,0 +1,63 @@
+package gregtech.api.multitileentity.interfaces;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+
+import gregtech.api.net.GT_Packet_MultiTileEntity;
+
+public interface SyncedMultiTileEntity {
+
+ public static final int DEFAULT_TIMED_PACKET_PERIOD = 20;
+
+ /**
+ * Will send a packet to the client when they open the controller or access a casing.
+ * Should only be sent to one player!
+ */
+ void sendFullPacket(@Nonnull EntityPlayerMP player);
+
+ /**
+ * Should always collect all the data that the controller or casing has and should send
+ * Called by {@link #sendFullPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getFullPacketData(GT_Packet_MultiTileEntity packet);
+
+ /**
+ * Will send a packet at a certain period of time, defined by {@link #getTimedPacketPeriod()}, to all players around
+ * the controller or casing to send important information.
+ * Redstone state, color, ect. It shouldn't send data about the internals like inventory and processing time
+ */
+ void sendTimedPacket();
+
+ /**
+ * Collects all the data that should be sent out at a certain period of time defined by
+ * {@link #getTimedPacketPeriod()}
+ * Called by {@link #sendTimedPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getTimedPacketData(GT_Packet_MultiTileEntity packet);
+
+ /**
+ * Defines the period of time at which a timed packet should be sent out. Default 20 ticks
+ */
+ default int getTimedPacketPeriod() {
+ return DEFAULT_TIMED_PACKET_PERIOD;
+ }
+
+ /**
+ * Will send a packet, which should only contain data about how the TileEntity should be rendered.
+ * !!! Warning !!! This is sent every single tick! Do not put a lot of data here!
+ */
+ void sendGraphicPacket();
+
+ /**
+ * Collects all the data that is needed to be send every single tick
+ * Called by {@link #sendGraphicPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getGraphicPacketData(GT_Packet_MultiTileEntity packet);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
index 19c052b96a..4b348c2fec 100644
--- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
+++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
@@ -53,7 +53,6 @@ import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
import gregtech.api.multitileentity.base.TickableMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileMachine;
-import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.task.tasks.ProcessingTask;
import gregtech.api.util.GT_Utility;
@@ -271,16 +270,6 @@ public abstract class MultiTileBasicMachine<P extends MuTEProcessingLogic<P>> ex
return TextureFactory.of(texture, getCoverTexture(side));
}
-
- @Override
- public GT_Packet_MultiTileEntity getClientDataPacket() {
- final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
- int booleans = getBooleans();
- packet.setBooleans(booleans);
- packet.setSoundEvent(soundEvent, soundEventValue);
- return packet;
- }
-
/*
* Fluids
*/
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
index 223edc0761..5331d1477d 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
@@ -54,7 +54,6 @@ import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasModes;
-import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Utility;
import gregtech.common.covers.CoverInfo;
@@ -277,18 +276,6 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
}
@Override
- public GT_Packet_MultiTileEntity getClientDataPacket() {
- final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
- packet.setModes(getMode(), getAllowedModes());
- if (getTargetPos() != null) {
- final ChunkCoordinates aTarget = getTargetPos();
- packet.setTargetPos(aTarget.posX, (short) aTarget.posY, aTarget.posZ);
- }
- packet.setInventoryIndex(getLockedInventoryIndex());
- return packet;
- }
-
- @Override
public void setLockedInventoryIndex(int aIndex) {
mLockedInventoryIndex = aIndex;
}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
index b7bd8dbc02..096f21df29 100644
--- a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
+++ b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
@@ -2,320 +2,253 @@ package gregtech.api.net;
import static gregtech.api.enums.GT_Values.B;
-import net.minecraft.block.Block;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.ChunkCoordinates;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
import net.minecraft.world.IBlockAccess;
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 gregtech.api.multitileentity.interfaces.IMultiTileMachine;
-import gregtech.common.tileentities.casings.upgrade.Inventory;
+import gregtech.api.net.data.CasingData;
+import gregtech.api.net.data.CommonData;
+import gregtech.api.net.data.CoordinateData;
+import gregtech.api.net.data.MultiTileEntityData;
+import gregtech.api.net.data.MultiTileEntityProcess;
+import gregtech.api.net.data.PacketData;
import io.netty.buffer.ByteBuf;
public class GT_Packet_MultiTileEntity extends GT_Packet_New {
+ private final Set<PacketData<MultiTileEntityProcess>> data = new HashSet<>();
public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3], INVENTORY_INDEX = B[4],
INVENTORY_NAME_ID = B[5], BOOLEANS = B[6], SOUND = B[7];
- 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, mRedstone, mColor;
- private ChunkCoordinates mTargetPos = null;
- private int mLockedInventoryIndex;
- private String mInventoryName;
- private String inventoryID;
- private int booleans;
- private byte soundEvent;
- private int soundEventValue;
-
- // MultiBlockPart
- private int mode;
- private int allowedModes;
-
- 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(int mode, int allowedModes) {
- features |= MODES;
- this.mode = mode;
- this.allowedModes = allowedModes;
- }
-
- public void setTargetPos(int aX, short aY, int aZ) {
- features |= CONTROLLER;
- mTargetPos = new ChunkCoordinates(aX, aY, aZ);
- }
-
- public void setInventoryIndex(int aInventoryIndex) {
- features |= INVENTORY_INDEX;
- mLockedInventoryIndex = aInventoryIndex;
-
- }
-
- public void setInventoryName(String aInventoryName, String inventoryID) {
- features |= INVENTORY_NAME_ID;
- mInventoryName = aInventoryName;
- this.inventoryID = inventoryID;
- }
-
- /**
- *
- * @param boolToSync each bit of the integer will be a boolean.
- */
- public void setBooleans(int boolToSync) {
- features |= BOOLEANS;
- this.booleans = boolToSync;
- }
-
- public void setSoundEvent(byte soundEvent, int soundEventValue) {
- features |= SOUND;
- this.soundEvent = soundEvent;
- this.soundEventValue = soundEventValue;
+ public GT_Packet_MultiTileEntity(boolean reference) {
+ super(reference);
}
@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.writeInt(mode);
- aOut.writeInt(allowedModes);
- }
- if ((features & CONTROLLER) == CONTROLLER) {
- aOut.writeInt(mTargetPos.posX);
- aOut.writeShort(mTargetPos.posY);
- aOut.writeInt(mTargetPos.posZ);
- }
- if ((features & INVENTORY_INDEX) == INVENTORY_INDEX) {
- aOut.writeInt(mLockedInventoryIndex);
- }
- if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) {
- if (mInventoryName != null && mInventoryName.length() > 0) {
- byte[] bytes = mInventoryName.getBytes();
- aOut.writeInt(bytes.length);
- aOut.writeBytes(bytes);
- } else {
- aOut.writeInt(0);
- }
- if (inventoryID != null && inventoryID.length() > 0) {
- byte[] bytes = inventoryID.getBytes();
- aOut.writeInt(bytes.length);
- aOut.writeBytes(bytes);
- } else {
- aOut.writeInt(0);
- }
+ Set<PacketData<MultiTileEntityProcess>> set = data.stream()
+ .sorted()
+ .collect(
+ HashSet<PacketData<MultiTileEntityProcess>>::new,
+ HashSet<PacketData<MultiTileEntityProcess>>::add,
+ HashSet<PacketData<MultiTileEntityProcess>>::addAll);
+ clearData();
+ data.addAll(set);
+ int features = 0;
+ for (PacketData<MultiTileEntityProcess> data : data) {
+ features |= 1 << data.getId();
}
- if ((features & BOOLEANS) == BOOLEANS) {
- aOut.writeInt(booleans);
- }
+ aOut.writeInt(features);
- if ((features & SOUND) == SOUND) {
- aOut.writeByte(soundEvent);
- aOut.writeInt(soundEventValue);
- }
+ for (PacketData<MultiTileEntityProcess> data : data) {
+ data.encode(aOut);
+ }
+ /*
+ * TODO Move to new system
+ * if ((features & COVERS) == COVERS) {
+ * aOut.writeInt(mC0);
+ * aOut.writeInt(mC1);
+ * aOut.writeInt(mC2);
+ * aOut.writeInt(mC3);
+ * aOut.writeInt(mC4);
+ * aOut.writeInt(mC5);
+ * }
+ * if ((features & MODES) == MODES) {
+ * aOut.writeInt(mode);
+ * aOut.writeInt(allowedModes);
+ * }
+ * if ((features & CONTROLLER) == CONTROLLER) {
+ * aOut.writeInt(mTargetPos.posX);
+ * aOut.writeShort(mTargetPos.posY);
+ * aOut.writeInt(mTargetPos.posZ);
+ * }
+ * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX) {
+ * aOut.writeInt(mLockedInventoryIndex);
+ * }
+ * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) {
+ * if (mInventoryName != null && mInventoryName.length() > 0) {
+ * byte[] bytes = mInventoryName.getBytes();
+ * aOut.writeInt(bytes.length);
+ * aOut.writeBytes(bytes);
+ * } else {
+ * aOut.writeInt(0);
+ * }
+ * if (inventoryID != null && inventoryID.length() > 0) {
+ * byte[] bytes = inventoryID.getBytes();
+ * aOut.writeInt(bytes.length);
+ * aOut.writeBytes(bytes);
+ * } else {
+ * aOut.writeInt(0);
+ * }
+ * }
+ * if ((features & BOOLEANS) == BOOLEANS) {
+ * aOut.writeInt(booleans);
+ * }
+ * if ((features & SOUND) == SOUND) {
+ * aOut.writeByte(soundEvent);
+ * aOut.writeInt(soundEventValue);
+ * }
+ */
}
@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.readInt(), aData.readInt());
- }
- if ((packetFeatures & CONTROLLER) == CONTROLLER) {
- packet.setTargetPos(aData.readInt(), aData.readShort(), aData.readInt());
- }
- if ((packetFeatures & INVENTORY_INDEX) == INVENTORY_INDEX) {
- packet.setInventoryIndex(aData.readInt());
- }
- if ((packetFeatures & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) {
- int nameLength = aData.readInt();
- String inventoryName;
- if (nameLength > 0) {
- byte[] bytes = new byte[nameLength];
- for (int i = 0; i < nameLength; i++) {
- bytes[i] = aData.readByte();
- }
- inventoryName = new String(bytes);
- } else {
- inventoryName = null;
- }
- int idLength = aData.readInt();
- String inventoryID;
- if (idLength > 0) {
- byte[] bytes = new byte[idLength];
- for (int i = 0; i < idLength; i++) {
- bytes[i] = aData.readByte();
- }
- inventoryID = new String(bytes);
- } else {
- inventoryID = null;
- }
- packet.setInventoryName(inventoryName, inventoryID);
- }
-
- if ((packetFeatures & BOOLEANS) == BOOLEANS) {
- packet.setBooleans(aData.readInt());
- }
-
- if ((packetFeatures & SOUND) == SOUND) {
- packet.setSoundEvent(aData.readByte(), aData.readInt());
- }
-
+ public GT_Packet_New decode(ByteArrayDataInput in) {
+ Objects.requireNonNull(in);
+ final int packetFeatures = in.readInt();
+
+ final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(false);
+
+ if (containsBit(packetFeatures, CoordinateData.COORDINATE_DATA_ID)) {
+ packet.addData(new CoordinateData());
+ }
+ if (containsBit(packetFeatures, MultiTileEntityData.MULTI_TILE_ENTITY_DATA_ID)) {
+ packet.addData(new MultiTileEntityData());
+ }
+ if (containsBit(packetFeatures, CommonData.COMMON_DATA_ID)) {
+ packet.addData(new CommonData());
+ }
+ if (containsBit(packetFeatures, CasingData.CASING_DATA_ID)) {
+ packet.addData(new CasingData());
+ }
+
+ Set<PacketData<MultiTileEntityProcess>> set = packet.data.stream()
+ .sorted()
+ .collect(
+ HashSet<PacketData<MultiTileEntityProcess>>::new,
+ HashSet<PacketData<MultiTileEntityProcess>>::add,
+ HashSet<PacketData<MultiTileEntityProcess>>::addAll);
+ packet.clearData();
+ packet.data.addAll(set);
+ for (PacketData<MultiTileEntityProcess> data : packet.data) {
+ data.decode(in);
+ }
+ /*
+ * if ((packetFeatures & COVERS) == COVERS) {
+ * packet.setCoverData(
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt());
+ * }
+ * if ((packetFeatures & INVENTORY_INDEX) == INVENTORY_INDEX) {
+ * packet.setInventoryIndex(aData.readInt());
+ * }
+ * if ((packetFeatures & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) {
+ * int nameLength = aData.readInt();
+ * String inventoryName;
+ * if (nameLength > 0) {
+ * byte[] bytes = new byte[nameLength];
+ * for (int i = 0; i < nameLength; i++) {
+ * bytes[i] = aData.readByte();
+ * }
+ * inventoryName = new String(bytes);
+ * } else {
+ * inventoryName = null;
+ * }
+ * int idLength = aData.readInt();
+ * String inventoryID;
+ * if (idLength > 0) {
+ * byte[] bytes = new byte[idLength];
+ * for (int i = 0; i < idLength; i++) {
+ * bytes[i] = aData.readByte();
+ * }
+ * inventoryID = new String(bytes);
+ * } else {
+ * inventoryID = null;
+ * }
+ * packet.setInventoryName(inventoryName, inventoryID);
+ * }
+ * if ((packetFeatures & BOOLEANS) == BOOLEANS) {
+ * packet.setBooleans(aData.readInt());
+ * }
+ * if ((packetFeatures & SOUND) == SOUND) {
+ * packet.setSoundEvent(aData.readByte(), 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 mteBlock) {
- final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID);
- if (mte == null) return;
- mte.receiveClientData(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData);
- mte.receiveClientData(GregTechTileClientEvents.CHANGE_COLOR, mColor);
-
- if ((features & COVERS) == COVERS) {
- mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5);
- }
- if ((features & REDSTONE) == REDSTONE) {
- mte.receiveClientData(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone);
- }
-
- if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes mteModes) {
- mteModes.setMode(mode);
- mteModes.setAllowedModes(allowedModes);
- }
-
- if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID && mte instanceof Inventory invUpg) {
- invUpg.setInventoryName(mInventoryName);
- invUpg.setInventoryId(inventoryID);
- }
-
- if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) {
- final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
- mtePart.setTargetPos(mTargetPos);
- }
-
- if ((features & INVENTORY_INDEX) == INVENTORY_INDEX && mte instanceof IMultiBlockPart) {
- final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
- mtePart.setLockedInventoryIndex(mLockedInventoryIndex);
- }
-
- if ((features & BOOLEANS) == BOOLEANS && mte instanceof IMultiTileMachine) {
- final IMultiTileMachine machine = (IMultiTileMachine) mte;
- machine.setBooleans(booleans);
- }
-
- if ((features & SOUND) == SOUND && mte instanceof IMultiTileMachine) {
- final IMultiTileMachine machine = (IMultiTileMachine) mte;
- machine.setSound(soundEvent, soundEventValue);
- }
-
- }
- } catch (Exception e) {
- e.printStackTrace();
- GT_Mod.GT_FML_LOGGER.error(
- "Exception setting tile entity data for tile entity {} at ({}, {}, {})",
- tTileEntity,
- mX,
- mY,
- mZ);
- }
+ MultiTileEntityProcess process = new MultiTileEntityProcess(aWorld);
+ for (PacketData<MultiTileEntityProcess> data : data) {
+ data.process(process);
+ }
+ process.process();
+ /*
+ * final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ);
+ * try {
+ * final Block tBlock = aWorld.getBlock(mX, mY, mZ);
+ * if (tBlock instanceof MultiTileEntityBlock mteBlock) {
+ * final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID);
+ * if (mte == null) return;
+ * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData);
+ * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COLOR, mColor);
+ * if ((features & COVERS) == COVERS) {
+ * mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5);
+ * }
+ * if ((features & REDSTONE) == REDSTONE) {
+ * mte.receiveClientData(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone);
+ * }
+ * if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes mteModes) {
+ * mteModes.setMode(mode);
+ * mteModes.setAllowedModes(allowedModes);
+ * }
+ * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID && mte instanceof Inventory invUpg) {
+ * invUpg.setInventoryName(mInventoryName);
+ * invUpg.setInventoryId(inventoryID);
+ * }
+ * if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) {
+ * final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
+ * mtePart.setTargetPos(mTargetPos);
+ * }
+ * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX && mte instanceof IMultiBlockPart) {
+ * final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
+ * mtePart.setLockedInventoryIndex(mLockedInventoryIndex);
+ * }
+ * if ((features & BOOLEANS) == BOOLEANS && mte instanceof IMultiTileMachine) {
+ * final IMultiTileMachine machine = (IMultiTileMachine) mte;
+ * machine.setBooleans(booleans);
+ * }
+ * if ((features & SOUND) == SOUND && mte instanceof IMultiTileMachine) {
+ * final IMultiTileMachine machine = (IMultiTileMachine) mte;
+ * machine.setSound(soundEvent, soundEventValue);
+ * }
+ * }
+ * } catch (Exception e) {
+ * e.printStackTrace();
+ * 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;
}
+
+ public void clearData() {
+ data.clear();
+ }
+
+ public void addData(PacketData<MultiTileEntityProcess> data) {
+ this.data.add(data);
+ }
+
+ private static boolean containsBit(int toCheck, int bit) {
+ return (toCheck & (1 << bit)) > 0;
+ }
}
diff --git a/src/main/java/gregtech/api/net/data/CasingData.java b/src/main/java/gregtech/api/net/data/CasingData.java
new file mode 100644
index 0000000000..627c1eacf2
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/CasingData.java
@@ -0,0 +1,53 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.util.ChunkCoordinates;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class CasingData extends PacketData<MultiTileEntityProcess> {
+
+ public static final int CASING_DATA_ID = 4;
+
+ private int currentMode;
+ private int allowedModes;
+ private ChunkCoordinates controllerCoords;
+
+ public CasingData() {}
+
+ public CasingData(int currentMode, int allowedModes, ChunkCoordinates controllerCoords) {
+ this.currentMode = currentMode;
+ this.allowedModes = allowedModes;
+ this.controllerCoords = controllerCoords;
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ currentMode = in.readInt();
+ allowedModes = in.readInt();
+ controllerCoords = new ChunkCoordinates(in.readInt(), in.readInt(), in.readInt());
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeInt(currentMode);
+ out.writeInt(allowedModes);
+ out.writeInt(controllerCoords.posX);
+ out.writeInt(controllerCoords.posY);
+ out.writeInt(controllerCoords.posZ);
+ }
+
+ @Override
+ public int getId() {
+ return CASING_DATA_ID;
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/CommonData.java b/src/main/java/gregtech/api/net/data/CommonData.java
new file mode 100644
index 0000000000..294cca134b
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/CommonData.java
@@ -0,0 +1,50 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class CommonData extends PacketData<MultiTileEntityProcess> {
+
+ public static final int COMMON_DATA_ID = 2;
+
+ private byte redstone;
+ private byte color;
+ private byte commonData;
+
+ public CommonData() {}
+
+ public CommonData(byte redstone, byte color, byte commonData) {
+ this.redstone = redstone;
+ this.color = color;
+ this.commonData = commonData;
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ redstone = in.readByte();
+ color = in.readByte();
+ commonData = in.readByte();
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeByte(redstone);
+ out.writeByte(color);
+ out.writeByte(commonData);
+ }
+
+ @Override
+ public int getId() {
+ return COMMON_DATA_ID;
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/CoordinateData.java b/src/main/java/gregtech/api/net/data/CoordinateData.java
new file mode 100644
index 0000000000..ad8ebbd210
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/CoordinateData.java
@@ -0,0 +1,50 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.util.ChunkCoordinates;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class CoordinateData extends PacketData<MultiTileEntityProcess> {
+
+ public final static int COORDINATE_DATA_ID = 0;
+
+ private ChunkCoordinates coords;
+
+ public CoordinateData(ChunkCoordinates coords) {
+ this.coords = coords;
+ }
+
+ public CoordinateData(int x, int y, int z) {
+ this(new ChunkCoordinates(x, y, z));
+ }
+
+ public CoordinateData() {}
+
+ @Override
+ public int getId() {
+ return COORDINATE_DATA_ID;
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeInt(coords.posX);
+ out.writeInt(coords.posY);
+ out.writeInt(coords.posZ);
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ coords = new ChunkCoordinates(in.readInt(), in.readInt(), in.readInt());
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+ if (coords == null) return;
+ processData.giveCoordinates(coords);
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/MultiTileEntityData.java b/src/main/java/gregtech/api/net/data/MultiTileEntityData.java
new file mode 100644
index 0000000000..3b0b896b0f
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/MultiTileEntityData.java
@@ -0,0 +1,39 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class MultiTileEntityData extends PacketData<MultiTileEntityProcess> {
+
+ public static final int MULTI_TILE_ENTITY_DATA_ID = 1;
+
+ private int registryId;
+ private int metaId;
+
+ public MultiTileEntityData() {}
+
+ public MultiTileEntityData(int registryId, int metaId) {
+ this.registryId = registryId;
+ this.metaId = metaId;
+ }
+
+ @Override
+ public int getId() {
+ return MULTI_TILE_ENTITY_DATA_ID;
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {}
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {}
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+ processData.giveMultiTileEntityData(registryId, metaId);
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java b/src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java
new file mode 100644
index 0000000000..02e04981c0
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java
@@ -0,0 +1,54 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.IBlockAccess;
+
+import gregtech.api.multitileentity.MultiTileEntityBlock;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+
+public class MultiTileEntityProcess extends Process {
+
+ @Nonnull
+ private final IBlockAccess world;
+ private ChunkCoordinates coords;
+ private int registryId;
+ private int metaId;
+ private byte redstone;
+ private byte color;
+ private byte commonData;
+
+ public MultiTileEntityProcess(@Nonnull IBlockAccess world) {
+ this.world = world;
+ }
+
+ @Override
+ public void process() {
+ if (coords == null) return;
+ Block block = world.getBlock(coords.posX, coords.posY, coords.posZ);
+ if (!(block instanceof MultiTileEntityBlock muteBlock)) {
+ return;
+ }
+ IMultiTileEntity mute = muteBlock
+ .receiveMultiTileEntityData(world, coords.posX, coords.posY, coords.posZ, registryId, metaId);
+ if (mute == null) return;
+ mute.setColorization(color);
+ }
+
+ public void giveCoordinates(@Nonnull ChunkCoordinates coords) {
+ this.coords = coords;
+ }
+
+ public void giveMultiTileEntityData(int registryId, int metaId) {
+ this.registryId = registryId;
+ this.metaId = metaId;
+ }
+
+ public void giveCommonData(byte redstone, byte color, byte commonData) {
+ this.redstone = redstone;
+ this.color = color;
+ this.commonData = commonData;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/data/PacketData.java b/src/main/java/gregtech/api/net/data/PacketData.java
new file mode 100644
index 0000000000..bde2b9fb76
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/PacketData.java
@@ -0,0 +1,48 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public abstract class PacketData<T extends Process> implements Comparable<PacketData<T>> {
+
+ /**
+ * This should return the Id of the packet. The Id is is used to bit-shift to be added a header for the packet its
+ * used in
+ */
+ public abstract int getId();
+
+ /**
+ * Called by the packet it is held by to store the data it needs
+ */
+ public abstract void encode(@Nonnull ByteBuf out);
+
+ /**
+ * Called by the packet it is held by to decode the data to later be used in {@link #process()}
+ */
+ public abstract void decode(@Nonnull ByteArrayDataInput in);
+
+ /**
+ * Called by the packet it is held by to process the data it decoded.
+ */
+ public abstract void process(T processData);
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ if (!(other instanceof PacketData otherData)) return false;
+ return this.getId() == otherData.getId();
+ }
+
+ @Override
+ public int hashCode() {
+ return getId();
+ }
+
+ @Override
+ public int compareTo(PacketData<T> other) {
+ return Integer.compare(this.getId(), other.getId());
+ }
+}
diff --git a/src/main/java/gregtech/api/net/data/Process.java b/src/main/java/gregtech/api/net/data/Process.java
new file mode 100644
index 0000000000..d5bc1317b7
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/Process.java
@@ -0,0 +1,6 @@
+package gregtech.api.net.data;
+
+public abstract class Process {
+
+ public abstract void process();
+}
diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java
index abc0651f26..3d081b3320 100644
--- a/src/main/java/gregtech/common/GT_Network.java
+++ b/src/main/java/gregtech/common/GT_Network.java
@@ -74,7 +74,7 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet>
new GT_Packet_GtTileEntityGuiRequest(), // 15
new GT_Packet_SendCoverData(), // 16
new GT_Packet_RequestCoverData(), // 17
- new GT_Packet_MultiTileEntity(), // 18
+ new GT_Packet_MultiTileEntity(true), // 18
new GT_Packet_SendOregenPattern() // 19
);
}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
index 5087c7f09e..31294c7002 100644
--- a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
@@ -15,7 +15,6 @@ import gregtech.api.enums.GT_Values.NBT;
import gregtech.api.enums.InventoryType;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
-import gregtech.api.net.GT_Packet_MultiTileEntity;
public class Inventory extends UpgradeCasing {
@@ -111,14 +110,6 @@ public class Inventory extends UpgradeCasing {
}
@Override
- public GT_Packet_MultiTileEntity getClientDataPacket() {
- final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
- String name = getCustomInventoryName();
- packet.setInventoryName(name, inventoryID.toString());
- return packet;
- }
-
- @Override
public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
super.addToolTips(list, stack, f3_h);
list.add("Adds another item inventory");