]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blobdiff - src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java
Several fixes
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / providers / SlimeChunkProvider.java
index 7899b2192bf514960705fca02aa24403f581fdaf..c22b4627316003639bd766816932869dc4f2a8b8 100644 (file)
@@ -8,30 +8,27 @@ import com.irtimaled.bbor.common.BoundingBoxType;
 import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.models.Coords;
 import com.irtimaled.bbor.common.models.DimensionId;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.world.gen.random.ChunkRandom;
 
 import java.util.HashSet;
-import java.util.Random;
 import java.util.Set;
 
-public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk> {
+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;
     }
 
     private static boolean isSlimeChunk(int chunkX, int chunkZ) {
-        Random r = new Random(seed +
-                (long) (chunkX * chunkX * 4987142) +
-                (long) (chunkX * 5947611) +
-                (long) (chunkZ * chunkZ) * 4392871L +
-                (long) (chunkZ * 389711) ^ 987234911L);
-        return r.nextInt(10) == 0;
+        return ChunkRandom.getSlimeRandom(chunkX, chunkZ, seed, 987234911L).nextInt(10) == 0;
     }
 
-    public static void clear() {
+    public void clearCache() {
         seed = null;
     }
 
@@ -44,6 +41,13 @@ public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlime
     public Iterable<BoundingBoxSlimeChunk> get(DimensionId dimensionId) {
         Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
         int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
+        final ClientWorld world = MinecraftClient.getInstance().world;
+        final int minimumY;
+        if (world != null) {
+            minimumY = world.getDimension().getMinimumY();
+        } else {
+            minimumY = 0;
+        }
         int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
         int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
         for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; ++chunkX) {
@@ -51,7 +55,7 @@ public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlime
                 if (isSlimeChunk(chunkX, chunkZ)) {
                     int chunkXStart = chunkX << 4;
                     int chunkZStart = chunkZ << 4;
-                    Coords minCoords = new Coords(chunkXStart, 1, chunkZStart);
+                    Coords minCoords = new Coords(chunkXStart, minimumY + 1, chunkZStart);
                     Coords maxCoords = new Coords(chunkXStart + 15, 38, chunkZStart + 15);
                     slimeChunks.add(new BoundingBoxSlimeChunk(minCoords, maxCoords));
                 }