1 package com.irtimaled.bbor.client.providers;
3 import com.irtimaled.bbor.client.Player;
4 import com.irtimaled.bbor.client.interop.ClientInterop;
5 import com.irtimaled.bbor.client.models.BoundingBoxSlimeChunk;
6 import com.irtimaled.bbor.common.BoundingBoxType;
7 import com.irtimaled.bbor.common.Dimensions;
8 import com.irtimaled.bbor.common.MathHelper;
9 import com.irtimaled.bbor.common.models.Coords;
11 import java.util.HashSet;
12 import java.util.Random;
15 public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk> {
16 private static final double CHUNK_SIZE = 16d;
18 private static Long seed;
20 public static void setSeed(long seed) {
21 SlimeChunkProvider.seed = seed;
24 private static boolean isSlimeChunk(int chunkX, int chunkZ) {
25 Random r = new Random(seed +
26 (long) (chunkX * chunkX * 4987142) +
27 (long) (chunkX * 5947611) +
28 (long) (chunkZ * chunkZ) * 4392871L +
29 (long) (chunkZ * 389711) ^ 987234911L);
30 return r.nextInt(10) == 0;
33 public static void clear() {
37 public Iterable<BoundingBoxSlimeChunk> get(int dimensionId) {
38 if (!BoundingBoxType.SlimeChunks.shouldRender() || seed == null || dimensionId != Dimensions.OVERWORLD) {
39 return Iterators.empty();
42 Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
43 int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
44 int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
45 int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
46 for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; ++chunkX) {
47 for (int chunkZ = playerChunkZ - renderDistanceChunks; chunkZ <= playerChunkZ + renderDistanceChunks; ++chunkZ) {
48 if (isSlimeChunk(chunkX, chunkZ)) {
49 int chunkXStart = chunkX << 4;
50 int chunkZStart = chunkZ << 4;
51 Coords minCoords = new Coords(chunkXStart, 1, chunkZStart);
52 Coords maxCoords = new Coords(chunkXStart + 15, 38, chunkZStart + 15);
53 slimeChunks.add(BoundingBoxSlimeChunk.from(minCoords, maxCoords));