import com.irtimaled.bbor.common.MathHelper;
import com.irtimaled.bbor.common.models.Coords;
import com.irtimaled.bbor.common.models.DimensionId;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.world.gen.random.ChunkRandom;
import java.util.HashSet;
-import java.util.Random;
import java.util.Set;
-public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk> {
+public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk>, ICachingProvider {
private static final double CHUNK_SIZE = 16d;
- private static Long seed;
+ private static volatile Long seed;
public static void setSeed(long seed) {
SlimeChunkProvider.seed = seed;
}
private static boolean isSlimeChunk(int chunkX, int chunkZ) {
- Random r = new Random(seed +
- (long) (chunkX * chunkX * 4987142) +
- (long) (chunkX * 5947611) +
- (long) (chunkZ * chunkZ) * 4392871L +
- (long) (chunkZ * 389711) ^ 987234911L);
- return r.nextInt(10) == 0;
+ return ChunkRandom.getSlimeRandom(chunkX, chunkZ, seed, 987234911L).nextInt(10) == 0;
}
- public static void clear() {
+ public void clearCache() {
seed = null;
}
public Iterable<BoundingBoxSlimeChunk> get(DimensionId dimensionId) {
Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
+ final ClientWorld world = MinecraftClient.getInstance().world;
+ final int minimumY;
+ if (world != null) {
+ minimumY = world.getDimension().getMinimumY();
+ } else {
+ minimumY = 0;
+ }
int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; ++chunkX) {
if (isSlimeChunk(chunkX, chunkZ)) {
int chunkXStart = chunkX << 4;
int chunkZStart = chunkZ << 4;
- Coords minCoords = new Coords(chunkXStart, 1, chunkZStart);
+ Coords minCoords = new Coords(chunkXStart, minimumY + 1, chunkZStart);
Coords maxCoords = new Coords(chunkXStart + 15, 38, chunkZStart + 15);
slimeChunks.add(new BoundingBoxSlimeChunk(minCoords, maxCoords));
}