1 package com.irtimaled.bbor.client.providers;
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;
15 import java.util.HashSet;
18 public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk>, ICachingProvider {
19 private static final double CHUNK_SIZE = 16d;
21 private static volatile Long seed;
23 public static void setSeed(long seed) {
24 SlimeChunkProvider.seed = seed;
27 private static boolean isSlimeChunk(int chunkX, int chunkZ) {
28 return ChunkRandom.getSlimeRandom(chunkX, chunkZ, seed, 987234911L).nextInt(10) == 0;
31 public void clearCache() {
36 public boolean canProvide(DimensionId dimensionId) {
37 return dimensionId == DimensionId.OVERWORLD && seed != null && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.SlimeChunks);
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;
47 minimumY = world.getDimension().minY();
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));