From 9619b5a6951db158528f196467cd75e04dfe073c Mon Sep 17 00:00:00 2001 From: warjort Date: Sat, 16 Jan 2021 14:01:01 +0000 Subject: [PATCH 01/11] Fixes for WorldSaveData dimension handling (#1398) and fluid in pipes not being persisted (#1357) --- .../gregtech/api/pipenet/WorldPipeNet.java | 18 ++++++++++++------ .../TickableWorldPipeNetEventHandler.java | 15 ++++++++++++--- .../common/pipelike/cable/BlockCable.java | 2 ++ .../common/pipelike/cable/net/WorldENet.java | 3 ++- .../pipelike/fluidpipe/BlockFluidPipe.java | 2 ++ .../pipelike/fluidpipe/net/FluidPipeNet.java | 15 +++++++++++++++ .../fluidpipe/net/WorldFluidPipeNet.java | 3 ++- .../inventory/net/WorldInventoryPipeNet.java | 3 ++- 8 files changed, 49 insertions(+), 12 deletions(-) mode change 100644 => 100755 src/main/java/gregtech/api/pipenet/WorldPipeNet.java mode change 100644 => 100755 src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java mode change 100644 => 100755 src/main/java/gregtech/common/pipelike/cable/BlockCable.java mode change 100644 => 100755 src/main/java/gregtech/common/pipelike/fluidpipe/BlockFluidPipe.java mode change 100644 => 100755 src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java mode change 100644 => 100755 src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java diff --git a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java old mode 100644 new mode 100755 index 34245df2d9..f1fed81539 --- a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java +++ b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java @@ -9,27 +9,33 @@ import net.minecraft.world.storage.WorldSavedData; import net.minecraftforge.common.util.Constants.NBT; +import java.lang.ref.WeakReference; import java.util.*; public abstract class WorldPipeNet> extends WorldSavedData { - private World world; - protected boolean isFirstTick = true; + private WeakReference worldRef = new WeakReference<>(null); protected List pipeNets = new ArrayList<>(); protected Map> pipeNetsByChunk = new HashMap<>(); + public static String getDataID(final String baseID, final World world) { + if (world == null || world.isRemote) + throw new RuntimeException("WorldPipeNet should only be created on the server!"); + final int dimension = world.provider.getDimension(); + return dimension == 0 ? baseID : baseID + '.' + dimension; + } + public WorldPipeNet(String name) { super(name); } public World getWorld() { - return world; + return this.worldRef.get(); } protected void setWorldAndInit(World world) { - if (isFirstTick) { - this.world = world; - this.isFirstTick = false; + if (world != this.worldRef.get()) { + this.worldRef = new WeakReference(world); onWorldSet(); } } diff --git a/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java b/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java old mode 100644 new mode 100755 index d150da8573..d9f7badada --- a/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java +++ b/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java @@ -27,16 +27,25 @@ public static void registerTickablePipeNet(Function it.onChunkLoaded(event.getChunk())); + final World world = event.getWorld(); + if (world == null || world.isRemote) + return; + getPipeNetsForWorld(world).forEach(it -> it.onChunkLoaded(event.getChunk())); } @SubscribeEvent public static void onChunkUnload(ChunkEvent.Unload event) { - getPipeNetsForWorld(event.getWorld()).forEach(it -> it.onChunkUnloaded(event.getChunk())); + final World world = event.getWorld(); + if (world == null || world.isRemote) + return; + getPipeNetsForWorld(world).forEach(it -> it.onChunkUnloaded(event.getChunk())); } } diff --git a/src/main/java/gregtech/common/pipelike/cable/BlockCable.java b/src/main/java/gregtech/common/pipelike/cable/BlockCable.java old mode 100644 new mode 100755 index 0ae53766ea..4e95dce212 --- a/src/main/java/gregtech/common/pipelike/cable/BlockCable.java +++ b/src/main/java/gregtech/common/pipelike/cable/BlockCable.java @@ -105,6 +105,8 @@ public int getActiveNodeConnections(IBlockAccess world, BlockPos nodePos, IPipeT @Override public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { + if (worldIn.isRemote) + return; Insulation insulation = getPipeTileEntity(worldIn, pos).getPipeType(); boolean damageOnLossless = ConfigHolder.doLosslessWiresDamage; if (!worldIn.isRemote && insulation.insulationLevel == -1 && entityIn instanceof EntityLivingBase) { diff --git a/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java b/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java index 6bbba2a9ed..37b1efe531 100644 --- a/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java +++ b/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java @@ -6,9 +6,10 @@ public class WorldENet extends WorldPipeNet { - private static final String DATA_ID = "gregtech.e_net"; + private static final String DATA_ID_BASE = "gregtech.e_net"; public static WorldENet getWorldENet(World world) { + final String DATA_ID = getDataID(DATA_ID_BASE, world); WorldENet eNetWorldData = (WorldENet) world.loadData(WorldENet.class, DATA_ID); if (eNetWorldData == null) { eNetWorldData = new WorldENet(DATA_ID); diff --git a/src/main/java/gregtech/common/pipelike/fluidpipe/BlockFluidPipe.java b/src/main/java/gregtech/common/pipelike/fluidpipe/BlockFluidPipe.java old mode 100644 new mode 100755 index 11e567546e..089daa7961 --- a/src/main/java/gregtech/common/pipelike/fluidpipe/BlockFluidPipe.java +++ b/src/main/java/gregtech/common/pipelike/fluidpipe/BlockFluidPipe.java @@ -139,6 +139,8 @@ public boolean canPushIntoFluidHandler(IPipeTile { - private static final String DATA_ID = "gregtech.fluid_pipe_net"; + private static final String DATA_ID_BASE = "gregtech.fluid_pipe_net"; public static WorldFluidPipeNet getWorldPipeNet(World world) { + final String DATA_ID = getDataID(DATA_ID_BASE, world); WorldFluidPipeNet netWorldData = (WorldFluidPipeNet) world.loadData(WorldFluidPipeNet.class, DATA_ID); if (netWorldData == null) { netWorldData = new WorldFluidPipeNet(DATA_ID); diff --git a/src/main/java/gregtech/common/pipelike/inventory/net/WorldInventoryPipeNet.java b/src/main/java/gregtech/common/pipelike/inventory/net/WorldInventoryPipeNet.java index b9566de0d3..f0f0882667 100644 --- a/src/main/java/gregtech/common/pipelike/inventory/net/WorldInventoryPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/inventory/net/WorldInventoryPipeNet.java @@ -6,9 +6,10 @@ public class WorldInventoryPipeNet extends TickableWorldPipeNet { - private static final String DATA_ID = "gregtech.inventory_pipe_net"; + private static final String DATA_ID_BASE = "gregtech.inventory_pipe_net"; public static WorldInventoryPipeNet getWorldPipeNet(World world) { + final String DATA_ID = getDataID(DATA_ID_BASE, world); WorldInventoryPipeNet netWorldData = (WorldInventoryPipeNet) world.loadData(WorldInventoryPipeNet.class, DATA_ID); if (netWorldData == null) { netWorldData = new WorldInventoryPipeNet(DATA_ID); From bf14f643d232fc1aecea7390cebfdc1d77318224 Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 17 Jan 2021 19:02:33 +0000 Subject: [PATCH 02/11] (#1398) Use old WorldPipeData multiplexing when old data exists for backwards compatibility --- .../java/gregtech/api/pipenet/WorldPipeNet.java | 17 +++++++++++++++-- .../common/pipelike/cable/net/WorldENet.java | 8 ++++++++ .../fluidpipe/net/WorldFluidPipeNet.java | 8 ++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java diff --git a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java index f1fed81539..0831121583 100755 --- a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java +++ b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java @@ -15,14 +15,17 @@ public abstract class WorldPipeNet> extends WorldSavedData { private WeakReference worldRef = new WeakReference<>(null); + protected boolean isFirstTick = true; protected List pipeNets = new ArrayList<>(); protected Map> pipeNetsByChunk = new HashMap<>(); + // Used to do the old processing where a singleton is maintained + protected boolean old = false; public static String getDataID(final String baseID, final World world) { if (world == null || world.isRemote) throw new RuntimeException("WorldPipeNet should only be created on the server!"); final int dimension = world.provider.getDimension(); - return dimension == 0 ? baseID : baseID + '.' + dimension; + return baseID + '.' + dimension; } public WorldPipeNet(String name) { @@ -34,7 +37,17 @@ public World getWorld() { } protected void setWorldAndInit(World world) { - if (world != this.worldRef.get()) { + // The original way was to setup one WorldPipeNet + if (old) { + if (this.isFirstTick) { + this.worldRef = new WeakReference(world); + this.isFirstTick = false; + onWorldSet(); + } + } + // The correct way is to have to a WorldPipeNet per dimension + // which will change as the dimensions are loaded/unloaded + else if (world != this.worldRef.get()) { this.worldRef = new WeakReference(world); onWorldSet(); } diff --git a/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java b/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java old mode 100644 new mode 100755 index 37b1efe531..041a20545b --- a/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java +++ b/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java @@ -10,7 +10,15 @@ public class WorldENet extends WorldPipeNet { public static WorldENet getWorldENet(World world) { final String DATA_ID = getDataID(DATA_ID_BASE, world); + // First look for per dimension data WorldENet eNetWorldData = (WorldENet) world.loadData(WorldENet.class, DATA_ID); + if (eNetWorldData == null) { + // Next look for the old shared data + eNetWorldData = (WorldENet) world.loadData(WorldENet.class, DATA_ID_BASE); + if (eNetWorldData != null) + eNetWorldData.old = true; + } + // No saved data, create it and queue it to be saved if (eNetWorldData == null) { eNetWorldData = new WorldENet(DATA_ID); world.setData(DATA_ID, eNetWorldData); diff --git a/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java b/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java index 6ccaf0edb6..2e048f4b0f 100755 --- a/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java @@ -10,7 +10,15 @@ public class WorldFluidPipeNet extends WorldPipeNet Date: Mon, 1 Feb 2021 14:42:31 +0000 Subject: [PATCH 03/11] Add some self healing for converting old pipe data to new pipe data --- .../java/gregtech/api/pipenet/PipeNet.java | 8 ++- .../gregtech/api/pipenet/WorldPipeNet.java | 60 ++++++++++++++----- .../api/pipenet/tile/TileEntityPipeBase.java | 5 ++ .../common/pipelike/cable/net/WorldENet.java | 14 ++--- .../fluidpipe/net/WorldFluidPipeNet.java | 14 ++--- 5 files changed, 72 insertions(+), 29 deletions(-) diff --git a/src/main/java/gregtech/api/pipenet/PipeNet.java b/src/main/java/gregtech/api/pipenet/PipeNet.java index 1fba3d1daa..48681afe31 100644 --- a/src/main/java/gregtech/api/pipenet/PipeNet.java +++ b/src/main/java/gregtech/api/pipenet/PipeNet.java @@ -19,7 +19,7 @@ public abstract class PipeNet implements INBTSerializable { - protected final WorldPipeNet> worldData; + protected WorldPipeNet> worldData; private final Map> nodeByBlockPos = new HashMap<>(); private final Map> unmodifiableNodeByBlockPos = Collections.unmodifiableMap(nodeByBlockPos); private final Map ownedChunks = new HashMap<>(); @@ -31,6 +31,12 @@ public PipeNet(WorldPipeNet world) { this.worldData = (WorldPipeNet>) world; } + void setWorldData(WorldPipeNet worldData) { + this.worldData = (WorldPipeNet>) worldData; + // Duplicated from WorldPipeNet.onWorldSet() + onConnectionsUpdate(); + } + public Set getContainedChunks() { return Collections.unmodifiableSet(ownedChunks.keySet()); } diff --git a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java index 0831121583..1fe48f62c8 100755 --- a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java +++ b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java @@ -12,14 +12,15 @@ import java.lang.ref.WeakReference; import java.util.*; +import gregtech.api.util.GTLog; + public abstract class WorldPipeNet> extends WorldSavedData { private WeakReference worldRef = new WeakReference<>(null); - protected boolean isFirstTick = true; protected List pipeNets = new ArrayList<>(); protected Map> pipeNetsByChunk = new HashMap<>(); - // Used to do the old processing where a singleton is maintained - protected boolean old = false; + protected WorldPipeNet oldData = null; + protected boolean checkedForOldData = false; public static String getDataID(final String baseID, final World world) { if (world == null || world.isRemote) @@ -37,17 +38,8 @@ public World getWorld() { } protected void setWorldAndInit(World world) { - // The original way was to setup one WorldPipeNet - if (old) { - if (this.isFirstTick) { - this.worldRef = new WeakReference(world); - this.isFirstTick = false; - onWorldSet(); - } - } - // The correct way is to have to a WorldPipeNet per dimension - // which will change as the dimensions are loaded/unloaded - else if (world != this.worldRef.get()) { + // Reset the world as the dimensions are loaded/unloaded + if (world != this.worldRef.get()) { this.worldRef = new WeakReference(world); onWorldSet(); } @@ -141,6 +133,46 @@ protected void removePipeNet(T pipeNet) { protected abstract T createNetInstance(); + /* + * This method is invoked during tile loading + * + * It's purpose is to move pipenets from the old data file to new one based on matching block position + */ + public void checkForOldData(final BlockPos blockPos) { + // No old data + if (this.oldData == null || this.oldData.pipeNets.isEmpty()) + return; + + // We have new data at this position so don't try to fix + if (getNetFromPos(blockPos) != null) + return; + + // See if we have a pipenet for this block pos in the old data + T foundOldData = null; + final List oldPipeNets = this.oldData.pipeNetsByChunk.getOrDefault(new ChunkPos(blockPos), Collections.emptyList()); + for (T pipeNet : oldPipeNets) { + if (pipeNet.containsNode(blockPos)) { + if (foundOldData != null) + { + // We have 2 pipenets at this position? + GTLog.logger.warn("Found duplicate pipenets in old data at " + blockPos + " [" + foundOldData + ',' + pipeNet + ']'); + return; + } + foundOldData = pipeNet; + } + } + // Nothing found + if (foundOldData == null) + return; + // Move the old data into the new data + GTLog.logger.info("Fixing old data for " + foundOldData + " found at " + blockPos); + this.oldData.removePipeNet(foundOldData); + this.oldData.markDirty(); + this.addPipeNetSilently(foundOldData); + this.markDirty(); + foundOldData.setWorldData(this); + } + @Override public void readFromNBT(NBTTagCompound nbt) { this.pipeNets = new ArrayList<>(); diff --git a/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java b/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java index bf125b603c..c4da1cce23 100644 --- a/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java +++ b/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java @@ -283,6 +283,11 @@ public void readFromNBT(NBTTagCompound compound) { @Override public void onLoad() { super.onLoad(); + final World world = getWorld(); + final BlockPipe pipeBlock = getPipeBlock(); + if (world != null && !world.isRemote && pipeBlock != null) { + pipeBlock.getWorldPipeNet(world).checkForOldData(getPos()); + } this.coverableImplementation.onLoad(); } diff --git a/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java b/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java index 041a20545b..8c5dc3fdc5 100755 --- a/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java +++ b/src/main/java/gregtech/common/pipelike/cable/net/WorldENet.java @@ -10,19 +10,19 @@ public class WorldENet extends WorldPipeNet { public static WorldENet getWorldENet(World world) { final String DATA_ID = getDataID(DATA_ID_BASE, world); - // First look for per dimension data + // First look for saved data WorldENet eNetWorldData = (WorldENet) world.loadData(WorldENet.class, DATA_ID); - if (eNetWorldData == null) { - // Next look for the old shared data - eNetWorldData = (WorldENet) world.loadData(WorldENet.class, DATA_ID_BASE); - if (eNetWorldData != null) - eNetWorldData.old = true; - } // No saved data, create it and queue it to be saved if (eNetWorldData == null) { eNetWorldData = new WorldENet(DATA_ID); world.setData(DATA_ID, eNetWorldData); } + // See if we have old data + if (!eNetWorldData.checkedForOldData) { + eNetWorldData.oldData = (WorldENet) world.loadData(WorldENet.class, DATA_ID_BASE); + eNetWorldData.checkedForOldData = true; + } + // Initialise eNetWorldData.setWorldAndInit(world); return eNetWorldData; } diff --git a/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java b/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java index 2e048f4b0f..e1a7fd88cb 100755 --- a/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/fluidpipe/net/WorldFluidPipeNet.java @@ -10,19 +10,19 @@ public class WorldFluidPipeNet extends WorldPipeNet Date: Sun, 21 Feb 2021 13:40:23 +0000 Subject: [PATCH 04/11] nfc --- .../TickableWorldPipeNetEventHandler.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java b/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java index d9f7badada..6396f86854 100755 --- a/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java +++ b/src/main/java/gregtech/api/pipenet/tickable/TickableWorldPipeNetEventHandler.java @@ -28,24 +28,21 @@ public static void registerTickablePipeNet(Function it.onChunkLoaded(event.getChunk())); + if (!world.isRemote) + getPipeNetsForWorld(world).forEach(it -> it.onChunkLoaded(event.getChunk())); } @SubscribeEvent public static void onChunkUnload(ChunkEvent.Unload event) { final World world = event.getWorld(); - if (world == null || world.isRemote) - return; - getPipeNetsForWorld(world).forEach(it -> it.onChunkUnloaded(event.getChunk())); + if (!world.isRemote) + getPipeNetsForWorld(world).forEach(it -> it.onChunkUnloaded(event.getChunk())); } } From 608bf20fb511fd1f7409a9ee5cef090a67547543 Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 21 Feb 2021 14:41:04 +0000 Subject: [PATCH 05/11] nfc --- src/main/java/gregtech/api/pipenet/WorldPipeNet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java index 1fe48f62c8..10927a25ff 100755 --- a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java +++ b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java @@ -155,7 +155,7 @@ public void checkForOldData(final BlockPos blockPos) { if (foundOldData != null) { // We have 2 pipenets at this position? - GTLog.logger.warn("Found duplicate pipenets in old data at " + blockPos + " [" + foundOldData + ',' + pipeNet + ']'); + GTLog.logger.warn("Found duplicate pipenets in old data at {} [{},{}]", blockPos, foundOldData, pipeNet); return; } foundOldData = pipeNet; @@ -165,7 +165,7 @@ public void checkForOldData(final BlockPos blockPos) { if (foundOldData == null) return; // Move the old data into the new data - GTLog.logger.info("Fixing old data for " + foundOldData + " found at " + blockPos); + GTLog.logger.info("Fixing old data for {} found at {}", foundOldData, blockPos); this.oldData.removePipeNet(foundOldData); this.oldData.markDirty(); this.addPipeNetSilently(foundOldData); From 3929a74f0eb0d1f500c2bc92ef90e1e72569bad5 Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 21 Feb 2021 15:28:19 +0000 Subject: [PATCH 06/11] Only check for old data when getNetFromPos can't find data --- .../gregtech/api/pipenet/WorldPipeNet.java | 18 +++++++----------- .../api/pipenet/tile/TileEntityPipeBase.java | 5 ----- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java index 10927a25ff..9b4cbfbe3a 100755 --- a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java +++ b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java @@ -112,7 +112,7 @@ public T getNetFromPos(BlockPos blockPos) { if (pipeNet.containsNode(blockPos)) return pipeNet; } - return null; + return checkForOldData(blockPos); } protected void addPipeNet(T pipeNet) { @@ -138,32 +138,27 @@ protected void removePipeNet(T pipeNet) { * * It's purpose is to move pipenets from the old data file to new one based on matching block position */ - public void checkForOldData(final BlockPos blockPos) { + private T checkForOldData(final BlockPos blockPos) { // No old data if (this.oldData == null || this.oldData.pipeNets.isEmpty()) - return; - - // We have new data at this position so don't try to fix - if (getNetFromPos(blockPos) != null) - return; + return null; // See if we have a pipenet for this block pos in the old data T foundOldData = null; final List oldPipeNets = this.oldData.pipeNetsByChunk.getOrDefault(new ChunkPos(blockPos), Collections.emptyList()); for (T pipeNet : oldPipeNets) { if (pipeNet.containsNode(blockPos)) { - if (foundOldData != null) - { + if (foundOldData != null) { // We have 2 pipenets at this position? GTLog.logger.warn("Found duplicate pipenets in old data at {} [{},{}]", blockPos, foundOldData, pipeNet); - return; + return null; } foundOldData = pipeNet; } } // Nothing found if (foundOldData == null) - return; + return null; // Move the old data into the new data GTLog.logger.info("Fixing old data for {} found at {}", foundOldData, blockPos); this.oldData.removePipeNet(foundOldData); @@ -171,6 +166,7 @@ public void checkForOldData(final BlockPos blockPos) { this.addPipeNetSilently(foundOldData); this.markDirty(); foundOldData.setWorldData(this); + return foundOldData; } @Override diff --git a/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java b/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java index c4da1cce23..bf125b603c 100644 --- a/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java +++ b/src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java @@ -283,11 +283,6 @@ public void readFromNBT(NBTTagCompound compound) { @Override public void onLoad() { super.onLoad(); - final World world = getWorld(); - final BlockPipe pipeBlock = getPipeBlock(); - if (world != null && !world.isRemote && pipeBlock != null) { - pipeBlock.getWorldPipeNet(world).checkForOldData(getPos()); - } this.coverableImplementation.onLoad(); } From 34c74017a1a7217c52cd89787ec9ea28f9389122 Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 21 Feb 2021 17:01:04 +0000 Subject: [PATCH 07/11] nfc --- src/main/java/gregtech/api/pipenet/WorldPipeNet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java index 9b4cbfbe3a..6cabed1c1f 100755 --- a/src/main/java/gregtech/api/pipenet/WorldPipeNet.java +++ b/src/main/java/gregtech/api/pipenet/WorldPipeNet.java @@ -134,7 +134,7 @@ protected void removePipeNet(T pipeNet) { protected abstract T createNetInstance(); /* - * This method is invoked during tile loading + * This method is used when data cannot be found at the given position. * * It's purpose is to move pipenets from the old data file to new one based on matching block position */ From 9b63d6d3a68ef49d140f4004d0c1f11a414fe07c Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 21 Feb 2021 20:40:12 +0000 Subject: [PATCH 08/11] Mark the pipenet as dirty when the fluid tank fluid amount changes --- .../common/pipelike/fluidpipe/net/FluidNetTank.java | 8 +++++++- .../common/pipelike/fluidpipe/net/FluidPipeNet.java | 11 +++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) mode change 100644 => 100755 src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidNetTank.java diff --git a/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidNetTank.java b/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidNetTank.java old mode 100644 new mode 100755 index 2027831d7d..c332745a46 --- a/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidNetTank.java +++ b/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidNetTank.java @@ -32,7 +32,10 @@ public int fill(FluidStack resource, boolean doFill) { handle.destroyNetwork(isLeakingPipe, isBurningPipe); return copyStack.amount; } - return super.fill(copyStack, doFill); + int result = super.fill(copyStack, doFill); + if (result != 0 && doFill) + this.handle.markDirty(); + return result; } @Override @@ -47,6 +50,7 @@ public FluidStack drain(FluidStack resource, boolean doDrain) { resource.amount = originalAmount; if (resultDrained != null && doDrain) { drainedThisTick.increment(handle.getWorldData(), resultDrained.amount); + this.handle.markDirty(); } return resultDrained; } @@ -61,6 +65,7 @@ public FluidStack drain(int maxDrain, boolean doDrain) { FluidStack resultDrained = super.drain(maxDrain, doDrain); if (resultDrained != null && doDrain) { drainedThisTick.increment(handle.getWorldData(), resultDrained.amount); + this.handle.markDirty(); } return resultDrained; } @@ -69,6 +74,7 @@ public void updateTankCapacity(int newTankCapacity) { this.capacity = newTankCapacity; if (this.fluid != null) { this.fluid.amount = Math.min(this.fluid.amount, newTankCapacity); + this.handle.markDirty(); } } diff --git a/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java b/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java index 33505e8cd8..44983e334e 100755 --- a/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java @@ -17,6 +17,7 @@ import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fml.common.Optional.Method; @@ -131,6 +132,10 @@ protected void transferNodeData(Map> transfe } } + protected void markDirty() { + this.worldData.markDirty(); + } + @Override protected boolean areNodesCustomContactable(FluidPipeProperties first, FluidPipeProperties second, PipeNet secondNodeNet) { FluidPipeNet fluidPipeNet = (FluidPipeNet) secondNodeNet; @@ -164,9 +169,7 @@ public NBTTagCompound serializeNBT() { @Override public void deserializeNBT(final NBTTagCompound nbt) { super.deserializeNBT(nbt); - final NBTTagCompound tankData = nbt.getCompoundTag("FluidNetTank"); - // Guard against old data that didn't have this tag - if (tankData != null) - this.fluidNetTank.readFromNBT(tankData); + if (nbt.hasKey("FluidNetTank", NBT.TAG_COMPOUND)); + this.fluidNetTank.readFromNBT(nbt.getCompoundTag("FluidNetTank")); } } From 02ebd186bb0eceb699080302f7b6e041806f256d Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 21 Feb 2021 21:13:40 +0000 Subject: [PATCH 09/11] Typo --- .../gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java b/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java index 44983e334e..7d52abe48c 100755 --- a/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java +++ b/src/main/java/gregtech/common/pipelike/fluidpipe/net/FluidPipeNet.java @@ -169,7 +169,7 @@ public NBTTagCompound serializeNBT() { @Override public void deserializeNBT(final NBTTagCompound nbt) { super.deserializeNBT(nbt); - if (nbt.hasKey("FluidNetTank", NBT.TAG_COMPOUND)); + if (nbt.hasKey("FluidNetTank", NBT.TAG_COMPOUND)) this.fluidNetTank.readFromNBT(nbt.getCompoundTag("FluidNetTank")); } } From fe747833a7276f87757becc872ac59db026c9afc Mon Sep 17 00:00:00 2001 From: warjort Date: Thu, 27 May 2021 11:05:53 +0100 Subject: [PATCH 10/11] Add vanilla dusts to dustRegular --- .../gregtech/api/items/materialitem/MaterialMetaItem.java | 2 +- src/main/java/gregtech/api/unification/ore/OrePrefix.java | 2 ++ src/main/java/gregtech/loaders/OreDictionaryLoader.java | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java mode change 100644 => 100755 src/main/java/gregtech/api/unification/ore/OrePrefix.java mode change 100644 => 100755 src/main/java/gregtech/loaders/OreDictionaryLoader.java diff --git a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java old mode 100644 new mode 100755 index ab4ce2fac5..43e5d2c214 --- a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java +++ b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java @@ -57,7 +57,7 @@ public void registerOreDict() { ItemStack item = new ItemStack(this, 1, metaItem); OreDictUnifier.registerOre(item, prefix, material); if(prefix.name().equals("dust")) - OreDictUnifier.registerOre(item, "dustRegular", material); + OreDictUnifier.registerOre(item, OrePrefix.DUST_REGULAR, material); items.add(item); } diff --git a/src/main/java/gregtech/api/unification/ore/OrePrefix.java b/src/main/java/gregtech/api/unification/ore/OrePrefix.java old mode 100644 new mode 100755 index 22ff51ae64..b330c01c6a --- a/src/main/java/gregtech/api/unification/ore/OrePrefix.java +++ b/src/main/java/gregtech/api/unification/ore/OrePrefix.java @@ -161,6 +161,8 @@ public enum OrePrefix { circuit("Circuits", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null), // Introduced by Calclavia chipset("Chipsets", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null); // Introduced by Buildcraft + public static final String DUST_REGULAR = "dustRegular"; + public static class Flags { public static final long ENABLE_UNIFICATION = GTUtility.createFlag(0); public static final long SELF_REFERENCING = GTUtility.createFlag(1); diff --git a/src/main/java/gregtech/loaders/OreDictionaryLoader.java b/src/main/java/gregtech/loaders/OreDictionaryLoader.java old mode 100644 new mode 100755 index e2e00bf306..02e46c8e5a --- a/src/main/java/gregtech/loaders/OreDictionaryLoader.java +++ b/src/main/java/gregtech/loaders/OreDictionaryLoader.java @@ -67,13 +67,19 @@ public static void init() { OreDictUnifier.registerOre(new ItemStack(Items.IRON_INGOT), OrePrefix.ingot, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Items.PAPER), OrePrefix.plate, Materials.Paper); OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.dust, Materials.Sugar); + OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.DUST_REGULAR, Materials.Sugar); OreDictUnifier.registerOre(new ItemStack(Items.STICK), OrePrefix.stick, Materials.Wood); OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.dust, Materials.Redstone); + OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.DUST_REGULAR, Materials.Redstone); OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.dust, Materials.Gunpowder); + OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.DUST_REGULAR, Materials.Gunpowder); OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.dust, Materials.Glowstone); + OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.DUST_REGULAR, Materials.Glowstone); OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.dust, Materials.Bone); + OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.DUST_REGULAR, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BONE), OrePrefix.stick, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.dust, Materials.Blaze); + OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.DUST_REGULAR, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_ROD), OrePrefix.stick, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Blocks.IRON_BLOCK), OrePrefix.block, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Blocks.GOLD_BLOCK), OrePrefix.block, Materials.Gold); From ad872d2229959dc229b57ffe4c0c5e4bccba8373 Mon Sep 17 00:00:00 2001 From: warjort Date: Thu, 27 May 2021 11:10:14 +0100 Subject: [PATCH 11/11] Revert "Add vanilla dusts to dustRegular" This reverts commit fe747833a7276f87757becc872ac59db026c9afc. --- .../gregtech/api/items/materialitem/MaterialMetaItem.java | 2 +- src/main/java/gregtech/api/unification/ore/OrePrefix.java | 2 -- src/main/java/gregtech/loaders/OreDictionaryLoader.java | 6 ------ 3 files changed, 1 insertion(+), 9 deletions(-) mode change 100755 => 100644 src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java mode change 100755 => 100644 src/main/java/gregtech/api/unification/ore/OrePrefix.java mode change 100755 => 100644 src/main/java/gregtech/loaders/OreDictionaryLoader.java diff --git a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java old mode 100755 new mode 100644 index 43e5d2c214..ab4ce2fac5 --- a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java +++ b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java @@ -57,7 +57,7 @@ public void registerOreDict() { ItemStack item = new ItemStack(this, 1, metaItem); OreDictUnifier.registerOre(item, prefix, material); if(prefix.name().equals("dust")) - OreDictUnifier.registerOre(item, OrePrefix.DUST_REGULAR, material); + OreDictUnifier.registerOre(item, "dustRegular", material); items.add(item); } diff --git a/src/main/java/gregtech/api/unification/ore/OrePrefix.java b/src/main/java/gregtech/api/unification/ore/OrePrefix.java old mode 100755 new mode 100644 index b330c01c6a..22ff51ae64 --- a/src/main/java/gregtech/api/unification/ore/OrePrefix.java +++ b/src/main/java/gregtech/api/unification/ore/OrePrefix.java @@ -161,8 +161,6 @@ public enum OrePrefix { circuit("Circuits", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null), // Introduced by Calclavia chipset("Chipsets", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null); // Introduced by Buildcraft - public static final String DUST_REGULAR = "dustRegular"; - public static class Flags { public static final long ENABLE_UNIFICATION = GTUtility.createFlag(0); public static final long SELF_REFERENCING = GTUtility.createFlag(1); diff --git a/src/main/java/gregtech/loaders/OreDictionaryLoader.java b/src/main/java/gregtech/loaders/OreDictionaryLoader.java old mode 100755 new mode 100644 index 02e46c8e5a..e2e00bf306 --- a/src/main/java/gregtech/loaders/OreDictionaryLoader.java +++ b/src/main/java/gregtech/loaders/OreDictionaryLoader.java @@ -67,19 +67,13 @@ public static void init() { OreDictUnifier.registerOre(new ItemStack(Items.IRON_INGOT), OrePrefix.ingot, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Items.PAPER), OrePrefix.plate, Materials.Paper); OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.dust, Materials.Sugar); - OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.DUST_REGULAR, Materials.Sugar); OreDictUnifier.registerOre(new ItemStack(Items.STICK), OrePrefix.stick, Materials.Wood); OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.dust, Materials.Redstone); - OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.DUST_REGULAR, Materials.Redstone); OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.dust, Materials.Gunpowder); - OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.DUST_REGULAR, Materials.Gunpowder); OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.dust, Materials.Glowstone); - OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.DUST_REGULAR, Materials.Glowstone); OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.dust, Materials.Bone); - OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.DUST_REGULAR, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BONE), OrePrefix.stick, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.dust, Materials.Blaze); - OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.DUST_REGULAR, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_ROD), OrePrefix.stick, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Blocks.IRON_BLOCK), OrePrefix.block, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Blocks.GOLD_BLOCK), OrePrefix.block, Materials.Gold);