From aeef9cf89f9fe41bccbd93f268aedca2e7eaee8c Mon Sep 17 00:00:00 2001 From: Somebody Date: Thu, 1 May 2025 13:36:23 +0800 Subject: [PATCH] perf: allow some avatars create an extra summon unit --- Common/Data/Config/Task/CreateSummonUnit.cs | 2 +- Common/Data/Config/Task/DestroySummonUnit.cs | 2 +- Common/Data/Excel/SummonUnitDataExcel.cs | 6 ++++++ Common/Enums/Avatar/SummonUnitUniqueGroupEnum.cs | 8 ++++++++ GameServer/Game/Battle/BattleManager.cs | 9 ++++----- GameServer/Game/Lineup/LineupManager.cs | 12 ++++++++---- GameServer/Game/Scene/Entity/EntityMonster.cs | 1 - GameServer/Game/Scene/Entity/EntitySummonUnit.cs | 1 + GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs | 4 +++- .../Adventure/HandlerQuickStartCocoonStageCsReq.cs | 2 +- .../Recv/Scene/HandlerRefreshTriggerByClientCsReq.cs | 2 +- .../Packet/Recv/Scene/HandlerSceneCastSkillCsReq.cs | 2 +- .../Recv/Scene/HandlerStartCocoonStageCsReq.cs | 2 +- 13 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 Common/Enums/Avatar/SummonUnitUniqueGroupEnum.cs diff --git a/Common/Data/Config/Task/CreateSummonUnit.cs b/Common/Data/Config/Task/CreateSummonUnit.cs index 3153eea3..b486b6ba 100644 --- a/Common/Data/Config/Task/CreateSummonUnit.cs +++ b/Common/Data/Config/Task/CreateSummonUnit.cs @@ -1,6 +1,6 @@ namespace EggLink.DanhengServer.Data.Config.Task; -public class DestroySummonUnit : TaskConfigInfo +public class CreateSummonUnit : TaskConfigInfo { public int SummonUnitID { get; set; } } \ No newline at end of file diff --git a/Common/Data/Config/Task/DestroySummonUnit.cs b/Common/Data/Config/Task/DestroySummonUnit.cs index b486b6ba..3153eea3 100644 --- a/Common/Data/Config/Task/DestroySummonUnit.cs +++ b/Common/Data/Config/Task/DestroySummonUnit.cs @@ -1,6 +1,6 @@ namespace EggLink.DanhengServer.Data.Config.Task; -public class CreateSummonUnit : TaskConfigInfo +public class DestroySummonUnit : TaskConfigInfo { public int SummonUnitID { get; set; } } \ No newline at end of file diff --git a/Common/Data/Excel/SummonUnitDataExcel.cs b/Common/Data/Excel/SummonUnitDataExcel.cs index 72266a40..23d27735 100644 --- a/Common/Data/Excel/SummonUnitDataExcel.cs +++ b/Common/Data/Excel/SummonUnitDataExcel.cs @@ -1,4 +1,7 @@ using EggLink.DanhengServer.Data.Config.SummonUnit; +using EggLink.DanhengServer.Enums.Avatar; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace EggLink.DanhengServer.Data.Excel; @@ -7,6 +10,9 @@ public class SummonUnitDataExcel : ExcelResource { public int ID { get; set; } public string JsonPath { get; set; } = ""; + + [JsonConverter(typeof(StringEnumConverter))] + public SummonUnitUniqueGroupEnum UniqueGroup { get; set; } public bool DestroyOnEnterBattle { get; set; } public bool RemoveMazeBuffOnDestroy { get; set; } diff --git a/Common/Enums/Avatar/SummonUnitUniqueGroupEnum.cs b/Common/Enums/Avatar/SummonUnitUniqueGroupEnum.cs new file mode 100644 index 00000000..e2c76a91 --- /dev/null +++ b/Common/Enums/Avatar/SummonUnitUniqueGroupEnum.cs @@ -0,0 +1,8 @@ +namespace EggLink.DanhengServer.Enums.Avatar; + +public enum SummonUnitUniqueGroupEnum +{ + None = 0, + TeamField = 1, + _Count = 2 +} \ No newline at end of file diff --git a/GameServer/Game/Battle/BattleManager.cs b/GameServer/Game/Battle/BattleManager.cs index 9e38ca05..57b81053 100644 --- a/GameServer/Game/Battle/BattleManager.cs +++ b/GameServer/Game/Battle/BattleManager.cs @@ -1,5 +1,6 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Database.Avatar; using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Game.RogueMagic; @@ -197,7 +198,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) InvokeOnPlayerEnterBattle(Player, battleInstance); await Player.SendPacket(new PacketSceneEnterStageScRsp(battleInstance)); - Player.SceneInstance?.ClearSummonUnit(); + Player.SceneInstance?.OnEnterStage(); } public async ValueTask StartCocoonStage(int cocoonId, int wave, int worldLevel) @@ -326,15 +327,13 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) // Update battle status foreach (var avatar in req.Stt.BattleAvatarList) { - var avatarInstance = Player.AvatarManager!.GetFormalAvatar((int)avatar.Id); + BaseAvatarInfo? avatarInstance = Player.AvatarManager!.GetFormalAvatar((int)avatar.Id); var prop = avatar.AvatarStatus; var curHp = (int)Math.Max(Math.Round(prop.LeftHp / prop.MaxHp * 10000), minimumHp); var curSp = (int)prop.LeftSp * 100; if (avatarInstance == null) { - GameData.SpecialAvatarData.TryGetValue((int)(avatar.Id * 10 + Player.Data.WorldLevel), - out var specialAvatar); - if (specialAvatar == null) continue; + avatarInstance = Player.AvatarManager!.GetTrialAvatar((int)avatar.Id); avatarInstance?.SetCurHp(curHp, lineup.LineupType != 0); avatarInstance?.SetCurSp(curSp, lineup.LineupType != 0); } diff --git a/GameServer/Game/Lineup/LineupManager.cs b/GameServer/Game/Lineup/LineupManager.cs index 86dc0f29..615119e8 100644 --- a/GameServer/Game/Lineup/LineupManager.cs +++ b/GameServer/Game/Lineup/LineupManager.cs @@ -60,7 +60,8 @@ public class LineupManager : BasePlayerManager BaseAvatarInfo? avatarInfo = null; if (avatar.SpecialAvatarId > 0) { - avatarInfo = Player.AvatarManager!.GetFormalAvatar(avatar.SpecialAvatarId); + avatarInfo = Player.AvatarManager!.GetTrialAvatar(avatar.SpecialAvatarId); + avatarType = AvatarType.AvatarTrialType; } else if (avatar.AssistUid > 0) { @@ -158,10 +159,13 @@ public class LineupManager : BasePlayerManager foreach (var avatarId in baseAvatarIds) { - GameData.SpecialAvatarData.TryGetValue(avatarId * 10 + worldLevel, out var specialAvatar); - if (specialAvatar != null) + var trial = Player.AvatarManager!.GetTrialAvatar(avatarId); + if (trial != null) + { + trial.CheckLevel(worldLevel); lineup.BaseAvatars!.Add(new LineupAvatarInfo - { BaseAvatarId = specialAvatar.AvatarID, SpecialAvatarId = specialAvatar.SpecialAvatarID }); + { BaseAvatarId = trial.BaseAvatarId, SpecialAvatarId = trial.SpecialAvatarId }); + } else lineup.BaseAvatars!.Add(new LineupAvatarInfo { BaseAvatarId = avatarId }); } diff --git a/GameServer/Game/Scene/Entity/EntityMonster.cs b/GameServer/Game/Scene/Entity/EntityMonster.cs index c2a88572..8e47eeee 100644 --- a/GameServer/Game/Scene/Entity/EntityMonster.cs +++ b/GameServer/Game/Scene/Entity/EntityMonster.cs @@ -29,7 +29,6 @@ public class EntityMonster( public List BuffList { get; set; } = []; public SceneBuff? TempBuff { get; set; } public bool IsAlive { get; private set; } = true; - public bool IsInSummonUnit { get; set; } = false; public int EventID { get; set; } = info.EventID; public int CustomStageID { get; set; } = 0; diff --git a/GameServer/Game/Scene/Entity/EntitySummonUnit.cs b/GameServer/Game/Scene/Entity/EntitySummonUnit.cs index c38de199..5d054425 100644 --- a/GameServer/Game/Scene/Entity/EntitySummonUnit.cs +++ b/GameServer/Game/Scene/Entity/EntitySummonUnit.cs @@ -19,6 +19,7 @@ public class EntitySummonUnit : IGameEntity public int EntityId { get; set; } public int GroupID { get; set; } = 0; public List BuffList { get; set; } = []; + public HashSet CaughtEntityIds { get; set; } = []; public async ValueTask AddBuff(SceneBuff buff) { diff --git a/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs b/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs index 3aaa9a0c..7dbffa31 100644 --- a/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs +++ b/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs @@ -287,6 +287,8 @@ public class AbilityLevelTask(PlayerInstance player) if (!GameData.SummonUnitDataData.TryGetValue(createSummonUnit.SummonUnitID, out var excel)) return new AbilityLevelResult(); + if (excel.IsClient) return new AbilityLevelResult(); + var unit = new EntitySummonUnit { EntityId = 0, @@ -307,7 +309,7 @@ public class AbilityLevelTask(PlayerInstance player) public async ValueTask DestroySummonUnit(AbilityLevelParam param) { - if (param.Act is CreateSummonUnit createSummonUnit) await Player.SceneInstance!.ClearSummonUnit(); // TODO + if (param.Act is DestroySummonUnit destroySummonUnit) await Player.SceneInstance!.RemoveSummonUnitById(destroySummonUnit.SummonUnitID); // TODO return new AbilityLevelResult(); } diff --git a/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs b/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs index c2d706c8..41b36a29 100644 --- a/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs +++ b/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs @@ -13,7 +13,7 @@ public class HandlerQuickStartCocoonStageCsReq : Handler var battle = await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave, (int)req.WorldLevel); - connection.Player.SceneInstance?.ClearSummonUnit(); + connection.Player.SceneInstance?.OnEnterStage(); if (battle != null) await connection.SendPacket(new PacketQuickStartCocoonStageScRsp(battle, (int)req.CocoonId, (int)req.Wave)); diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerRefreshTriggerByClientCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerRefreshTriggerByClientCsReq.cs index 9cb4f827..9d96c549 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerRefreshTriggerByClientCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerRefreshTriggerByClientCsReq.cs @@ -12,7 +12,7 @@ public class HandlerRefreshTriggerByClientCsReq : Handler var req = RefreshTriggerByClientCsReq.Parser.ParseFrom(data); var player = connection.Player!; - var ret = await player.SceneInstance!.TriggerSummonUnit(req.TriggerName, req.TriggerTargetIdList.ToList()); + var ret = await player.SceneInstance!.TriggerSummonUnit((int)req.TriggerEntityId, req.TriggerName, req.TriggerTargetIdList.ToList()); await connection.SendPacket(new PacketRefreshTriggerByClientScRsp(ret, req.TriggerName, req.TriggerEntityId)); } diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerSceneCastSkillCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerSceneCastSkillCsReq.cs index e832e73c..6377bfbf 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerSceneCastSkillCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerSceneCastSkillCsReq.cs @@ -16,6 +16,6 @@ public class HandlerSceneCastSkillCsReq : Handler await connection.SendPacket(new PacketSceneCastSkillScRsp(res.RetCode, req.CastEntityId, res.Instance, res.TriggerBattleInfos ?? [])); - if (res.Instance != null) await player.SceneInstance!.ClearSummonUnit(); + if (res.Instance != null) await player.SceneInstance!.OnEnterStage(); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs index 21007de0..9509dffb 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs @@ -13,7 +13,7 @@ public class HandlerStartCocoonStageCsReq : Handler var battle = await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave, (int)req.WorldLevel); - connection.Player.SceneInstance?.ClearSummonUnit(); + connection.Player.SceneInstance?.OnEnterStage(); if (battle != null) await connection.SendPacket(new PacketStartCocoonStageScRsp(battle, (int)req.CocoonId, (int)req.Wave));