Improved roof detection. Added missing error.

This commit is contained in:
tastybento 2019-11-22 21:23:42 -08:00
parent d41e49597d
commit 42a3da2bfd
3 changed files with 18 additions and 20 deletions

View File

@ -48,38 +48,35 @@ public class Roof extends MinMaxXZ {
// This section tries to find a roof block // This section tries to find a roof block
// Try just going up - this covers every case except if the player is standing under a hole // Try just going up - this covers every case except if the player is standing under a hole
roofFound = false; roofFound = false;
// This does a ever-growing check around the player to find a roof block. It is possible for the player
// This does a ever-growing check around the player to find a wall block. It is possible for the player
// to be outside the greenhouse in this situation, so a check is done later to make sure the player is inside // to be outside the greenhouse in this situation, so a check is done later to make sure the player is inside
int roofY = loc.getBlockY(); int roofY = loc.getBlockY();
for (int y = roofY; y < world.getMaxHeight(); y++) {
if (ROOF_BLOCKS.contains(world.getBlockAt(loc.getBlockX(),y,loc.getBlockZ()).getType())) {
roofFound = true;
loc = new Location(world,loc.getBlockX(),y,loc.getBlockZ());
break;
}
}
// If the roof was not found start going around in circles until something is found // If the roof was not found start going around in circles until something is found
// Expand in ever increasing squares around location until a wall block is found // Expand in ever increasing squares around location until a wall block is found
for (int radius = 0; radius < 3; radius++) { for (int radius = 0; radius < 3 && !roofFound; radius++) {
for (int x = loc.getBlockX() - radius; x <= loc.getBlockX() + radius; x++) { for (int x = loc.getBlockX() - radius; x <= loc.getBlockX() + radius && !roofFound; x++) {
for (int z = loc.getBlockZ() - radius; z <= loc.getBlockZ() + radius; z++) { for (int z = loc.getBlockZ() - radius; z <= loc.getBlockZ() + radius && !roofFound; z++) {
if (!((x > loc.getBlockX() - radius && x < loc.getBlockX() + radius) if (!((x > loc.getBlockX() - radius && x < loc.getBlockX() + radius) && (z > loc.getBlockZ() - radius && z < loc.getBlockZ() + radius))) {
&& (z > loc.getBlockZ() - radius && z < loc.getBlockZ() + radius))) {
Block b = world.getBlockAt(x, roofY, z); Block b = world.getBlockAt(x, roofY, z);
if (!Walls.WALL_BLOCKS.contains(b.getType())) { if (!Walls.WALL_BLOCKS.contains(b.getType())) {
// Look up // Look up
for (int y = roofY; y < world.getMaxHeight(); y++) { for (int y = roofY; y < world.getMaxHeight() && !roofFound; y++) {
if (ROOF_BLOCKS.contains(world.getBlockAt(x,y,z).getType())) { if (ROOF_BLOCKS.contains(world.getBlockAt(x,y,z).getType())) {
roofFound = true; roofFound = true;
loc = new Location(world,x,y,z); loc = new Location(world,x,y,z);
break;
} }
} }
} }
} }
if (roofFound) {
break;
}
} }
if (roofFound) {
break;
}
}
if (roofFound) {
break;
} }
} }
if (!roofFound) return false; if (!roofFound) return false;

View File

@ -65,6 +65,7 @@ greenhouses:
FAIL_NO_LAVA: "&cLava is required to make this recipe" FAIL_NO_LAVA: "&cLava is required to make this recipe"
FAIL_NO_WATER: "&cWater is required to make this recipe" FAIL_NO_WATER: "&cWater is required to make this recipe"
FAIL_INSUFFICIENT_BLOCKS: "&cMore blocks are required to make this recipe!" FAIL_INSUFFICIENT_BLOCKS: "&cMore blocks are required to make this recipe!"
FAIL_OVERLAPPING: "&cGreenhouses cannot share walls, sorry."
success: "&2You successfully made a [biome] biome greenhouse! Biome will sync at next teleport or login." success: "&2You successfully made a [biome] biome greenhouse! Biome will sync at next teleport or login."
missing-blocks: "&cMissing [material] x [number]" missing-blocks: "&cMissing [material] x [number]"
unknown-recipe: "&cUnknown recipe" unknown-recipe: "&cUnknown recipe"

View File

@ -39,7 +39,7 @@ public class RoofTest {
public void setUp() throws Exception { public void setUp() throws Exception {
when(world.getMaxHeight()).thenReturn(255); when(world.getMaxHeight()).thenReturn(255);
// Block // Block
when(block.getType()).thenReturn(Material.AIR, Material.AIR, Material.AIR, Material.AIR, Material.AIR, when(block.getType()).thenReturn(Material.AIR, Material.AIR, Material.AIR, Material.AIR,
Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS,
Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS,
Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS,
@ -76,12 +76,12 @@ public class RoofTest {
// Test // Test
roof = new Roof(location); roof = new Roof(location);
} }
@Test @Test
public void testNoGlass() { public void testNoGlass() {
when(block.getType()).thenReturn(Material.AIR); when(block.getType()).thenReturn(Material.AIR);
roof = new Roof(location); roof = new Roof(location);
} }
/** /**