diff --git a/src/main/java/emu/grasscutter/command/commands/GiveCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveCommand.java index c427d9d89ce..2ecdac1f5ea 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveCommand.java @@ -13,16 +13,15 @@ import java.util.LinkedList; import java.util.List; -@Command(label = "give", usage = "give [player] [amount]", - description = "Gives an item to you or the specified player", aliases = {"g", "item", "giveitem"}, permission = "player.give") +@Command(label = "give", usage = "give [player] [amount] [level]", description = "Gives an item to you or the specified player", aliases = { + "g", "item", "giveitem" }, permission = "player.give") public final class GiveCommand implements CommandHandler { @Override public void execute(GenshinPlayer sender, List args) { - int target, item, amount = 1; - + int target, item, lvl, amount = 1; if (sender == null && args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: give [amount]"); + CommandHandler.sendMessage(null, "Usage: give [amount] [level]"); return; } @@ -34,6 +33,7 @@ public void execute(GenshinPlayer sender, List args) { try { item = Integer.parseInt(args.get(0)); target = sender.getUid(); + lvl = 1; } catch (NumberFormatException ignored) { // TODO: Parse from item name using GM Handbook. CommandHandler.sendMessage(sender, "Invalid item id."); @@ -43,6 +43,7 @@ public void execute(GenshinPlayer sender, List args) { case 2: // [amount] | [player] try { target = Integer.parseInt(args.get(0)); + lvl = 1; if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { target = sender.getUid(); @@ -57,17 +58,39 @@ public void execute(GenshinPlayer sender, List args) { return; } break; - case 3: // [player] [amount] + case 3: // [player] [amount] | [amount] [level] + try { + target = Integer.parseInt(args.get(0)); + + if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + target = sender.getUid(); + item = Integer.parseInt(args.get(0)); + amount = Integer.parseInt(args.get(1)); + lvl = Integer.parseInt(args.get(2)); + } else { + item = Integer.parseInt(args.get(1)); + amount = Integer.parseInt(args.get(2)); + lvl = 1; + } + + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + return; + } + break; + case 4: // [player] [amount] [level] try { target = Integer.parseInt(args.get(0)); if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { CommandHandler.sendMessage(sender, "Invalid player ID."); return; + } else { + item = Integer.parseInt(args.get(1)); + amount = Integer.parseInt(args.get(2)); + lvl = Integer.parseInt(args.get(3)); } - - item = Integer.parseInt(args.get(1)); - amount = Integer.parseInt(args.get(2)); } catch (NumberFormatException ignored) { // TODO: Parse from item name using GM Handbook. CommandHandler.sendMessage(sender, "Invalid item or player ID."); @@ -89,18 +112,40 @@ public void execute(GenshinPlayer sender, List args) { return; } - this.item(targetPlayer, itemData, amount); + this.item(targetPlayer, itemData, amount, lvl); - if (!itemData.isEquip()) CommandHandler.sendMessage(sender, String.format("Given %s of %s to %s.", amount, item, target)); - else CommandHandler.sendMessage(sender, String.format("Given %s with level %s to %s", item, amount, target)); + if (!itemData.isEquip()) + CommandHandler.sendMessage(sender, String.format("Given %s of %s to %s.", amount, item, target)); + else + CommandHandler.sendMessage(sender, + String.format("Given %s with level %s %s times to %s", item, lvl, amount, target)); } - private void item(GenshinPlayer player, ItemData itemData, int amount) { + private void item(GenshinPlayer player, ItemData itemData, int amount, int lvl) { if (itemData.isEquip()) { - GenshinItem item = new GenshinItem(itemData); - item.setLevel(amount); - player.getInventory().addItem(item); - player.sendPacket(new PacketItemAddHintNotify(item, ActionReason.SubfieldDrop)); + List items = new LinkedList<>(); + for (int i = 0; i < amount; i++) { + GenshinItem item = new GenshinItem(itemData); + item.setCount(amount); + item.setLevel(lvl); + item.setPromoteLevel(0); + if (lvl > 20) { // 20/40 + item.setPromoteLevel(1); + } else if (lvl > 40) { // 40/50 + item.setPromoteLevel(2); + } else if (lvl > 50) { // 50/60 + item.setPromoteLevel(3); + } else if (lvl > 60) { // 60/70 + item.setPromoteLevel(4); + } else if (lvl > 70) { // 70/80 + item.setPromoteLevel(5); + } else if (lvl > 80) { // 80/90 + item.setPromoteLevel(6); + } + items.add(item); + } + player.getInventory().addItems(items); + player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); } else { GenshinItem genshinItem = new GenshinItem(itemData); genshinItem.setCount(amount); @@ -109,4 +154,3 @@ private void item(GenshinPlayer player, ItemData itemData, int amount) { } } } -