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.util.SharedSeedRandom;
13 import java.util.HashSet;
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 return SharedSeedRandom.seedSlimeChunk(chunkX, chunkZ,seed, 987234911L).nextInt(10) == 0;
29 public static void clear() {
34 public boolean canProvide(DimensionId dimensionId) {
35 return dimensionId == DimensionId.OVERWORLD && seed != null && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.SlimeChunks);
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));