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