From 3a05faace02af1926891b57b1a939fe49de46136 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 21 Jan 2019 17:53:34 -0800 Subject: [PATCH] Better. Needs tests to fix bugs. --- .../bentobox/greenhouses/data/Greenhouse.java | 26 +++++++++++++ .../greenhouses/greenhouse/Walls.java | 9 +++++ .../managers/GreenhouseFinder.java | 3 +- .../managers/GreenhouseManager.java | 30 +++++++++------ .../greenhouses/managers/GreenhouseMap.java | 38 +++++++++++-------- .../greenhouses/managers/RecipeManager.java | 3 +- .../greenhouses/ui/user/MakeCommand.java | 4 +- 7 files changed, 82 insertions(+), 31 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java b/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java index da6b039..eb16a82 100644 --- a/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java +++ b/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java @@ -19,6 +19,17 @@ import world.bentobox.greenhouses.greenhouse.BiomeRecipe; */ public class Greenhouse implements DataObject { + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Greenhouse [uniqueId=" + uniqueId + ", location=" + location + ", footprint=" + footprint + + ", ceilingHeight=" + ceilingHeight + ", originalBiome=" + originalBiome + ", greenhouseBiome=" + + greenhouseBiome + ", roofHopperLocation=" + roofHopperLocation + ", biomeRecipe=" + biomeRecipe.getName() + + ", broken=" + broken + "]"; + } + private String uniqueId = UUID.randomUUID().toString(); private Location location; private Rectangle footprint; @@ -192,4 +203,19 @@ public class Greenhouse implements DataObject { return this.getLocation().getWorld(); } + /** + * Checks if a location is inside the greenhouse + * @param location2 - location to check + * @return true if inside the greenhouse + */ + public boolean contains(Location location2) { + return (location.getWorld().equals(location2.getWorld()) + && location2.getBlockY() <= this.ceilingHeight + && location2.getBlockY() >= this.getFloorHeight() + && location2.getBlockX() >= (int)this.footprint.getMinX() + && location2.getBlockX() <= (int)this.footprint.getMaxX() + && location2.getBlockZ() >= (int)this.footprint.getMinY() + && location2.getBlockZ() <= (int)this.footprint.getMaxY()); + } + } diff --git a/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java b/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java index 5d12652..81edf66 100644 --- a/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java +++ b/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java @@ -227,4 +227,13 @@ public class Walls { public static boolean isWallBlock(Material blockType) { return WALL_BLOCKS.contains(blockType); } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Walls [minX=" + minX + ", maxX=" + maxX + ", minZ=" + minZ + ", maxZ=" + maxZ + ", floor=" + floor + + "]"; + } } diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseFinder.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseFinder.java index 5dcc9d6..2312047 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseFinder.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseFinder.java @@ -4,6 +4,7 @@ import java.awt.Rectangle; import java.util.HashSet; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -32,7 +33,7 @@ public class GreenhouseFinder { } // Find the walls Walls walls = new Walls(roof); - + Bukkit.getLogger().info("DEBUG: walls = " + walls.toString()); // Make the initial greenhouse gh = new Greenhouse(location.getWorld(), new Rectangle(walls.getMinX(), walls.getMinZ(), walls.getMaxX(), walls.getMaxZ()), walls.getFloor(), roof.getHeight()); // Set the original biome diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java index 4a72942..f1a252a 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java @@ -12,11 +12,13 @@ import world.bentobox.bentobox.database.Database; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.data.Greenhouse; import world.bentobox.greenhouses.greenhouse.BiomeRecipe; -import world.bentobox.greenhouses.managers.GreenhouseMap.AddResult; public class GreenhouseManager { - // No result = success + /** + * Result of greenhouse making + * + */ public enum GreenhouseResult { FAIL_NO_ROOF, FAIL_BELOW, @@ -33,7 +35,12 @@ public class GreenhouseManager { FAIL_NO_ICE, FAIL_INSUFFICIENT_WATER, FAIL_INSUFFICIENT_LAVA, - FAIL_INSUFFICIENT_ICE + FAIL_INSUFFICIENT_ICE, + FAIL_NO_ISLAND, + FAIL_OVERLAPPING, + NULL, + SUCCESS, + FAIL_NO_RECIPE_FOUND } private Greenhouses addon; @@ -60,7 +67,7 @@ public class GreenhouseManager { public void loadGreenhouses() { addon.log("Loading greenhouses..."); handler.loadObjects().forEach(g -> { - AddResult result = map.addGreenhouse(g); + GreenhouseResult result = map.addGreenhouse(g); switch (result) { case FAIL_NO_ISLAND: case FAIL_OVERLAPPING: @@ -141,14 +148,15 @@ public class GreenhouseManager { } return new GhResult().setFinder(finder).setResults(resultSet); } + // Try ordered recipes - addon.getRecipes().getBiomeRecipes().stream().sorted() - .filter(r -> r.checkRecipe(finder.getGh()).isEmpty()).findFirst() - .ifPresent(r -> { - // Success - set recipe and add to map - finder.getGh().setBiomeRecipe(r); - map.addGreenhouse(finder.getGh()); - }); + resultSet.add(addon.getRecipes().getBiomeRecipes().stream().sorted() + .filter(r -> r.checkRecipe(finder.getGh()).isEmpty()).findFirst() + .map(r -> { + // Success - set recipe and add to map + finder.getGh().setBiomeRecipe(r); + return map.addGreenhouse(finder.getGh()); + }).orElse(GreenhouseResult.FAIL_NO_RECIPE_FOUND)); return new GhResult().setFinder(finder).setResults(resultSet); } diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java index 37c7a9b..43d13e9 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java @@ -7,20 +7,16 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import org.bukkit.Bukkit; import org.bukkit.Location; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.data.Greenhouse; +import world.bentobox.greenhouses.managers.GreenhouseManager.GreenhouseResult; public class GreenhouseMap { - public enum AddResult { - SUCCESS, - FAIL_OVERLAPPING, - FAIL_NO_ISLAND, - NULL - } private Greenhouses addon; private Map> greenhouses = new HashMap<>(); @@ -34,22 +30,22 @@ public class GreenhouseMap { /** * Try to add a greenhouse * @param greenhouse - greenhouse object - * @return {@link AddResult#SUCCESS}, {@link AddResult#FAIL_NO_ISLAND} or {@link AddResult#FAIL_OVERLAPPING} + * @return result {@link GreenhouseResult} */ - public AddResult addGreenhouse(Greenhouse greenhouse) { + public GreenhouseResult addGreenhouse(Greenhouse greenhouse) { if (greenhouse.getLocation() == null) { - return AddResult.NULL; + return GreenhouseResult.NULL; } return addon.getIslands().getIslandAt(greenhouse.getLocation()).map(i -> { greenhouses.putIfAbsent(i, new ArrayList<>()); // Check if overlapping if (!isOverlapping(greenhouse)) { greenhouses.get(i).add(greenhouse); - return AddResult.SUCCESS; + return GreenhouseResult.SUCCESS; } else { - return AddResult.FAIL_OVERLAPPING; + return GreenhouseResult.FAIL_OVERLAPPING; } - }).orElse(AddResult.FAIL_NO_ISLAND); + }).orElse(GreenhouseResult.FAIL_NO_ISLAND); } /** @@ -62,10 +58,20 @@ public class GreenhouseMap { } private Optional getXZGreenhouse(Location location) { - return addon.getIslands().getIslandAt(location).map(i -> { - greenhouses.putIfAbsent(i, new ArrayList<>()); - return greenhouses.get(i).stream().filter(g -> g.getFootprint().contains(location.getX(), location.getY())).findFirst(); - }).orElse(Optional.empty()); + return addon.getIslands().getIslandAt(location) + .filter(i -> greenhouses.containsKey(i)) + .map(i -> { + for (Greenhouse gh : greenhouses.get(i)) { + Bukkit.getLogger().info("Trying " + location); + Bukkit.getLogger().info(gh.toString()); + if (gh.contains(location)) { + Bukkit.getLogger().info("inside gh"); + return Optional.of(gh); + } + } + Bukkit.getLogger().info("None found"); + return null; + }).orElse(Optional.empty()); } /** diff --git a/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java b/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java index 41ad373..4353f49 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java @@ -14,6 +14,7 @@ import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.EntityType; +import world.bentobox.bentobox.util.Util; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.greenhouse.BiomeRecipe; @@ -76,7 +77,7 @@ public class RecipeManager { b.setPermission(biomeRecipe.getString("permission","")); // Set the icon b.setIcon(Material.valueOf(biomeRecipe.getString("icon", "SAPLING"))); - b.setFriendlyName(ChatColor.translateAlternateColorCodes('&', biomeRecipe.getString("friendlyname", ""))); + b.setFriendlyName(ChatColor.translateAlternateColorCodes('&', biomeRecipe.getString("friendlyname", Util.prettifyText(type)))); // A value of zero on these means that there must be NO coverage, e.g., desert. If the value is not present, then the default is -1 b.setWatercoverage(biomeRecipe.getInt("watercoverage",-1)); b.setLavacoverage(biomeRecipe.getInt("lavacoverage",-1)); diff --git a/src/main/java/world/bentobox/greenhouses/ui/user/MakeCommand.java b/src/main/java/world/bentobox/greenhouses/ui/user/MakeCommand.java index 9709fd8..180b6fe 100644 --- a/src/main/java/world/bentobox/greenhouses/ui/user/MakeCommand.java +++ b/src/main/java/world/bentobox/greenhouses/ui/user/MakeCommand.java @@ -56,10 +56,10 @@ public class MakeCommand extends CompositeCommand { } GhResult result = ((Greenhouses)this.getAddon()).getManager().tryToMakeGreenhouse(location, null); - if (result.getResults().isEmpty()) { + if (result.getResults().contains(GreenhouseResult.SUCCESS)) { // Success user.sendMessage("general.success"); - user.sendRawMessage(result.getFinder().getGh().getBiomeRecipe().getFriendlyName()); + user.sendRawMessage(result.getFinder().getGh().getBiomeRecipe().getName()); return true; } result.getResults().forEach(r -> sendErrorMessage(user, r));