From e8164747640e134b100dd1fb3f2a040331ab877c Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:59:46 -0800 Subject: [PATCH] Command handlers no longer need to handle null targets --- .../java/emu/lunarcore/command/Command.java | 2 ++ .../emu/lunarcore/command/CommandHandler.java | 6 +++- .../emu/lunarcore/command/CommandManager.java | 15 +++++++-- .../command/commands/AvatarCommand.java | 8 +---- .../command/commands/ClearCommand.java | 8 +---- .../command/commands/GenderCommand.java | 8 +---- .../command/commands/GiveAllCommand.java | 8 +---- .../command/commands/GiveCommand.java | 8 +---- .../command/commands/HealCommand.java | 8 +---- .../command/commands/KickCommand.java | 7 +--- .../command/commands/MailCommand.java | 33 ++++++------------- .../command/commands/PermissionCommand.java | 8 +---- .../command/commands/RefillMPCommand.java | 8 +---- .../command/commands/RefillSPCommand.java | 8 +---- .../command/commands/SceneCommand.java | 8 +---- .../command/commands/SetLevelCommand.java | 8 +---- .../command/commands/SpawnCommand.java | 8 +---- .../command/commands/WorldLevelCommand.java | 8 +---- 18 files changed, 44 insertions(+), 123 deletions(-) diff --git a/src/main/java/emu/lunarcore/command/Command.java b/src/main/java/emu/lunarcore/command/Command.java index 5afb734..f393f94 100644 --- a/src/main/java/emu/lunarcore/command/Command.java +++ b/src/main/java/emu/lunarcore/command/Command.java @@ -12,4 +12,6 @@ public @interface Command { public String desc() default ""; public String permission() default ""; + + public boolean requireTarget() default false; } diff --git a/src/main/java/emu/lunarcore/command/CommandHandler.java b/src/main/java/emu/lunarcore/command/CommandHandler.java index 102611e..cd75b14 100644 --- a/src/main/java/emu/lunarcore/command/CommandHandler.java +++ b/src/main/java/emu/lunarcore/command/CommandHandler.java @@ -5,8 +5,12 @@ import emu.lunarcore.game.player.Player; public interface CommandHandler { + public default Command getData() { + return this.getClass().getAnnotation(Command.class); + } + public default String getLabel() { - return this.getClass().getAnnotation(Command.class).label(); + return getData().label(); } public default void sendMessage(Player player, String message) { diff --git a/src/main/java/emu/lunarcore/command/CommandManager.java b/src/main/java/emu/lunarcore/command/CommandManager.java index 9de813c..746f0d2 100644 --- a/src/main/java/emu/lunarcore/command/CommandManager.java +++ b/src/main/java/emu/lunarcore/command/CommandManager.java @@ -108,19 +108,30 @@ public class CommandManager { // Execute if (handler != null) { // Command annotation data - Command command = handler.getClass().getAnnotation(Command.class); + Command command = handler.getData(); + // Check permission if (this.checkPermission(sender, command)) { - // Check targeted permission + // Build command arguments CommandArgs cmdArgs = new CommandArgs(sender, args); + + // Check targeted permission if (sender != cmdArgs.getTarget() && !this.checkTargetPermission(sender, command)) { handler.sendMessage(sender, "You do not have permission to use this command on another player."); return; } + + // Make sure our command has a target + if (command.requireTarget() && cmdArgs.getTarget() == null) { + handler.sendMessage(sender, "Error: Targeted player not found or offline"); + return; + } + // Log if (sender != null && LunarCore.getConfig().getLogOptions().commands) { LunarCore.getLogger().info("[UID: " + sender.getUid() + "] " + sender.getName() + " used command: " + message); } + // Run command handler.execute(sender, cmdArgs); } else { diff --git a/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java b/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java index 49199fb..5d960d7 100644 --- a/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java @@ -11,17 +11,11 @@ import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.player.Player; import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; -@Command(label = "avatar", aliases = {"a"}, permission = "player.avatar", desc = "/avatar {cur | all | lineup} lv(level) p(ascension) r(eidolon) s(skill levels). Sets the current avatar's properties") +@Command(label = "avatar", aliases = {"a"}, requireTarget = true, permission = "player.avatar", desc = "/avatar {cur | all | lineup} lv(level) p(ascension) r(eidolon) s(skill levels). Sets the current avatar's properties") public class AvatarCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - // Temp avatar list List changeList = new ArrayList<>(); diff --git a/src/main/java/emu/lunarcore/command/commands/ClearCommand.java b/src/main/java/emu/lunarcore/command/commands/ClearCommand.java index a44e736..26cb4c5 100644 --- a/src/main/java/emu/lunarcore/command/commands/ClearCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/ClearCommand.java @@ -10,17 +10,11 @@ import emu.lunarcore.game.enums.ItemMainType; import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.player.Player; -@Command(label = "clear", permission = "player.clear", desc = "/clear {relics | lightcones | materials | items}. Removes filtered items from the player inventory.") +@Command(label = "clear", permission = "player.clear", requireTarget = true, desc = "/clear {relics | lightcones | materials | items}. Removes filtered items from the player inventory.") public class ClearCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - List toRemove = new LinkedList<>(); String type = args.get(0).toLowerCase(); diff --git a/src/main/java/emu/lunarcore/command/commands/GenderCommand.java b/src/main/java/emu/lunarcore/command/commands/GenderCommand.java index 4f01e55..f9924a7 100644 --- a/src/main/java/emu/lunarcore/command/commands/GenderCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/GenderCommand.java @@ -8,17 +8,11 @@ import emu.lunarcore.game.player.Player; import emu.lunarcore.game.player.PlayerGender; import emu.lunarcore.server.packet.send.PacketGetHeroBasicTypeInfoScRsp; -@Command(label = "gender", permission = "player.gender", desc = "/gender {male | female}. Sets the player gender.") +@Command(label = "gender", permission = "player.gender", requireTarget = true, desc = "/gender {male | female}. Sets the player gender.") public class GenderCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - // Set world level Player target = args.getTarget(); PlayerGender playerGender = null; diff --git a/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java b/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java index fdae835..c57b720 100644 --- a/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java @@ -15,17 +15,11 @@ import emu.lunarcore.game.enums.ItemSubType; import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.player.Player; -@Command(label = "giveall", aliases = {"ga"}, permission = "player.give", desc = "/giveall {materials | avatars | lightcones | relics}. Gives the targeted player items.") +@Command(label = "giveall", aliases = {"ga"}, permission = "player.give", requireTarget = true, desc = "/giveall {materials | avatars | lightcones | relics}. Gives the targeted player items.") public class GiveAllCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - Player target = args.getTarget(); String type = args.get(0).toLowerCase(); diff --git a/src/main/java/emu/lunarcore/command/commands/GiveCommand.java b/src/main/java/emu/lunarcore/command/commands/GiveCommand.java index d7e9cb4..a0d6e83 100644 --- a/src/main/java/emu/lunarcore/command/commands/GiveCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/GiveCommand.java @@ -14,17 +14,11 @@ import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.player.Player; import emu.lunarcore.util.Utils; -@Command(label = "give", aliases = {"g"}, permission = "player.give", desc = "/give [item id] x[amount]. Gives the targetted player an item.") +@Command(label = "give", aliases = {"g"}, permission = "player.give", requireTarget = true, desc = "/give [item id] x[amount]. Gives the targetted player an item.") public class GiveCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - int itemId = Utils.parseSafeInt(args.get(0)); int amount = Math.max(args.getAmount(), 1); diff --git a/src/main/java/emu/lunarcore/command/commands/HealCommand.java b/src/main/java/emu/lunarcore/command/commands/HealCommand.java index 5f98a78..65af9b4 100644 --- a/src/main/java/emu/lunarcore/command/commands/HealCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/HealCommand.java @@ -6,17 +6,11 @@ import emu.lunarcore.command.CommandHandler; import emu.lunarcore.game.player.lineup.PlayerLineup; import emu.lunarcore.game.player.Player; -@Command(label = "heal", permission = "player.heal", desc = "/heal. Heals your avatars.") +@Command(label = "heal", permission = "player.heal", requireTarget = true, desc = "/heal. Heals your avatars.") public class HealCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - PlayerLineup lineup = args.getTarget().getCurrentLineup(); lineup.forEachAvatar(avatar -> { avatar.setCurrentHp(lineup, 10000); diff --git a/src/main/java/emu/lunarcore/command/commands/KickCommand.java b/src/main/java/emu/lunarcore/command/commands/KickCommand.java index 10c1d52..5e334ed 100644 --- a/src/main/java/emu/lunarcore/command/commands/KickCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/KickCommand.java @@ -8,18 +8,13 @@ import emu.lunarcore.game.player.Player; @Command( label = "kick", desc = "/kick @[player id]. Kicks a player from the server.", + requireTarget = true, permission = "player.kick" ) public final class KickCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - // Kick player args.getTarget().getSession().close(); diff --git a/src/main/java/emu/lunarcore/command/commands/MailCommand.java b/src/main/java/emu/lunarcore/command/commands/MailCommand.java index 7aa4996..d153520 100644 --- a/src/main/java/emu/lunarcore/command/commands/MailCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/MailCommand.java @@ -6,41 +6,28 @@ import java.util.List; import emu.lunarcore.command.Command; import emu.lunarcore.command.CommandArgs; import emu.lunarcore.command.CommandHandler; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.ItemExcel; import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.mail.Mail; import emu.lunarcore.game.player.Player; -@Command(label = "mail", aliases = {"m"}, permission = "player.mail", desc = "/mail [content]. Sends the targeted player a system mail.") +@Command(label = "mail", aliases = {"m"}, permission = "player.mail", requireTarget = true, desc = "/mail [content]. Sends the targeted player a system mail.") public class MailCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - // Get attachments List attachments = new ArrayList<>(); - - var it = args.getList().iterator(); - while (it.hasNext()) { - try { - String str = it.next(); + + if (args.getMap() != null) { + for (var entry : args.getMap().int2IntEntrySet()) { + if (entry.getIntValue() <= 0) continue; - if (str.contains(":")) { - String[] split = str.split(":"); - - int itemId = Integer.parseInt(split[0]); - int count = Integer.parseInt(split[1]); - - attachments.add(new GameItem(itemId, count)); - - it.remove(); - } - } catch (Exception e) { + ItemExcel itemExcel = GameData.getItemExcelMap().get(entry.getIntKey()); + if (itemExcel == null) continue; + attachments.add(new GameItem(itemExcel, entry.getIntValue())); } } diff --git a/src/main/java/emu/lunarcore/command/commands/PermissionCommand.java b/src/main/java/emu/lunarcore/command/commands/PermissionCommand.java index a1df8e4..878c83f 100644 --- a/src/main/java/emu/lunarcore/command/commands/PermissionCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/PermissionCommand.java @@ -5,17 +5,11 @@ import emu.lunarcore.command.CommandArgs; import emu.lunarcore.command.CommandHandler; import emu.lunarcore.game.player.Player; -@Command(label = "permission", aliases = {"perm"}, permission = "admin.permission", desc = "/permission {add | remove | clear} [permission]. Gives/removes a permission from the targeted player.") +@Command(label = "permission", aliases = {"perm"}, permission = "admin.permission", requireTarget = true, desc = "/permission {add | remove | clear} [permission]. Gives/removes a permission from the targeted player.") public class PermissionCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - String type = args.get(0).toLowerCase(); String permission = args.get(1).toLowerCase(); diff --git a/src/main/java/emu/lunarcore/command/commands/RefillMPCommand.java b/src/main/java/emu/lunarcore/command/commands/RefillMPCommand.java index 51f5197..5e0b7f8 100644 --- a/src/main/java/emu/lunarcore/command/commands/RefillMPCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/RefillMPCommand.java @@ -6,17 +6,11 @@ import emu.lunarcore.command.CommandArgs; import emu.lunarcore.command.CommandHandler; import emu.lunarcore.game.player.Player; -@Command(label = "refill", aliases = {"rf"}, permission = "player.refill", desc = "/refill - refill your skill points in open world.") +@Command(label = "refill", aliases = {"rf"}, permission = "player.refill", requireTarget = true, desc = "/refill - refill your skill points in open world.") public class RefillMPCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - sender.getCurrentLineup().addMp(GameConstants.MAX_MP); this.sendMessage(sender, "Successfully refilled skill points for " + args.getTarget().getName()); } diff --git a/src/main/java/emu/lunarcore/command/commands/RefillSPCommand.java b/src/main/java/emu/lunarcore/command/commands/RefillSPCommand.java index 38b2c97..edf443c 100644 --- a/src/main/java/emu/lunarcore/command/commands/RefillSPCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/RefillSPCommand.java @@ -6,17 +6,11 @@ import emu.lunarcore.command.CommandArgs; import emu.lunarcore.command.CommandHandler; import emu.lunarcore.game.player.Player; -@Command(label = "energy", permission = "player.energy", desc = "/energy. Refills all characters energy in current lineup.") +@Command(label = "energy", permission = "player.energy", requireTarget = true, desc = "/energy. Refills all characters energy in current lineup.") public class RefillSPCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - PlayerLineup lineup = args.getTarget().getCurrentLineup(); lineup.forEachAvatar(avatar -> { avatar.setCurrentSp(lineup, 10000); diff --git a/src/main/java/emu/lunarcore/command/commands/SceneCommand.java b/src/main/java/emu/lunarcore/command/commands/SceneCommand.java index 49d8b4a..32c109f 100644 --- a/src/main/java/emu/lunarcore/command/commands/SceneCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/SceneCommand.java @@ -10,17 +10,11 @@ import emu.lunarcore.data.excel.MazePlaneExcel; import emu.lunarcore.game.player.Player; import emu.lunarcore.util.Utils; -@Command(label = "scene", aliases = {"sc"}, permission = "player.scene", desc = "/scene [scene id] [floor id]. Teleports the player to the specified scene.") +@Command(label = "scene", aliases = {"sc"}, permission = "player.scene", requireTarget = true, desc = "/scene [scene id] [floor id]. Teleports the player to the specified scene.") public class SceneCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - // Get arguments int planeId = Utils.parseSafeInt(args.get(0)); int floorId = Utils.parseSafeInt(args.get(1)); diff --git a/src/main/java/emu/lunarcore/command/commands/SetLevelCommand.java b/src/main/java/emu/lunarcore/command/commands/SetLevelCommand.java index bfffb37..22e5d96 100644 --- a/src/main/java/emu/lunarcore/command/commands/SetLevelCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/SetLevelCommand.java @@ -6,17 +6,11 @@ import emu.lunarcore.command.CommandArgs; import emu.lunarcore.command.CommandHandler; import emu.lunarcore.game.player.Player; -@Command(label = "setlevel", aliases = {"level"}, permission = "player.setlevel", desc = "/setlevel [level] - Sets the targeted player's trailblazer level.") +@Command(label = "setlevel", aliases = {"level"}, permission = "player.setlevel", requireTarget = true, desc = "/setlevel [level] - Sets the targeted player's trailblazer level.") public class SetLevelCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - int targetLevel = Utils.parseSafeInt(args.get(0)); args.getTarget().setLevel(targetLevel); diff --git a/src/main/java/emu/lunarcore/command/commands/SpawnCommand.java b/src/main/java/emu/lunarcore/command/commands/SpawnCommand.java index e9d66a4..8bae1e8 100644 --- a/src/main/java/emu/lunarcore/command/commands/SpawnCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/SpawnCommand.java @@ -16,17 +16,11 @@ import emu.lunarcore.game.scene.entity.EntityProp; import emu.lunarcore.util.Position; import emu.lunarcore.util.Utils; -@Command(label = "spawn", permission = "player.spawn", desc = "/spawn [monster/prop id] x[amount] s[stage id]. Spawns a monster or prop near the targeted player.") +@Command(label = "spawn", permission = "player.spawn", requireTarget = true, desc = "/spawn [monster/prop id] x[amount] s[stage id]. Spawns a monster or prop near the targeted player.") public class SpawnCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - Player target = args.getTarget(); if (target.getScene() == null) { diff --git a/src/main/java/emu/lunarcore/command/commands/WorldLevelCommand.java b/src/main/java/emu/lunarcore/command/commands/WorldLevelCommand.java index c8837fa..b940f0c 100644 --- a/src/main/java/emu/lunarcore/command/commands/WorldLevelCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/WorldLevelCommand.java @@ -6,17 +6,11 @@ import emu.lunarcore.command.CommandHandler; import emu.lunarcore.game.player.Player; import emu.lunarcore.util.Utils; -@Command(label = "worldlevel", aliases = {"wl"}, permission = "player.worldlevel", desc = "/worldlevel [world level]. Sets the targeted player's equilibrium level.") +@Command(label = "worldlevel", aliases = {"wl"}, permission = "player.worldlevel", requireTarget = true, desc = "/worldlevel [world level]. Sets the targeted player's equilibrium level.") public class WorldLevelCommand implements CommandHandler { @Override public void execute(Player sender, CommandArgs args) { - // Check target - if (args.getTarget() == null) { - this.sendMessage(sender, "Error: Targeted player not found or offline"); - return; - } - // Set world level int level = Utils.parseSafeInt(args.get(0)); level = Math.min(Math.max(level, 0), 6);