From 085db69dff9fe51dcc2282b834c671ea8482a7a6 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 8 Jul 2019 07:53:03 -0700 Subject: [PATCH] Fixes bug where animals spawn too much in greenhouses. Also tracks island deletion so greenhouses are removed when that happens. --- .../bentobox/greenhouses/Greenhouses.java | 2 +- .../listeners/IslandChangeEvents.java | 29 +++++++++++++++++++ .../managers/EcoSystemManager.java | 17 ++++++++++- .../managers/GreenhouseManager.java | 13 +++++++++ .../greenhouses/managers/GreenhouseMap.java | 21 ++++++++++++-- src/main/resources/biomes.yml | 2 +- 6 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/main/java/world/bentobox/greenhouses/listeners/IslandChangeEvents.java diff --git a/src/main/java/world/bentobox/greenhouses/Greenhouses.java b/src/main/java/world/bentobox/greenhouses/Greenhouses.java index ad0ce2e..495bcba 100644 --- a/src/main/java/world/bentobox/greenhouses/Greenhouses.java +++ b/src/main/java/world/bentobox/greenhouses/Greenhouses.java @@ -66,7 +66,7 @@ public class Greenhouses extends Addon { public void onDisable() { if (manager != null) { manager.saveGreenhouses(); - manager.getEcoMgr().cancel(); + if (manager.getEcoMgr() != null) manager.getEcoMgr().cancel(); } if (settings != null) { new Config<>(this, Settings.class).saveConfigObject(settings); diff --git a/src/main/java/world/bentobox/greenhouses/listeners/IslandChangeEvents.java b/src/main/java/world/bentobox/greenhouses/listeners/IslandChangeEvents.java new file mode 100644 index 0000000..ccee904 --- /dev/null +++ b/src/main/java/world/bentobox/greenhouses/listeners/IslandChangeEvents.java @@ -0,0 +1,29 @@ +package world.bentobox.greenhouses.listeners; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import world.bentobox.bentobox.api.events.island.IslandEvent.IslandDeleteEvent; +import world.bentobox.greenhouses.Greenhouses; + +/** + * @author tastybento + * + */ +public class IslandChangeEvents implements Listener { + + private Greenhouses addon; + + /** + * @param addon + */ + public IslandChangeEvents(Greenhouses addon) { + this.addon = addon; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled=true) + public void onIslandDeleteEvent(IslandDeleteEvent e) { + addon.getManager().removeGreenhouses(e.getIsland()); + } +} diff --git a/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java b/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java index 3957271..5dfd5b7 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java @@ -13,6 +13,7 @@ import org.bukkit.block.Hopper; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; +import world.bentobox.bentobox.util.Pair; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.data.Greenhouse; @@ -91,19 +92,33 @@ public class EcoSystemManager { return; } // Count mobs in greenhouse + // Load chunks + List> chunks = new ArrayList<>(); + for (double blockX = gh.getBoundingBox().getMinX(); blockX < gh.getBoundingBox().getMaxX(); blockX+=16) { + for (double blockZ = gh.getBoundingBox().getMinZ(); blockZ < gh.getBoundingBox().getMaxZ(); blockZ+=16) { + int chunkX = (int)(blockX / 16); + int chunkZ = (int)(blockZ / 16); + if (!gh.getWorld().isChunkLoaded(chunkX, chunkZ)) { + gh.getWorld().loadChunk(chunkX, chunkZ); + chunks.add(new Pair<>(chunkX, chunkZ)); + } + } + } long sum = gh.getWorld().getEntities().stream() .filter(e -> gh.getBiomeRecipe().getMobTypes().contains(e.getType())) .filter(e -> gh.contains(e.getLocation())).count(); // Get the blocks in the greenhouse where spawning could occur Iterator it = getAvailableBlocks(gh).iterator(); // Check if the greenhouse is full - while (it.hasNext() && (sum == 0 || gh.getArea() / sum > gh.getBiomeRecipe().getMobLimit())) { + while (it.hasNext() && (sum == 0 || gh.getArea() / sum >= gh.getBiomeRecipe().getMobLimit())) { // Spawn something if chance says so if (gh.getBiomeRecipe().spawnMob(it.next())) { // Add a mob to the sum in the greenhouse sum++; } } + // Unload chunks again + chunks.forEach(p -> gh.getWorld().unloadChunk(p.x, p.z)); } /** diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java index 0b42606..beebd29 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 org.bukkit.event.Listener; import world.bentobox.bentobox.api.events.BentoBoxReadyEvent; import world.bentobox.bentobox.database.Database; +import world.bentobox.bentobox.database.objects.Island; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.data.Greenhouse; import world.bentobox.greenhouses.greenhouse.BiomeRecipe; import world.bentobox.greenhouses.listeners.GreenhouseEvents; import world.bentobox.greenhouses.listeners.GreenhouseGuard; +import world.bentobox.greenhouses.listeners.IslandChangeEvents; import world.bentobox.greenhouses.listeners.SnowTracker; public class GreenhouseManager implements Listener { @@ -70,6 +72,7 @@ public class GreenhouseManager implements Listener { addon.registerListener(new SnowTracker(addon)); addon.registerListener(new GreenhouseEvents(addon)); addon.registerListener(new GreenhouseGuard(addon)); + addon.registerListener(new IslandChangeEvents(addon)); } public GreenhouseMap getMap() { @@ -245,4 +248,14 @@ public class GreenhouseManager implements Listener { public EcoSystemManager getEcoMgr() { return ecoMgr; } + + /** + * Removes all greenhouses on island + * @param island - island + */ + public void removeGreenhouses(Island island) { + map.getGreenhouses(island).forEach(handler::deleteObject); + map.removeGreenhouses(island); + + } } diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java index 307af7d..223e7a2 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java @@ -1,6 +1,7 @@ package world.bentobox.greenhouses.managers; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -100,11 +101,18 @@ public class GreenhouseMap { */ protected void removeGreenhouse(Greenhouse greenhouse) { addon.getIslands().getIslandAt(greenhouse.getLocation()).ifPresent(i -> { - greenhouses.putIfAbsent(i, new ArrayList<>()); - greenhouses.get(i).remove(greenhouse); + if (greenhouses.containsKey(i)) greenhouses.get(i).remove(greenhouse); }); } + /** + * @param island + */ + public void removeGreenhouses(Island island) { + greenhouses.remove(island); + } + + /** * @return a list of all the Greenhouses */ @@ -112,6 +120,15 @@ public class GreenhouseMap { return greenhouses.values().stream().flatMap(List::stream).collect(Collectors.toList()); } + /** + * Get all greenhouses on island + * @param island - island + * @return list of islands or empty list + */ + public List getGreenhouses(Island island) { + return greenhouses.getOrDefault(island, Collections.emptyList()); + } + /** * @return number of greenhouses loaded */ diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml index ad5206e..850feac 100644 --- a/src/main/resources/biomes.yml +++ b/src/main/resources/biomes.yml @@ -178,7 +178,7 @@ biomes: TALL_GRASS: 10:GRASS_BLOCK mobs: HORSE: 10:GRASS_BLOCK - moblimit: 9 + moblimit: 1 RIVER: friendlyname: "Clay river" biome: RIVER