using Cal; using System; using System.Collections.Generic; namespace ET { public static class SelectTargetHelper { /// /// 选取可以攻击的目标 /// public static void SelectUnitByFlags(List sourceList, List retList, TargetFlagType flags) { retList.Clear(); if (sourceList == null || sourceList.Count == 0) return; foreach (Unit 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, SkillAction 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) { Unit target = singleUnit.target; if (!target) { Log.ErrorDetail($"单体目标为空 {skillSender}"); targetBase.Dispose(); return; } try { if (action != null) action.Invoke(target, skillSender).Coroutine(); } catch (Exception e) { Log.Error(e); } } else if (targetBase is TargetableMultiUnit multiUnit) { List targetList = multiUnit.targetList; if (targetList == null) { Log.ErrorDetail($"多个目标为空 {skillSender}"); targetBase.Dispose(); return; } foreach (Unit target in targetList) { try { if (action != null) action.Invoke(target, skillSender).Coroutine(); } catch (Exception e) { Log.Error(e); } } } targetBase.Dispose(); } } }