diff --git a/src/main/java/emu/lunarcore/command/CommandArgs.java b/src/main/java/emu/lunarcore/command/CommandArgs.java index 1df9deb..d311354 100644 --- a/src/main/java/emu/lunarcore/command/CommandArgs.java +++ b/src/main/java/emu/lunarcore/command/CommandArgs.java @@ -3,6 +3,9 @@ package emu.lunarcore.command; import java.util.List; import emu.lunarcore.LunarCore; +import emu.lunarcore.data.GameData; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.player.Player; import emu.lunarcore.util.Utils; import lombok.Getter; @@ -81,4 +84,91 @@ public class CommandArgs { } return this.list.get(index); } + + // Utility commands + + /** + * Changes the properties of an avatar based on the arguments provided + * @param avatar The targeted avatar to change + * @return A boolean of whether or not any changes were made to the avatar + */ + public boolean setProperties(GameAvatar avatar) { + boolean hasChanged = false; + + // Try to set level + if (this.getLevel() > 0) { + avatar.setLevel(this.getLevel()); + hasChanged = true; + } + + // Try to set level + if (this.getLevel() > 0) { + avatar.setLevel(Math.min(this.getLevel(), 80)); + avatar.setPromotion(Utils.getMinPromotionForLevel(avatar.getLevel())); + hasChanged = true; + } + + // Try to set promotion (ascension level) + if (this.getPromotion() >= 0) { + avatar.setPromotion(Math.min(this.getPromotion(), avatar.getExcel().getMaxPromotion())); + hasChanged = true; + } + + // Try to set rank (eidolons) + if (this.getRank() >= 0) { + avatar.setRank(Math.min(this.getRank(), avatar.getExcel().getMaxRank())); + hasChanged = true; + } + + // Try to set skill trees + if (this.getStage() > 0) { + for (int pointId : avatar.getExcel().getSkillTreeIds()) { + var skillTree = GameData.getAvatarSkillTreeExcel(pointId, 1); + if (skillTree == null) continue; + + int minLevel = skillTree.isDefaultUnlock() ? 1 : 0; + int pointLevel = Math.max(Math.min(this.getStage(), skillTree.getMaxLevel()), minLevel); + + avatar.getSkills().put(pointId, pointLevel); + } + hasChanged = true; + } + + return hasChanged; + } + + /** + * Changes the properties of an item based on the arguments provided + * @param item The targeted item to change + * @return A boolean of whether or not any changes were made to the item + */ + public boolean setProperties(GameItem item) { + boolean hasChanged = false; + + if (item.getExcel().isEquipment()) { + // Try to set level + if (this.getLevel() > 0) { + item.setLevel(Math.min(this.getLevel(), 80)); + item.setPromotion(Utils.getMinPromotionForLevel(item.getLevel())); + } + + // Try to set promotion + if (this.getPromotion() >= 0) { + item.setPromotion(Math.min(this.getPromotion(), item.getExcel().getEquipmentExcel().getMaxPromotion())); + } + + // Try to set rank (superimposition) + if (this.getRank() >= 0) { + item.setRank(Math.min(this.getRank(), item.getExcel().getEquipmentExcel().getMaxRank())); + } + } else if (item.getExcel().isRelic()) { + // Try to set level + if (this.getLevel() > 0) { + item.setLevel(Math.min(this.getLevel(), 15)); + // TODO add substats + } + } + + return hasChanged; + } } diff --git a/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java b/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java index edd42c7..f1fe39e 100644 --- a/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/AvatarCommand.java @@ -3,11 +3,9 @@ package emu.lunarcore.command.commands; import emu.lunarcore.command.Command; import emu.lunarcore.command.CommandArgs; import emu.lunarcore.command.CommandHandler; -import emu.lunarcore.data.GameData; import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.player.Player; import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; -import emu.lunarcore.util.Utils; @Command(label = "avatar", aliases = {"a"}, permission = "player.avatar", desc = "/avatar lv(level) p(ascension) r(eidolon) s(skill levels). Sets the current avatar's properties") public class AvatarCommand implements CommandHandler { @@ -27,49 +25,8 @@ public class AvatarCommand implements CommandHandler { return; } - boolean hasChanged = false; - - // Try to set level - if (args.getLevel() > 0) { - avatar.setLevel(args.getLevel()); - hasChanged = true; - } - - // Try to set level - if (args.getLevel() > 0) { - avatar.setLevel(Math.min(args.getLevel(), 80)); - avatar.setPromotion(Utils.getMinPromotionForLevel(avatar.getLevel())); - hasChanged = true; - } - - // Try to set promotion (ascension level) - if (args.getPromotion() >= 0) { - avatar.setPromotion(Math.min(args.getPromotion(), avatar.getExcel().getMaxPromotion())); - hasChanged = true; - } - - // Try to set rank (eidolons) - if (args.getRank() >= 0) { - avatar.setRank(Math.min(args.getRank(), avatar.getExcel().getMaxRank())); - hasChanged = true; - } - - // Try to set skill trees - if (args.getStage() > 0) { - for (int pointId : avatar.getExcel().getSkillTreeIds()) { - var skillTree = GameData.getAvatarSkillTreeExcel(pointId, 1); - if (skillTree == null) continue; - - int minLevel = skillTree.isDefaultUnlock() ? 1 : 0; - int pointLevel = Math.max(Math.min(args.getStage(), skillTree.getMaxLevel()), minLevel); - - avatar.getSkills().put(pointId, pointLevel); - } - hasChanged = true; - } - - // Done - if (hasChanged) { + // Change properties + if (args.setProperties(avatar)) { // Save avatar avatar.save(); diff --git a/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java b/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java index 48acf21..be29b96 100644 --- a/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/GiveAllCommand.java @@ -8,6 +8,7 @@ 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.avatar.GameAvatar; import emu.lunarcore.game.enums.ItemMainType; import emu.lunarcore.game.enums.ItemRarity; import emu.lunarcore.game.enums.ItemSubType; @@ -25,6 +26,7 @@ public class GiveAllCommand implements CommandHandler { return; } + Player target = args.getTarget(); String type = args.get(0).toLowerCase(); switch (type) { @@ -43,51 +45,72 @@ public class GiveAllCommand implements CommandHandler { items.add(new GameItem(2, 50_000_000)); // Add to target's inventory - args.getTarget().getInventory().addItems(items, true); + target.getInventory().addItems(items, true); // Send message - this.sendMessage(sender, "Giving " + args.getTarget().getName() + " " + items.size() + " items"); + this.sendMessage(sender, "Giving " + target.getName() + " " + items.size() + " items"); } case "lc", "lightcones" -> { // Get lightcones List items = GameData.getItemExcelMap().values() .stream() .filter(ItemExcel::isEquipment) - .map(excel -> new GameItem(excel, 1)) + .map(excel -> { + var item = new GameItem(excel, 1); + args.setProperties(item); + return item; + }) .toList(); // Add to target's inventory - args.getTarget().getInventory().addItems(items, true); + target.getInventory().addItems(items, true); // Send message - this.sendMessage(sender, "Giving " + args.getTarget().getName() + " " + items.size() + " light cones"); + this.sendMessage(sender, "Giving " + target.getName() + " " + items.size() + " light cones"); } case "r", "relics" -> { // Get relics List items = GameData.getItemExcelMap().values() .stream() .filter(excel -> excel.isRelic() && excel.getRarity() == ItemRarity.SuperRare) - .map(excel -> new GameItem(excel, 1)) + .map(excel -> { + var item = new GameItem(excel, 1); + args.setProperties(item); + return item; + }) .toList(); // Add to target's inventory - args.getTarget().getInventory().addItems(items, true); + target.getInventory().addItems(items, true); // Send message - this.sendMessage(sender, "Giving " + args.getTarget().getName() + " " + items.size() + " relics"); + this.sendMessage(sender, "Giving " + target.getName() + " " + items.size() + " relics"); } case "a", "characters", "avatars" -> { // All avatars and their eidolons for (ItemExcel excel : GameData.getItemExcelMap().values()) { if (excel.getItemMainType() == ItemMainType.AvatarCard) { - args.getTarget().getInventory().addItem(excel, 1); + // Skip if target already has this avatar + if (target.getAvatars().hasAvatar(excel.getId())) { + continue; + } + + // Add avatar + target.getInventory().addItem(excel, 1); + + // Set avatar properties + GameAvatar avatar = target.getAvatarById(excel.getId()); + if (avatar != null) { + args.setProperties(avatar); + } } else if (excel.getItemSubType() == ItemSubType.Eidolon) { - args.getTarget().getInventory().addItem(excel, 6); + // Add eidolons + target.getInventory().addItem(excel, 6); } } // Send message - this.sendMessage(sender, "Giving " + args.getTarget().getName() + " all avatars"); + this.sendMessage(sender, "Giving " + target.getName() + " all avatars"); } } } diff --git a/src/main/java/emu/lunarcore/command/commands/GiveCommand.java b/src/main/java/emu/lunarcore/command/commands/GiveCommand.java index 25f078f..677c58a 100644 --- a/src/main/java/emu/lunarcore/command/commands/GiveCommand.java +++ b/src/main/java/emu/lunarcore/command/commands/GiveCommand.java @@ -41,22 +41,10 @@ public class GiveCommand implements CommandHandler { if (itemData.getItemMainType() == ItemMainType.AvatarCard) { // Add avatar GameAvatar avatar = new GameAvatar(itemData.getId()); + if (args.getTarget().addAvatar(avatar)) { - // Try to set level - if (args.getLevel() > 0) { - avatar.setLevel(Math.min(args.getLevel(), 80)); - avatar.setPromotion(Utils.getMinPromotionForLevel(avatar.getLevel())); - } - - // Try to set promotion - if (args.getPromotion() >= 0) { - avatar.setPromotion(Math.min(args.getPromotion(), avatar.getExcel().getMaxPromotion())); - } - - // Try to set rank - if (args.getRank() >= 0) { - avatar.setRank(Math.min(args.getRank(), avatar.getExcel().getMaxRank())); - } + // Change avatar properties + args.setProperties(avatar); } } else if (itemData.isEquippable()) { for (int i = 0; i < amount; i++) {