]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java
1119146640125bed6e534a6eac87d6f7e038b0a4
[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.Collection;
12 import java.util.HashSet;
13 import java.util.Set;
14 import java.util.concurrent.atomic.AtomicReferenceArray;
15 import java.util.function.Function;
16
17 public class TileEntitiesHelper {
18     public static <T extends BlockEntity, S extends AbstractBoundingBox> Iterable<S> map(Class<T> clazz, Function<T, S> map) {
19         @SuppressWarnings("ConstantConditions") final AtomicReferenceArray<WorldChunk> chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks();
20         Collection<BlockEntity> tileEntities = new HashSet<>();
21         for (int i = 0; i < chunks.length(); i ++) {
22             final WorldChunk worldChunk = chunks.get(i);
23             if(worldChunk == null) continue;
24             tileEntities.addAll(worldChunk.getBlockEntities().values());
25         }
26
27         Set<S> results = new HashSet<>();
28         for (BlockEntity tileEntity : tileEntities) {
29             T typed = TypeHelper.as(tileEntity, clazz);
30             if (typed == null) {
31                 continue;
32             }
33             S result = map.apply(typed);
34             if (result != null) {
35                 results.add(result);
36             }
37         }
38         return results;
39     }
40 }