diff options
author | BlueWeabo <ilia.iliev2005@gmail.com> | 2024-02-03 21:55:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-03 13:55:06 -0600 |
commit | 0361000b1d4e4276277a805dd1d2dc60aad0ae99 (patch) | |
tree | 075be0871b9437db8a48b6bd7e29615504591df3 /src/main/java/gregtech/api/multitileentity | |
parent | 7874a016f950b11da80f1680c40a17e7e33c6e51 (diff) | |
download | GT5-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/multitileentity')
5 files changed, 120 insertions, 53 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; } |