]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java
1.18.1
[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.MathHelper;
9 import com.irtimaled.bbor.common.models.Coords;
10 import com.irtimaled.bbor.common.models.DimensionId;
11 import net.minecraft.world.gen.random.ChunkRandom;
12
13 import java.util.HashSet;
14 import java.util.Set;
15
16 public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk>, ICachingProvider {
17     private static final double CHUNK_SIZE = 16d;
18
19     private static volatile 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         return ChunkRandom.getSlimeRandom(chunkX, chunkZ, seed, 987234911L).nextInt(10) == 0;
27     }
28
29     public void clearCache() {
30         seed = null;
31     }
32
33     @Override
34     public boolean canProvide(DimensionId dimensionId) {
35         return dimensionId == DimensionId.OVERWORLD && seed != null && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.SlimeChunks);
36     }
37
38     @Override
39     public Iterable<BoundingBoxSlimeChunk> get(DimensionId dimensionId) {
40         Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
41         int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
42         int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
43         int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
44         for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; ++chunkX) {
45             for (int chunkZ = playerChunkZ - renderDistanceChunks; chunkZ <= playerChunkZ + renderDistanceChunks; ++chunkZ) {
46                 if (isSlimeChunk(chunkX, chunkZ)) {
47                     int chunkXStart = chunkX << 4;
48                     int chunkZStart = chunkZ << 4;
49                     Coords minCoords = new Coords(chunkXStart, 1, chunkZStart);
50                     Coords maxCoords = new Coords(chunkXStart + 15, 38, chunkZStart + 15);
51                     slimeChunks.add(new BoundingBoxSlimeChunk(minCoords, maxCoords));
52                 }
53             }
54         }
55         return slimeChunks;
56     }
57 }