From 9c983569be75309f272580a7fd691b6667aeb874 Mon Sep 17 00:00:00 2001 From: Rhythmic System Date: Fri, 21 Nov 2025 20:48:12 -0800 Subject: [PATCH 1/4] Start moving stuff to brig --- pom.xml | 2 +- .../simplexity/simplefly/ConfigValues.java | 65 ------- .../java/simplexity/simplefly/Constants.java | 16 ++ .../simplexity/simplefly/FlyListeners.java | 44 ++--- .../java/simplexity/simplefly/FlyLogic.java | 40 +++- .../java/simplexity/simplefly/SimpleFly.java | 8 +- src/main/java/simplexity/simplefly/Util.java | 13 +- .../simplefly/commands/CommandUtils.java | 21 --- .../simplefly/commands/Exceptions.java | 30 +++ .../simplexity/simplefly/commands/Fly.java | 172 ++++++++++++++---- .../simplefly/commands/FlyReload.java | 5 +- .../simplefly/commands/FlySpeed.java | 23 ++- .../simplefly/commands/SuggestionUtils.java | 28 +++ .../simplefly/config/ConfigValues.java | 32 ++++ .../simplefly/config/LocaleHandler.java | 94 ++++++++++ .../simplefly/config/LocaleMessage.java | 59 ++++++ src/main/resources/config.yml | 33 ---- 17 files changed, 470 insertions(+), 215 deletions(-) delete mode 100644 src/main/java/simplexity/simplefly/ConfigValues.java create mode 100644 src/main/java/simplexity/simplefly/Constants.java delete mode 100644 src/main/java/simplexity/simplefly/commands/CommandUtils.java create mode 100644 src/main/java/simplexity/simplefly/commands/Exceptions.java create mode 100644 src/main/java/simplexity/simplefly/commands/SuggestionUtils.java create mode 100644 src/main/java/simplexity/simplefly/config/ConfigValues.java create mode 100644 src/main/java/simplexity/simplefly/config/LocaleHandler.java create mode 100644 src/main/java/simplexity/simplefly/config/LocaleMessage.java diff --git a/pom.xml b/pom.xml index a35c9a9..73b5ca4 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ io.papermc.paper paper-api - 1.20.2-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT provided diff --git a/src/main/java/simplexity/simplefly/ConfigValues.java b/src/main/java/simplexity/simplefly/ConfigValues.java deleted file mode 100644 index fd3baae..0000000 --- a/src/main/java/simplexity/simplefly/ConfigValues.java +++ /dev/null @@ -1,65 +0,0 @@ -package simplexity.simplefly; - -import org.bukkit.configuration.file.FileConfiguration; - -import java.util.logging.Logger; - -public class ConfigValues { - private static final Logger logger = SimpleFly.getFlyServer().getLogger(); - public static String papiFlightEnabled, papiFlightDisabled, prefix, enabled, disabled, flySetOther, - flySetOwn, flySetByOther, flySpeedGetOther, flySpeedGetOwn, flySpeedSetOwn, flySpeedResetOwn, - flySpeedSetOther, flySpeedResetOther, flySpeedSetByOther, flySpeedResetByOther, - invalidPlayer, noPermission, mustBePlayer, notEnoughArguments, invalidNumber, notInRange, - invalidCommand, configReloaded; - - public static float maxFlySpeed, minFlySpeed; - public static boolean sessionPersistentFlight, worldChangePersistentFlight, - respawnPersistentFlight, gamemodeChangePersistentFlight; - - public static void reloadConfigValues(){ - FileConfiguration config = SimpleFly.getInstance().getConfig(); - maxFlySpeed = config.getInt("max-fly-speed"); - if (maxFlySpeed > 10) { - logger.warning("Max fly speed cannot be greater than 10. Setting to 10"); - maxFlySpeed = 10; - } - minFlySpeed = config.getInt("min-fly-speed"); - if (minFlySpeed < -10) { - logger.warning("Min fly speed cannot be less than -10. Setting to -10"); - minFlySpeed = -10; - } - sessionPersistentFlight = config.getBoolean("session-persistent-flight"); - worldChangePersistentFlight = config.getBoolean("world-change-persistent-flight"); - respawnPersistentFlight = config.getBoolean("respawn-persistent-flight"); - gamemodeChangePersistentFlight = config.getBoolean("gamemode-change-persistent-flight"); - reloadLangValues(); - } - public static void reloadLangValues(){ - FileConfiguration config = SimpleFly.getInstance().getConfig(); - papiFlightEnabled = config.getString("papi-flight.enabled"); - papiFlightDisabled = config.getString("papi-flight.disabled"); - prefix = config.getString("insertion.prefix"); - enabled = config.getString("insertion.enabled"); - disabled = config.getString("insertion.disabled"); - flySetOther = config.getString("fly-set.other"); - flySetOwn = config.getString("fly-set.own"); - flySetByOther = config.getString("fly-set.by-other"); - flySpeedGetOther = config.getString("fly-speed-get.other"); - flySpeedGetOwn = config.getString("fly-speed-get.own"); - flySpeedSetOwn = config.getString("fly-speed-set.own"); - flySpeedResetOwn = config.getString("fly-speed-reset.own"); - flySpeedSetOther = config.getString("fly-speed-set.other"); - flySpeedResetOther = config.getString("fly-speed-reset.other"); - flySpeedSetByOther = config.getString("fly-speed-set.by-other"); - flySpeedResetByOther = config.getString("fly-speed-reset.by-other"); - invalidPlayer = config.getString("error.invalid-player"); - noPermission = config.getString("error.no-permission"); - mustBePlayer = config.getString("error.must-be-player"); - notEnoughArguments = config.getString("error.not-enough-arguments"); - invalidNumber = config.getString("error.invalid-number"); - notInRange = config.getString("error.not-in-range"); - invalidCommand = config.getString("error.invalid-command"); - configReloaded = config.getString("plugin-messages.config-reloaded"); - } - -} diff --git a/src/main/java/simplexity/simplefly/Constants.java b/src/main/java/simplexity/simplefly/Constants.java new file mode 100644 index 0000000..ca93457 --- /dev/null +++ b/src/main/java/simplexity/simplefly/Constants.java @@ -0,0 +1,16 @@ +package simplexity.simplefly; + +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.NamespacedKey; + +public class Constants { + + + + public static final NamespacedKey FLY_STATUS = new NamespacedKey(SimpleFly.getInstance(), "flystatus"); + public static final String FLY_PERMISSION = "simplefly.fly"; + public static final String FLY_SPEED_PERMISSION = "simplefly.flyspeed"; + public static final String FLY_OTHERS_PERMISSION = "simplefly.others.fly"; + public static final String FLY_SPEED_OTHERS_PERMISSION = "simplefly.others.flyspeed"; + +} diff --git a/src/main/java/simplexity/simplefly/FlyListeners.java b/src/main/java/simplexity/simplefly/FlyListeners.java index 2a9d2e1..b94eafa 100644 --- a/src/main/java/simplexity/simplefly/FlyListeners.java +++ b/src/main/java/simplexity/simplefly/FlyListeners.java @@ -1,5 +1,6 @@ package simplexity.simplefly; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; @@ -11,11 +12,13 @@ import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import simplexity.simplefly.config.ConfigValues; +import simplexity.simplefly.config.LocaleMessage; public class FlyListeners implements Listener { - - private static final NamespacedKey flyStatus = Util.flyStatus; - + + private static final NamespacedKey flyStatus = Constants.FLY_STATUS; + @EventHandler public void onPlayerLogin(PlayerJoinEvent joinEvent) { if (!ConfigValues.sessionPersistentFlight) { @@ -25,20 +28,18 @@ public void onPlayerLogin(PlayerJoinEvent joinEvent) { PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Bukkit.getScheduler().runTaskLater(SimpleFly.getInstance(), () -> { boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); - if (flyEnabled && player.hasPermission(Util.flyPermission)) { - player.setAllowFlight(true); - if (player.getFallDistance() > 0f) { - player.setFlying(true); - } - Util.sendUserMessage(player, ConfigValues.flySetOwn, ConfigValues.enabled, null); + if (flyEnabled && player.hasPermission(Constants.FLY_PERMISSION)) { + FlyLogic.flyEnable(player); + player.sendRichMessage(LocaleMessage.FLY_SET_OWN.getMessage(), + Placeholder.parsed("value", LocaleMessage.ENABLED.getMessage())); return; } - if (flyEnabled && !player.hasPermission(Util.flyPermission)) { - playerPDC.set(flyStatus, PersistentDataType.BOOLEAN, false); + if (flyEnabled && !player.hasPermission(Constants.FLY_PERMISSION)) { + FlyLogic.flyDisable(player); } }, 10); } - + @EventHandler public void onWorldChange(PlayerChangedWorldEvent worldEvent) { if (!ConfigValues.worldChangePersistentFlight) return; @@ -46,13 +47,10 @@ public void onWorldChange(PlayerChangedWorldEvent worldEvent) { PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); if (flyEnabled) { - player.setAllowFlight(true); - if (player.getFallDistance() > 0f) { - player.setFlying(true); - } + FlyLogic.flyEnable(player); } } - + @EventHandler public void onRespawn(PlayerRespawnEvent respawnEvent) { if (!ConfigValues.respawnPersistentFlight) return; @@ -60,10 +58,10 @@ public void onRespawn(PlayerRespawnEvent respawnEvent) { PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); if (flyEnabled) { - player.setAllowFlight(true); + FlyLogic.flyEnable(player); } } - + @EventHandler public void onGamemodeChange(PlayerGameModeChangeEvent gameModeChangeEvent) { if (!ConfigValues.gamemodeChangePersistentFlight) return; @@ -72,13 +70,9 @@ public void onGamemodeChange(PlayerGameModeChangeEvent gameModeChangeEvent) { Bukkit.getScheduler().runTaskLater(SimpleFly.getInstance(), () -> { Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); if (flyEnabled) { - player.setAllowFlight(true); - if (player.getFallDistance() > 0f) { - player.setFlying(true); - } + FlyLogic.flyEnable(player); } }, 10); } - - + } diff --git a/src/main/java/simplexity/simplefly/FlyLogic.java b/src/main/java/simplexity/simplefly/FlyLogic.java index 6418b20..ba1593c 100644 --- a/src/main/java/simplexity/simplefly/FlyLogic.java +++ b/src/main/java/simplexity/simplefly/FlyLogic.java @@ -1,28 +1,50 @@ package simplexity.simplefly; +import org.bukkit.Location; import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; public class FlyLogic { - private static final NamespacedKey flyStatus = Util.flyStatus; + private static final NamespacedKey flyStatus = Constants.FLY_STATUS; - public static boolean flyEnabled(Player player) { + public static boolean flyToggle(Player player) { PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyState = playerPDC.get(flyStatus, PersistentDataType.BOOLEAN); - //If they have no set flystate, or it's off, set true, set flying if (flyState == null || !flyState) { - playerPDC.set(flyStatus, PersistentDataType.BOOLEAN, true); - player.setAllowFlight(true); - player.setFlying(true); + flyEnable(player); return true; } - //If their current flystate is on, set false - playerPDC.set(flyStatus, PersistentDataType.BOOLEAN, false); + flyDisable(player); + return false; + } + + public static void setFlyStatus(Player player, boolean enable){ + if (enable && willFall(player)) player.setFlying(true); + player.getPersistentDataContainer().set(flyStatus, PersistentDataType.BOOLEAN, enable); + player.setAllowFlight(enable); + } + public static void flyEnable(Player player) { + player.getPersistentDataContainer().set(flyStatus, PersistentDataType.BOOLEAN, true); + player.setAllowFlight(true); + if (willFall(player)) { + player.setFlying(true); + } + } + + public static void flyDisable(Player player){ + player.getPersistentDataContainer().set(flyStatus, PersistentDataType.BOOLEAN, false); player.setAllowFlight(false); player.setFlying(false); - return false; + } + + private static boolean willFall(Player player){ + Location location = player.getLocation(); + Block blockBelow = location.clone().add(0, -1, 0).getBlock(); + Block blockTwoBelow = location.clone().add(0, -2, 0).getBlock(); + return blockBelow.isPassable() && blockTwoBelow.isPassable(); } } diff --git a/src/main/java/simplexity/simplefly/SimpleFly.java b/src/main/java/simplexity/simplefly/SimpleFly.java index 7b7e58a..23f33c2 100644 --- a/src/main/java/simplexity/simplefly/SimpleFly.java +++ b/src/main/java/simplexity/simplefly/SimpleFly.java @@ -1,11 +1,14 @@ package simplexity.simplefly; +import io.papermc.paper.plugin.lifecycle.event.LifecycleEvent; +import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Server; import org.bukkit.plugin.java.JavaPlugin; import simplexity.simplefly.commands.Fly; import simplexity.simplefly.commands.FlyReload; import simplexity.simplefly.commands.FlySpeed; +import simplexity.simplefly.config.ConfigValues; public final class SimpleFly extends JavaPlugin { @@ -33,8 +36,9 @@ public void onEnable() { this.saveDefaultConfig(); ConfigValues.reloadConfigValues(); this.getServer().getPluginManager().registerEvents(new simplexity.simplefly.FlyListeners(), this); - this.getCommand("fly").setExecutor(new Fly()); - this.getCommand("flyspeed").setExecutor(new FlySpeed()); + this.getLifecycleManager().registerEventHandler(LifecycleEvents.COMMANDS, commands -> { + commands.registrar().register(Fly.createCommand().build()); + }); this.getCommand("flyreload").setExecutor(new FlyReload()); } diff --git a/src/main/java/simplexity/simplefly/Util.java b/src/main/java/simplexity/simplefly/Util.java index f5fb1b4..c8cea78 100644 --- a/src/main/java/simplexity/simplefly/Util.java +++ b/src/main/java/simplexity/simplefly/Util.java @@ -3,24 +3,17 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; public class Util { - + private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); - - public static final NamespacedKey flyStatus = new NamespacedKey(SimpleFly.getInstance(), "flystatus"); - public static final String flyPermission = "simplefly.fly"; - public static final String flySpeedPermission = "simplefly.flyspeed"; - public static final String flyOthersPermission = "simplefly.others.fly"; - public static final String flySpeedOthersPermission = "simplefly.others.flyspeed"; - + public static void sendUserMessage(CommandSender sender, String message) { if (message.isEmpty()) return; sender.sendMessage(miniMessage.deserialize(message)); } - + public static void sendUserMessage(CommandSender userToSendTo, String message, String value, CommandSender userToParse) { if (message.isEmpty()) return; diff --git a/src/main/java/simplexity/simplefly/commands/CommandUtils.java b/src/main/java/simplexity/simplefly/commands/CommandUtils.java deleted file mode 100644 index 553385b..0000000 --- a/src/main/java/simplexity/simplefly/commands/CommandUtils.java +++ /dev/null @@ -1,21 +0,0 @@ -package simplexity.simplefly.commands; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import simplexity.simplefly.ConfigValues; - -public class CommandUtils { - - public static boolean checkIfPlayerAndPerms(CommandSender sender, String permission) { - if (!(sender instanceof Player player)) { - sender.sendRichMessage(ConfigValues.mustBePlayer); - return false; - } - if (!player.hasPermission(permission)) { - player.sendRichMessage(ConfigValues.noPermission); - return false; - } - return true; - } - -} diff --git a/src/main/java/simplexity/simplefly/commands/Exceptions.java b/src/main/java/simplexity/simplefly/commands/Exceptions.java new file mode 100644 index 0000000..4cb7b15 --- /dev/null +++ b/src/main/java/simplexity/simplefly/commands/Exceptions.java @@ -0,0 +1,30 @@ +package simplexity.simplefly.commands; + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import net.kyori.adventure.text.minimessage.MiniMessage; +import simplexity.simplefly.SimpleFly; +import simplexity.simplefly.config.LocaleMessage; + +public class Exceptions { + private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); + + public static final SimpleCommandExceptionType ERROR_MUST_BE_PLAYER = new SimpleCommandExceptionType( + parseMessage(LocaleMessage.ERROR_MUST_BE_PLAYER)); + + public static final SimpleCommandExceptionType NO_USERS_FOUND = new SimpleCommandExceptionType( + parseMessage(LocaleMessage.ERROR_INVALID_PLAYER)); + + public static final SimpleCommandExceptionType MUST_SPECIFY_FLY_STATE = new SimpleCommandExceptionType( + parseMessage(LocaleMessage.ERROR_MUST_PROVIDE_STATE) + ); + + + private static Message parseMessage(LocaleMessage message) { + return MessageComponentSerializer.message().serialize( + miniMessage.deserialize(message.getMessage()) + ); + } +} diff --git a/src/main/java/simplexity/simplefly/commands/Fly.java b/src/main/java/simplexity/simplefly/commands/Fly.java index 4de9b3e..86131ce 100644 --- a/src/main/java/simplexity/simplefly/commands/Fly.java +++ b/src/main/java/simplexity/simplefly/commands/Fly.java @@ -1,54 +1,150 @@ package simplexity.simplefly.commands; -import org.bukkit.command.Command; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; +import io.papermc.paper.command.brigadier.argument.ArgumentTypes; +import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import simplexity.simplefly.ConfigValues; +import simplexity.simplefly.Constants; import simplexity.simplefly.FlyLogic; import simplexity.simplefly.SimpleFly; -import simplexity.simplefly.Util; +import simplexity.simplefly.config.LocaleMessage; import java.util.List; -public class Fly implements TabExecutor { - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - if (args.length == 0) { - if (CommandUtils.checkIfPlayerAndPerms(sender, Util.flyPermission)) { - if (FlyLogic.flyEnabled((Player) sender)) { - Util.sendUserMessage(sender, ConfigValues.flySetOwn, ConfigValues.enabled, null); - return true; - } else { - Util.sendUserMessage(sender, ConfigValues.flySetOwn, ConfigValues.disabled, null); - return true; - } - } else { - return false; - } +@SuppressWarnings("UnstableApiUsage") +public class Fly { + + private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); + + public static LiteralArgumentBuilder createCommand() { + return Commands.literal("fly") + .requires(Fly::canExecute) + .executes(Fly::execute) + .then( + Commands.literal("enable").executes( + ctx -> executeWithArg(ctx, true) + )) + .then(Commands.literal("disable").executes( + ctx -> executeWithArg(ctx, false) + )) + .then(Commands.literal("admin") + .requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_OTHERS_PERMISSION)) + .then( + Commands.argument("player", ArgumentTypes.player()) + .suggests(SuggestionUtils::suggestPlayers)) + .executes(Fly::executeOnOther) + .then(Commands.literal("enable").executes(ctx -> executeOnOtherWithArg(ctx, true))) + .then(Commands.literal("disable").executes(ctx -> executeOnOtherWithArg(ctx, false)))); + } + + private static boolean canExecute(CommandSourceStack css) { + if (!(css.getSender() instanceof Player player)) return false; + return player.hasPermission(Constants.FLY_PERMISSION); + } + + private static int execute(CommandContext ctx) throws CommandSyntaxException { + CommandSender sender = ctx.getSource().getSender(); + if (!(sender instanceof Player player)) throw Exceptions.ERROR_MUST_BE_PLAYER.create(); + boolean flyEnabled = FlyLogic.flyToggle(player); + sendOwnMessage(flyEnabled, player); + return Command.SINGLE_SUCCESS; + } + + private static int executeWithArg(CommandContext ctx, boolean enableFlight) throws CommandSyntaxException { + CommandSender sender = ctx.getSource().getSender(); + if (!(sender instanceof Player player)) throw Exceptions.ERROR_MUST_BE_PLAYER.create(); + FlyLogic.setFlyStatus(player, enableFlight); + sendOwnMessage(enableFlight, player); + return Command.SINGLE_SUCCESS; + } + + private static int executeOnOther(CommandContext ctx) throws CommandSyntaxException { + CommandSender sender = ctx.getSource().getSender(); + PlayerSelectorArgumentResolver playerArg = ctx.getArgument("player", PlayerSelectorArgumentResolver.class); + List targets = playerArg.resolve(ctx.getSource()); + int size = targets.size(); + if (size == 0) { + throw Exceptions.NO_USERS_FOUND.create(); + } else if (size > 1) { + throw Exceptions.MUST_SPECIFY_FLY_STATE.create(); + } + Player player = targets.getFirst(); + boolean flyEnabled = FlyLogic.flyToggle(player); + player.sendMessage(getParsedComponent(flyEnabled, player, sender, LocaleMessage.FLY_SET_BY_OTHER.getMessage())); + sender.sendMessage(getParsedComponent(flyEnabled, player, sender, LocaleMessage.FLY_SET_OTHER.getMessage())); + return Command.SINGLE_SUCCESS; + } + + private static int executeOnOtherWithArg(CommandContext ctx, boolean shouldEnable) throws CommandSyntaxException { + CommandSender sender = ctx.getSource().getSender(); + PlayerSelectorArgumentResolver playerArg = ctx.getArgument("player", PlayerSelectorArgumentResolver.class); + List targets = playerArg.resolve(ctx.getSource()); + if (targets.isEmpty()) throw Exceptions.NO_USERS_FOUND.create(); + if (targets.size() == 1) { + Player player = targets.getFirst(); + FlyLogic.setFlyStatus(player, shouldEnable); + player.sendMessage(getParsedComponent(shouldEnable, player, sender, LocaleMessage.FLY_SET_BY_OTHER.getMessage())); + sender.sendMessage(getParsedComponent(shouldEnable, player, sender, LocaleMessage.FLY_SET_OTHER.getMessage())); + return Command.SINGLE_SUCCESS; } - if (!sender.hasPermission(Util.flyOthersPermission)) return false; - Player player = SimpleFly.getFlyServer().getPlayer(args[0]); - if (player == null) { - Util.sendUserMessage(sender, ConfigValues.invalidPlayer); - return false; + int modified = 0; + for (Player player : targets) { + FlyLogic.setFlyStatus(player, shouldEnable); + player.sendMessage(getParsedComponent(shouldEnable, player, sender, LocaleMessage.FLY_SET_BY_OTHER.getMessage())); + modified++; } - if (FlyLogic.flyEnabled(player)) { - Util.sendUserMessage(sender, ConfigValues.flySetOther, ConfigValues.enabled, player); - Util.sendUserMessage(player, ConfigValues.flySetByOther, ConfigValues.enabled, sender); - return true; + String enabledString; + if (shouldEnable) { + enabledString = LocaleMessage.ENABLED.getMessage(); } else { - Util.sendUserMessage(sender, ConfigValues.flySetOther, ConfigValues.disabled, player); - Util.sendUserMessage(player, ConfigValues.flySetByOther, ConfigValues.disabled, sender); - return true; + enabledString = LocaleMessage.DISABLED.getMessage(); } + sender.sendRichMessage(LocaleMessage.FLY_SET_MANY_OTHER_ARG.getMessage(), + Placeholder.parsed("value", enabledString), + Placeholder.parsed("count", String.valueOf(modified))); + return Command.SINGLE_SUCCESS; } - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { - return null; + + private static void sendOwnMessage(boolean flyEnabled, Player player) { + String enabledString; + if (flyEnabled) { + enabledString = LocaleMessage.ENABLED.getMessage(); + } else { + enabledString = LocaleMessage.DISABLED.getMessage(); + } + player.sendRichMessage(LocaleMessage.FLY_SET_OWN.getMessage(), + Placeholder.parsed("value", enabledString)); + } + + private static Component getParsedComponent(boolean flyEnabled, Player target, CommandSender source, String message) { + String enabledString; + if (flyEnabled) { + enabledString = LocaleMessage.ENABLED.getMessage(); + } else { + enabledString = LocaleMessage.DISABLED.getMessage(); + } + Component targetName = target.displayName(); + Component senderName; + if (source instanceof Player player) { + senderName = player.displayName(); + } else { + senderName = miniMessage.deserialize(LocaleMessage.SERVER_NAME.getMessage()); + } + return miniMessage.deserialize(message, + Placeholder.parsed("value", enabledString), + Placeholder.component("initiator", senderName), + Placeholder.component("target", targetName)); } + + } + diff --git a/src/main/java/simplexity/simplefly/commands/FlyReload.java b/src/main/java/simplexity/simplefly/commands/FlyReload.java index a7eb70c..ac5d4f5 100644 --- a/src/main/java/simplexity/simplefly/commands/FlyReload.java +++ b/src/main/java/simplexity/simplefly/commands/FlyReload.java @@ -4,15 +4,16 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import simplexity.simplefly.ConfigValues; +import simplexity.simplefly.config.ConfigValues; import simplexity.simplefly.Util; +import simplexity.simplefly.config.LocaleMessage; public class FlyReload implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { ConfigValues.reloadConfigValues(); - Util.sendUserMessage(sender, ConfigValues.configReloaded); + sender.sendRichMessage(LocaleMessage.FEEDBACK_CONFIG_RELOADED.getMessage()); return false; } } diff --git a/src/main/java/simplexity/simplefly/commands/FlySpeed.java b/src/main/java/simplexity/simplefly/commands/FlySpeed.java index cf5ea83..fef92e5 100644 --- a/src/main/java/simplexity/simplefly/commands/FlySpeed.java +++ b/src/main/java/simplexity/simplefly/commands/FlySpeed.java @@ -8,24 +8,27 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import simplexity.simplefly.ConfigValues; +import simplexity.simplefly.config.ConfigValues; import simplexity.simplefly.SimpleFly; +import simplexity.simplefly.Constants; import simplexity.simplefly.Util; import java.util.ArrayList; import java.util.List; -public class FlySpeed implements TabExecutor { +public class FlySpeed { private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); private static final ArrayList tabComplete = new ArrayList<>(); private static final String setArg = "set"; private static final String resetArg = "reset"; private static final String getArg = "get"; - + + + /* @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - boolean hasOtherPermission = sender.hasPermission(Util.flyOthersPermission); + boolean hasOtherPermission = sender.hasPermission(Constants.FLY_OTHERS_PERMISSION); switch (args.length) { case 0 -> { getOwnFlySpeed(sender); @@ -159,7 +162,7 @@ private void setOwnSpeed(CommandSender sender, String[] args) { secondArgument, null); } catch (NumberFormatException e) { player = SimpleFly.getFlyServer().getPlayer(secondArgument); - if (player == null || !sender.hasPermission(Util.flySpeedOthersPermission)) { + if (player == null || !sender.hasPermission(Constants.FLY_SPEED_OTHERS_PERMISSION)) { Util.sendUserMessage(sender, ConfigValues.invalidNumber); return; } @@ -168,14 +171,14 @@ private void setOwnSpeed(CommandSender sender, String[] args) { } private void resetOwnFlySpeed(CommandSender sender) { - if (CommandUtils.checkIfPlayerAndPerms(sender, Util.flySpeedPermission)) { + if (CommandUtils.checkIfPlayerAndPerms(sender, Constants.FLY_SPEED_PERMISSION)) { ((Player) sender).setFlySpeed(0.1f); Util.sendUserMessage(sender, ConfigValues.flySpeedResetOwn); } } private void getOwnFlySpeed(CommandSender sender) { - if (CommandUtils.checkIfPlayerAndPerms(sender, Util.flySpeedPermission)) { + if (CommandUtils.checkIfPlayerAndPerms(sender, Constants.FLY_SPEED_PERMISSION)) { float flyspeed = ((Player) sender).getFlySpeed() * 10f; Util.sendUserMessage(sender, ConfigValues.flySpeedGetOwn, String.valueOf(flyspeed), null); @@ -186,11 +189,11 @@ private void getOwnFlySpeed(CommandSender sender) { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - if (sender.hasPermission(Util.flySpeedPermission) && args.length == 1) { + if (sender.hasPermission(Constants.FLY_SPEED_PERMISSION) && args.length == 1) { tabComplete.clear(); tabComplete.add(setArg); tabComplete.add(resetArg); - if (sender.hasPermission(Util.flySpeedOthersPermission)) { + if (sender.hasPermission(Constants.FLY_SPEED_OTHERS_PERMISSION)) { tabComplete.add(getArg); } return tabComplete; @@ -200,4 +203,6 @@ private void getOwnFlySpeed(CommandSender sender) { } return null; } + + */ } diff --git a/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java b/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java new file mode 100644 index 0000000..8a9e01f --- /dev/null +++ b/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java @@ -0,0 +1,28 @@ +package simplexity.simplefly.commands; + +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.concurrent.CompletableFuture; + +public class SuggestionUtils { + public static CompletableFuture suggestPlayers(CommandContext context, SuggestionsBuilder builder) { + CommandSourceStack css = (CommandSourceStack) context.getSource(); + Player playerSender = null; + if (css.getSender() instanceof Player) playerSender = (Player) css.getSender(); + for (Player player : Bukkit.getOnlinePlayers()) { + if (playerSender == null) { + builder.suggest(player.getName()); + continue; + } + if (playerSender.canSee(player) && !player.equals(playerSender)) { + builder.suggest(player.getName()); + } + } + return builder.buildFuture(); + } +} diff --git a/src/main/java/simplexity/simplefly/config/ConfigValues.java b/src/main/java/simplexity/simplefly/config/ConfigValues.java new file mode 100644 index 0000000..c52f531 --- /dev/null +++ b/src/main/java/simplexity/simplefly/config/ConfigValues.java @@ -0,0 +1,32 @@ +package simplexity.simplefly.config; + +import org.bukkit.configuration.file.FileConfiguration; +import org.slf4j.Logger; +import simplexity.simplefly.SimpleFly; + +public class ConfigValues { + private static final Logger logger = SimpleFly.getInstance().getSLF4JLogger(); + + public static float maxFlySpeed, minFlySpeed; + public static boolean sessionPersistentFlight, worldChangePersistentFlight, + respawnPersistentFlight, gamemodeChangePersistentFlight; + + public static void reloadConfigValues(){ + FileConfiguration config = SimpleFly.getInstance().getConfig(); + maxFlySpeed = config.getInt("max-fly-speed"); + if (maxFlySpeed > 10) { + logger.warn("Max fly speed cannot be greater than 10. Setting to 10"); + maxFlySpeed = 10; + } + minFlySpeed = config.getInt("min-fly-speed"); + if (minFlySpeed < -10) { + logger.warn("Min fly speed cannot be less than -10. Setting to -10"); + minFlySpeed = -10; + } + sessionPersistentFlight = config.getBoolean("session-persistent-flight"); + worldChangePersistentFlight = config.getBoolean("world-change-persistent-flight"); + respawnPersistentFlight = config.getBoolean("respawn-persistent-flight"); + gamemodeChangePersistentFlight = config.getBoolean("gamemode-change-persistent-flight"); + } + +} diff --git a/src/main/java/simplexity/simplefly/config/LocaleHandler.java b/src/main/java/simplexity/simplefly/config/LocaleHandler.java new file mode 100644 index 0000000..746e94e --- /dev/null +++ b/src/main/java/simplexity/simplefly/config/LocaleHandler.java @@ -0,0 +1,94 @@ +package simplexity.simplefly.config; + +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.slf4j.Logger; +import simplexity.simplefly.SimpleFly; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +public class LocaleHandler { + + + private static final Logger logger = SimpleFly.getInstance().getSLF4JLogger(); + private static LocaleHandler instance; + private final String fileName = "locale.yml"; + private final File dataFile = new File(SimpleFly.getInstance().getDataFolder(), fileName); + private FileConfiguration locale = new YamlConfiguration(); + + private LocaleHandler() { + Path dataFilePath = dataFile.toPath(); + Path parentDir = dataFilePath.getParent(); + try { + if (parentDir != null) { + Files.createDirectories(parentDir); + } + + if (Files.notExists(dataFilePath)) { + Files.createFile(dataFilePath); + } + + reloadLocale(); + } catch (IOException e) { + logger.warn("Unable to initialize locale.yml! Error: {}", e.getMessage(), e); + } + } + + public static LocaleHandler getInstance() { + if (instance == null) { + instance = new LocaleHandler(); + } + return instance; + } + + public void reloadLocale() { + try { + locale.load(dataFile); + populateLocale(); + sortLocale(); + saveLocale(); + } catch (IOException | InvalidConfigurationException e) { + logger.warn("Unable to reload Locale! Error: {}", e.getMessage(), e); + } + } + + + private void populateLocale() { + Set missing = new HashSet<>(Arrays.asList(LocaleMessage.values())); + for (LocaleMessage localeMessage : LocaleMessage.values()) { + if (locale.contains(localeMessage.getPath())) { + localeMessage.setMessage(locale.getString(localeMessage.getPath())); + missing.remove(localeMessage); + } + } + + for (LocaleMessage localeMessage : missing) { + locale.set(localeMessage.getPath(), localeMessage.getMessage()); + } + + + } + + private void sortLocale() { + FileConfiguration newLocale = new YamlConfiguration(); + List keys = new ArrayList<>(locale.getKeys(true)); + Collections.sort(keys); + for (String key : keys) { + newLocale.set(key, locale.getString(key)); + } + locale = newLocale; + } + + private void saveLocale() { + try { + locale.save(dataFile); + } catch (IOException e) { + logger.warn("Unable to save Locale! Error: {}", e.getMessage(), e); + } + } +} diff --git a/src/main/java/simplexity/simplefly/config/LocaleMessage.java b/src/main/java/simplexity/simplefly/config/LocaleMessage.java new file mode 100644 index 0000000..6c621c8 --- /dev/null +++ b/src/main/java/simplexity/simplefly/config/LocaleMessage.java @@ -0,0 +1,59 @@ +package simplexity.simplefly.config; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public enum LocaleMessage { + + PAPI_FLIGHT_ENABLED("papi-flight.enabled", "[F]"), + PAPI_FLIGHT_DISABLED("papi-flight.disabled", ""), + PREFIX("insertion.prefix", "[SF] "), + ENABLED("insertion.enabled", "enabled"), + DISABLED("insertion.disabled", "disabled"), + SERVER_NAME("insertion.server-name", "[Server]"), + FLY_SET_OWN("fly-set.own", "Your fly has been "), + FLY_SET_OTHER("fly-set.other", "'s fly has been "), + FLY_SET_OTHER_MANY("fly-set.many-other", "You have altered player's fly states."), + FLY_SET_MANY_OTHER_ARG("fly-set.many-other-with-arg", "You have players' fly states"), + FLY_SET_BY_OTHER("fly-set.by-other", "Your fly has been by "), + FLY_SPEED_GET_OWN("fly-speed-get.own", "Your flyspeed is currently set to "), + FLY_SPEED_GET_OTHER("fly-speed-get.other", "'s current flyspeed is "), + FLY_SPEED_SET_OWN("fly-speed-set.own", "Your flyspeed has been set to "), + FLY_SPEED_SET_OTHER("fly-speed-set.other", "You set 's flyspeed to "), + FLY_SPEED_SET_BY_OTHER("fly-speed-set.by-other", "Your flyspeed has been set to by "), + FLY_SPEED_RESET_OWN("fly-speed-reset.own", "Your flyspeed has been reset"), + FLY_SPEED_RESET_OTHER("fly-speed-reset.other", "'s flyspeed has been reset"), + FLY_SPEED_RESET_BY_OTHER("fly-speed-reset.by-other", "Your flyspeed has been reset by "), + ERROR_INVALID_PLAYER("error.invalid-player", "That is not a valid player. Please check your spelling and try again"), + ERROR_NO_PERMISSION("error.no-permission", "You do not have permission to run this command"), + ERROR_MUST_BE_PLAYER("error.must-be-player", "You must be a player to run this command"), + ERROR_NOT_ENOUGH_ARGUMENTS("error.not-enough-arguments", "You did not provide enough arguments. Please check your syntax and try again"), + ERROR_INVALID_NUMBER("error.invalid-number", "Sorry, you did not enter a valid flyspeed, please try again"), + ERROR_NOT_IN_RANGE("error.not-in-range", "Sorry, you must provide a number between and "), + ERROR_INVALID_COMMAND("error.invalid-command", "Sorry, that subcommand is invalid. Please check your syntax and try again"), + ERROR_MUST_PROVIDE_STATE("error.must-provide-state", "In order to toggle fly state for multiple players simultaneously, you will need to specify a fly state"), + FEEDBACK_CONFIG_RELOADED("plugin-messages.config-reloaded", "Config Reloaded"); + private final String path; + private String message; + + LocaleMessage(String path, String message) { + this.path = path; + this.message = message; + } + + @NotNull + public String getPath() { + return path; + } + + @NotNull + public String getMessage() { + if (message == null) return ""; + return message; + } + + public void setMessage(@Nullable String message) { + if (message == null) message = ""; + this.message = message; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4df2a8b..816a537 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,36 +8,3 @@ "world-change-persistent-flight" : true "respawn-persistent-flight" : true "gamemode-change-persistent-flight" : true -# lang -papi-flight: - enabled: "[F]" - disabled: "" -fly-set: - own: "Your fly has been " - other: "'s fly has been " - by-other: "Your fly has been by " -fly-speed-set: - own: "Your flyspeed has been set to " - other: "You set 's flyspeed to " - by-other: "Your flyspeed has been set to by " -fly-speed-reset: - own: "Your flyspeed has been reset" - other: "'s flyspeed has been reset" - by-other: "Your flyspeed has been reset by " -fly-speed-get: - own: "Your flyspeed is currently set to " - other: "'s current flyspeed is " -insertion: - prefix : "[SF] " - enabled : "enabled" - disabled : "disabled" -error: - invalid-player : "That is not a valid player. Please check your spelling and try again" - no-permission : "You do not have permission to run this command" - must-be-player : "You must be a player to run this command" - not-enough-arguments : "You did not provide enough arguments. Please check your syntax and try again" - invalid-number : "Sorry, you did not enter a valid flyspeed, please try again" - not-in-range : "Sorry, you must provide a number between and " - invalid-command : "Sorry, that subcommand is invalid. Please check your syntax and try again" -plugin-messages: - config-reloaded: "Config Reloaded" From 0283a3d4f205976ff4b66d6e556ac4e2b4f65885 Mon Sep 17 00:00:00 2001 From: Rhythmic System Date: Mon, 24 Nov 2025 13:08:53 -0800 Subject: [PATCH 2/4] some more refactoring --- .../java/simplexity/simplefly/Constants.java | 1 + .../simplexity/simplefly/FlyListeners.java | 10 +++--- .../java/simplexity/simplefly/SimpleFly.java | 8 ++--- .../simplexity/simplefly/commands/Fly.java | 11 ++++--- .../simplefly/commands/FlyReload.java | 31 +++++++++++-------- .../simplefly/commands/FlySpeed.java | 12 ------- .../{ConfigValues.java => ConfigHandler.java} | 2 +- .../simplefly/config/LocaleMessage.java | 4 +-- 8 files changed, 36 insertions(+), 43 deletions(-) rename src/main/java/simplexity/simplefly/config/{ConfigValues.java => ConfigHandler.java} (97%) diff --git a/src/main/java/simplexity/simplefly/Constants.java b/src/main/java/simplexity/simplefly/Constants.java index ca93457..f9929b9 100644 --- a/src/main/java/simplexity/simplefly/Constants.java +++ b/src/main/java/simplexity/simplefly/Constants.java @@ -12,5 +12,6 @@ public class Constants { public static final String FLY_SPEED_PERMISSION = "simplefly.flyspeed"; public static final String FLY_OTHERS_PERMISSION = "simplefly.others.fly"; public static final String FLY_SPEED_OTHERS_PERMISSION = "simplefly.others.flyspeed"; + public static final String FLY_RELOAD = "simplefly.reload"; } diff --git a/src/main/java/simplexity/simplefly/FlyListeners.java b/src/main/java/simplexity/simplefly/FlyListeners.java index b94eafa..2cf1cf2 100644 --- a/src/main/java/simplexity/simplefly/FlyListeners.java +++ b/src/main/java/simplexity/simplefly/FlyListeners.java @@ -12,7 +12,7 @@ import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; -import simplexity.simplefly.config.ConfigValues; +import simplexity.simplefly.config.ConfigHandler; import simplexity.simplefly.config.LocaleMessage; public class FlyListeners implements Listener { @@ -21,7 +21,7 @@ public class FlyListeners implements Listener { @EventHandler public void onPlayerLogin(PlayerJoinEvent joinEvent) { - if (!ConfigValues.sessionPersistentFlight) { + if (!ConfigHandler.sessionPersistentFlight) { return; } Player player = joinEvent.getPlayer(); @@ -42,7 +42,7 @@ public void onPlayerLogin(PlayerJoinEvent joinEvent) { @EventHandler public void onWorldChange(PlayerChangedWorldEvent worldEvent) { - if (!ConfigValues.worldChangePersistentFlight) return; + if (!ConfigHandler.worldChangePersistentFlight) return; Player player = worldEvent.getPlayer(); PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); @@ -53,7 +53,7 @@ public void onWorldChange(PlayerChangedWorldEvent worldEvent) { @EventHandler public void onRespawn(PlayerRespawnEvent respawnEvent) { - if (!ConfigValues.respawnPersistentFlight) return; + if (!ConfigHandler.respawnPersistentFlight) return; Player player = respawnEvent.getPlayer(); PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); @@ -64,7 +64,7 @@ public void onRespawn(PlayerRespawnEvent respawnEvent) { @EventHandler public void onGamemodeChange(PlayerGameModeChangeEvent gameModeChangeEvent) { - if (!ConfigValues.gamemodeChangePersistentFlight) return; + if (!ConfigHandler.gamemodeChangePersistentFlight) return; Player player = gameModeChangeEvent.getPlayer(); PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Bukkit.getScheduler().runTaskLater(SimpleFly.getInstance(), () -> { diff --git a/src/main/java/simplexity/simplefly/SimpleFly.java b/src/main/java/simplexity/simplefly/SimpleFly.java index 23f33c2..e732a11 100644 --- a/src/main/java/simplexity/simplefly/SimpleFly.java +++ b/src/main/java/simplexity/simplefly/SimpleFly.java @@ -1,14 +1,12 @@ package simplexity.simplefly; -import io.papermc.paper.plugin.lifecycle.event.LifecycleEvent; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Server; import org.bukkit.plugin.java.JavaPlugin; import simplexity.simplefly.commands.Fly; import simplexity.simplefly.commands.FlyReload; -import simplexity.simplefly.commands.FlySpeed; -import simplexity.simplefly.config.ConfigValues; +import simplexity.simplefly.config.ConfigHandler; public final class SimpleFly extends JavaPlugin { @@ -34,12 +32,12 @@ public void onEnable() { instance = this; flyServer = this.getServer(); this.saveDefaultConfig(); - ConfigValues.reloadConfigValues(); + ConfigHandler.reloadConfigValues(); this.getServer().getPluginManager().registerEvents(new simplexity.simplefly.FlyListeners(), this); this.getLifecycleManager().registerEventHandler(LifecycleEvents.COMMANDS, commands -> { commands.registrar().register(Fly.createCommand().build()); + commands.registrar().register(FlyReload.createCommand().build()); }); - this.getCommand("flyreload").setExecutor(new FlyReload()); } } diff --git a/src/main/java/simplexity/simplefly/commands/Fly.java b/src/main/java/simplexity/simplefly/commands/Fly.java index 86131ce..cdf66e5 100644 --- a/src/main/java/simplexity/simplefly/commands/Fly.java +++ b/src/main/java/simplexity/simplefly/commands/Fly.java @@ -40,10 +40,10 @@ public static LiteralArgumentBuilder createCommand() { .requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_OTHERS_PERMISSION)) .then( Commands.argument("player", ArgumentTypes.player()) - .suggests(SuggestionUtils::suggestPlayers)) - .executes(Fly::executeOnOther) - .then(Commands.literal("enable").executes(ctx -> executeOnOtherWithArg(ctx, true))) - .then(Commands.literal("disable").executes(ctx -> executeOnOtherWithArg(ctx, false)))); + .suggests(SuggestionUtils::suggestPlayers) + .executes(Fly::executeOnOther) + .then(Commands.literal("enable").executes(ctx -> executeOnOtherWithArg(ctx, true))) + .then(Commands.literal("disable").executes(ctx -> executeOnOtherWithArg(ctx, false))))); } private static boolean canExecute(CommandSourceStack css) { @@ -84,6 +84,7 @@ private static int executeOnOther(CommandContext ctx) throws return Command.SINGLE_SUCCESS; } + @SuppressWarnings("SameReturnValue") private static int executeOnOtherWithArg(CommandContext ctx, boolean shouldEnable) throws CommandSyntaxException { CommandSender sender = ctx.getSource().getSender(); PlayerSelectorArgumentResolver playerArg = ctx.getArgument("player", PlayerSelectorArgumentResolver.class); @@ -108,7 +109,7 @@ private static int executeOnOtherWithArg(CommandContext ctx, } else { enabledString = LocaleMessage.DISABLED.getMessage(); } - sender.sendRichMessage(LocaleMessage.FLY_SET_MANY_OTHER_ARG.getMessage(), + sender.sendRichMessage(LocaleMessage.FLY_SET_OTHER_MANY_ARG.getMessage(), Placeholder.parsed("value", enabledString), Placeholder.parsed("count", String.valueOf(modified))); return Command.SINGLE_SUCCESS; diff --git a/src/main/java/simplexity/simplefly/commands/FlyReload.java b/src/main/java/simplexity/simplefly/commands/FlyReload.java index ac5d4f5..59434c1 100644 --- a/src/main/java/simplexity/simplefly/commands/FlyReload.java +++ b/src/main/java/simplexity/simplefly/commands/FlyReload.java @@ -1,19 +1,24 @@ package simplexity.simplefly.commands; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; -import simplexity.simplefly.config.ConfigValues; -import simplexity.simplefly.Util; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; + +import simplexity.simplefly.Constants; +import simplexity.simplefly.config.ConfigHandler; import simplexity.simplefly.config.LocaleMessage; -public class FlyReload implements CommandExecutor { - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { - ConfigValues.reloadConfigValues(); - sender.sendRichMessage(LocaleMessage.FEEDBACK_CONFIG_RELOADED.getMessage()); - return false; +public class FlyReload { + + public static LiteralArgumentBuilder createCommand() { + return Commands.literal("flyreload").requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_RELOAD)) + .executes(ctx -> { + ConfigHandler.reloadConfigValues(); + ctx.getSource().getSender().sendRichMessage(LocaleMessage.FEEDBACK_CONFIG_RELOADED.getMessage()); + return Command.SINGLE_SUCCESS; + }); } + + } diff --git a/src/main/java/simplexity/simplefly/commands/FlySpeed.java b/src/main/java/simplexity/simplefly/commands/FlySpeed.java index fef92e5..2510b9b 100644 --- a/src/main/java/simplexity/simplefly/commands/FlySpeed.java +++ b/src/main/java/simplexity/simplefly/commands/FlySpeed.java @@ -1,25 +1,13 @@ package simplexity.simplefly.commands; import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import simplexity.simplefly.config.ConfigValues; import simplexity.simplefly.SimpleFly; -import simplexity.simplefly.Constants; -import simplexity.simplefly.Util; import java.util.ArrayList; -import java.util.List; public class FlySpeed { private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); - private static final ArrayList tabComplete = new ArrayList<>(); private static final String setArg = "set"; private static final String resetArg = "reset"; private static final String getArg = "get"; diff --git a/src/main/java/simplexity/simplefly/config/ConfigValues.java b/src/main/java/simplexity/simplefly/config/ConfigHandler.java similarity index 97% rename from src/main/java/simplexity/simplefly/config/ConfigValues.java rename to src/main/java/simplexity/simplefly/config/ConfigHandler.java index c52f531..57e4898 100644 --- a/src/main/java/simplexity/simplefly/config/ConfigValues.java +++ b/src/main/java/simplexity/simplefly/config/ConfigHandler.java @@ -4,7 +4,7 @@ import org.slf4j.Logger; import simplexity.simplefly.SimpleFly; -public class ConfigValues { +public class ConfigHandler { private static final Logger logger = SimpleFly.getInstance().getSLF4JLogger(); public static float maxFlySpeed, minFlySpeed; diff --git a/src/main/java/simplexity/simplefly/config/LocaleMessage.java b/src/main/java/simplexity/simplefly/config/LocaleMessage.java index 6c621c8..1ce5bee 100644 --- a/src/main/java/simplexity/simplefly/config/LocaleMessage.java +++ b/src/main/java/simplexity/simplefly/config/LocaleMessage.java @@ -13,8 +13,8 @@ public enum LocaleMessage { SERVER_NAME("insertion.server-name", "[Server]"), FLY_SET_OWN("fly-set.own", "Your fly has been "), FLY_SET_OTHER("fly-set.other", "'s fly has been "), - FLY_SET_OTHER_MANY("fly-set.many-other", "You have altered player's fly states."), - FLY_SET_MANY_OTHER_ARG("fly-set.many-other-with-arg", "You have players' fly states"), + FLY_SET_OTHER_MANY("fly-set.other-many", "You have altered player's fly states."), + FLY_SET_OTHER_MANY_ARG("fly-set.other-many-with-arg", "You have players' fly states"), FLY_SET_BY_OTHER("fly-set.by-other", "Your fly has been by "), FLY_SPEED_GET_OWN("fly-speed-get.own", "Your flyspeed is currently set to "), FLY_SPEED_GET_OTHER("fly-speed-get.other", "'s current flyspeed is "), From 8085e8c189250c450cfdc892b73f7f02152ffc7e Mon Sep 17 00:00:00 2001 From: Rhythmic System Date: Tue, 25 Nov 2025 20:24:48 -0800 Subject: [PATCH 3/4] final refactoring --- .../java/simplexity/simplefly/Constants.java | 15 +- .../simplexity/simplefly/FlyListeners.java | 12 +- .../java/simplexity/simplefly/FlyLogic.java | 2 +- .../java/simplexity/simplefly/SimpleFly.java | 28 +- src/main/java/simplexity/simplefly/Util.java | 31 -- .../simplefly/commands/Exceptions.java | 6 +- .../simplexity/simplefly/commands/Fly.java | 50 +-- .../simplefly/commands/FlyReload.java | 5 +- .../simplefly/commands/FlySpeed.java | 315 ++++++++---------- .../simplefly/commands/SuggestionUtils.java | 1 + .../simplefly/config/ConfigHandler.java | 57 +++- .../simplefly/config/LocaleMessage.java | 34 +- src/main/resources/paper-plugin.yml | 5 + src/main/resources/plugin.yml | 40 --- 14 files changed, 252 insertions(+), 349 deletions(-) delete mode 100644 src/main/java/simplexity/simplefly/Util.java create mode 100644 src/main/resources/paper-plugin.yml delete mode 100644 src/main/resources/plugin.yml diff --git a/src/main/java/simplexity/simplefly/Constants.java b/src/main/java/simplexity/simplefly/Constants.java index f9929b9..a9cf34c 100644 --- a/src/main/java/simplexity/simplefly/Constants.java +++ b/src/main/java/simplexity/simplefly/Constants.java @@ -1,17 +1,18 @@ package simplexity.simplefly; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.NamespacedKey; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; public class Constants { - public static final NamespacedKey FLY_STATUS = new NamespacedKey(SimpleFly.getInstance(), "flystatus"); - public static final String FLY_PERMISSION = "simplefly.fly"; - public static final String FLY_SPEED_PERMISSION = "simplefly.flyspeed"; - public static final String FLY_OTHERS_PERMISSION = "simplefly.others.fly"; - public static final String FLY_SPEED_OTHERS_PERMISSION = "simplefly.others.flyspeed"; - public static final String FLY_RELOAD = "simplefly.reload"; + public static final NamespacedKey FLY_STATUS_KEY = new NamespacedKey(SimpleFly.getInstance(), "flystatus"); + public static final Permission FLY_PERMISSION = new Permission("simplefly.fly", "Allows a player to toggle their own flight", PermissionDefault.OP); + public static final Permission FLY_SPEED_PERMISSION = new Permission("simplefly.flyspeed", "Allows a player to set their own flight speed", PermissionDefault.OP); + public static final Permission FLY_OTHERS_PERMISSION = new Permission("simplefly.others.fly", "Allows a player to toggle other players' flight", PermissionDefault.OP); + public static final Permission FLY_SPEED_OTHERS_PERMISSION = new Permission("simplefly.others.flyspeed", "Allows a player to set other players' flight speed", PermissionDefault.OP); + public static final Permission FLY_RELOAD_PERMISSION = new Permission("simplefly.reload", "Allows a player to reload the SimpleFly configuration", PermissionDefault.OP); } diff --git a/src/main/java/simplexity/simplefly/FlyListeners.java b/src/main/java/simplexity/simplefly/FlyListeners.java index 2cf1cf2..ac1d992 100644 --- a/src/main/java/simplexity/simplefly/FlyListeners.java +++ b/src/main/java/simplexity/simplefly/FlyListeners.java @@ -17,11 +17,11 @@ public class FlyListeners implements Listener { - private static final NamespacedKey flyStatus = Constants.FLY_STATUS; + private static final NamespacedKey flyStatus = Constants.FLY_STATUS_KEY; @EventHandler public void onPlayerLogin(PlayerJoinEvent joinEvent) { - if (!ConfigHandler.sessionPersistentFlight) { + if (!ConfigHandler.getInstance().isFlyPersistsSessions()) { return; } Player player = joinEvent.getPlayer(); @@ -42,7 +42,7 @@ public void onPlayerLogin(PlayerJoinEvent joinEvent) { @EventHandler public void onWorldChange(PlayerChangedWorldEvent worldEvent) { - if (!ConfigHandler.worldChangePersistentFlight) return; + if (!ConfigHandler.getInstance().isFlyPersistsWorldChange()) return; Player player = worldEvent.getPlayer(); PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); @@ -53,7 +53,7 @@ public void onWorldChange(PlayerChangedWorldEvent worldEvent) { @EventHandler public void onRespawn(PlayerRespawnEvent respawnEvent) { - if (!ConfigHandler.respawnPersistentFlight) return; + if (!ConfigHandler.getInstance().isFlyPersistsRespawn()) return; Player player = respawnEvent.getPlayer(); PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Boolean flyEnabled = playerPDC.getOrDefault(flyStatus, PersistentDataType.BOOLEAN, false); @@ -63,8 +63,8 @@ public void onRespawn(PlayerRespawnEvent respawnEvent) { } @EventHandler - public void onGamemodeChange(PlayerGameModeChangeEvent gameModeChangeEvent) { - if (!ConfigHandler.gamemodeChangePersistentFlight) return; + public void onGameModeChange(PlayerGameModeChangeEvent gameModeChangeEvent) { + if (!ConfigHandler.getInstance().isFlyPersistsGameMode()) return; Player player = gameModeChangeEvent.getPlayer(); PersistentDataContainer playerPDC = player.getPersistentDataContainer(); Bukkit.getScheduler().runTaskLater(SimpleFly.getInstance(), () -> { diff --git a/src/main/java/simplexity/simplefly/FlyLogic.java b/src/main/java/simplexity/simplefly/FlyLogic.java index ba1593c..60d8f3e 100644 --- a/src/main/java/simplexity/simplefly/FlyLogic.java +++ b/src/main/java/simplexity/simplefly/FlyLogic.java @@ -9,7 +9,7 @@ public class FlyLogic { - private static final NamespacedKey flyStatus = Constants.FLY_STATUS; + private static final NamespacedKey flyStatus = Constants.FLY_STATUS_KEY; public static boolean flyToggle(Player player) { PersistentDataContainer playerPDC = player.getPersistentDataContainer(); diff --git a/src/main/java/simplexity/simplefly/SimpleFly.java b/src/main/java/simplexity/simplefly/SimpleFly.java index e732a11..01df575 100644 --- a/src/main/java/simplexity/simplefly/SimpleFly.java +++ b/src/main/java/simplexity/simplefly/SimpleFly.java @@ -2,42 +2,42 @@ import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Server; import org.bukkit.plugin.java.JavaPlugin; import simplexity.simplefly.commands.Fly; import simplexity.simplefly.commands.FlyReload; +import simplexity.simplefly.commands.FlySpeed; import simplexity.simplefly.config.ConfigHandler; +@SuppressWarnings("UnstableApiUsage") public final class SimpleFly extends JavaPlugin { - + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); private static SimpleFly instance; - private static Server flyServer; - + public static SimpleFly getInstance() { return instance; } - + public static MiniMessage getMiniMessage() { return miniMessage; } - - public static Server getFlyServer() { - return flyServer; - } - - + @Override public void onEnable() { instance = this; - flyServer = this.getServer(); this.saveDefaultConfig(); - ConfigHandler.reloadConfigValues(); + ConfigHandler.getInstance().reloadConfigValues(); this.getServer().getPluginManager().registerEvents(new simplexity.simplefly.FlyListeners(), this); this.getLifecycleManager().registerEventHandler(LifecycleEvents.COMMANDS, commands -> { commands.registrar().register(Fly.createCommand().build()); commands.registrar().register(FlyReload.createCommand().build()); + commands.registrar().register(FlySpeed.createCommand().build()); }); + this.getServer().getPluginManager().addPermission(Constants.FLY_PERMISSION); + this.getServer().getPluginManager().addPermission(Constants.FLY_OTHERS_PERMISSION); + this.getServer().getPluginManager().addPermission(Constants.FLY_SPEED_PERMISSION); + this.getServer().getPluginManager().addPermission(Constants.FLY_SPEED_OTHERS_PERMISSION); + this.getServer().getPluginManager().addPermission(Constants.FLY_RELOAD_PERMISSION); } - + } diff --git a/src/main/java/simplexity/simplefly/Util.java b/src/main/java/simplexity/simplefly/Util.java deleted file mode 100644 index c8cea78..0000000 --- a/src/main/java/simplexity/simplefly/Util.java +++ /dev/null @@ -1,31 +0,0 @@ -package simplexity.simplefly; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.CommandSender; - -public class Util { - - private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); - - public static void sendUserMessage(CommandSender sender, String message) { - if (message.isEmpty()) return; - sender.sendMessage(miniMessage.deserialize(message)); - } - - public static void sendUserMessage(CommandSender userToSendTo, String message, - String value, CommandSender userToParse) { - if (message.isEmpty()) return; - Component parsedName; - if (userToParse == null) { - parsedName = Component.empty(); - } else { - parsedName = userToParse.name(); - } - userToSendTo.sendMessage(miniMessage.deserialize(message, - Placeholder.parsed("value", value), - Placeholder.component("initiator", parsedName), - Placeholder.component("target", parsedName))); - } -} diff --git a/src/main/java/simplexity/simplefly/commands/Exceptions.java b/src/main/java/simplexity/simplefly/commands/Exceptions.java index 4cb7b15..44f1696 100644 --- a/src/main/java/simplexity/simplefly/commands/Exceptions.java +++ b/src/main/java/simplexity/simplefly/commands/Exceptions.java @@ -1,13 +1,13 @@ package simplexity.simplefly.commands; import com.mojang.brigadier.Message; -import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import io.papermc.paper.command.brigadier.MessageComponentSerializer; import net.kyori.adventure.text.minimessage.MiniMessage; import simplexity.simplefly.SimpleFly; import simplexity.simplefly.config.LocaleMessage; +@SuppressWarnings("UnstableApiUsage") public class Exceptions { private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); @@ -17,10 +17,6 @@ public class Exceptions { public static final SimpleCommandExceptionType NO_USERS_FOUND = new SimpleCommandExceptionType( parseMessage(LocaleMessage.ERROR_INVALID_PLAYER)); - public static final SimpleCommandExceptionType MUST_SPECIFY_FLY_STATE = new SimpleCommandExceptionType( - parseMessage(LocaleMessage.ERROR_MUST_PROVIDE_STATE) - ); - private static Message parseMessage(LocaleMessage message) { return MessageComponentSerializer.message().serialize( diff --git a/src/main/java/simplexity/simplefly/commands/Fly.java b/src/main/java/simplexity/simplefly/commands/Fly.java index cdf66e5..1a9c010 100644 --- a/src/main/java/simplexity/simplefly/commands/Fly.java +++ b/src/main/java/simplexity/simplefly/commands/Fly.java @@ -27,28 +27,21 @@ public class Fly { public static LiteralArgumentBuilder createCommand() { return Commands.literal("fly") - .requires(Fly::canExecute) + .requires(css -> css.getSender().hasPermission(Constants.FLY_PERMISSION)) .executes(Fly::execute) - .then( - Commands.literal("enable").executes( - ctx -> executeWithArg(ctx, true) - )) + .then(Commands.literal("enable").executes( + ctx -> executeWithArg(ctx, true)) + .then(Commands.argument("player", ArgumentTypes.players()) + .requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_OTHERS_PERMISSION)) + .suggests(SuggestionUtils::suggestPlayers) + .executes(ctx-> executeOnOtherWithArg(ctx, true))) + ) .then(Commands.literal("disable").executes( - ctx -> executeWithArg(ctx, false) - )) - .then(Commands.literal("admin") - .requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_OTHERS_PERMISSION)) - .then( - Commands.argument("player", ArgumentTypes.player()) - .suggests(SuggestionUtils::suggestPlayers) - .executes(Fly::executeOnOther) - .then(Commands.literal("enable").executes(ctx -> executeOnOtherWithArg(ctx, true))) - .then(Commands.literal("disable").executes(ctx -> executeOnOtherWithArg(ctx, false))))); - } - - private static boolean canExecute(CommandSourceStack css) { - if (!(css.getSender() instanceof Player player)) return false; - return player.hasPermission(Constants.FLY_PERMISSION); + ctx -> executeWithArg(ctx, false)) + .then(Commands.argument("player", ArgumentTypes.players()) + .requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_OTHERS_PERMISSION)) + .suggests(SuggestionUtils::suggestPlayers) + .executes(ctx-> executeOnOtherWithArg(ctx, false)))); } private static int execute(CommandContext ctx) throws CommandSyntaxException { @@ -67,23 +60,6 @@ private static int executeWithArg(CommandContext ctx, boolea return Command.SINGLE_SUCCESS; } - private static int executeOnOther(CommandContext ctx) throws CommandSyntaxException { - CommandSender sender = ctx.getSource().getSender(); - PlayerSelectorArgumentResolver playerArg = ctx.getArgument("player", PlayerSelectorArgumentResolver.class); - List targets = playerArg.resolve(ctx.getSource()); - int size = targets.size(); - if (size == 0) { - throw Exceptions.NO_USERS_FOUND.create(); - } else if (size > 1) { - throw Exceptions.MUST_SPECIFY_FLY_STATE.create(); - } - Player player = targets.getFirst(); - boolean flyEnabled = FlyLogic.flyToggle(player); - player.sendMessage(getParsedComponent(flyEnabled, player, sender, LocaleMessage.FLY_SET_BY_OTHER.getMessage())); - sender.sendMessage(getParsedComponent(flyEnabled, player, sender, LocaleMessage.FLY_SET_OTHER.getMessage())); - return Command.SINGLE_SUCCESS; - } - @SuppressWarnings("SameReturnValue") private static int executeOnOtherWithArg(CommandContext ctx, boolean shouldEnable) throws CommandSyntaxException { CommandSender sender = ctx.getSource().getSender(); diff --git a/src/main/java/simplexity/simplefly/commands/FlyReload.java b/src/main/java/simplexity/simplefly/commands/FlyReload.java index 59434c1..090eaed 100644 --- a/src/main/java/simplexity/simplefly/commands/FlyReload.java +++ b/src/main/java/simplexity/simplefly/commands/FlyReload.java @@ -9,12 +9,13 @@ import simplexity.simplefly.config.ConfigHandler; import simplexity.simplefly.config.LocaleMessage; +@SuppressWarnings("UnstableApiUsage") public class FlyReload { public static LiteralArgumentBuilder createCommand() { - return Commands.literal("flyreload").requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_RELOAD)) + return Commands.literal("flyreload").requires(ctx -> ctx.getSender().hasPermission(Constants.FLY_RELOAD_PERMISSION)) .executes(ctx -> { - ConfigHandler.reloadConfigValues(); + ConfigHandler.getInstance().reloadConfigValues(); ctx.getSource().getSender().sendRichMessage(LocaleMessage.FEEDBACK_CONFIG_RELOADED.getMessage()); return Command.SINGLE_SUCCESS; }); diff --git a/src/main/java/simplexity/simplefly/commands/FlySpeed.java b/src/main/java/simplexity/simplefly/commands/FlySpeed.java index 2510b9b..ef12ce5 100644 --- a/src/main/java/simplexity/simplefly/commands/FlySpeed.java +++ b/src/main/java/simplexity/simplefly/commands/FlySpeed.java @@ -1,196 +1,159 @@ package simplexity.simplefly.commands; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.FloatArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; +import io.papermc.paper.command.brigadier.argument.ArgumentTypes; +import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import simplexity.simplefly.Constants; import simplexity.simplefly.SimpleFly; +import simplexity.simplefly.config.ConfigHandler; +import simplexity.simplefly.config.LocaleMessage; -import java.util.ArrayList; +import java.util.List; +@SuppressWarnings("UnstableApiUsage") public class FlySpeed { - + private static final MiniMessage miniMessage = SimpleFly.getMiniMessage(); - private static final String setArg = "set"; - private static final String resetArg = "reset"; - private static final String getArg = "get"; - - - /* - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - boolean hasOtherPermission = sender.hasPermission(Constants.FLY_OTHERS_PERMISSION); - switch (args.length) { - case 0 -> { - getOwnFlySpeed(sender); - return true; - } - case 1 -> { - switch (args[0]) { - case setArg -> { - Util.sendUserMessage(sender, ConfigValues.notEnoughArguments); - return false; - } - case getArg -> { - getOwnFlySpeed(sender); - return true; - } - case resetArg -> { - resetOwnFlySpeed(sender); - return true; - } - default -> Util.sendUserMessage(sender, ConfigValues.invalidCommand); - } - } - case 2 -> { - Player player = SimpleFly.getFlyServer().getPlayer(args[1]); - switch (args[0]) { - case setArg -> { - if (player == null || !hasOtherPermission) { - setOwnSpeed(sender, args); - return true; - } else { - Util.sendUserMessage(sender, ConfigValues.notEnoughArguments); - return false; - } - } - case getArg -> { - if (player == null || !hasOtherPermission) { - Util.sendUserMessage(sender, ConfigValues.invalidCommand); - return false; - } else { - getOtherFlySpeed(sender, args); - return true; - } - } - case resetArg -> { - if (player == null || !hasOtherPermission) { - Util.sendUserMessage(sender, ConfigValues.invalidCommand); - return true; - } else { - resetOtherFlySpeed(sender, args); - return true; - } - } - default -> Util.sendUserMessage(sender, ConfigValues.invalidCommand); - } - } - case 3 -> { - if (args[0].equals(setArg) && hasOtherPermission) { - setOtherPlayerSpeed(sender, args); - return true; - } - Util.sendUserMessage(sender, ConfigValues.invalidCommand); - } - } - return false; + + public static LiteralArgumentBuilder createCommand() { + return Commands.literal("flyspeed") + .requires(src -> src.getSender().hasPermission(Constants.FLY_SPEED_PERMISSION)) + .then(Commands.literal("get") + .executes(FlySpeed::getOwnSpeed) + .then(Commands.argument("target", ArgumentTypes.player()) + .executes(FlySpeed::getOtherSpeed) + ) + ) + .then(Commands.literal("reset") + .executes(FlySpeed::resetOwnSpeed) + .then(Commands.argument("targets", ArgumentTypes.players()) + .requires(css -> css.getSender().hasPermission(Constants.FLY_SPEED_OTHERS_PERMISSION)) + .executes(FlySpeed::resetOtherSpeed) + ) + ) + .then(Commands.literal("set") + .then(Commands.argument("speed", + FloatArgumentType.floatArg(ConfigHandler.getInstance().getMinFlySpeed(), + ConfigHandler.getInstance().getMaxFlySpeed())) + .executes(FlySpeed::setOwnSpeed) + .then(Commands.argument("targets", ArgumentTypes.players()) + .requires(css -> css.getSender().hasPermission(Constants.FLY_SPEED_OTHERS_PERMISSION)) + .executes(FlySpeed::setOtherSpeed) + ) + ) + ); + } - - - private void setOtherPlayerSpeed(CommandSender sender, String[] args) { - String firstArgument = args[0]; - String secondArgument = args[1]; - String thirdArgument = args[2]; - if (firstArgument.equalsIgnoreCase(setArg)) { - Player player = SimpleFly.getFlyServer().getPlayer(secondArgument); - if (player == null) { - Util.sendUserMessage(sender, ConfigValues.invalidPlayer); - return; - } - float flyspeed; - try { - flyspeed = Float.parseFloat(thirdArgument); - player.setFlySpeed(flyspeed / 10f); - Util.sendUserMessage(sender, ConfigValues.flySpeedSetOther, - thirdArgument, player); - Util.sendUserMessage(player, ConfigValues.flySpeedSetByOther, - thirdArgument, sender); - } catch (NumberFormatException e) { - Util.sendUserMessage(sender, ConfigValues.invalidNumber); - } - } + + private static int getOwnSpeed(CommandContext context) throws CommandSyntaxException { + if (!(context.getSource().getSender() instanceof Player player)) throw Exceptions.ERROR_MUST_BE_PLAYER.create(); + float flyspeedValue = player.getFlySpeed() * 10.0f; + player.sendRichMessage(LocaleMessage.FLY_SPEED_GET_OWN.getMessage(), + Placeholder.parsed("value", String.valueOf(flyspeedValue))); + return Command.SINGLE_SUCCESS; } - - private void resetOtherFlySpeed(CommandSender sender, String[] args) { - Player player = SimpleFly.getFlyServer().getPlayer(args[1]); - if (player == null) { - Util.sendUserMessage(sender, ConfigValues.invalidPlayer); - return; - } + + private static int getOtherSpeed(CommandContext context) throws CommandSyntaxException { + PlayerSelectorArgumentResolver targetResolver = context.getArgument("target", PlayerSelectorArgumentResolver.class); + Player target = targetResolver.resolve(context.getSource()).getFirst(); + float targetSpeed = target.getFlySpeed() * 10f; + CommandSender sender = context.getSource().getSender(); + sender.sendRichMessage(LocaleMessage.FLY_SPEED_GET_OTHER.getMessage(), + Placeholder.component("target", target.displayName()), + Placeholder.parsed("value", String.valueOf(targetSpeed))); + return Command.SINGLE_SUCCESS; + } + + private static int resetOwnSpeed(CommandContext context) throws CommandSyntaxException { + if (!(context.getSource().getSender() instanceof Player player)) throw Exceptions.ERROR_MUST_BE_PLAYER.create(); player.setFlySpeed(0.1f); - Util.sendUserMessage(sender, ConfigValues.flySpeedResetOther, - null, player); - Util.sendUserMessage(player, ConfigValues.flySpeedResetByOther, - null, sender); + player.sendRichMessage(LocaleMessage.FLY_SPEED_RESET_OWN.getMessage()); + return Command.SINGLE_SUCCESS; } - - private void getOtherFlySpeed(CommandSender sender, String[] args) { - Player player = SimpleFly.getFlyServer().getPlayer(args[1]); - if (player == null) { - Util.sendUserMessage(sender, ConfigValues.invalidPlayer); - return; - } - float flyspeed = player.getFlySpeed() * 10f; - Util.sendUserMessage(sender, ConfigValues.flySpeedGetOther, - String.valueOf(flyspeed), player); + + private static int resetOtherSpeed(CommandContext context) throws CommandSyntaxException { + CommandSender sender = context.getSource().getSender(); + PlayerSelectorArgumentResolver targetResolver = context.getArgument("targets", PlayerSelectorArgumentResolver.class); + List targets = targetResolver.resolve(context.getSource()); + + return setSpeed(targets, sender, 1.0f, + LocaleMessage.FLY_SPEED_RESET_OTHER.getMessage(), + LocaleMessage.FLY_SPEED_RESET_BY_OTHER.getMessage(), + LocaleMessage.FLY_SPEED_RESET_OTHER_MANY.getMessage()); } - - private void setOwnSpeed(CommandSender sender, String[] args) { - float flyspeed; - Player player; - String secondArgument = args[1]; - try { - flyspeed = Float.parseFloat(secondArgument); - player = (Player) sender; - if (flyspeed > ConfigValues.maxFlySpeed || flyspeed < ConfigValues.minFlySpeed) { - player.sendMessage(miniMessage.deserialize(ConfigValues.notInRange, - Placeholder.parsed("min", String.valueOf(ConfigValues.minFlySpeed)), - Placeholder.parsed("max", String.valueOf(ConfigValues.maxFlySpeed)))); - return; - } - player.setFlySpeed(flyspeed / 10f); - Util.sendUserMessage(player, ConfigValues.flySpeedSetOwn, - secondArgument, null); - } catch (NumberFormatException e) { - player = SimpleFly.getFlyServer().getPlayer(secondArgument); - if (player == null || !sender.hasPermission(Constants.FLY_SPEED_OTHERS_PERMISSION)) { - Util.sendUserMessage(sender, ConfigValues.invalidNumber); - return; - } - Util.sendUserMessage(sender, ConfigValues.notEnoughArguments); - } + + private static int setOwnSpeed(CommandContext context) throws CommandSyntaxException { + if (!(context.getSource().getSender() instanceof Player player)) throw Exceptions.ERROR_MUST_BE_PLAYER.create(); + float speed = context.getArgument("speed", Float.class); + float actualSpeed = speed / 10f; + player.setFlySpeed(actualSpeed); + player.sendRichMessage(LocaleMessage.FLY_SPEED_SET_OWN.getMessage(), + Placeholder.parsed("value", String.valueOf(speed))); + return Command.SINGLE_SUCCESS; } - - private void resetOwnFlySpeed(CommandSender sender) { - if (CommandUtils.checkIfPlayerAndPerms(sender, Constants.FLY_SPEED_PERMISSION)) { - ((Player) sender).setFlySpeed(0.1f); - Util.sendUserMessage(sender, ConfigValues.flySpeedResetOwn); - } + + private static int setOtherSpeed(CommandContext context) throws CommandSyntaxException { + CommandSender sender = context.getSource().getSender(); + PlayerSelectorArgumentResolver targetResolver = context.getArgument("targets", PlayerSelectorArgumentResolver.class); + List targets = targetResolver.resolve(context.getSource()); + float speed = context.getArgument("speed", Float.class); + return setSpeed(targets, sender, speed, + LocaleMessage.FLY_SPEED_SET_OTHER.getMessage(), + LocaleMessage.FLY_SPEED_SET_BY_OTHER.getMessage(), + LocaleMessage.FLY_SPEED_SET_OTHER_MANY.getMessage()); } - - private void getOwnFlySpeed(CommandSender sender) { - if (CommandUtils.checkIfPlayerAndPerms(sender, Constants.FLY_SPEED_PERMISSION)) { - float flyspeed = ((Player) sender).getFlySpeed() * 10f; - Util.sendUserMessage(sender, ConfigValues.flySpeedGetOwn, - String.valueOf(flyspeed), null); + + + @SuppressWarnings("SameReturnValue") + private static int setSpeed(List targets, CommandSender sender, float speed, String otherMessage, + String byOtherMessage, String manyOtherMessage) throws CommandSyntaxException { + Component senderName; + if (sender instanceof Player playerSender) { + senderName = playerSender.displayName(); + } else { + senderName = miniMessage.deserialize(LocaleMessage.SERVER_NAME.getMessage()); } - } - - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command - command, @NotNull String s, @NotNull String[] args) { - if (sender.hasPermission(Constants.FLY_SPEED_PERMISSION) && args.length == 1) { - tabComplete.clear(); - tabComplete.add(setArg); - tabComplete.add(resetArg); - if (sender.hasPermission(Constants.FLY_SPEED_OTHERS_PERMISSION)) { - tabComplete.add(getArg); - } - return tabComplete; + float flySpeed = speed / 10f; + if (targets.isEmpty()) throw Exceptions.NO_USERS_FOUND.create(); + if (targets.size() == 1) { + Player player = targets.getFirst(); + player.setFlySpeed(flySpeed); + player.sendRichMessage( + byOtherMessage, + Placeholder.component("initiator", senderName), + Placeholder.parsed("value", String.valueOf(speed)) + ); + sender.sendRichMessage( + otherMessage, + Placeholder.component("target", player.displayName()), + Placeholder.parsed("value", String.valueOf(speed)) + ); + return Command.SINGLE_SUCCESS; } - if (args.length == 3) { - return List.of(""); + int modified = 0; + for (Player player : targets) { + player.setFlySpeed(flySpeed); + player.sendRichMessage( + byOtherMessage, + Placeholder.component("initiator", senderName), + Placeholder.parsed("value", String.valueOf(speed))); + modified++; } - return null; + sender.sendRichMessage(manyOtherMessage, + Placeholder.parsed("count", String.valueOf(modified)), + Placeholder.parsed("value", String.valueOf(speed))); + return Command.SINGLE_SUCCESS; } - - */ } + diff --git a/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java b/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java index 8a9e01f..45ffab3 100644 --- a/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java +++ b/src/main/java/simplexity/simplefly/commands/SuggestionUtils.java @@ -9,6 +9,7 @@ import java.util.concurrent.CompletableFuture; +@SuppressWarnings("UnstableApiUsage") public class SuggestionUtils { public static CompletableFuture suggestPlayers(CommandContext context, SuggestionsBuilder builder) { CommandSourceStack css = (CommandSourceStack) context.getSource(); diff --git a/src/main/java/simplexity/simplefly/config/ConfigHandler.java b/src/main/java/simplexity/simplefly/config/ConfigHandler.java index 57e4898..34cb14e 100644 --- a/src/main/java/simplexity/simplefly/config/ConfigHandler.java +++ b/src/main/java/simplexity/simplefly/config/ConfigHandler.java @@ -5,13 +5,24 @@ import simplexity.simplefly.SimpleFly; public class ConfigHandler { - private static final Logger logger = SimpleFly.getInstance().getSLF4JLogger(); - - public static float maxFlySpeed, minFlySpeed; - public static boolean sessionPersistentFlight, worldChangePersistentFlight, - respawnPersistentFlight, gamemodeChangePersistentFlight; - - public static void reloadConfigValues(){ + + private static ConfigHandler instance; + + private ConfigHandler() { + } + + public static ConfigHandler getInstance() { + if (instance == null) instance = new ConfigHandler(); + return instance; + } + + private static final Logger logger = SimpleFly.getInstance().getSLF4JLogger(); + + private float maxFlySpeed, minFlySpeed; + private boolean flyPersistsSessions, flyPersistsWorldChange, flyPersistsRespawn, flyPersistsGameMode; + + public void reloadConfigValues() { + LocaleHandler.getInstance().reloadLocale(); FileConfiguration config = SimpleFly.getInstance().getConfig(); maxFlySpeed = config.getInt("max-fly-speed"); if (maxFlySpeed > 10) { @@ -23,10 +34,34 @@ public static void reloadConfigValues(){ logger.warn("Min fly speed cannot be less than -10. Setting to -10"); minFlySpeed = -10; } - sessionPersistentFlight = config.getBoolean("session-persistent-flight"); - worldChangePersistentFlight = config.getBoolean("world-change-persistent-flight"); - respawnPersistentFlight = config.getBoolean("respawn-persistent-flight"); - gamemodeChangePersistentFlight = config.getBoolean("gamemode-change-persistent-flight"); + flyPersistsSessions = config.getBoolean("session-persistent-flight"); + flyPersistsWorldChange = config.getBoolean("world-change-persistent-flight"); + flyPersistsRespawn = config.getBoolean("respawn-persistent-flight"); + flyPersistsGameMode = config.getBoolean("gamemode-change-persistent-flight"); + } + + public float getMinFlySpeed() { + return minFlySpeed; } + public float getMaxFlySpeed() { + return maxFlySpeed; + } + + + public boolean isFlyPersistsSessions() { + return flyPersistsSessions; + } + + public boolean isFlyPersistsWorldChange() { + return flyPersistsWorldChange; + } + + public boolean isFlyPersistsGameMode() { + return flyPersistsGameMode; + } + + public boolean isFlyPersistsRespawn() { + return flyPersistsRespawn; + } } diff --git a/src/main/java/simplexity/simplefly/config/LocaleMessage.java b/src/main/java/simplexity/simplefly/config/LocaleMessage.java index 1ce5bee..c00c0f3 100644 --- a/src/main/java/simplexity/simplefly/config/LocaleMessage.java +++ b/src/main/java/simplexity/simplefly/config/LocaleMessage.java @@ -7,30 +7,26 @@ public enum LocaleMessage { PAPI_FLIGHT_ENABLED("papi-flight.enabled", "[F]"), PAPI_FLIGHT_DISABLED("papi-flight.disabled", ""), - PREFIX("insertion.prefix", "[SF] "), ENABLED("insertion.enabled", "enabled"), DISABLED("insertion.disabled", "disabled"), SERVER_NAME("insertion.server-name", "[Server]"), - FLY_SET_OWN("fly-set.own", "Your fly has been "), - FLY_SET_OTHER("fly-set.other", "'s fly has been "), - FLY_SET_OTHER_MANY("fly-set.other-many", "You have altered player's fly states."), - FLY_SET_OTHER_MANY_ARG("fly-set.other-many-with-arg", "You have players' fly states"), - FLY_SET_BY_OTHER("fly-set.by-other", "Your fly has been by "), - FLY_SPEED_GET_OWN("fly-speed-get.own", "Your flyspeed is currently set to "), - FLY_SPEED_GET_OTHER("fly-speed-get.other", "'s current flyspeed is "), - FLY_SPEED_SET_OWN("fly-speed-set.own", "Your flyspeed has been set to "), - FLY_SPEED_SET_OTHER("fly-speed-set.other", "You set 's flyspeed to "), - FLY_SPEED_SET_BY_OTHER("fly-speed-set.by-other", "Your flyspeed has been set to by "), - FLY_SPEED_RESET_OWN("fly-speed-reset.own", "Your flyspeed has been reset"), - FLY_SPEED_RESET_OTHER("fly-speed-reset.other", "'s flyspeed has been reset"), - FLY_SPEED_RESET_BY_OTHER("fly-speed-reset.by-other", "Your flyspeed has been reset by "), + FLY_SET_OWN("fly-set.own", "Your fly has been "), + FLY_SET_OTHER("fly-set.other", "'s fly has been "), + FLY_SET_OTHER_MANY("fly-set.other-many", "You have altered player's fly states."), + FLY_SET_OTHER_MANY_ARG("fly-set.other-many-with-arg", "You have players' fly states"), + FLY_SET_BY_OTHER("fly-set.by-other", "Your fly has been by "), + FLY_SPEED_GET_OWN("fly-speed-get.own", "Your flyspeed is currently set to "), + FLY_SPEED_GET_OTHER("fly-speed-get.other", "'s current flyspeed is "), + FLY_SPEED_SET_OWN("fly-speed-set.own", "Your flyspeed has been set to "), + FLY_SPEED_SET_OTHER("fly-speed-set.other", "You set 's flyspeed to "), + FLY_SPEED_SET_OTHER_MANY("fly-speed-set.other-many", "You set players' flyspeed to "), + FLY_SPEED_SET_BY_OTHER("fly-speed-set.by-other", "Your flyspeed has been set to by "), + FLY_SPEED_RESET_OWN("fly-speed-reset.own", "Your flyspeed has been reset"), + FLY_SPEED_RESET_OTHER("fly-speed-reset.other", "'s flyspeed has been reset"), + FLY_SPEED_RESET_OTHER_MANY("fly-speed-reset.other-many", "Reset players' flyspeed"), + FLY_SPEED_RESET_BY_OTHER("fly-speed-reset.by-other", "Your flyspeed has been reset by "), ERROR_INVALID_PLAYER("error.invalid-player", "That is not a valid player. Please check your spelling and try again"), - ERROR_NO_PERMISSION("error.no-permission", "You do not have permission to run this command"), ERROR_MUST_BE_PLAYER("error.must-be-player", "You must be a player to run this command"), - ERROR_NOT_ENOUGH_ARGUMENTS("error.not-enough-arguments", "You did not provide enough arguments. Please check your syntax and try again"), - ERROR_INVALID_NUMBER("error.invalid-number", "Sorry, you did not enter a valid flyspeed, please try again"), - ERROR_NOT_IN_RANGE("error.not-in-range", "Sorry, you must provide a number between and "), - ERROR_INVALID_COMMAND("error.invalid-command", "Sorry, that subcommand is invalid. Please check your syntax and try again"), ERROR_MUST_PROVIDE_STATE("error.must-provide-state", "In order to toggle fly state for multiple players simultaneously, you will need to specify a fly state"), FEEDBACK_CONFIG_RELOADED("plugin-messages.config-reloaded", "Config Reloaded"); private final String path; diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml new file mode 100644 index 0000000..3166bb7 --- /dev/null +++ b/src/main/resources/paper-plugin.yml @@ -0,0 +1,5 @@ +name: SimpleFly +version: '${project.version}' +main: simplexity.simplefly.SimpleFly +api-version: '1.20' + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml deleted file mode 100644 index af22195..0000000 --- a/src/main/resources/plugin.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: SimpleFly -version: '${project.version}' -main: simplexity.simplefly.SimpleFly -api-version: '1.20' -commands: - fly: - permission: simplefly.fly - description: allows toggling flight - usage: /fly - aliases: [sfly] - permission-message: You don't have permission to use this command. - flyspeed: - permission: simplefly.flyspeed - description: allows changing fly speed - usage: /flyspeed [set|reset] - aliases: [sflyspeed] - permission-message: You don't have permission to use this command. - flyreload: - permission: simplefly.reload - description: reloads the plugin - aliases: [sflyreload] - permission-message: You don't have permission to use this command. -permissions: - simplefly.fly: - default: op - description: allows toggling flight - simplefly.others.fly: - default: op - description: allows toggling flight for others - simplefly.flyspeed: - default: op - description: allows changing fly speed - simplefly.others.flyspeed: - default: op - description: allows changing fly speed for others - simplefly.reload: - default: op - description: allows reloading the plugin - - From c66743a4b2a10ce19f19baf59064a7ca34737734 Mon Sep 17 00:00:00 2001 From: Rhythmic System Date: Tue, 25 Nov 2025 20:35:40 -0800 Subject: [PATCH 4/4] version bump and fix login check --- pom.xml | 2 +- src/main/java/simplexity/simplefly/FlyListeners.java | 2 +- src/main/java/simplexity/simplefly/FlyLogic.java | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 73b5ca4..17a76e1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ simplexity SimpleFly - 0.0.1 + 1.0.0 jar SimpleFly diff --git a/src/main/java/simplexity/simplefly/FlyListeners.java b/src/main/java/simplexity/simplefly/FlyListeners.java index ac1d992..06de8bf 100644 --- a/src/main/java/simplexity/simplefly/FlyListeners.java +++ b/src/main/java/simplexity/simplefly/FlyListeners.java @@ -35,7 +35,7 @@ public void onPlayerLogin(PlayerJoinEvent joinEvent) { return; } if (flyEnabled && !player.hasPermission(Constants.FLY_PERMISSION)) { - FlyLogic.flyDisable(player); + FlyLogic.disablePDC(player); } }, 10); } diff --git a/src/main/java/simplexity/simplefly/FlyLogic.java b/src/main/java/simplexity/simplefly/FlyLogic.java index 60d8f3e..62e2170 100644 --- a/src/main/java/simplexity/simplefly/FlyLogic.java +++ b/src/main/java/simplexity/simplefly/FlyLogic.java @@ -41,6 +41,10 @@ public static void flyDisable(Player player){ player.setFlying(false); } + public static void disablePDC(Player player){ + player.getPersistentDataContainer().set(flyStatus, PersistentDataType.BOOLEAN, false); + } + private static boolean willFall(Player player){ Location location = player.getLocation(); Block blockBelow = location.clone().add(0, -1, 0).getBlock();