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