]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java
a41b6836e810886d5c01896052acc0481c2f89fc
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / providers / SlimeChunkProvider.java
1 package com.irtimaled.bbor.client.providers;
2
3 import com.irtimaled.bbor.client.Player;
4 import com.irtimaled.bbor.client.interop.ClientInterop;
5 import com.irtimaled.bbor.client.models.BoundingBoxSlimeChunk;
6 import com.irtimaled.bbor.common.BoundingBoxType;
7 import com.irtimaled.bbor.common.Dimensions;
8 import com.irtimaled.bbor.common.MathHelper;
9 import com.irtimaled.bbor.common.models.Coords;
10
11 import java.util.HashSet;
12 import java.util.Random;
13 import java.util.Set;
14
15 public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk> {
16     private static final double CHUNK_SIZE = 16d;
17
18     private static Long seed;
19
20     public static void setSeed(long seed) {
21         SlimeChunkProvider.seed = seed;
22     }
23
24     private static boolean isSlimeChunk(int chunkX, int chunkZ) {
25         Random r = new Random(seed +
26                 (long) (chunkX * chunkX * 4987142) +
27                 (long) (chunkX * 5947611) +
28                 (long) (chunkZ * chunkZ) * 4392871L +
29                 (long) (chunkZ * 389711) ^ 987234911L);
30         return r.nextInt(10) == 0;
31     }
32
33     public static void clear() {
34         seed = null;
35     }
36
37     public Iterable<BoundingBoxSlimeChunk> get(int dimensionId) {
38         if (!BoundingBoxType.SlimeChunks.shouldRender() || seed == null || dimensionId != Dimensions.OVERWORLD) {
39             return Iterators.empty();
40         }
41
42         Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
43         int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
44         int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
45         int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
46         for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; ++chunkX) {
47             for (int chunkZ = playerChunkZ - renderDistanceChunks; chunkZ <= playerChunkZ + renderDistanceChunks; ++chunkZ) {
48                 if (isSlimeChunk(chunkX, chunkZ)) {
49                     int chunkXStart = chunkX << 4;
50                     int chunkZStart = chunkZ << 4;
51                     Coords minCoords = new Coords(chunkXStart, 1, chunkZStart);
52                     Coords maxCoords = new Coords(chunkXStart + 15, 38, chunkZStart + 15);
53                     slimeChunks.add(BoundingBoxSlimeChunk.from(minCoords, maxCoords));
54                 }
55             }
56         }
57         return slimeChunks;
58     }
59 }