From 9115a9eed38abfd07c031cb413fce537a2ccd1df Mon Sep 17 00:00:00 2001 From: bonan Date: Sun, 8 Jun 2025 19:44:20 +0200 Subject: [PATCH 1/2] Add /autoreplant command to toggle automatic replanting of trees --- .../nabsuite/modules/mechs/MechsModule.java | 8 +++- .../mechs/command/AutoReplantCommand.java | 42 +++++++++++++++++++ .../modules/mechs/trees/TreeManager.java | 18 ++++++++ .../modules/mechs/trees/TreeReplanter.java | 8 +--- src/main/resources/plugin.yml | 2 + 5 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java index c7e85df..aaa31c6 100644 --- a/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java @@ -8,6 +8,7 @@ import com.froobworld.nabsuite.modules.mechs.command.EffectiveViewDistanceCommand; import com.froobworld.nabsuite.modules.mechs.command.PvpCommand; import com.froobworld.nabsuite.modules.mechs.command.ToggleViewDistanceCommand; +import com.froobworld.nabsuite.modules.mechs.command.AutoReplantCommand; import com.froobworld.nabsuite.modules.mechs.config.MechsConfig; import com.froobworld.nabsuite.modules.mechs.signedit.SignEditDisabler; import com.froobworld.nabsuite.modules.mechs.mobgriefing.MobGriefingManager; @@ -50,7 +51,8 @@ public void onEnable() { new PvpCommand(this), new ToggleViewDistanceCommand(this), //new EffectiveViewDistanceCommand(), - new BorderWarningCommand(this) + new BorderWarningCommand(this), + new AutoReplantCommand(this) ).forEach(getPlugin().getCommandManager()::registerCommand); } @@ -68,6 +70,10 @@ public PvpManager getPvpManager() { return pvpManager; } + public TreeManager getTreeManager() { + return treeManager; + } + public ViewDistanceManager getViewDistanceManager() { return viewDistanceManager; } diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java new file mode 100644 index 0000000..c5ee23c --- /dev/null +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java @@ -0,0 +1,42 @@ +package com.froobworld.nabsuite.modules.mechs.command; + +import cloud.commandframework.Command; +import cloud.commandframework.context.CommandContext; +import com.froobworld.nabsuite.command.NabCommand; +import com.froobworld.nabsuite.modules.mechs.MechsModule; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class AutoReplantCommand extends NabCommand { + private final MechsModule mechsModule; + + public AutoReplantCommand(MechsModule mechsModule) { + super( + "autoreplant", + "Toggle automatic tree replanting.", + "nabsuite.command.autoreplant", + Player.class + ); + this.mechsModule = mechsModule; + } + + @Override + public void execute(CommandContext context) { + Player sender = (Player) context.getSender(); + boolean current = mechsModule.getTreeManager().replantEnabled(sender); + + mechsModule.getTreeManager().setReplantEnabled(sender, !current); + if (current) { + sender.sendMessage(Component.text("Automatic tree replanting disabled.", NamedTextColor.YELLOW)); + } else { + sender.sendMessage(Component.text("Automatic tree replanting enabled.", NamedTextColor.YELLOW)); + } + } + + @Override + public Command.Builder populateBuilder(Command.Builder builder) { + return builder; + } +} diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java index eaf47bd..a158b46 100644 --- a/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java @@ -7,12 +7,15 @@ import com.google.common.collect.HashBiMap; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.Tag; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.persistence.PersistentDataType; import java.io.File; import java.util.regex.Pattern; @@ -22,8 +25,10 @@ public class TreeManager implements Listener { protected final DataSaver regionDataSaver; private final BiMap logRegionMap = HashBiMap.create(); private final File directory; + private final NamespacedKey replantPdcKey; public TreeManager(MechsModule mechsModule) { + this.replantPdcKey = new NamespacedKey(mechsModule.getPlugin(), "tree-replanter-enabled"); directory = new File(mechsModule.getDataFolder(), "unnatural-logs/"); regionDataSaver = new DataSaver(mechsModule.getPlugin(), 1200 * 5); logRegionMap.putAll(DataLoader.loadAll( @@ -73,4 +78,17 @@ private void onBlockPlace(BlockPlaceEvent event) { } } + public Boolean replantEnabled(Player player) { + if (player == null) { + return true; + } + return player.getPersistentDataContainer().getOrDefault(replantPdcKey, PersistentDataType.BOOLEAN, true); + } + + public void setReplantEnabled(Player player, boolean replant) { + if (player != null) { + player.getPersistentDataContainer().set(replantPdcKey, PersistentDataType.BOOLEAN, replant); + } + } + } diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeReplanter.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeReplanter.java index d06bce5..a8ce28c 100644 --- a/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeReplanter.java +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeReplanter.java @@ -1,10 +1,7 @@ package com.froobworld.nabsuite.modules.mechs.trees; import com.froobworld.nabsuite.modules.mechs.MechsModule; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Tag; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,13 +15,12 @@ public class TreeReplanter implements Listener { public TreeReplanter(MechsModule mechsModule, TreeManager treeManager) { this.mechsModule = mechsModule; this.treeManager = treeManager; - } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) private void onBlockBreak(BlockBreakEvent event) { if (Tag.LOGS.isTagged(event.getBlock().getType())) { - if (treeManager.isNaturalLog(event.getBlock().getLocation())) { + if (treeManager.replantEnabled(event.getPlayer()) && treeManager.isNaturalLog(event.getBlock().getLocation())) { Material saplingMaterial = saplingTypeForWood(event.getBlock().getType()); if (saplingMaterial != null) { schedulePlantTask(event.getBlock().getLocation(), saplingMaterial); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index fc4987c..ce16a35 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -323,6 +323,8 @@ permissions: description: "Access to the /effectivevd command." nabsuite.command.borderwarning: description: "Access to the /borderwarning command." + nabsuite.command.autoreplant: + description: "Access to the /autoreplant command." # Mechs module other permissions nabsuite.nabmode: From adc45159d7d53c60888f9e238d15c4c6a64b783d Mon Sep 17 00:00:00 2001 From: bonan Date: Mon, 9 Jun 2025 02:01:34 +0200 Subject: [PATCH 2/2] Don't persist preference. Rename command to /noreplant --- .../nabsuite/modules/mechs/MechsModule.java | 5 ++--- ...lantCommand.java => NoReplantCommand.java} | 10 ++++----- .../modules/mechs/trees/TreeManager.java | 22 ++++++++++++++----- src/main/resources/plugin.yml | 4 ++-- 4 files changed, 25 insertions(+), 16 deletions(-) rename src/main/java/com/froobworld/nabsuite/modules/mechs/command/{AutoReplantCommand.java => NoReplantCommand.java} (84%) diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java index aaa31c6..834e9f2 100644 --- a/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/MechsModule.java @@ -5,10 +5,9 @@ import com.froobworld.nabsuite.modules.mechs.border.WorldBorderManager; import com.froobworld.nabsuite.modules.mechs.chat.ClickableLinkReplacer; import com.froobworld.nabsuite.modules.mechs.command.BorderWarningCommand; -import com.froobworld.nabsuite.modules.mechs.command.EffectiveViewDistanceCommand; import com.froobworld.nabsuite.modules.mechs.command.PvpCommand; import com.froobworld.nabsuite.modules.mechs.command.ToggleViewDistanceCommand; -import com.froobworld.nabsuite.modules.mechs.command.AutoReplantCommand; +import com.froobworld.nabsuite.modules.mechs.command.NoReplantCommand; import com.froobworld.nabsuite.modules.mechs.config.MechsConfig; import com.froobworld.nabsuite.modules.mechs.signedit.SignEditDisabler; import com.froobworld.nabsuite.modules.mechs.mobgriefing.MobGriefingManager; @@ -52,7 +51,7 @@ public void onEnable() { new ToggleViewDistanceCommand(this), //new EffectiveViewDistanceCommand(), new BorderWarningCommand(this), - new AutoReplantCommand(this) + new NoReplantCommand(this) ).forEach(getPlugin().getCommandManager()::registerCommand); } diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/command/NoReplantCommand.java similarity index 84% rename from src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java rename to src/main/java/com/froobworld/nabsuite/modules/mechs/command/NoReplantCommand.java index c5ee23c..9815c01 100644 --- a/src/main/java/com/froobworld/nabsuite/modules/mechs/command/AutoReplantCommand.java +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/command/NoReplantCommand.java @@ -9,14 +9,14 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -public class AutoReplantCommand extends NabCommand { +public class NoReplantCommand extends NabCommand { private final MechsModule mechsModule; - public AutoReplantCommand(MechsModule mechsModule) { + public NoReplantCommand(MechsModule mechsModule) { super( - "autoreplant", + "noreplant", "Toggle automatic tree replanting.", - "nabsuite.command.autoreplant", + "nabsuite.command.noreplant", Player.class ); this.mechsModule = mechsModule; @@ -29,7 +29,7 @@ public void execute(CommandContext context) { mechsModule.getTreeManager().setReplantEnabled(sender, !current); if (current) { - sender.sendMessage(Component.text("Automatic tree replanting disabled.", NamedTextColor.YELLOW)); + sender.sendMessage(Component.text("Automatic tree replanting disabled temporarily.", NamedTextColor.YELLOW)); } else { sender.sendMessage(Component.text("Automatic tree replanting enabled.", NamedTextColor.YELLOW)); } diff --git a/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java b/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java index a158b46..fe65cd7 100644 --- a/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java +++ b/src/main/java/com/froobworld/nabsuite/modules/mechs/trees/TreeManager.java @@ -7,7 +7,6 @@ import com.google.common.collect.HashBiMap; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.NamespacedKey; import org.bukkit.Tag; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -15,9 +14,12 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.persistence.PersistentDataType; +import org.bukkit.event.player.PlayerQuitEvent; import java.io.File; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import java.util.regex.Pattern; public class TreeManager implements Listener { @@ -25,10 +27,9 @@ public class TreeManager implements Listener { protected final DataSaver regionDataSaver; private final BiMap logRegionMap = HashBiMap.create(); private final File directory; - private final NamespacedKey replantPdcKey; + private final Set noreplantPlayers = new HashSet<>(); public TreeManager(MechsModule mechsModule) { - this.replantPdcKey = new NamespacedKey(mechsModule.getPlugin(), "tree-replanter-enabled"); directory = new File(mechsModule.getDataFolder(), "unnatural-logs/"); regionDataSaver = new DataSaver(mechsModule.getPlugin(), 1200 * 5); logRegionMap.putAll(DataLoader.loadAll( @@ -78,16 +79,25 @@ private void onBlockPlace(BlockPlaceEvent event) { } } + @EventHandler(priority = EventPriority.MONITOR) + private void onPlayerQuit(PlayerQuitEvent event) { + noreplantPlayers.remove(event.getPlayer().getUniqueId()); + } + public Boolean replantEnabled(Player player) { if (player == null) { return true; } - return player.getPersistentDataContainer().getOrDefault(replantPdcKey, PersistentDataType.BOOLEAN, true); + return !noreplantPlayers.contains(player.getUniqueId()); } public void setReplantEnabled(Player player, boolean replant) { if (player != null) { - player.getPersistentDataContainer().set(replantPdcKey, PersistentDataType.BOOLEAN, replant); + if (!replant) { + noreplantPlayers.add(player.getUniqueId()); + } else { + noreplantPlayers.remove(player.getUniqueId()); + } } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ce16a35..3d5ebfa 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -323,8 +323,8 @@ permissions: description: "Access to the /effectivevd command." nabsuite.command.borderwarning: description: "Access to the /borderwarning command." - nabsuite.command.autoreplant: - description: "Access to the /autoreplant command." + nabsuite.command.noreplant: + description: "Access to the /noreplant command." # Mechs module other permissions nabsuite.nabmode: