using UnityEngine;
|
using System.Collections.Generic;
|
using Cysharp.Threading.Tasks;
|
using System;
|
|
|
// 如果这个Action卡住了 大概率是因为 动作被其他动作中断了 导致没有回调
|
public class DeathRecordAction : RecordAction
|
{
|
protected List<BattleDeadPack> deadPackList = new List<BattleDeadPack>();
|
|
protected Dictionary<BattleDeadPack, SkillRecordAction> deathActionDict = new Dictionary<BattleDeadPack, SkillRecordAction>();
|
|
protected Dictionary<BattleDeadPack, Func<bool>> deadActionStatesDict = new Dictionary<BattleDeadPack, Func<bool>>();
|
|
protected Dictionary<int, bool> dropStateDict = new Dictionary<int, bool>();
|
|
public DeathRecordAction(BattleField _battleField, List<BattleDeadPack> _deadPackList)
|
: base(RecordActionType.Death, _battleField, null)
|
{
|
deadPackList = _deadPackList;
|
}
|
|
|
public override void Run()
|
{
|
// 该死的正常死
|
// 有技能的则按照顺序播放死亡技能 后再正常死
|
if (isFinish)
|
return;
|
|
|
if (!isRunOnce)
|
{
|
isRunOnce = true;
|
|
foreach (var battleDeadPack in deadPackList)
|
{
|
if (battleDeadPack.deadTriggerSkill != null)
|
{
|
var skillAction = battleDeadPack.deadTriggerSkill.CreateSkillAction();
|
if (null != skillAction)
|
{
|
deathActionDict.Add(battleDeadPack, skillAction);
|
}
|
}
|
else
|
{
|
deadActionStatesDict.Add(battleDeadPack, CreateDeadActionState(battleDeadPack));
|
}
|
}
|
}
|
else
|
{
|
List<BattleDeadPack> finishedKeys = new List<BattleDeadPack>();
|
foreach (var kv in deathActionDict)
|
{
|
if (!kv.Key.isPlaySkill)
|
{
|
// battleField.recordPlayer.ImmediatelyPlay(kv.Value);
|
kv.Key.isPlaySkill = true;
|
}
|
|
if (!kv.Value.IsFinished())
|
{
|
kv.Value.Run();
|
}
|
else
|
{
|
deadActionStatesDict.Add(kv.Key, CreateDeadActionState(kv.Key, true));
|
finishedKeys.Add(kv.Key);
|
}
|
break;
|
}
|
|
foreach (var key in finishedKeys)
|
{
|
deathActionDict.Remove(key);
|
}
|
|
int completeNum = 0;
|
|
foreach (var kv in deadActionStatesDict)
|
{
|
if (kv.Value())
|
{
|
completeNum++;
|
}
|
}
|
|
if (completeNum == deadPackList.Count)
|
{
|
isFinish = true;
|
}
|
}
|
}
|
|
private Func<bool> CreateDeadActionState(BattleDeadPack deadPack, bool withoutAnime = false)
|
{
|
BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.deadPack.ObjID);
|
if (null == deadObj)
|
{
|
return () => true;
|
}
|
|
PerformDrop(deadObj);
|
|
bool isComplete = false;
|
|
deadObj.OnDeath(() => {
|
isComplete = true;
|
}, withoutAnime);
|
|
return () => isComplete;
|
}
|
|
public override void ForceFinish()
|
{
|
isFinish = true;
|
|
foreach (var kv in deathActionDict)
|
{
|
kv.Value.ForceFinish();
|
}
|
|
// 直接结束
|
foreach (var deadPack in deadPackList)
|
{
|
BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.deadPack.ObjID);
|
if (null != deadObj)
|
{
|
PerformDrop(deadObj);
|
}
|
deadObj.SetDeath();
|
}
|
|
base.ForceFinish();
|
}
|
|
private void PerformDrop(BattleObject deadObj)
|
{
|
// 只有主线掉落物品
|
if (battleField.MapID == 1 || battleField.MapID == 2)
|
{
|
if (dropStateDict.ContainsKey(deadObj.ObjID))
|
{
|
return;
|
}
|
dropStateDict.Add(deadObj.ObjID, true);
|
deadObj.PerformDrop();
|
}
|
}
|
}
|