diff --git a/src/main/java/emu/grasscutter/command/Command.java b/src/main/java/emu/grasscutter/command/Command.java index d8a57e1a8..c38568d65 100644 --- a/src/main/java/emu/grasscutter/command/Command.java +++ b/src/main/java/emu/grasscutter/command/Command.java @@ -14,4 +14,6 @@ public @interface Command { String[] aliases() default {}; String permission() default ""; + + boolean threading() default false; } diff --git a/src/main/java/emu/grasscutter/command/CommandMap.java b/src/main/java/emu/grasscutter/command/CommandMap.java index f735bc642..19ab687ad 100644 --- a/src/main/java/emu/grasscutter/command/CommandMap.java +++ b/src/main/java/emu/grasscutter/command/CommandMap.java @@ -11,7 +11,6 @@ import java.util.*; public final class CommandMap { private final Map commands = new HashMap<>(); private final Map annotations = new HashMap<>(); - public CommandMap() { this(false); } @@ -106,8 +105,9 @@ public final class CommandMap { */ public void invoke(GenshinPlayer player, String rawMessage) { rawMessage = rawMessage.trim(); - if(rawMessage.length() == 0) { - CommandHandler.sendMessage(player, "No command specified."); return; + if (rawMessage.length() == 0) { + CommandHandler.sendMessage(player, "No command specified."); + return; } // Remove prefix if present. @@ -118,7 +118,6 @@ public final class CommandMap { String[] split = rawMessage.split(" "); List args = new LinkedList<>(Arrays.asList(split)); String label = args.remove(0); - // Get command handler. CommandHandler handler = this.commands.get(label); if (handler == null) { @@ -130,14 +129,22 @@ public final class CommandMap { if (player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if(!permissionNode.isEmpty() && !account.hasPermission(permissionNode)) { + if (!permissionNode.isEmpty() && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } } // Invoke execute method for handler. - handler.execute(player, args); + boolean threading = this.annotations.get(label).threading(); + Runnable runnable = () -> handler.execute(player, args); + if(threading) { + Thread command = new Thread(runnable); + command.start(); + } + else { + runnable.run(); + } } /** diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index a90080e0a..ad4240b01 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -1,5 +1,6 @@ package emu.grasscutter.command.commands; +import com.thoughtworks.proxy.toys.nullobject.Null; import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; @@ -9,14 +10,11 @@ import emu.grasscutter.data.def.ItemData; import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.game.avatar.GenshinAvatar; import emu.grasscutter.game.inventory.GenshinItem; -import emu.grasscutter.game.props.ActionReason; -import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; -import java.util.LinkedList; -import java.util.List; +import java.util.*; @Command(label = "giveall", usage = "giveall [player] ", - description = "Gives All item to you or the specified player", aliases = {"givea"}, permission = "player.giveall") + description = "Gives all items", aliases = {"givea"}, permission = "player.giveall",threading = true) public class GiveAllCommand implements CommandHandler { @Override @@ -25,7 +23,12 @@ public class GiveAllCommand implements CommandHandler { switch (args.size()) { default: // giveall *no args* - target = sender.getUid(); + try { + target = sender.getUid(); + }catch (NullPointerException ignored){ + CommandHandler.sendMessage(sender, "Player not found."); + return; + } break; case 1: //[player] try { @@ -62,27 +65,27 @@ public class GiveAllCommand implements CommandHandler { } this.GetAllItem(targetPlayer,amount); - CommandHandler.sendMessage(sender, String.format("Get All Items Done.")); + CommandHandler.sendMessage(sender, "Done! or Getting all items done"); } public void GetAllItem(GenshinPlayer player, int amount){ - CommandHandler.sendMessage(player, "Get All Items..."); + CommandHandler.sendMessage(player, "Getting all items…"); + + Collection genshinItemList =new LinkedList<>(); for (ItemData itemdata: GenshinData.getItemDataMap().values()) { - if(itemdata.getId() > 1000 && itemdata.getId() <= 2000)continue;//is avatar + if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar if (itemdata.isEquip()) { - List items = new LinkedList<>(); for (int i = 0; i < 20; i++) { - items.add(new GenshinItem(itemdata)); + genshinItemList.add(new GenshinItem(itemdata)); } - player.getInventory().addItems(items); - player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); } else { GenshinItem genshinItem = new GenshinItem(itemdata); genshinItem.setCount(amount); - player.getInventory().addItem(genshinItem); - player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.SubfieldDrop)); + genshinItemList.add(genshinItem); } } + player.getInventory().addItems(genshinItemList); + for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { int ascension;