From f726492eae9d566622cf8a95910da08294970321 Mon Sep 17 00:00:00 2001 From: evlad Date: Tue, 5 Jul 2022 19:35:00 +0200 Subject: [PATCH] add new placeholders and BlockGrowEvent --- .../java/world/bentobox/limits/Limits.java | 60 +++++++++++++++++++ .../limits/listeners/BlockLimitsListener.java | 33 ++++------ 2 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/main/java/world/bentobox/limits/Limits.java b/src/main/java/world/bentobox/limits/Limits.java index f75ecc9..eab5559 100644 --- a/src/main/java/world/bentobox/limits/Limits.java +++ b/src/main/java/world/bentobox/limits/Limits.java @@ -7,6 +7,7 @@ import java.util.stream.Collectors; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.entity.EntityType; import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.addons.GameModeAddon; @@ -138,6 +139,9 @@ public class Limits extends Addon { Arrays.stream(Material.values()) .filter(Material::isBlock) .forEach(m -> registerCountAndLimitPlaceholders(m, gm)); + + Arrays.stream(EntityType.values()) + .forEach(e -> registerCountAndLimitPlaceholders(e, gm)); } /** @@ -149,6 +153,8 @@ public class Limits extends Addon { * Placeholders: * "Limits_bskyblock_island_hopper_count" * "Limits_bskyblock_island_hopper_limit" + * "Limits_bskyblock_island_hopper_base_limit" + * "Limits_bskyblock_island_zombie_limit" * * @param m material * @param gm game mode @@ -160,6 +166,18 @@ public class Limits extends Addon { getPlugin().getPlaceholdersManager().registerPlaceholder(this, gm.getDescription().getName().toLowerCase() + "_island_" + m.toString().toLowerCase() + "_limit", user -> getLimit(user, m, gm)); + getPlugin().getPlaceholdersManager().registerPlaceholder(this, + gm.getDescription().getName().toLowerCase() + "_island_" + m.toString().toLowerCase() + "_base_limit", + user -> getBaseLimit(user, m, gm)); + } + + private void registerCountAndLimitPlaceholders(EntityType e, GameModeAddon gm) { + getPlugin().getPlaceholdersManager().registerPlaceholder(this, + gm.getDescription().getName().toLowerCase() + "_island_" + e.toString().toLowerCase() + "_limit", + user -> getLimit(user, e, gm)); + getPlugin().getPlaceholdersManager().registerPlaceholder(this, + gm.getDescription().getName().toLowerCase() + "_island_" + e.toString().toLowerCase() + "_base_limit", + user -> getBaseLimit(user, e, gm)); } /** @@ -199,4 +217,46 @@ public class Limits extends Addon { return limit == -1 ? LIMIT_NOT_SET : String.valueOf(limit); } + private String getBaseLimit(@Nullable User user, Material m, GameModeAddon gm) { + Island is = gm.getIslands().getIsland(gm.getOverWorld(), user); + if (is == null) { + return LIMIT_NOT_SET; + } + + int limit = this.getBlockLimitListener(). + getMaterialLimits(is.getWorld(), is.getUniqueId()). + getOrDefault(m, -1); + + if (limit > 0) { + limit -= this.getBlockLimitListener().getIsland(is).getBlockLimitOffset(m); + } + + return limit == -1 ? LIMIT_NOT_SET : String.valueOf(limit); + } + + private String getLimit(@Nullable User user, EntityType e, GameModeAddon gm) { + Island is = gm.getIslands().getIsland(gm.getOverWorld(), user); + if (is == null) { + return LIMIT_NOT_SET; + } + + int limit = this.getBlockLimitListener().getIsland(is).getEntityLimit(e); + if (limit < 0 && this.getSettings().getLimits().containsKey(e)) { + limit = this.getSettings().getLimits().get(e); + } + + return limit == -1 ? LIMIT_NOT_SET : String.valueOf(limit); + } + + private String getBaseLimit(@Nullable User user, EntityType e, GameModeAddon gm) { + Island is = gm.getIslands().getIsland(gm.getOverWorld(), user); + if (is == null || !this.getSettings().getLimits().containsKey(e)) { + return LIMIT_NOT_SET; + } + + int limit = this.getSettings().getLimits().get(e); + + return limit == -1 ? LIMIT_NOT_SET : String.valueOf(limit); + } + } diff --git a/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java b/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java index 1f5742b..5d64bd4 100644 --- a/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java +++ b/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java @@ -1,14 +1,6 @@ package world.bentobox.limits.listeners; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -23,18 +15,7 @@ import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockExplodeEvent; -import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.block.BlockFromToEvent; -import org.bukkit.event.block.BlockMultiPlaceEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.BlockSpreadEvent; -import org.bukkit.event.block.EntityBlockFormEvent; -import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -256,6 +237,16 @@ public class BlockLimitsListener implements Listener { process(e.getBlock(), true); } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onBlock(BlockGrowEvent e) { + if (process(e.getNewState().getBlock(), true) > -1) { + e.setCancelled(true); + e.getBlock().getWorld().getBlockAt(e.getBlock().getLocation()).setBlockData(e.getBlock().getBlockData()); + } else { + process(e.getBlock(), false); + } + } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onBlock(LeavesDecayEvent e) { process(e.getBlock(), false);