]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/interop/SpawnableBlocksHelper.java
Add support for spawnable blocks rendering
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / interop / SpawnableBlocksHelper.java
1 package com.irtimaled.bbor.client.interop;
2
3 import com.irtimaled.bbor.common.models.Coords;
4 import net.minecraft.block.Block;
5 import net.minecraft.block.state.IBlockState;
6 import net.minecraft.client.Minecraft;
7 import net.minecraft.entity.EnumCreatureType;
8 import net.minecraft.init.Blocks;
9 import net.minecraft.tags.BlockTags;
10 import net.minecraft.util.EnumFacing;
11 import net.minecraft.util.math.BlockPos;
12 import net.minecraft.world.EnumLightType;
13 import net.minecraft.world.World;
14 import net.minecraft.world.biome.Biome;
15
16 public class SpawnableBlocksHelper {
17     public static void findSpawnableBlocks(Coords coords, int width, int height, BlockProcessor blockProcessor) {
18         int blockX = coords.getX();
19         int minX = blockX - width;
20         int maxX = blockX + width + 1;
21
22         int blockZ = coords.getZ();
23         int minZ = blockZ - width;
24         int maxZ = blockZ + width + 1;
25
26         int blockY = coords.getY();
27         int minY = Math.max(1, blockY - height);
28         int maxY = Math.min(255, blockY + height);
29
30         World world = Minecraft.getInstance().world;
31         for (int x = minX; x < maxX; x++) {
32             for (int z = minZ; z < maxZ; z++) {
33                 if (isBiomeHostileSpawnProof(world, new BlockPos(x, 1, z))) continue;
34
35                 IBlockState upperBlockState = world.getBlockState(new BlockPos(x, minY - 1, z));
36                 for (int y = Math.max(1, minY); y < maxY; y++) {
37                     IBlockState spawnBlockState = upperBlockState;
38                     BlockPos pos = new BlockPos(x, y, z);
39                     upperBlockState = world.getBlockState(pos);
40                     if (isSpawnable(world, pos, spawnBlockState, upperBlockState)) {
41                         blockProcessor.process(x, y, z);
42                     }
43                 }
44             }
45         }
46     }
47
48     static boolean isBiomeHostileSpawnProof(World world, BlockPos pos) {
49         Biome biome = world.getBiome(pos);
50         return biome.getSpawningChance() == 0 ||
51                 biome.getSpawns(EnumCreatureType.MONSTER).isEmpty();
52     }
53
54     static boolean isSpawnable(World world, BlockPos pos, IBlockState spawnBlockState, IBlockState upperBlockState) {
55         Block spawnBlock = spawnBlockState.getBlock();
56         return spawnBlock != Blocks.AIR &&
57                 spawnBlock != Blocks.BEDROCK &&
58                 spawnBlock != Blocks.BARRIER &&
59                 spawnBlockState.isTopSolid() &&
60                 !upperBlockState.isBlockNormalCube() &&
61                 !upperBlockState.canProvidePower() &&
62                 !upperBlockState.isIn(BlockTags.RAILS) &&
63                 upperBlockState.getCollisionShape(world, pos).getEnd(EnumFacing.Axis.Y) <= 0 &&
64                 upperBlockState.getFluidState().isEmpty() &&
65                 (world.dimension.isNether() || world.getLightFor(EnumLightType.BLOCK, pos) <= 7);
66     }
67 }