1 package com.irtimaled.bbor.client.interop;
3 import com.irtimaled.bbor.client.models.BoundingBoxSpawningSphere;
4 import com.irtimaled.bbor.common.models.Coords;
5 import com.irtimaled.bbor.common.models.Point;
6 import net.minecraft.block.state.IBlockState;
7 import net.minecraft.client.Minecraft;
8 import net.minecraft.util.math.BlockPos;
9 import net.minecraft.world.World;
11 public class SpawningSphereHelper {
12 public static int findSpawnableSpaces(Point center, Coords coords, int width, int height, BlockProcessor blockProcessor) {
13 int blockX = coords.getX();
14 int minX = blockX - width;
15 int maxX = blockX + width + 1;
17 int blockZ = coords.getZ();
18 int minZ = blockZ - width;
19 int maxZ = blockZ + width + 1;
21 int blockY = coords.getY();
22 int minY = Math.max(1, blockY - height);
23 int maxY = Math.min(255, blockY + height);
25 World world = Minecraft.getInstance().world;
27 for (int x = minX; x < maxX; x++) {
28 for (int z = minZ; z < maxZ; z++) {
29 double closestX = x + 0.5D;
30 double closestZ = z + 0.5D;
31 double distance = center.getDistance(new Point(closestX, center.getY(), closestZ));
32 if (distance > BoundingBoxSpawningSphere.SPAWN_RADIUS) continue;
34 if (SpawnableBlocksHelper.isBiomeHostileSpawnProof(world, new BlockPos(x, 1, z))) continue;
36 IBlockState upperBlockState = world.getBlockState(new BlockPos(x, minY - 1, z));
37 for (int y = minY; y < maxY; y++) {
38 IBlockState spawnBlockState = upperBlockState;
39 BlockPos pos = new BlockPos(x, y, z);
40 upperBlockState = world.getBlockState(pos);
41 distance = center.getDistance(new Point(closestX, y, closestZ));
42 if (isWithinSpawnableZone(distance) &&
43 SpawnableBlocksHelper.isSpawnable(world, pos, spawnBlockState, upperBlockState) &&
44 blockProcessor.process(x, y, z)) {
53 private static boolean isWithinSpawnableZone(double distance) {
54 return distance <= BoundingBoxSpawningSphere.SPAWN_RADIUS &&
55 distance > BoundingBoxSpawningSphere.SAFE_RADIUS;