From 5b6698f583c1d476350cf7824fcc752d6fc5aa26 Mon Sep 17 00:00:00 2001 From: natsu <107408377+natsurepo@users.noreply.github.com> Date: Mon, 24 Oct 2022 10:58:39 +0700 Subject: [PATCH] Extend setConstCommand "all" (#1884) * Extend give command "talent" * Update src/main/java/emu/grasscutter/data/excels/AvatarSkillDepotData.java Shorten IntStream for getCombatSkills Co-authored-by: Luke H-W * Fix setSkillLevel to work during avatar construction Shortening getCombatSkills * changeSkillLevel now acts as intermediate operation to fetch skillIds * setSkillLevel changes to allow out of range levels to be normalized * Update src/main/java/emu/grasscutter/command/commands/GiveCommand.java Removing recalcStats since it's redundant Co-authored-by: Luke H-W * Major changes and cleanup: - AvatarSkillDepotData: removed getCombatSkills since it's unused - TalentCommand: shortened /talent all using getSkillsAndEnergySkill - GiveCommand: changed changeSkillLevel to setSkillLevel - Avatar: delete changeSkillLevel and moved the operation inside setSkillLevel,updated skillId to Integer to catch special cases from GiveCommand * Small cleanup: Removed the special case from Avatar to be handled inside of GiveCommand * Added "all" parameter to SetConst * Changed all to [all] int SetConstCommand usage Co-authored-by: Luke H-W Co-authored-by: Luke H-W --- .../command/commands/SetConstCommand.java | 59 ++++++++++++------- src/main/resources/languages/en-US.json | 1 + src/main/resources/languages/es-ES.json | 1 + src/main/resources/languages/fr-FR.json | 1 + src/main/resources/languages/ja-JP.json | 1 + src/main/resources/languages/ko-KR.json | 1 + src/main/resources/languages/pl-PL.json | 1 + src/main/resources/languages/ro-RO.json | 1 + src/main/resources/languages/ru-RU.json | 1 + src/main/resources/languages/zh-CN.json | 1 + src/main/resources/languages/zh-TW.json | 1 + 11 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/SetConstCommand.java b/src/main/java/emu/grasscutter/command/commands/SetConstCommand.java index f24f46fc2..a2e3f68b4 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetConstCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SetConstCommand.java @@ -1,10 +1,7 @@ package emu.grasscutter.command.commands; -import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.data.GameData; -import emu.grasscutter.data.excels.AvatarTalentData; import emu.grasscutter.game.avatar.Avatar; import emu.grasscutter.game.entity.EntityAvatar; import emu.grasscutter.game.player.Player; @@ -12,14 +9,13 @@ import emu.grasscutter.game.world.Scene; import emu.grasscutter.game.world.World; import emu.grasscutter.server.packet.send.*; import emu.grasscutter.utils.Position; -import it.unimi.dsi.fastutil.ints.IntArrayList; import java.util.List; @Command( label = "setConst", aliases = {"setconstellation"}, - usage = {""}, + usage = {" [all]"}, permission = "player.setconstellation", permissionTargeted = "player.setconstellation.others") public final class SetConstCommand implements CommandHandler { @@ -29,21 +25,28 @@ public final class SetConstCommand implements CommandHandler { sendUsageMessage(sender); return; } - try { int constLevel = Integer.parseInt(args.get(0)); + // Check if level is out of range if (constLevel < -1 || constLevel > 6) { CommandHandler.sendTranslatedMessage(sender, "commands.setConst.range_error"); return; } - - EntityAvatar entity = targetPlayer.getTeamManager().getCurrentAvatarEntity(); - if (entity == null) return; - Avatar avatar = entity.getAvatar(); - - this.setConstellation(targetPlayer, avatar, constLevel); - - CommandHandler.sendTranslatedMessage(sender, "commands.setConst.success", avatar.getAvatarData().getName(), constLevel); + // If it's either empty or anything else other than "all" just do normal setConstellation + if (args.size() == 1) { + EntityAvatar entity = targetPlayer.getTeamManager().getCurrentAvatarEntity(); + if (entity == null) return; + Avatar avatar = entity.getAvatar(); + this.setConstellation(targetPlayer, avatar, constLevel); + CommandHandler.sendTranslatedMessage(sender, "commands.setConst.success", avatar.getAvatarData().getName(), constLevel); + return; + } + // Check if there's an additional argument which is "all", if it does then go setAllConstellation + if (args.size() > 1 && args.get(1).equalsIgnoreCase("all")) { + this.setAllConstellation(targetPlayer, constLevel); + CommandHandler.sendTranslatedMessage(sender, "commands.setConst.successall", constLevel); + } + else sendUsageMessage(sender); } catch (NumberFormatException ignored) { CommandHandler.sendTranslatedMessage(sender, "commands.setConst.level_error"); } @@ -55,13 +58,7 @@ public final class SetConstCommand implements CommandHandler { // force player to reload scene when necessary if (constLevel < currentConstLevel) { - World world = player.getWorld(); - Scene scene = player.getScene(); - Position pos = player.getPosition(); - - world.transferPlayerToScene(player, 1, pos); - world.transferPlayerToScene(player, scene.getId(), pos); - scene.broadcastPacket(new PacketSceneEntityAppearNotify(player)); + this.reloadScene(player); } // ensure that all changes are visible to the player @@ -69,4 +66,24 @@ public final class SetConstCommand implements CommandHandler { avatar.recalcStats(true); avatar.save(); } + + private void setAllConstellation(Player player, int constLevel) { + player.getAvatars().forEach(avatar -> { + avatar.forceConstellationLevel(constLevel); + avatar.recalcConstellations(); + avatar.recalcStats(true); + avatar.save(); + }); + // Just reload scene once, shorter than having to check for each constLevel < currentConstLevel + this.reloadScene(player); + } + + private void reloadScene(Player player) { + World world = player.getWorld(); + Scene scene = player.getScene(); + Position pos = player.getPosition(); + world.transferPlayerToScene(player, 1, pos); + world.transferPlayerToScene(player, scene.getId(), pos); + scene.broadcastPacket(new PacketSceneEntityAppearNotify(player)); + } } diff --git a/src/main/resources/languages/en-US.json b/src/main/resources/languages/en-US.json index 529e1e580..6471400e0 100644 --- a/src/main/resources/languages/en-US.json +++ b/src/main/resources/languages/en-US.json @@ -264,6 +264,7 @@ "fail": "Failed to set constellation.", "failed_success": "Constellations for %s have been set to %s. Please reload scene to see changes.", "success": "Constellations for %s have been set to %s.", + "successall": "Constellations for all characters have been set to %s.", "description": "Sets constellation level for your current active character" }, "setFetterLevel": { diff --git a/src/main/resources/languages/es-ES.json b/src/main/resources/languages/es-ES.json index e1f536e0c..50a0cc9ce 100644 --- a/src/main/resources/languages/es-ES.json +++ b/src/main/resources/languages/es-ES.json @@ -264,6 +264,7 @@ "fail": "Error al establecer la constelación.", "failed_success": "Las constelaciones de %s han sido establecidas a %s. Por favor reinicia el escenario para ver los cambios.", "success": "Las constelaciones de %s han sido establecidas a %s.", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "Establece el nivel de constelación para tu personaje actual" }, "setFetterLevel": { diff --git a/src/main/resources/languages/fr-FR.json b/src/main/resources/languages/fr-FR.json index 35da92fe2..dafb0fb9b 100644 --- a/src/main/resources/languages/fr-FR.json +++ b/src/main/resources/languages/fr-FR.json @@ -264,6 +264,7 @@ "fail": "🇺🇸Failed to set constellation.", "failed_success": "🇺🇸Constellations for %s have been set to %s. Please reload scene to see changes.", "success": "🇺🇸Constellations for %s have been set to %s.", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "🇺🇸Sets constellation level for your current active character" }, "setFetterLevel": { diff --git a/src/main/resources/languages/ja-JP.json b/src/main/resources/languages/ja-JP.json index 97398b699..2403e564a 100644 --- a/src/main/resources/languages/ja-JP.json +++ b/src/main/resources/languages/ja-JP.json @@ -264,6 +264,7 @@ "fail": "星座の設定に失敗しました。", "failed_success": "%s の星座は %s に設定されました。 シーンをリロードして変更を確認してください。", "success": "%s の星座は %s に設定されました。", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "現在アクティブなキャラクターの星座レベルを設定します" }, "setFetterLevel": { diff --git a/src/main/resources/languages/ko-KR.json b/src/main/resources/languages/ko-KR.json index ca8e79c9a..e74f26285 100644 --- a/src/main/resources/languages/ko-KR.json +++ b/src/main/resources/languages/ko-KR.json @@ -264,6 +264,7 @@ "fail": "🇺🇸Failed to set constellation.", "failed_success": "🇺🇸Constellations for %s have been set to %s. Please reload scene to see changes.", "success": "🇺🇸Constellations for %s have been set to %s.", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "🇺🇸Sets constellation level for your current active character" }, "setFetterLevel": { diff --git a/src/main/resources/languages/pl-PL.json b/src/main/resources/languages/pl-PL.json index b929d8207..02f382dfc 100644 --- a/src/main/resources/languages/pl-PL.json +++ b/src/main/resources/languages/pl-PL.json @@ -264,6 +264,7 @@ "fail": "Nie udało się ustawić konstelacji.", "failed_success": "Konstelacje dla %s zostały ustawione na %s. Proszę przeładować scenę aby zobaczyć zmiany.", "success": "Konstelacje dla %s zostały ustawione na %s.", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "Ustawia poziom konstelacji dla aktywnej postaci" }, "setFetterLevel": { diff --git a/src/main/resources/languages/ro-RO.json b/src/main/resources/languages/ro-RO.json index 1578d2192..48eac7409 100644 --- a/src/main/resources/languages/ro-RO.json +++ b/src/main/resources/languages/ro-RO.json @@ -264,6 +264,7 @@ "fail": "🇺🇸Failed to set constellation.", "failed_success": "🇺🇸Constellations for %s have been set to %s. Please reload scene to see changes.", "success": "🇺🇸Constellations for %s have been set to %s.", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "🇺🇸Sets constellation level for your current active character" }, "setFetterLevel": { diff --git a/src/main/resources/languages/ru-RU.json b/src/main/resources/languages/ru-RU.json index 96c4c6166..7faf96455 100644 --- a/src/main/resources/languages/ru-RU.json +++ b/src/main/resources/languages/ru-RU.json @@ -264,6 +264,7 @@ "fail": "Не удалось установить уровень созвездия.", "failed_success": "Созвездия для %s установлены на %s. Перезайдите чтобы изменения вступили в силу.", "success": "Созвездия для %s были установлены на %s.", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "Задает уровень созвездия для активного персонажа" }, "setFetterLevel": { diff --git a/src/main/resources/languages/zh-CN.json b/src/main/resources/languages/zh-CN.json index 9bd17feae..bd098a452 100644 --- a/src/main/resources/languages/zh-CN.json +++ b/src/main/resources/languages/zh-CN.json @@ -264,6 +264,7 @@ "fail": "命之座等级设置失败。", "failed_success": "命之座 %s 已设置为 %s。", "success": "命之座 %s 已设置为 %s。", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "为当前活跃角色设置命座等级" }, "setFetterLevel": { diff --git a/src/main/resources/languages/zh-TW.json b/src/main/resources/languages/zh-TW.json index 8ff040888..8d2d506e2 100644 --- a/src/main/resources/languages/zh-TW.json +++ b/src/main/resources/languages/zh-TW.json @@ -264,6 +264,7 @@ "fail": "設定命座失敗。", "failed_success": "%s的命之座已設定為成%s,重新登入後將會生效。", "success": "%s的命之座已設定為成%s。", + "successall": "🇺🇸Constellations for all characters have been set to %s.", "description": "設定當前角色的命之座。" }, "setFetterLevel": {