1 package com.irtimaled.bbor.client.interop;
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;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.HashSet;
15 import java.util.concurrent.atomic.AtomicReferenceArray;
16 import java.util.function.Function;
18 public class TileEntitiesHelper {
20 private static Collection<BlockEntity> tileEntities = null;
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());
31 TileEntitiesHelper.tileEntities = tileEntities;
37 public static void clearCache() {
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();
44 Set<S> results = new HashSet<>();
45 for (BlockEntity tileEntity : tileEntities) {
46 T typed = TypeHelper.as(tileEntity, clazz);
50 S result = map.apply(typed);