aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
diff options
context:
space:
mode:
authorBlueWeabo <ilia.iliev2005@gmail.com>2024-02-03 21:55:06 +0200
committerGitHub <noreply@github.com>2024-02-03 13:55:06 -0600
commit0361000b1d4e4276277a805dd1d2dc60aad0ae99 (patch)
tree075be0871b9437db8a48b6bd7e29615504591df3 /src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
parent7874a016f950b11da80f1680c40a17e7e33c6e51 (diff)
downloadGT5-Unofficial-0361000b1d4e4276277a805dd1d2dc60aad0ae99.tar.gz
GT5-Unofficial-0361000b1d4e4276277a805dd1d2dc60aad0ae99.tar.bz2
GT5-Unofficial-0361000b1d4e4276277a805dd1d2dc60aad0ae99.zip
Refactor Packet Handling for MuTEs (#2485)
* create base framework of packets for MuTEs * spotless
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.java499
1 files changed, 216 insertions, 283 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
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;
+ }
}