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;
12 import java.util.HashSet;
13 import java.util.Random;
16 public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk> {
17 private static final double CHUNK_SIZE = 16d;
19 private static Long seed;
21 public static void setSeed(long seed) {
22 SlimeChunkProvider.seed = seed;
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;
34 public static void clear() {
39 public boolean canProvide(DimensionId dimensionId) {
40 return dimensionId == DimensionId.OVERWORLD && seed != null && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.SlimeChunks);
44 public Iterable<BoundingBoxSlimeChunk> get(DimensionId dimensionId) {
45 Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
46 int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
47 int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
48 int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
49 for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; ++chunkX) {
50 for (int chunkZ = playerChunkZ - renderDistanceChunks; chunkZ <= playerChunkZ + renderDistanceChunks; ++chunkZ) {
51 if (isSlimeChunk(chunkX, chunkZ)) {
52 int chunkXStart = chunkX << 4;
53 int chunkZStart = chunkZ << 4;
54 Coords minCoords = new Coords(chunkXStart, 1, chunkZStart);
55 Coords maxCoords = new Coords(chunkXStart + 15, 38, chunkZStart + 15);
56 slimeChunks.add(BoundingBoxSlimeChunk.from(minCoords, maxCoords));