]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/commitdiff
Performance improvements
authorishland <ishlandmc@yeah.net>
Thu, 5 Aug 2021 14:52:55 +0000 (22:52 +0800)
committerirtimaled <irtimaled@gmail.com>
Sun, 15 Aug 2021 18:36:02 +0000 (11:36 -0700)
25 files changed:
src/main/java/com/irtimaled/bbor/client/ClientRenderer.java
src/main/java/com/irtimaled/bbor/client/interop/BiomeBorderHelper.java
src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java
src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java
src/main/java/com/irtimaled/bbor/client/providers/CacheProvider.java
src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java
src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java
src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java
src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java
src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java
src/main/java/com/irtimaled/bbor/client/renderers/SpawningSphereRenderer.java
src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java
src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java

index 554dcdc064f97d3ed2739751cb1e58d4494d19f7..1d517b39834038d9ddcf3ba38561082ffd2ca85c 100644 (file)
@@ -1,6 +1,7 @@
 package com.irtimaled.bbor.client;
 
 import com.irtimaled.bbor.client.interop.ClientInterop;
+import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
 import com.irtimaled.bbor.client.models.Point;
 import com.irtimaled.bbor.client.providers.BeaconProvider;
 import com.irtimaled.bbor.client.providers.BedrockCeilingProvider;
@@ -66,22 +67,20 @@ public class ClientRenderer {
     }
 
     static {
-        if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
-            registerProvider(new SlimeChunkProvider());
-            registerProvider(new WorldSpawnProvider());
-            registerProvider(new SpawningSphereProvider());
-            registerProvider(new BeaconProvider());
-            registerProvider(new CustomBoxProvider());
-            registerProvider(new CustomBeaconProvider());
-            registerProvider(new BiomeBorderProvider());
-            registerProvider(new MobSpawnerProvider());
-            registerProvider(new ConduitProvider());
-            registerProvider(new SpawnableBlocksProvider());
-            registerProvider(new CustomLineProvider());
-            registerProvider(new CustomSphereProvider());
-            registerProvider(new FlowerForestProvider());
-            registerProvider(new BedrockCeilingProvider());
-        }
+        registerProvider(new SlimeChunkProvider());
+        registerProvider(new WorldSpawnProvider());
+        registerProvider(new SpawningSphereProvider());
+        registerProvider(new BeaconProvider());
+        registerProvider(new CustomBoxProvider());
+        registerProvider(new CustomBeaconProvider());
+        registerProvider(new BiomeBorderProvider());
+        registerProvider(new MobSpawnerProvider());
+        registerProvider(new ConduitProvider());
+        registerProvider(new SpawnableBlocksProvider());
+        registerProvider(new CustomLineProvider());
+        registerProvider(new CustomSphereProvider());
+        registerProvider(new FlowerForestProvider());
+        registerProvider(new BedrockCeilingProvider());
     }
 
     public static <T extends AbstractBoundingBox> void registerProvider(IBoundingBoxProvider<T> provider) {
@@ -115,6 +114,7 @@ public class ClientRenderer {
         long startTime = System.nanoTime();
         matrixStack.push();
         RenderHelper.beforeRender();
+        TileEntitiesHelper.clearCache();
 
         for (AbstractBoundingBox key : getBoundingBoxes(dimensionId)) {
             AbstractRenderer renderer = key.getRenderer();
index 7cde22bbdc79702abb253550d9d21fa003cfd79f..5dd29e0a88d4dbecab29183de828a62c595fda94 100644 (file)
@@ -1,47 +1,47 @@
 package com.irtimaled.bbor.client.interop;
 
 import com.irtimaled.bbor.common.models.Coords;
+import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
 import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.world.ClientWorld;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.ChunkPos;
 import net.minecraft.util.registry.Registry;
-import net.minecraft.world.biome.Biome;
-import net.minecraft.world.biome.source.BiomeArray;
-import net.minecraft.world.biome.source.BiomeCoords;
-import net.minecraft.world.chunk.WorldChunk;
 
 public class BiomeBorderHelper {
 
-    private static final Long2ObjectOpenHashMap<BiomeArray> biomeCache = new Long2ObjectOpenHashMap<>();
+    private static final Long2ObjectOpenHashMap<Long2IntOpenHashMap> biomeCache = new Long2ObjectOpenHashMap<>();
 
     public static void onChunkLoaded(int chunkX, int chunkZ) {
-        assert MinecraftClient.getInstance().world != null;
-        final WorldChunk chunk = MinecraftClient.getInstance().world.getChunk(chunkX, chunkZ);
-        if (chunk == null) return;
-        biomeCache.put(ChunkPos.toLong(chunkX, chunkZ), chunk.getBiomeArray());
+
     }
 
     public static void onChunkUnload(int chunkX, int chunkZ) {
         biomeCache.remove(ChunkPos.toLong(chunkX, chunkZ));
     }
 
+    public static void onDisconnect() {
+        biomeCache.clear();
+    }
+
     public static int getBiomeId(Coords coords) {
         return getBiomeId(coords.getX(), coords.getY(), coords.getZ());
     }
 
     public static int getBiomeId(int x, int y, int z) {
         BlockPos pos = new BlockPos(x, y, z);
-        final BiomeArray biomeArray = biomeCache.get(ChunkPos.toLong(pos));
+        final Long2IntOpenHashMap biomeArray = biomeCache.computeIfAbsent(ChunkPos.toLong(pos), key -> createNewMap());
         final ClientWorld world = MinecraftClient.getInstance().world;
-        final Biome biome;
-        if (biomeArray != null) {
-            biome = biomeArray.getBiomeForNoiseGen(BiomeCoords.fromBlock(x & 15), y, BiomeCoords.fromBlock(z & 15));
-        } else {
+        return biomeArray.computeIfAbsent(pos.asLong(), key -> {
             assert world != null;
-            biome = world.getBiome(pos);
-        }
-        return world.getRegistryManager().get(Registry.BIOME_KEY).getRawId(biome);
+            return world.getRegistryManager().get(Registry.BIOME_KEY).getRawId(world.getBiome(pos));
+        });
+    }
+
+    private static Long2IntOpenHashMap createNewMap() {
+        final Long2IntOpenHashMap long2IntOpenHashMap = new Long2IntOpenHashMap();
+        long2IntOpenHashMap.defaultReturnValue(-1);
+        return long2IntOpenHashMap;
     }
 }
index e0cee81baaf1f87c087cad0f1b2b03ce2d692916..5501a91b6d10e1f119a54e680771e62547f820e9 100644 (file)
@@ -34,6 +34,7 @@ import net.minecraft.util.math.BlockPos;
 public class ClientInterop {
     public static void disconnectedFromRemoteServer() {
         SaveGameStructureLoader.clear();
+        BiomeBorderHelper.onDisconnect();
         EventBus.publish(new DisconnectedFromRemoteServer());
     }
 
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) {
index 14b4973c2ca49c02a58d2f46433e53eb06b7ae1d..a8e9cde9be0bcb47279a8cbcfa0e1afd07dc7201 100644 (file)
@@ -1,14 +1,14 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.BeaconRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxBeacon extends BoundingBoxCuboid {
-    private static final AbstractRenderer<BoundingBoxBeacon> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBeacon.class, () -> new BeaconRenderer());
+    private static final AbstractRenderer<BoundingBoxBeacon> RENDERER = CommonInterop.registerRenderer(BoundingBoxBeacon.class, () -> new BeaconRenderer());
 
     private final Coords coords;
     private final int level;
index 354b0862aef736b9ca802a1a98e7e5c891b6c0b7..39a54e7b811fa8df513763678fe675f770e31b4e 100644 (file)
@@ -1,14 +1,14 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.CuboidRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxBedrockCeiling extends BoundingBoxCuboid {
-    private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer());
+    private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer());
 
     public BoundingBoxBedrockCeiling(Coords coords) {
         super(coords, coords, BoundingBoxType.BedrockCeiling);
index daf6b1ccf033ea776770ba29324ba50f8103b116..d88d4e8cf3a4807f6dcd83633e642031879c113b 100644 (file)
@@ -1,15 +1,15 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.RenderCulling;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.BiomeBorderRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxBiomeBorder extends AbstractBoundingBox {
-    private static final AbstractRenderer<BoundingBoxBiomeBorder> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBiomeBorder.class, () -> new BiomeBorderRenderer());
+    private static final AbstractRenderer<BoundingBoxBiomeBorder> RENDERER = CommonInterop.registerRenderer(BoundingBoxBiomeBorder.class, () -> new BiomeBorderRenderer());
 
     private final Coords coords;
     private final boolean north;
index 3741808fcf5e51f68e1ffc569b4dcb01db1b930b..76c7f86c300e879248587dfd4a88522c429edd2f 100644 (file)
@@ -1,14 +1,14 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.ConduitRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
 import com.irtimaled.bbor.common.TypeHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxConduit extends BoundingBoxSphere {
-    private static final AbstractRenderer<BoundingBoxConduit> RENDERER = ClientRenderer.registerRenderer(BoundingBoxConduit.class, () -> new ConduitRenderer());
+    private static final AbstractRenderer<BoundingBoxConduit> RENDERER = CommonInterop.registerRenderer(BoundingBoxConduit.class, () -> new ConduitRenderer());
 
     private final int level;
 
index 23439b87156e9bbfceda604e626da52f5a7458c2..11d61d03476a6f20a47126a808afd654ac400eea 100644 (file)
@@ -1,6 +1,5 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.RenderCulling;
 import com.irtimaled.bbor.client.config.ColorHelper;
 import com.irtimaled.bbor.client.config.HexColor;
@@ -8,13 +7,14 @@ import com.irtimaled.bbor.client.config.Setting;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.FlowerForestRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 import com.irtimaled.bbor.common.models.Coords;
 
 import java.awt.*;
 
 public class BoundingBoxFlowerForest extends AbstractBoundingBox {
-    private static final AbstractRenderer<BoundingBoxFlowerForest> RENDERER = ClientRenderer.registerRenderer(BoundingBoxFlowerForest.class, () -> new FlowerForestRenderer());
+    private static final AbstractRenderer<BoundingBoxFlowerForest> RENDERER = CommonInterop.registerRenderer(BoundingBoxFlowerForest.class, () -> new FlowerForestRenderer());
 
     private final Coords coords;
     private final Setting<HexColor> colorSetting;
@@ -60,6 +60,6 @@ public class BoundingBoxFlowerForest extends AbstractBoundingBox {
 
     @Override
     public boolean isVisibleCulling() {
-        return RenderCulling.isVisibleCulling(coords.getX(), coords.getY() + 0.01d, coords.getZ(), coords.getX() + 1, coords.getY(), coords.getZ());
+        return RenderCulling.isVisibleCulling(coords.getX(), coords.getY() + 0.01d, coords.getZ(), coords.getX() + 1, coords.getY(), coords.getZ() + 1);
     }
 }
index 39e487ed0ad7f7370d6fd4a496f57a3755b44d5d..beb00f547aeb6c23e5dce89dd3fe8c8ad1ce7de5 100644 (file)
@@ -1,16 +1,16 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.RenderCulling;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.LineRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
 import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.TypeHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 
 public class BoundingBoxLine extends AbstractBoundingBox {
-    private static final AbstractRenderer<BoundingBoxLine> RENDERER = ClientRenderer.registerRenderer(BoundingBoxLine.class, () -> new LineRenderer());
+    private static final AbstractRenderer<BoundingBoxLine> RENDERER = CommonInterop.registerRenderer(BoundingBoxLine.class, () -> new LineRenderer());
 
     private final Point minPoint;
     private final Point maxPoint;
index d7573f29bd94b91b14e3324aa833256117b41fab..5997c022f4f419ffcbcde2fb2d95ea05d30a1ace 100644 (file)
@@ -1,14 +1,14 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.MobSpawnerRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxMobSpawner extends BoundingBoxCuboid {
-    private static final AbstractRenderer<BoundingBoxMobSpawner> RENDERER = ClientRenderer.registerRenderer(BoundingBoxMobSpawner.class, () -> new MobSpawnerRenderer());
+    private static final AbstractRenderer<BoundingBoxMobSpawner> RENDERER = CommonInterop.registerRenderer(BoundingBoxMobSpawner.class, () -> new MobSpawnerRenderer());
 
     private final Coords coords;
 
index 8c31514ee347105c0c0a89652b1411babc7f1e25..517813aee1f4c61d5531f6caa8fa60299b29a679 100644 (file)
@@ -1,17 +1,17 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.Player;
 import com.irtimaled.bbor.client.config.ConfigManager;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.SlimeChunkRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
 import com.irtimaled.bbor.common.MathHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxSlimeChunk extends BoundingBoxCuboid {
-    private static final AbstractRenderer<BoundingBoxSlimeChunk> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSlimeChunk.class, () -> new SlimeChunkRenderer());
+    private static final AbstractRenderer<BoundingBoxSlimeChunk> RENDERER = CommonInterop.registerRenderer(BoundingBoxSlimeChunk.class, () -> new SlimeChunkRenderer());
 
     public BoundingBoxSlimeChunk(Coords minCoords, Coords maxCoords) {
         super(minCoords, maxCoords, BoundingBoxType.SlimeChunks);
index 4976744fdc77dd76ab92c3da02a3b18ba349b609..de035f26c412e90ab069411d95c28d8eb6dff0e4 100644 (file)
@@ -1,9 +1,9 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.SpawnableBlocksRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 import net.minecraft.util.math.BlockPos;
 
@@ -11,7 +11,7 @@ import java.util.HashSet;
 import java.util.Set;
 
 public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox {
-    private static final AbstractRenderer<BoundingBoxSpawnableBlocks> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawnableBlocks.class, () -> new SpawnableBlocksRenderer());
+    private static final AbstractRenderer<BoundingBoxSpawnableBlocks> RENDERER = CommonInterop.registerRenderer(BoundingBoxSpawnableBlocks.class, () -> new SpawnableBlocksRenderer());
 
     private final Set<BlockPos> blocks = new HashSet<>();
 
index 396a5c4d129382dc97587ee6e76a48737bcfe108..c40215c73aeb12750e9776479e624147be6c78dd 100644 (file)
@@ -1,16 +1,16 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.SpawningSphereRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import net.minecraft.util.math.BlockPos;
 
 import java.util.HashSet;
 import java.util.Set;
 
 public class BoundingBoxSpawningSphere extends BoundingBoxSphere {
-    private static final AbstractRenderer<BoundingBoxSpawningSphere> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawningSphere.class, () -> new SpawningSphereRenderer());
+    private static final AbstractRenderer<BoundingBoxSpawningSphere> RENDERER = CommonInterop.registerRenderer(BoundingBoxSpawningSphere.class, () -> new SpawningSphereRenderer());
 
     public static final int SAFE_RADIUS = 24;
     public static final int SPAWN_RADIUS = 128;
index 9198bacf0ea2f9cf523082a2b6053b56e04a03ed..9d12785fce444e6a6e296edb7d36da87ef41097d 100644 (file)
@@ -1,14 +1,14 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.SphereRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxSphere extends AbstractBoundingBox {
-    private static final AbstractRenderer<BoundingBoxSphere> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSphere.class, () -> new SphereRenderer());
+    private static final AbstractRenderer<BoundingBoxSphere> RENDERER = CommonInterop.registerRenderer(BoundingBoxSphere.class, () -> new SphereRenderer());
 
     private final double radius;
     private final double minX;
index 22afcf5b2356800a26ddc183276e8e4382c4c6c6..34692bb404b2654a2cbafcb0b95bcc4a56604fe0 100644 (file)
@@ -1,14 +1,14 @@
 package com.irtimaled.bbor.client.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.WorldSpawnRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
 import com.irtimaled.bbor.common.models.Coords;
 
 public class BoundingBoxWorldSpawn extends BoundingBoxCuboid {
-    private static final AbstractRenderer<BoundingBoxWorldSpawn> RENDERER = ClientRenderer.registerRenderer(BoundingBoxWorldSpawn.class, () -> new WorldSpawnRenderer());
+    private static final AbstractRenderer<BoundingBoxWorldSpawn> RENDERER = CommonInterop.registerRenderer(BoundingBoxWorldSpawn.class, () -> new WorldSpawnRenderer());
 
     public BoundingBoxWorldSpawn(Coords minCoords, Coords maxCoords, BoundingBoxType type) {
         super(minCoords, maxCoords, type);
index 8e344480bddc0e38692b05e6116fecd2ef16b998..0b563d197f97e151e6fc52c20e385eca53be2f61 100644 (file)
@@ -10,7 +10,8 @@ import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 import com.irtimaled.bbor.common.models.DimensionId;
 
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -37,7 +38,7 @@ public class CacheProvider implements IBoundingBoxProvider<AbstractBoundingBox>
     public Iterable<AbstractBoundingBox> get(DimensionId dimensionId) {
         Boolean outerBoxesOnly = ConfigManager.outerBoxesOnly.get();
 
-        Set<AbstractBoundingBox> boundingBoxes = new HashSet<>();
+        List<AbstractBoundingBox> boundingBoxes = new ArrayList<>();
         BoundingBoxCache cache = getCache.apply(dimensionId);
         if (cache != null) {
             for (Map.Entry<AbstractBoundingBox, Set<AbstractBoundingBox>> entry : cache.getBoundingBoxes().entrySet()) {
index 167720531a87f8ac02e4659cd88cfd82d90cb1ae..b26745e5c8a56d7f81db9051f6b12d29a678d626 100644 (file)
@@ -59,7 +59,7 @@ public class FlowerForestProvider implements IBoundingBoxProvider<BoundingBoxFlo
         int minZ = blockZ - width;
         int maxZ = blockZ + width;
 
-        Map<Coords, BoundingBoxFlowerForest> boundingBoxes = new HashMap<>();
+        Map<Coords, BoundingBoxFlowerForest> boundingBoxes = new HashMap<>((maxX - minX) * (maxZ - minZ));
         for (int x = minX; x <= maxX; x++) {
             for (int z = minZ; z <= maxZ; z++) {
                 int biomeId = BiomeBorderHelper.getBiomeId(x, 255, z);
@@ -80,7 +80,8 @@ public class FlowerForestProvider implements IBoundingBoxProvider<BoundingBoxFlo
     }
 
     private static int getMaxYForPos(int x, int y, int z) {
-        int topY = MinecraftClient.getInstance().world.getTopY(Heightmap.Type.MOTION_BLOCKING, x, z) + 1;
+        int topY = MinecraftClient.getInstance().world.getTopY(Heightmap.Type.MOTION_BLOCKING, x, z);
+        if (topY == 0) topY = y; // heightmap appears to be broken
         while (topY > 0) {
             if (FlowerForestHelper.canGrowFlower(x, topY, z)) return topY;
             topY--;
index 032b1ee884f73687a02b9271190dd47865445e5f..c504b1eacdf29e2425740d6927729a4ccac5622b 100644 (file)
@@ -16,7 +16,7 @@ import java.util.Set;
 public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk>, ICachingProvider {
     private static final double CHUNK_SIZE = 16d;
 
-    private static Long seed;
+    private static volatile Long seed;
 
     public static void setSeed(long seed) {
         SlimeChunkProvider.seed = seed;
index b28b0e1a04029f51451bcdcd2e6270ab50c80fc2..54c1934ba9d17a3c1bfc3f2cb7fda846112296b0 100644 (file)
@@ -10,7 +10,7 @@ import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.models.DimensionId;
 import net.minecraft.client.MinecraftClient;
 
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Set;
 
 public class SpawnableBlocksProvider implements IBoundingBoxProvider<BoundingBoxSpawnableBlocks>, ICachingProvider {
@@ -54,8 +54,6 @@ public class SpawnableBlocksProvider implements IBoundingBoxProvider<BoundingBox
 
         SpawnableBlocksHelper.findSpawnableBlocks(Player.getCoords(), width, height, boundingBox.getBlocks()::add);
 
-        Set<BoundingBoxSpawnableBlocks> boundingBoxes = new HashSet<>();
-        boundingBoxes.add(boundingBox);
-        return boundingBoxes;
+        return Collections.singleton(boundingBox);
     }
 }
index 4580f611cbbea79fed0bbdec4ace34180754d14f..28af6b0446bfae12028c21c5330baed6a63f3e88 100644 (file)
@@ -6,7 +6,6 @@ import com.mojang.blaze3d.platform.GlStateManager;
 import com.mojang.blaze3d.systems.RenderSystem;
 import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.util.math.Quaternion;
-import net.minecraft.util.math.Vec3d;
 import org.lwjgl.opengl.GL11;
 
 public class RenderHelper {
@@ -164,22 +163,4 @@ public class RenderHelper {
                 regionZ - Camera.getZ());
     }
 
-    /**
-     * Compute hash code for vec3d
-     * @see Vec3d#hashCode()
-     *
-     * @param x x value
-     * @param y y value
-     * @param z z value
-     * @return hash code
-     */
-    public static long hashVec3d(double x, double y, double z) {
-        long l = Double.doubleToLongBits(x);
-        int i = (int)(l ^ l >>> 32);
-        l = Double.doubleToLongBits(y);
-        i = 31 * i + (int)(l ^ l >>> 32);
-        l = Double.doubleToLongBits(z);
-        i = 31 * i + (int)(l ^ l >>> 32);
-        return i;
-    }
 }
index 83b33c207b6ce965511fca952d1357b9d1eabe7b..06b0ee128771a3fde70f8e24c40179d1690f4c85 100644 (file)
@@ -3,6 +3,7 @@ package com.irtimaled.bbor.client.renderers;
 import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
 import com.irtimaled.bbor.client.models.BoundingBoxSpawnableBlocks;
 import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.util.math.BlockPos;
 
 import java.awt.*;
 
@@ -10,12 +11,12 @@ public class SpawnableBlocksRenderer extends AbstractRenderer<BoundingBoxSpawnab
     @Override
     public void render(MatrixStack matrixStack, BoundingBoxSpawnableBlocks boundingBox) {
         Color color = BoundingBoxTypeHelper.getColor(boundingBox.getType());
-        boundingBox.getBlocks().forEach(c -> {
+        for (BlockPos c : boundingBox.getBlocks()) {
             int x = c.getX();
             int y = c.getY();
             int z = c.getZ();
             OffsetBox offsetBox = new OffsetBox(x, y, z, x + 1, y, z + 1);
             renderCuboid(matrixStack, offsetBox, color, false, 30);
-        });
+        }
     }
 }
index 4c33aeeff04f4d9fc326e083b5241ab23dad77aa..2d543fdf3e0d3f806d49854b6dd6ccb04fc60c3d 100644 (file)
@@ -9,6 +9,7 @@ import com.irtimaled.bbor.client.models.Point;
 import com.irtimaled.bbor.common.BoundingBoxType;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.util.math.BlockPos;
 
 import java.awt.*;
 
@@ -47,12 +48,12 @@ public class SpawningSphereRenderer extends AbstractRenderer<BoundingBoxSpawning
 
     private void renderSpawnableSpaces(MatrixStack matrixStack, BoundingBoxSpawningSphere boundingBox) {
         Color color = BoundingBoxTypeHelper.getColor(BoundingBoxType.SpawnableBlocks);
-        boundingBox.getBlocks().forEach(c -> {
+        for (BlockPos c : boundingBox.getBlocks()) {
             int x = c.getX();
             int y = c.getY();
             int z = c.getZ();
             OffsetBox offsetBox = new OffsetBox(x, y, z, x + 1, y, z + 1);
             renderCuboid(matrixStack, offsetBox, color, false, 30);
-        });
+        }
     }
 }
index dd09ffd8dead0239e4e028230f4fa049b867f0a1..321c4c7d2db50a1a995c92c3f0921af27ae5f66b 100644 (file)
@@ -1,5 +1,7 @@
 package com.irtimaled.bbor.common.interop;
 
+import com.irtimaled.bbor.client.ClientRenderer;
+import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.common.EventBus;
 import com.irtimaled.bbor.common.events.PlayerLoggedIn;
 import com.irtimaled.bbor.common.events.PlayerLoggedOut;
@@ -7,8 +9,11 @@ import com.irtimaled.bbor.common.events.PlayerSubscribed;
 import com.irtimaled.bbor.common.events.ServerTick;
 import com.irtimaled.bbor.common.events.StructuresLoaded;
 import com.irtimaled.bbor.common.events.WorldLoaded;
+import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 import com.irtimaled.bbor.common.models.DimensionId;
 import com.irtimaled.bbor.common.models.ServerPlayer;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.network.ClientConnection;
 import net.minecraft.server.network.ServerPlayNetworkHandler;
 import net.minecraft.server.network.ServerPlayerEntity;
@@ -19,6 +24,7 @@ import net.minecraft.world.chunk.WorldChunk;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Supplier;
 
 public class CommonInterop {
     public static void chunkLoaded(WorldChunk chunk) {
@@ -59,4 +65,11 @@ public class CommonInterop {
     public static void playerSubscribed(ServerPlayerEntity player) {
         EventBus.publish(new PlayerSubscribed(player.getId(), new ServerPlayer(player)));
     }
+
+    public static <T extends AbstractBoundingBox> AbstractRenderer<T> registerRenderer(Class<? extends T> type, Supplier<AbstractRenderer<T>> renderer) {
+        if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
+            return ClientRenderer.registerRenderer(type, renderer);
+        }
+        return null;
+    }
 }
index 1e55a4e13dc82aec5aa8750a74e6edf1cb5b68a0..1cfc458fdf7cdef540b9675d749d7aef74b99f61 100644 (file)
@@ -1,15 +1,15 @@
 package com.irtimaled.bbor.common.models;
 
-import com.irtimaled.bbor.client.ClientRenderer;
 import com.irtimaled.bbor.client.RenderCulling;
 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
 import com.irtimaled.bbor.client.renderers.CuboidRenderer;
 import com.irtimaled.bbor.common.BoundingBoxType;
 import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.TypeHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
 
 public class BoundingBoxCuboid extends AbstractBoundingBox {
-    private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = ClientRenderer.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer());
+    private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = CommonInterop.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer());
 
     private final Coords minCoords;
     private final Coords maxCoords;