From d41a0366455bc6f7ac8ce195b4dcd2dde8a21c5b Mon Sep 17 00:00:00 2001 From: TechLord22 <37029404+TechLord22@users.noreply.github.com> Date: Sun, 17 Dec 2023 19:42:55 -0500 Subject: [PATCH] invalidate pipenet routepaths on chunk unload (#2303) --- .../metatileentity/NeighborCacheTileEntityBase.java | 11 +++++++++++ src/main/java/gregtech/api/pipenet/PipeNet.java | 12 +++++++++++- .../api/pipenet/tile/TileEntityPipeBase.java | 12 ++++++++++++ .../common/pipelike/cable/net/EnergyNet.java | 10 +++++++++- .../common/pipelike/cable/tile/TileEntityCable.java | 8 +++++++- .../common/pipelike/itempipe/net/ItemPipeNet.java | 11 ++++++++++- .../pipelike/itempipe/tile/TileEntityItemPipe.java | 6 ++++++ .../common/pipelike/laser/net/LaserPipeNet.java | 5 +++++ .../pipelike/laser/tile/TileEntityLaserPipe.java | 6 ++++++ .../common/pipelike/optical/net/OpticalPipeNet.java | 5 +++++ .../pipelike/optical/tile/TileEntityOpticalPipe.java | 6 ++++++ 11 files changed, 88 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java b/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java index 473b950d63c..97200ab8518 100644 --- a/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java +++ b/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java @@ -7,6 +7,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,24 +29,34 @@ protected void invalidateNeighbors() { } } + @MustBeInvokedByOverriders @Override public void setWorld(@NotNull World worldIn) { super.setWorld(worldIn); invalidateNeighbors(); } + @MustBeInvokedByOverriders @Override public void setPos(@NotNull BlockPos posIn) { super.setPos(posIn); invalidateNeighbors(); } + @MustBeInvokedByOverriders @Override public void invalidate() { super.invalidate(); invalidateNeighbors(); } + @MustBeInvokedByOverriders + @Override + public void onChunkUnload() { + super.onChunkUnload(); + invalidateNeighbors(); + } + @Override public @Nullable TileEntity getNeighbor(@NotNull EnumFacing facing) { if (world == null || pos == null) return null; diff --git a/src/main/java/gregtech/api/pipenet/PipeNet.java b/src/main/java/gregtech/api/pipenet/PipeNet.java index 384d15134a1..536b2a23b81 100644 --- a/src/main/java/gregtech/api/pipenet/PipeNet.java +++ b/src/main/java/gregtech/api/pipenet/PipeNet.java @@ -15,8 +15,13 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import java.util.*; +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; public abstract class PipeNet implements INBTSerializable { @@ -63,6 +68,11 @@ public void onPipeConnectionsUpdate() {} public void onNeighbourUpdate(BlockPos fromPos) {} + /** + * Is called when any Pipe TE in the PipeNet is unloaded + */ + public void onChunkUnload() {} + public Map> getAllNodes() { return unmodifiableNodeByBlockPos; } diff --git a/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java b/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java index a2d593bb206..b1ec074d9d6 100644 --- a/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java +++ b/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java @@ -26,6 +26,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants.NBT; +import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -539,6 +540,17 @@ public boolean shouldRefresh(@NotNull World world, @NotNull BlockPos pos, IBlock return oldState.getBlock() != newSate.getBlock(); } + @MustBeInvokedByOverriders + @Override + public void onChunkUnload() { + super.onChunkUnload(); + WorldPipeNet worldPipeNet = getPipeBlock().getWorldPipeNet(getWorld()); + PipeNet net = worldPipeNet.getNetFromPos(pos); + if (net != null) { + net.onChunkUnload(); + } + } + public void doExplosion(float explosionPower) { getWorld().setBlockToAir(getPos()); if (!getWorld().isRemote) { diff --git a/src/main/java/gregtech/common/pipelike/cable/net/EnergyNet.java b/src/main/java/gregtech/common/pipelike/cable/net/EnergyNet.java index 8d6f7110cb1..a56fb565600 100644 --- a/src/main/java/gregtech/common/pipelike/cable/net/EnergyNet.java +++ b/src/main/java/gregtech/common/pipelike/cable/net/EnergyNet.java @@ -11,7 +11,10 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import java.util.*; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; public class EnergyNet extends PipeNet { @@ -67,6 +70,11 @@ public void onPipeConnectionsUpdate() { NET_DATA.clear(); } + @Override + public void onChunkUnload() { + NET_DATA.clear(); + } + @Override protected void transferNodeData(Map> transferredNodes, PipeNet parentNet) { diff --git a/src/main/java/gregtech/common/pipelike/cable/tile/TileEntityCable.java b/src/main/java/gregtech/common/pipelike/cable/tile/TileEntityCable.java index d54d160e525..befdf615466 100644 --- a/src/main/java/gregtech/common/pipelike/cable/tile/TileEntityCable.java +++ b/src/main/java/gregtech/common/pipelike/cable/tile/TileEntityCable.java @@ -258,7 +258,7 @@ public T getCapabilityInternal(Capability capability, @Nullable EnumFacin if (capability == GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER) { if (world.isRemote) return GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER.cast(clientCapability); - if (handlers.size() == 0) + if (handlers.isEmpty()) initHandlers(); checkNetwork(); return GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER.cast(handlers.getOrDefault(facing, defaultHandler)); @@ -293,6 +293,12 @@ private EnergyNet getEnergyNet() { return currentEnergyNet; } + @Override + public void onChunkUnload() { + super.onChunkUnload(); + this.handlers.clear(); + } + @Override public int getDefaultPaintingColor() { return 0x404040; diff --git a/src/main/java/gregtech/common/pipelike/itempipe/net/ItemPipeNet.java b/src/main/java/gregtech/common/pipelike/itempipe/net/ItemPipeNet.java index 25e6534b0f4..c836119c344 100644 --- a/src/main/java/gregtech/common/pipelike/itempipe/net/ItemPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/itempipe/net/ItemPipeNet.java @@ -9,7 +9,11 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -import java.util.*; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class ItemPipeNet extends PipeNet { @@ -43,6 +47,11 @@ public void onPipeConnectionsUpdate() { NET_DATA.clear(); } + @Override + public void onChunkUnload() { + NET_DATA.clear(); + } + @Override protected void transferNodeData(Map> transferredNodes, PipeNet parentNet) { diff --git a/src/main/java/gregtech/common/pipelike/itempipe/tile/TileEntityItemPipe.java b/src/main/java/gregtech/common/pipelike/itempipe/tile/TileEntityItemPipe.java index 5880f375964..80b5e233b92 100644 --- a/src/main/java/gregtech/common/pipelike/itempipe/tile/TileEntityItemPipe.java +++ b/src/main/java/gregtech/common/pipelike/itempipe/tile/TileEntityItemPipe.java @@ -153,4 +153,10 @@ public int getTransferredItems() { updateTransferredState(); return this.transferredItems; } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + this.handlers.clear(); + } } diff --git a/src/main/java/gregtech/common/pipelike/laser/net/LaserPipeNet.java b/src/main/java/gregtech/common/pipelike/laser/net/LaserPipeNet.java index 02781ae8ce8..67aef2810ac 100644 --- a/src/main/java/gregtech/common/pipelike/laser/net/LaserPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/laser/net/LaserPipeNet.java @@ -46,6 +46,11 @@ public void onPipeConnectionsUpdate() { netData.clear(); } + @Override + public void onChunkUnload() { + netData.clear(); + } + @Override protected void transferNodeData(Map> transferredNodes, PipeNet parentNet) { diff --git a/src/main/java/gregtech/common/pipelike/laser/tile/TileEntityLaserPipe.java b/src/main/java/gregtech/common/pipelike/laser/tile/TileEntityLaserPipe.java index 6a11c0503a4..759fa494152 100644 --- a/src/main/java/gregtech/common/pipelike/laser/tile/TileEntityLaserPipe.java +++ b/src/main/java/gregtech/common/pipelike/laser/tile/TileEntityLaserPipe.java @@ -224,6 +224,12 @@ public void readFromNBT(@NotNull NBTTagCompound compound) { } } + @Override + public void onChunkUnload() { + super.onChunkUnload(); + this.handlers.clear(); + } + private static class DefaultLaserContainer implements ILaserContainer { @Override diff --git a/src/main/java/gregtech/common/pipelike/optical/net/OpticalPipeNet.java b/src/main/java/gregtech/common/pipelike/optical/net/OpticalPipeNet.java index 18f2edd36ca..fceabc6aae6 100644 --- a/src/main/java/gregtech/common/pipelike/optical/net/OpticalPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/optical/net/OpticalPipeNet.java @@ -47,6 +47,11 @@ public void onPipeConnectionsUpdate() { NET_DATA.clear(); } + @Override + public void onChunkUnload() { + NET_DATA.clear(); + } + @Override protected void transferNodeData(Map> transferredNodes, PipeNet parentNet) { diff --git a/src/main/java/gregtech/common/pipelike/optical/tile/TileEntityOpticalPipe.java b/src/main/java/gregtech/common/pipelike/optical/tile/TileEntityOpticalPipe.java index adf7f995ae1..43efe04cb56 100644 --- a/src/main/java/gregtech/common/pipelike/optical/tile/TileEntityOpticalPipe.java +++ b/src/main/java/gregtech/common/pipelike/optical/tile/TileEntityOpticalPipe.java @@ -194,6 +194,12 @@ public void receiveCustomData(int discriminator, PacketBuffer buf) { } } + @Override + public void onChunkUnload() { + super.onChunkUnload(); + this.handlers.clear(); + } + private static class DefaultDataHandler implements IDataAccessHatch { @Override