]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java
Performance improvements
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / interop / TileEntitiesHelper.java
1 package com.irtimaled.bbor.client.interop;
2
3 import com.irtimaled.bbor.common.TypeHelper;
4 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
5 import com.irtimaled.bbor.mixin.client.access.IClientChunkManager;
6 import com.irtimaled.bbor.mixin.client.access.IClientChunkManagerClientChunkMap;
7 import net.minecraft.block.entity.BlockEntity;
8 import net.minecraft.client.MinecraftClient;
9 import net.minecraft.world.chunk.WorldChunk;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.HashSet;
14 import java.util.Set;
15 import java.util.concurrent.atomic.AtomicReferenceArray;
16 import java.util.function.Function;
17
18 public class TileEntitiesHelper {
19
20     private static Collection<BlockEntity> tileEntities = null;
21
22     private static Collection<BlockEntity> getTileEntities() {
23         if (tileEntities == null) {
24             @SuppressWarnings("ConstantConditions") final AtomicReferenceArray<WorldChunk> chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks();
25             Collection<BlockEntity> tileEntities = new ArrayList<>();
26             for (int i = 0; i < chunks.length(); i ++) {
27                 final WorldChunk worldChunk = chunks.get(i);
28                 if(worldChunk == null) continue;
29                 tileEntities.addAll(worldChunk.getBlockEntities().values());
30             }
31             TileEntitiesHelper.tileEntities = tileEntities;
32             return tileEntities;
33         }
34         return tileEntities;
35     }
36
37     public static void clearCache() {
38         tileEntities = null;
39     }
40
41     public static <T extends BlockEntity, S extends AbstractBoundingBox> Iterable<S> map(Class<T> clazz, Function<T, S> map) {
42         final Collection<BlockEntity> tileEntities = getTileEntities();
43
44         Set<S> results = new HashSet<>();
45         for (BlockEntity tileEntity : tileEntities) {
46             T typed = TypeHelper.as(tileEntity, clazz);
47             if (typed == null) {
48                 continue;
49             }
50             S result = map.apply(typed);
51             if (result != null) {
52                 results.add(result);
53             }
54         }
55         return results;
56     }
57 }