97 lines
2.8 KiB
C#
97 lines
2.8 KiB
C#
using Cal;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace ET
|
|
{
|
|
public static class SelectTargetHelper
|
|
{
|
|
/// <summary>
|
|
/// 选取可以攻击的目标
|
|
/// </summary>
|
|
public static void SelectUnitByFlags(List<Unit> sourceList, List<Unit> retList, TargetFlagType flags)
|
|
{
|
|
retList.Clear();
|
|
if (sourceList == null || sourceList.Count == 0)
|
|
return;
|
|
foreach (var u in sourceList)
|
|
{
|
|
if (IsValid(u, flags))
|
|
retList.Add(u);
|
|
}
|
|
|
|
}
|
|
|
|
private static bool IsValid(Unit unit, TargetFlagType flags)
|
|
{
|
|
if (flags.HasFlag(TargetFlagType.死亡的))
|
|
{
|
|
if (!unit.IsAlive)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
if (flags.HasFlag(TargetFlagType.无敌的))
|
|
{
|
|
|
|
}
|
|
if (flags.HasFlag(TargetFlagType.隐身的))
|
|
{
|
|
|
|
}
|
|
if (flags.HasFlag(TargetFlagType.免疫控制的))
|
|
{
|
|
|
|
}
|
|
if (flags.HasFlag(TargetFlagType.召唤的))
|
|
{
|
|
|
|
}
|
|
return true;
|
|
}
|
|
public static void GetTarget(SelectTargetBase selectTarget, ISkillSender skillSender, Action<Unit, ISkillSender> action)
|
|
{
|
|
TargetableUnitBase targetBase = null;
|
|
switch (selectTarget)
|
|
{
|
|
default:
|
|
break;
|
|
case SelectSingleTarget singleTarget:
|
|
targetBase = singleTarget.GetTarget(skillSender);
|
|
break;
|
|
case SelectMultiTarget selectMultiTarget:
|
|
targetBase = selectMultiTarget.GetTarget(skillSender);
|
|
break;
|
|
}
|
|
|
|
if (!targetBase) return;
|
|
if (targetBase is TargetableSingleUnit singleUnit)
|
|
{
|
|
var target = singleUnit.target;
|
|
if (!target)
|
|
{
|
|
Log.ErrorDetail($"单体目标为空 {skillSender}");
|
|
targetBase.Dispose();
|
|
return;
|
|
}
|
|
action?.Invoke(target, skillSender);
|
|
}
|
|
else if (targetBase is TargetableMultiUnit multiUnit)
|
|
{
|
|
var targetList = multiUnit.targetList;
|
|
if (targetList == null)
|
|
{
|
|
Log.ErrorDetail($"多个目标为空 {skillSender}");
|
|
targetBase.Dispose();
|
|
return;
|
|
}
|
|
foreach (var target in targetList)
|
|
{
|
|
action?.Invoke(target, skillSender);
|
|
}
|
|
}
|
|
targetBase.Dispose();
|
|
}
|
|
}
|
|
}
|