diff options
Diffstat (limited to 'src/main/java')
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"); |