diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index b994fe419..47ac08405 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -14,20 +14,22 @@ import emu.grasscutter.game.inventory.ItemType; import java.util.*; @Command(label = "giveall", usage = "giveall [player] ", - description = "Gives all items", aliases = {"givea"}, permission = "player.giveall",threading = true) + description = "Gives all items", aliases = {"givea"}, permission = "player.giveall", threading = true) public class GiveAllCommand implements CommandHandler { + @Override public void execute(GenshinPlayer sender, List args) { - int target,amount=99999; + int target, amount = 99999; - if(sender == null){ - CommandHandler.sendMessage(null, "Run this command in-game"); - return; - } switch (args.size()) { - default: // *no args* + case 0: // *no args* + if (sender == null) { + CommandHandler.sendMessage(null, "This usage can only be run in-game"); + return; + } target = sender.getUid(); break; + case 1: // [player] try { target = Integer.parseInt(args.get(0)); @@ -40,6 +42,7 @@ public class GiveAllCommand implements CommandHandler { return; } break; + case 2: // [player] [amount] try { target = Integer.parseInt(args.get(0)); @@ -49,11 +52,15 @@ public class GiveAllCommand implements CommandHandler { } else { amount = Integer.parseInt(args.get(1)); } - } catch (NumberFormatException ignored) { + } catch (NumberFormatException ignored) { CommandHandler.sendMessage(sender, "Invalid amount or player ID."); return; } break; + + default: // invalid + CommandHandler.sendMessage(null, "Usage: giveall [player] "); + return; } GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); @@ -62,47 +69,121 @@ public class GiveAllCommand implements CommandHandler { return; } - this.GetAllItem(targetPlayer,amount); - CommandHandler.sendMessage(sender, "Done! or Getting all items done"); + this.giveAllItems(targetPlayer, amount); + CommandHandler.sendMessage(sender, "Giving all items done"); } - public void GetAllItem(GenshinPlayer player, int amount){ - CommandHandler.sendMessage(player, "Getting all item...."); + public void giveAllItems(GenshinPlayer player, int amount) { + CommandHandler.sendMessage(player, "Giving all items..."); - Collection genshinItemList =new LinkedList<>(); - for (ItemData itemdata: GenshinData.getItemDataMap().values()) { - if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar - if (itemdata.isEquip()) { - for (int i = 0; i < 20; i++) { - GenshinItem genshinItem = new GenshinItem(itemdata); - if(itemdata.getItemType() == ItemType.ITEM_WEAPON){ - genshinItem.setLevel(90); - genshinItem.setPromoteLevel(6); - } - genshinItemList.add(genshinItem); - } - } else { - GenshinItem genshinItem = new GenshinItem(itemdata); - genshinItem.setCount(amount); - genshinItemList.add(genshinItem); - } - } - player.getInventory().addItems(genshinItemList); + for (AvatarData avatarData: GenshinData.getAvatarDataMap().values()) { + //Exclude test avatar + if (isTestAvatar(avatarData.getId())) continue; - for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { - if(avatarData.getId() == 10000001 || avatarData.getId() >= 10000099)continue; - // Calculate ascension level. - int ascension = (int) Math.ceil(90 / 10f) - 3; GenshinAvatar avatar = new GenshinAvatar(avatarData); avatar.setLevel(90); - avatar.setPromoteLevel(ascension); - for (int i = 1;i<=6;i++){ - avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i);//(10000058-10000000)*10+i + avatar.setPromoteLevel(6); + for (int i = 1; i <= 6; ++i) { + avatar.getTalentIdList().add((avatar.getAvatarId() - 10000000) * 10 + i); } // This will handle stats and talents avatar.recalcStats(); player.addAvatar(avatar); } + + //some test items + List genshinItemList = new ArrayList<>(); + for (ItemData itemdata: GenshinData.getItemDataMap().values()) { + //Exclude test item + if (isTestItem(itemdata.getId())) continue; + + if (itemdata.isEquip()) { + for (int i = 0; i < 10; ++i) { + GenshinItem genshinItem = new GenshinItem(itemdata); + if (itemdata.getItemType() == ItemType.ITEM_WEAPON) { + genshinItem.setLevel(90); + genshinItem.setPromoteLevel(6); + genshinItem.setRefinement(4); + } + genshinItemList.add(genshinItem); + } + } + else { + GenshinItem genshinItem = new GenshinItem(itemdata); + genshinItem.setCount(amount); + genshinItemList.add(genshinItem); + } + } + int packetNum = 20; + int itemLength = genshinItemList.size(); + int number = itemLength / packetNum; + int remainder = itemLength % packetNum; + int offset = 0; + for (int i = 0; i < packetNum; ++i) { + if (remainder > 0) { + player.getInventory().addItems(genshinItemList.subList(i * number + offset, (i + 1) * number + offset + 1)); + --remainder; + ++offset; + } + else { + player.getInventory().addItems(genshinItemList.subList(i * number + offset, (i + 1) * number + offset)); + } + } } + public boolean isTestAvatar(int avatarId) { + return avatarId < 10000002 || avatarId >= 11000000; + } + + public boolean isTestItem(int itemId) { + for (Range range: testItemRanges) { + if (range.check(itemId)) { + return true; + } + } + + if (testItemsList.contains(itemId)) { + return true; + } + + return false; + } + + static class Range { + private int min; + private int max; + + public Range(int min, int max) { + if(min > max){ + min ^= max; + max ^= min; + min ^= max; + } + this.min = min; + this.max = max; + } + + public boolean check(int value) { + return value >= this.min && value <= this.max; + } + } + + private static final Range[] testItemRanges = new Range[] { + new Range(106, 139), + new Range(1000, 1099), + new Range(2001, 2008), + new Range(2017, 2029), + // new Range(108001, 108387) //food + }; + + private static final Integer[] testItemsIds = new Integer[] { + 210, 211, 314, 315, 317, 1005, 1007, 1105, 1107, 1201, 1202, 2800, + 100001, 100002, 100244, 100305, 100312, 100313, 101212, 11411, 11506, 11507, 11508, 12505, + 12506, 12508, 12509, 13503, 13506, 14411, 14503, 14505, 14508, 15411, 15504, 15505, + 15506, 15508, 20001, 10002, 10003, 10004, 10005, 10006, 10008 //9 + }; + + private static final Collection testItemsList = Arrays.asList(testItemsIds); + } +