From c299978e101dc8949a86a92c3feb8c363504f388 Mon Sep 17 00:00:00 2001 From: ASangarin Date: Thu, 1 Jul 2021 12:54:05 +0200 Subject: [PATCH] The block tag that prevents blocks from giving out XP now gets properly removed when a block is removed or when a block forms naturally in place of a placed block (Exploits COULD be present, please report anything you find out in tickets) --- .../source/MineBlockExperienceSource.java | 3 +- .../mmocore/listener/BlockListener.java | 27 ++++++++------ .../mmocore/manager/ConfigManager.java | 37 ++++++++----------- src/main/resources/config.yml | 2 + 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/api/experience/source/MineBlockExperienceSource.java b/src/main/java/net/Indyuce/mmocore/api/experience/source/MineBlockExperienceSource.java index b673af38..ab17a2b2 100644 --- a/src/main/java/net/Indyuce/mmocore/api/experience/source/MineBlockExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/api/experience/source/MineBlockExperienceSource.java @@ -34,8 +34,7 @@ public class MineBlockExperienceSource extends SpecificExperienceSource newManager() { return new ExperienceManager() { - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void a(BlockBreakEvent event) { if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) return; diff --git a/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java b/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java index 83e70fd8..8926490c 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java @@ -146,10 +146,19 @@ public class BlockListener implements Listener { } } + /* + * This is handled in a separate event because it + * needs to happen AFTER it's already checked the tag + */ + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void unregisterPlayerPlacedBlocksTag(BlockBreakEvent event) { + if(event.getBlock().hasMetadata("player_placed")) + event.getBlock().removeMetadata("player_placed", MMOCore.plugin); + } + @EventHandler(priority = EventPriority.HIGH) public void registerPlayerPlacedBlocksTag(BlockPlaceEvent event) { event.getBlock().setMetadata("player_placed", new FixedMetadataValue(MMOCore.plugin, true)); - } @@ -186,19 +195,15 @@ public class BlockListener implements Listener { * exp is not gained by these blocks */ - private boolean protect; - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void cobblestoneGeneratorHandling(BlockFormEvent event) { - if(MMOCore.plugin.getConfig().contains("should-cobblestone-generators-give-exp")) { - this.protect = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp"); - } else{ this.protect = false; } + if(event.getBlock().hasMetadata("player_placed")) + event.getBlock().removeMetadata("player_placed", MMOCore.plugin); + if(MMOCore.plugin.configManager.cobbleGeneratorXP) return; - if(!protect) { - if (event.getBlock().getType() == Material.WATER || event.getBlock().getType() == Material.LAVA) - if (event.getNewState().getType() == Material.COBBLESTONE || event.getNewState().getType() == Material.OBSIDIAN) - event.getNewState().setMetadata("player_placed", new FixedMetadataValue(MMOCore.plugin, true)); - } + if (event.getBlock().getType() == Material.WATER || event.getBlock().getType() == Material.LAVA) + if (event.getNewState().getType() == Material.COBBLESTONE || event.getNewState().getType() == Material.OBSIDIAN) + event.getNewState().setMetadata("player_placed", new FixedMetadataValue(MMOCore.plugin, true)); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index abda34d0..e2b31e6a 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -24,7 +24,7 @@ import java.util.logging.Level; public class ConfigManager { public final CommandVerbose commandVerbose = new CommandVerbose(); - public boolean overrideVanillaExp, canCreativeCast; + public boolean overrideVanillaExp, canCreativeCast, cobbleGeneratorXP; public double expPartyBuff, regenPartyBuff; public String partyChatPrefix, noSkillBoundPlaceholder; public ChatColor staminaFull, staminaHalf, staminaEmpty; @@ -94,22 +94,19 @@ public class ConfigManager { messages = new ConfigFile("messages").getConfig(); chatInput = MMOCore.plugin.getConfig().getBoolean("use-chat-input"); partyChatPrefix = MMOCore.plugin.getConfig().getString("party.chat-prefix"); - combatLogTimer = MMOCore.plugin.getConfig().getInt("combat-log.timer") * 1000; - lootChestExpireTime = Math.max(MMOCore.plugin.getConfig().getInt("loot-chests.chest-expire-time"), 1) * 1000; - lootChestPlayerCooldown = MMOCore.plugin.getConfig().getInt("player-cooldown") * 1000; + combatLogTimer = MMOCore.plugin.getConfig().getInt("combat-log.timer") * 1000L; + lootChestExpireTime = Math.max(MMOCore.plugin.getConfig().getInt("loot-chests.chest-expire-time"), 1) * 1000L; + lootChestPlayerCooldown = MMOCore.plugin.getConfig().getInt("player-cooldown") * 1000L; noSkillBoundPlaceholder = getSimpleMessage("no-skill-placeholder").message(); staminaFull = getColorOrDefault("stamina-whole", ChatColor.GREEN); staminaHalf = getColorOrDefault("stamina-half", ChatColor.DARK_GREEN); staminaEmpty = getColorOrDefault("stamina-empty", ChatColor.WHITE); - normalSwapAction = EnumUtils.getIfPresent(SwapAction.class, - MMOCore.plugin.getConfig().getString("swap-keybind.normal") - .toUpperCase()).orElse(SwapAction.VANILLA); - sneakingSwapAction = EnumUtils.getIfPresent(SwapAction.class, - MMOCore.plugin.getConfig().getString("swap-keybind.sneaking") - .toUpperCase()).orElse(SwapAction.VANILLA); + normalSwapAction = EnumUtils.getIfPresent(SwapAction.class, MMOCore.plugin.getConfig().getString("swap-keybind.normal").toUpperCase()).orElse(SwapAction.VANILLA); + sneakingSwapAction = EnumUtils.getIfPresent(SwapAction.class, MMOCore.plugin.getConfig().getString("swap-keybind.sneaking").toUpperCase()).orElse(SwapAction.VANILLA); canCreativeCast = MMOCore.plugin.getConfig().getBoolean("can-creative-cast"); + cobbleGeneratorXP = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp"); } private ChatColor getColorOrDefault(String key, ChatColor defaultColor) { @@ -132,16 +129,14 @@ public class ConfigManager { public void loadDefaultFile(String path, String name) { String newPath = path.isEmpty() ? "" : "/" + path; File folder = new File(MMOCore.plugin.getDataFolder() + (newPath)); - if (!folder.exists()) - folder.mkdir(); + if (!folder.exists()) folder.mkdir(); File file = new File(MMOCore.plugin.getDataFolder() + (newPath), name); - if (!file.exists()) - try { - Files.copy(MMOCore.plugin.getResource("default/" + (path.isEmpty() ? "" : path + "/") + name), file.getAbsoluteFile().toPath()); - } catch (IOException e) { - e.printStackTrace(); - } + if (!file.exists()) try { + Files.copy(MMOCore.plugin.getResource("default/" + (path.isEmpty() ? "" : path + "/") + name), file.getAbsoluteFile().toPath()); + } catch (IOException e) { + e.printStackTrace(); + } } public List getMessage(String key) { @@ -174,10 +169,8 @@ public class ConfigManager { String msg = hasPlaceholders ? MMOCore.plugin.placeholderParser.parse(player, message) : message; if (!msg.isEmpty()) { - if (actionbar) - PlayerData.get(player.getUniqueId()).displayActionBar(msg); - else - player.sendMessage(msg); + if (actionbar) PlayerData.get(player.getUniqueId()).displayActionBar(msg); + else player.sendMessage(msg); } return !msg.isEmpty(); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e6e2ccc8..ed50a14d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -58,6 +58,8 @@ custom-mine-conditions: # broken when custom mining conditions are met protect-custom-mine: false +# Whether blocks generated with a "cobblegenerator" should +# provide the player with experience points or not should-cobblestone-generators-give-exp: false loot-chests: