From e817dce1face7051276fa69aa356cc35fcd1990b Mon Sep 17 00:00:00 2001 From: StopWuyu Date: Sat, 7 Jun 2025 20:00:52 +0800 Subject: [PATCH] fix: the server will crash when lineup has same avatars --- GameServer/Game/Battle/BattleInstance.cs | 47 ++++++++++++++++++------ 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/GameServer/Game/Battle/BattleInstance.cs b/GameServer/Game/Battle/BattleInstance.cs index 5b2204e9..5bfd4a7a 100644 --- a/GameServer/Game/Battle/BattleInstance.cs +++ b/GameServer/Game/Battle/BattleInstance.cs @@ -4,6 +4,7 @@ using EggLink.DanhengServer.Database; using EggLink.DanhengServer.Database.Avatar; using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.Enums.Avatar; +using EggLink.DanhengServer.GameServer.Game.Lineup; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Game.Scene; using EggLink.DanhengServer.GameServer.Game.Scene.Entity; @@ -117,7 +118,7 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List GetBattleAvatars() + public List GetBattleAvatars() { var excel = GameData.StageConfigData[StageId]; List list = [.. excel.TrialAvatarList]; @@ -142,26 +143,27 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List 0) // if list is not empty { - Dictionary dict = []; + List avatars = []; foreach (var avatar in list) { var specialAvatar = Player.AvatarManager!.GetTrialAvatar(avatar); if (specialAvatar != null) { - dict.Add(specialAvatar, AvatarType.AvatarTrialType); + specialAvatar.CheckLevel(Player.Data.WorldLevel); + avatars.Add(new AvatarLineupData(specialAvatar, AvatarType.AvatarTrialType)); } else { var avatarInfo = Player.AvatarManager!.GetFormalAvatar(avatar); - if (avatarInfo != null) dict.Add(avatarInfo, AvatarType.AvatarFormalType); + if (avatarInfo != null) avatars.Add(new AvatarLineupData(avatarInfo, AvatarType.AvatarFormalType)); } } - return dict; + return avatars; } else { - Dictionary dict = []; + List avatars = []; foreach (var avatar in Lineup.BaseAvatars!) // if list is empty, use scene lineup { BaseAvatarInfo? avatarInstance = null; @@ -181,6 +183,7 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List 0) + { + var ids = Player.BattleManager!.NextBattleMonsterIds; + // split every 5 + for (var i = 0; i < (ids.Count - 1) / 5 + 1; i++) + { + var count = Math.Min(5, ids.Count - i * 5); + var waveIds = ids.GetRange(i * 5, count); + + proto.MonsterWaveList.Add(new SceneMonsterWave + { + BattleStageId = (uint)(Stages.FirstOrDefault()?.StageID ?? 0), + BattleWaveId = (uint)(proto.MonsterWaveList.Count + 1), + MonsterParam = new SceneMonsterWaveParam(), + MonsterList = { waveIds.Select(x => new SceneMonster + { + MonsterId = (uint)x + }) } + }); + } + } + var avatars = GetBattleAvatars(); foreach (var avatar in avatars) - proto.BattleAvatarList.Add(avatar.Key.ToBattleProto( - new PlayerDataCollection(Player.Data, Player.InventoryManager!.Data, Lineup), avatar.Value)); + proto.BattleAvatarList.Add(avatar.AvatarInfo.ToBattleProto( + new PlayerDataCollection(Player.Data, Player.InventoryManager!.Data, Lineup), avatar.AvatarType)); System.Threading.Tasks.Task.Run(async () => { foreach (var monster in EntityMonsters) await monster.ApplyBuff(this); foreach (var avatar in AvatarInfo) - if (avatars.Keys.FirstOrDefault(x => + if (avatars.Select(x => x.AvatarInfo).FirstOrDefault(x => x.BaseAvatarId == avatar.AvatarInfo.BaseAvatarId) != null) // if avatar is in lineup await avatar.ApplyBuff(this);