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 <Birdulon@users.noreply.github.com>

* 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 <Birdulon@users.noreply.github.com>

* 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 <Birdulon@users.noreply.github.com>

Co-authored-by: Luke H-W <Birdulon@users.noreply.github.com>
---
 .../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 f24f46fc..a2e3f68b 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 = {"<constellation level>"},
+    usage = {"<constellation level> [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 529e1e58..6471400e 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 e1f536e0..50a0cc9c 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 35da92fe..dafb0fb9 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 97398b69..2403e564 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 ca8e79c9..e74f2628 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 b929d820..02f382df 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 1578d219..48eac740 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 96c4c616..7faf9645 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 9bd17fea..bd098a45 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 8ff04088..8d2d506e 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": {
-- 
GitLab