]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blobdiff - src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java
Performance improvements
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / interop / TileEntitiesHelper.java
index 1119146640125bed6e534a6eac87d6f7e038b0a4..11896a06328767b2b8346b786e3a46c0019221f4 100644 (file)
@@ -8,6 +8,7 @@ import net.minecraft.block.entity.BlockEntity;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.world.chunk.WorldChunk;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
@@ -15,14 +16,30 @@ import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.function.Function;
 
 public class TileEntitiesHelper {
-    public static <T extends BlockEntity, S extends AbstractBoundingBox> Iterable<S> map(Class<T> clazz, Function<T, S> map) {
-        @SuppressWarnings("ConstantConditions") final AtomicReferenceArray<WorldChunk> chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks();
-        Collection<BlockEntity> tileEntities = new HashSet<>();
-        for (int i = 0; i < chunks.length(); i ++) {
-            final WorldChunk worldChunk = chunks.get(i);
-            if(worldChunk == null) continue;
-            tileEntities.addAll(worldChunk.getBlockEntities().values());
+
+    private static Collection<BlockEntity> tileEntities = null;
+
+    private static Collection<BlockEntity> getTileEntities() {
+        if (tileEntities == null) {
+            @SuppressWarnings("ConstantConditions") final AtomicReferenceArray<WorldChunk> chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks();
+            Collection<BlockEntity> tileEntities = new ArrayList<>();
+            for (int i = 0; i < chunks.length(); i ++) {
+                final WorldChunk worldChunk = chunks.get(i);
+                if(worldChunk == null) continue;
+                tileEntities.addAll(worldChunk.getBlockEntities().values());
+            }
+            TileEntitiesHelper.tileEntities = tileEntities;
+            return tileEntities;
         }
+        return tileEntities;
+    }
+
+    public static void clearCache() {
+        tileEntities = null;
+    }
+
+    public static <T extends BlockEntity, S extends AbstractBoundingBox> Iterable<S> map(Class<T> clazz, Function<T, S> map) {
+        final Collection<BlockEntity> tileEntities = getTileEntities();
 
         Set<S> results = new HashSet<>();
         for (BlockEntity tileEntity : tileEntities) {