]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/interop/SpawningSphereHelper.java
Add support for blocks only spawnable at night
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / interop / SpawningSphereHelper.java
1 package com.irtimaled.bbor.client.interop;
2
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;
10
11 public class SpawningSphereHelper {
12     public static void 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;
16
17         int blockZ = coords.getZ();
18         int minZ = blockZ - width;
19         int maxZ = blockZ + width + 1;
20
21         int blockY = coords.getY();
22         int minY = Math.max(1, blockY - height);
23         int maxY = Math.min(255, blockY + height);
24
25         World world = Minecraft.getInstance().world;
26         for (int x = minX; x < maxX; x++) {
27             for (int z = minZ; z < maxZ; z++) {
28                 double closestX = x + 0.5D;
29                 double closestZ = z + 0.5D;
30                 double distance = center.getDistance(new Point(closestX, center.getY(), closestZ));
31                 if (distance > BoundingBoxSpawningSphere.SPAWN_RADIUS) continue;
32
33                 if (SpawnableBlocksHelper.isBiomeHostileSpawnProof(world, new BlockPos(x, 1, z))) continue;
34
35                 IBlockState upperBlockState = world.getBlockState(new BlockPos(x, minY - 1, z));
36                 for (int y = minY; y < maxY; y++) {
37                     IBlockState spawnBlockState = upperBlockState;
38                     BlockPos pos = new BlockPos(x, y, z);
39                     upperBlockState = world.getBlockState(pos);
40                     distance = center.getDistance(new Point(closestX, y, closestZ));
41                     if (isWithinSpawnableZone(distance) &&
42                             SpawnableBlocksHelper.isSpawnable(world, pos, spawnBlockState, upperBlockState)) {
43                         blockProcessor.process(pos);
44                     }
45                 }
46             }
47         }
48     }
49
50     private static boolean isWithinSpawnableZone(double distance) {
51         return distance <= BoundingBoxSpawningSphere.SPAWN_RADIUS &&
52                 distance > BoundingBoxSpawningSphere.SAFE_RADIUS;
53     }
54 }