| | |
| | | protected int redTeamIndex = 0; |
| | | protected int blueTeamIndex = 0; |
| | | |
| | | // 记录正在处理死亡的角色ID,防止重复处理 |
| | | private HashSet<uint> processingDeathObjIds = new HashSet<uint>(); |
| | | |
| | | public BattleField(string _guid) |
| | | { |
| | | guid = _guid; |
| | |
| | | battleTweenMgr = new BattleTweenMgr(); |
| | | recordPlayer = new RecordPlayer(); |
| | | |
| | | |
| | | processingDeathObjIds = new HashSet<uint>(); |
| | | } |
| | | |
| | | public virtual void Init(int _MapID, int _FuncLineID, JsonData _extendData, |
| | |
| | | |
| | | redTeamIndex = 0; |
| | | blueTeamIndex = 0; |
| | | |
| | | // 重置死亡处理记录 |
| | | processingDeathObjIds.Clear(); |
| | | |
| | | battleEffectMgr.Init(this); |
| | | battleTweenMgr.Init(this); |
| | |
| | | battleEffectMgr.Release(); |
| | | battleTweenMgr.Release(); |
| | | recordPlayer.Release(); |
| | | |
| | | // 清理死亡处理记录 |
| | | processingDeathObjIds.Clear(); |
| | | } |
| | | |
| | | public virtual void Run() |
| | |
| | | { |
| | | if (deadPackList.Count > 0) |
| | | { |
| | | DeathRecordAction recordAction = new DeathRecordAction(this, deadPackList); |
| | | recordPlayer.ImmediatelyPlay(recordAction); |
| | | // 过滤掉正在处理死亡的角色,避免重复处理 |
| | | List<HB422_tagMCTurnFightObjDead> validDeadList = new List<HB422_tagMCTurnFightObjDead>(); |
| | | |
| | | foreach (var deadPack in deadPackList) |
| | | { |
| | | // 检查是否已经在处理死亡 |
| | | if (processingDeathObjIds.Contains(deadPack.ObjID)) |
| | | { |
| | | Debug.LogWarning($"OnObjsDead: 角色正在处理死亡,忽略重复死亡消息 ObjID={deadPack.ObjID}"); |
| | | continue; |
| | | } |
| | | |
| | | BattleObject battleObj = battleObjMgr.GetBattleObject((int)deadPack.ObjID); |
| | | if (battleObj == null) |
| | | { |
| | | Debug.LogWarning($"OnObjsDead: 找不到角色 ObjID={deadPack.ObjID}"); |
| | | continue; |
| | | } |
| | | |
| | | // 添加到处理中列表 |
| | | processingDeathObjIds.Add(deadPack.ObjID); |
| | | validDeadList.Add(deadPack); |
| | | // Debug.LogError("prepare death : " + deadPack.ObjID); |
| | | } |
| | | |
| | | // 只处理有效的死亡消息 |
| | | if (validDeadList.Count > 0) |
| | | { |
| | | DeathRecordAction recordAction = new DeathRecordAction(this, validDeadList); |
| | | recordPlayer.ImmediatelyPlay(recordAction); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | if (battleObj != null) |
| | | { |
| | | battleObj.OnReborn(vNetData); |
| | | |
| | | // 从死亡处理列表中移除该角色 |
| | | if (processingDeathObjIds.Remove(vNetData.ObjID)) |
| | | { |
| | | Debug.Log($"OnObjReborn: 角色复活,从死亡处理列表移除 ObjID={vNetData.ObjID}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | battleObjMgr.DestroyTeam(BattleCamp.Blue); |
| | | SetBattleStartState(); |
| | | SetBattleMode(BattleMode.Stop); |
| | | |
| | | // 清理死亡处理记录 |
| | | processingDeathObjIds.Clear(); |
| | | } |
| | | |
| | | //清场敌方但不终止战斗,用于切换主线BOSS战斗后,正常显示敌方 |
| | |
| | | battleObjMgr.HaveRest(BattleCamp.Blue); |
| | | battleObjMgr.DestroyTeam(BattleCamp.Blue); |
| | | SetBattleStartState(); |
| | | |
| | | // 清理死亡处理记录 |
| | | processingDeathObjIds.Clear(); |
| | | } |
| | | |
| | | public bool IsBattleEnd() |