aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/threads
diff options
context:
space:
mode:
authorMogball <jeffniu22@gmail.com>2020-04-12 16:05:29 -0400
committerMogball <jeffniu22@gmail.com>2020-04-12 16:07:45 -0400
commit481ff7cc3aad20dda680aff943ad366a02f4dbee (patch)
tree1760a9266d656f1844f3ad09291dd05236e5260d /src/main/java/gregtech/api/threads
parent221f5c70b3fd97c40426e20e7305f683bf288d66 (diff)
downloadGT5-Unofficial-481ff7cc3aad20dda680aff943ad366a02f4dbee.tar.gz
GT5-Unofficial-481ff7cc3aad20dda680aff943ad366a02f4dbee.tar.bz2
GT5-Unofficial-481ff7cc3aad20dda680aff943ad366a02f4dbee.zip
Use HashSet for machine block update and limit recursion depth
Diffstat (limited to 'src/main/java/gregtech/api/threads')
-rw-r--r--src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java56
1 files changed, 44 insertions, 12 deletions
diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java
index 92944d3e32..523d504884 100644
--- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java
+++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java
@@ -1,43 +1,75 @@
package gregtech.api.threads;
import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item;
+
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
-import java.util.ArrayList;
+import java.util.Set;
+import java.util.HashSet;
public class GT_Runnable_MachineBlockUpdate implements Runnable {
private final int mX, mY, mZ;
private final World mWorld;
+ private final Set<ChunkPosition> mVisited;
+
+ private static final int MAX_UPDATE_DEPTH = 128;
public GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) {
mWorld = aWorld;
mX = aX;
mY = aY;
mZ = aZ;
+ mVisited = new HashSet<ChunkPosition>(80);
+ }
+
+ private boolean shouldVisit(int aX, int aY, int aZ) {
+ return !mVisited.contains(new ChunkPosition(aX, aY, aZ));
}
- private static void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ, ArrayList<ChunkPosition> aList) {
- aList.add(new ChunkPosition(aX, aY, aZ));
+ private boolean shouldUpdate(TileEntity aTileEntity) {
+ // Stop recursion on cables and pipes
+ if (aTileEntity == null || !(aTileEntity instanceof IGregTechTileEntity))
+ return false;
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity();
+ return
+ !(tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) &&
+ !(tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) &&
+ !(tMetaTileEntity instanceof GT_MetaPipeEntity_Item);
+ }
+
+ private void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ) {
+ mVisited.add(new ChunkPosition(aX, aY, aZ));
TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!shouldUpdate(tTileEntity) || mVisited.size() > MAX_UPDATE_DEPTH)
+ return;
+
if (tTileEntity instanceof IMachineBlockUpdateable)
((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate();
- if (aList.size() < 5 || (tTileEntity instanceof IMachineBlockUpdateable) || GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) {
- if (!aList.contains(new ChunkPosition(aX + 1, aY, aZ))) stepToUpdateMachine(aWorld, aX + 1, aY, aZ, aList);
- if (!aList.contains(new ChunkPosition(aX - 1, aY, aZ))) stepToUpdateMachine(aWorld, aX - 1, aY, aZ, aList);
- if (!aList.contains(new ChunkPosition(aX, aY + 1, aZ))) stepToUpdateMachine(aWorld, aX, aY + 1, aZ, aList);
- if (!aList.contains(new ChunkPosition(aX, aY - 1, aZ))) stepToUpdateMachine(aWorld, aX, aY - 1, aZ, aList);
- if (!aList.contains(new ChunkPosition(aX, aY, aZ + 1))) stepToUpdateMachine(aWorld, aX, aY, aZ + 1, aList);
- if (!aList.contains(new ChunkPosition(aX, aY, aZ - 1))) stepToUpdateMachine(aWorld, aX, aY, aZ - 1, aList);
+
+ if (mVisited.size() < 5 ||
+ (tTileEntity instanceof IMachineBlockUpdateable) ||
+ GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) {
+ if (shouldVisit(aX + 1, aY, aZ)) stepToUpdateMachine(aWorld, aX + 1, aY, aZ);
+ if (shouldVisit(aX - 1, aY, aZ)) stepToUpdateMachine(aWorld, aX - 1, aY, aZ);
+ if (shouldVisit(aX, aY + 1, aZ)) stepToUpdateMachine(aWorld, aX, aY + 1, aZ);
+ if (shouldVisit(aX, aY - 1, aZ)) stepToUpdateMachine(aWorld, aX, aY - 1, aZ);
+ if (shouldVisit(aX, aY, aZ + 1)) stepToUpdateMachine(aWorld, aX, aY, aZ + 1);
+ if (shouldVisit(aX, aY, aZ - 1)) stepToUpdateMachine(aWorld, aX, aY, aZ - 1);
}
}
@Override
public void run() {
try {
- stepToUpdateMachine(mWorld, mX, mY, mZ, new ArrayList<ChunkPosition>());
+ stepToUpdateMachine(mWorld, mX, mY, mZ);
} catch (Throwable e) {/**/}
}
-} \ No newline at end of file
+}