diff --git a/src/main/java/emu/grasscutter/command/CommandHelpers.java b/src/main/java/emu/grasscutter/command/CommandHelpers.java index fd3541cb9..ff1ea386f 100644 --- a/src/main/java/emu/grasscutter/command/CommandHelpers.java +++ b/src/main/java/emu/grasscutter/command/CommandHelpers.java @@ -13,6 +13,7 @@ public class CommandHelpers { public static final Pattern refineRegex = Pattern.compile("(?||all|weapons|mats|avatars) [lv] [r] [x] [c]", + "(||all|weapons|mats|avatars) [lv] [r] [x] [c] [sl]", " [lv] [x] [] [[,]]..."}, permission = "player.give", permissionTargeted = "player.give.others", @@ -47,7 +48,8 @@ public final class GiveCommand implements CommandHandler { Map.entry(lvlRegex, GiveItemParameters::setLvl), Map.entry(refineRegex, GiveItemParameters::setRefinement), Map.entry(amountRegex, GiveItemParameters::setAmount), - Map.entry(constellationRegex, GiveItemParameters::setConstellation) + Map.entry(constellationRegex, GiveItemParameters::setConstellation), + Map.entry(skillLevelRegex, GiveItemParameters::setSkillLevel) ); private static class GiveItemParameters { @@ -56,6 +58,7 @@ public final class GiveCommand implements CommandHandler { @Setter public int amount = 1; @Setter public int refinement = 1; @Setter public int constellation = -1; + @Setter public int skillLevel = 1; public int mainPropId = -1; public List appendPropIdList; public ItemData data; @@ -212,30 +215,28 @@ public final class GiveCommand implements CommandHandler { } private static Avatar makeAvatar(GiveItemParameters param) { - return makeAvatar(param.avatarData, param.lvl, Avatar.getMinPromoteLevel(param.lvl), param.constellation); + return makeAvatar(param.avatarData, param.lvl, Avatar.getMinPromoteLevel(param.lvl), param.constellation, param.skillLevel); } - private static Avatar makeAvatar(AvatarData avatarData, int level, int promoteLevel, int constellation) { + private static Avatar makeAvatar(AvatarData avatarData, int level, int promoteLevel, int constellation, int skillLevel) { Avatar avatar = new Avatar(avatarData); avatar.setLevel(level); avatar.setPromoteLevel(promoteLevel); + avatar.getSkillDepot().getSkillsAndEnergySkill().forEach(id -> avatar.setSkillLevel(id, skillLevel)); avatar.forceConstellationLevel(constellation); - avatar.recalcStats(); + avatar.recalcStats(true); + avatar.save(); return avatar; } private static void giveAllAvatars(Player player, GiveItemParameters param) { int promoteLevel = Avatar.getMinPromoteLevel(param.lvl); - if (param.constellation < 0) { - param.constellation = 6; - } + if (param.constellation < 0 || param.constellation > 6) param.constellation = 6; // constellation's default is -1 so if no parameters set for constellations it'll automatically be 6 for (AvatarData avatarData : GameData.getAvatarDataMap().values()) { - // Exclude test avatars int id = avatarData.getId(); - if (id < 10000002 || id >= 11000000) continue; - + if (id < 10000002 || id >= 11000000) continue; // Exclude test avatars // Don't try to add each avatar to the current team - player.addAvatar(makeAvatar(avatarData, param.lvl, promoteLevel, param.constellation), false); + player.addAvatar(makeAvatar(avatarData, param.lvl, promoteLevel, param.constellation, param.skillLevel), false); } } @@ -372,7 +373,7 @@ public final class GiveCommand implements CommandHandler { for (int i = 0; i < n; i++) { param.appendPropIdList.add(appendPropId); } - }; + } } private static void addItemsChunked(Player player, List items, int packetSize) { diff --git a/src/main/java/emu/grasscutter/command/commands/TalentCommand.java b/src/main/java/emu/grasscutter/command/commands/TalentCommand.java index db4747543..b77cfa059 100644 --- a/src/main/java/emu/grasscutter/command/commands/TalentCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/TalentCommand.java @@ -103,10 +103,8 @@ public final class TalentCommand implements CommandHandler { CommandHandler.sendTranslatedMessage(sender, "commands.talent.out_of_range"); return; } - // This is small so array is not needed imo - setTalentLevel(sender, avatar, skillDepot.getSkills().get(0), newLevel); - setTalentLevel(sender, avatar, skillDepot.getSkills().get(1), newLevel); - setTalentLevel(sender, avatar, skillDepot.getEnergySkill(), newLevel); + int finalNewLevel = newLevel; + skillDepot.getSkillsAndEnergySkill().forEach(id -> setTalentLevel(sender, avatar, id, finalNewLevel)); } case "getid" -> { var map = GameData.getAvatarSkillDataMap(); diff --git a/src/main/java/emu/grasscutter/game/avatar/Avatar.java b/src/main/java/emu/grasscutter/game/avatar/Avatar.java index 06247a691..c3af9f62b 100644 --- a/src/main/java/emu/grasscutter/game/avatar/Avatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/Avatar.java @@ -750,14 +750,16 @@ public class Avatar { if (level < 0 || level > 15) return false; var validLevels = GameData.getAvatarSkillLevels(skillId); if (validLevels != null && !validLevels.contains(level)) return false; - int oldLevel = this.skillLevelMap.getOrDefault(skillId, 0); // just taking the return value of put would have null concerns this.skillLevelMap.put(skillId, level); this.save(); // Packet - this.getPlayer().sendPacket(new PacketAvatarSkillChangeNotify(this, skillId, oldLevel, level)); - this.getPlayer().sendPacket(new PacketAvatarSkillUpgradeRsp(this, skillId, oldLevel, level)); + val player = this.getPlayer(); + if (player != null) { + player.sendPacket(new PacketAvatarSkillChangeNotify(this, skillId, oldLevel, level)); + player.sendPacket(new PacketAvatarSkillUpgradeRsp(this, skillId, oldLevel, level)); + } return true; }