From b90cba0b60f97ccf519a32b9dde2a7c95db16acd Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 17 Jan 2021 09:35:06 -0800 Subject: [PATCH] WIP --- .../bentobox/greenhouses/data/Greenhouse.java | 2 +- .../managers/GreenhouseManager.java | 49 +++++++++++++------ .../greenhouses/ui/user/MakeCommand.java | 5 ++ .../greenhouses/world/AsyncWorldCache.java | 6 +-- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java b/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java index 27aef0b..cc40135 100644 --- a/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java +++ b/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java @@ -203,7 +203,7 @@ public class Greenhouse implements DataObject { /** * @return the world */ - @NonNull + @Nullable public World getWorld() { return this.getLocation().getWorld(); } diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java index 87a673a..90bd921 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java @@ -1,15 +1,18 @@ package world.bentobox.greenhouses.managers; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; import org.bukkit.Location; import org.bukkit.block.Biome; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.events.BentoBoxReadyEvent; import world.bentobox.bentobox.database.Database; import world.bentobox.bentobox.database.objects.Island; @@ -167,12 +170,17 @@ public class GreenhouseManager implements Listener { } // Check if the greenhouse meets the requested recipe if (greenhouseRecipe != null) { - checkRecipe(finder, greenhouseRecipe, resultSet).thenAccept(r::complete); + checkRecipe(finder, greenhouseRecipe, resultSet).thenAccept(rs -> { + r.complete(rs); + }); return; } // Try ordered recipes - findRecipe(finder, resultSet); - r.complete(new GhResult().setFinder(finder).setResults(resultSet)); + findRecipe(finder).thenAccept(rs -> { + resultSet.addAll(rs); + r.complete(new GhResult().setFinder(finder).setResults(resultSet)); + }); + }); return r; } @@ -182,18 +190,29 @@ public class GreenhouseManager implements Listener { * @param finder - finder object * @param resultSet - result set from find */ - private void findRecipe(GreenhouseFinder finder, Set resultSet) { - // TODO - /* - 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); - activateGreenhouse(finder.getGh()); - handler.saveObjectAsync(finder.getGh()); - return map.addGreenhouse(finder.getGh()); - }).orElse(GreenhouseResult.FAIL_NO_RECIPE_FOUND));*/ + private CompletableFuture> findRecipe(GreenhouseFinder finder) { + CompletableFuture> r = new CompletableFuture<>(); + // Get sorted list of all recipes + List list = addon.getRecipes().getBiomeRecipes().stream().sorted().collect(Collectors.toList()); + findRecipe(r, list, finder); + return r; + } + + private void findRecipe(CompletableFuture> r, List list, + GreenhouseFinder finder) { + if (list.isEmpty()) { + r.complete(Collections.singleton(GreenhouseResult.FAIL_NO_RECIPE_FOUND)); + return; + } + BiomeRecipe br = list.get(0); + list.remove(0); + br.checkRecipe(finder.getGh()).thenAccept(results -> { + if (results.isEmpty()) { + findRecipe(r, list, finder); + } else { + r.complete(results); + } + }); } /** 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 0d0a444..fcc2ad3 100644 --- a/src/main/java/world/bentobox/greenhouses/ui/user/MakeCommand.java +++ b/src/main/java/world/bentobox/greenhouses/ui/user/MakeCommand.java @@ -86,6 +86,11 @@ class MakeCommand extends CompositeCommand { .collect(Collectors.toMap(br -> br.getName(), br -> br)); } + /** + * @param user - user + * @param br requested biome recipe, or null to try anything + * @return true if successful + */ private boolean makeGreenhouse(User user, BiomeRecipe br) { // Check flag if (!getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) { diff --git a/src/main/java/world/bentobox/greenhouses/world/AsyncWorldCache.java b/src/main/java/world/bentobox/greenhouses/world/AsyncWorldCache.java index e4381f3..643d49e 100644 --- a/src/main/java/world/bentobox/greenhouses/world/AsyncWorldCache.java +++ b/src/main/java/world/bentobox/greenhouses/world/AsyncWorldCache.java @@ -75,13 +75,13 @@ public class AsyncWorldCache { if (cache.containsKey(key)) { return cache.get(key); } - ChunkSnapshot cs; + ChunkSnapshot cs = null; try { // Block on getting the chunk because this is running async cs = getAChunk(key.x, key.z).get(); } catch (InterruptedException | ExecutionException e) { - // Try again... - return getSnap(x,z); + Greenhouses.getInstance().logError("Could not get chunk! " + e); + Thread.currentThread().interrupt(); } // Store in cache cache.put(key, cs);