Beispiel #1
0
        private void SelectTargets(Bio mainTarget, bool detectInOut, ref List <Bio> result)
        {
            if (detectInOut)
            {
                this._tempOldTargets.AddRange(result);
                result.Clear();
            }

            switch (this._buff.rangeType)
            {
            case RangeType.Single:
                //检查指定的目标是否符合条件
                //在隐身等状态下也能选中,因此不能使用CanAttack方法
                if (!mainTarget.isDead &&
                    EntityUtils.CheckCampType(this._buff.caster, this._buff.campType, mainTarget) &&
                    EntityUtils.CheckTargetFlag(this._buff.targetFlag, mainTarget))
                {
                    result.Add(mainTarget);
                }
                break;

            case RangeType.Circle:
            {
                bool targetAdded = false;
                if (mainTarget != null &&
                    EntityUtils.CanAttack(this._buff.caster, mainTarget, this._buff.campType, this._buff.targetFlag))
                {
                    targetAdded = true;
                    result.Add(mainTarget);                                       //如果指定的目标符合条件则优先添加到目标列表
                }

                int maxTargetNum = mainTarget != null
                                                                                           ? this._buff.maxTriggerTargets - 1
                                                                                           : this._buff.maxTriggerTargets;
                if (maxTargetNum > 0)
                {
                    EntityUtils.GetEntitiesInCircle(this._buff.battle.GetEntities(), this._buff.property.position,
                                                    this._buff.radius, ref this._temp1);
                    if (targetAdded)
                    {
                        this._temp1.Remove(mainTarget);                                           //之前已经添加目标了
                    }
                    EntityUtils.FilterTarget(this._buff.caster, this._buff.campType, this._buff.targetFlag, ref this._temp1,
                                             ref this._temp2);
                    this._temp1.Clear();
                    EntityUtils.FilterLimit(ref this._temp2, ref this._temp1, maxTargetNum);

                    int count = this._temp1.Count;
                    for (int i = 0; i < count; i++)
                    {
                        result.Add(( Bio )this._temp1[i]);
                    }

                    this._temp1.Clear();
                    this._temp2.Clear();
                }
            }
            break;

            case RangeType.Sector:
                //todo
                break;
            }

            if (detectInOut)
            {
                int tc = result.Count;
                for (int i = 0; i < tc; i++)
                {
                    Bio mTarget = result[i];
                    if (!this._tempOldTargets.Contains(mTarget))
                    {
                        this._tempEnter.Add(mTarget);
                    }
                }
                tc = this._tempOldTargets.Count;
                for (int i = 0; i < tc; i++)
                {
                    Bio mTarget = this._tempOldTargets[i];
                    if (!result.Contains(mTarget))
                    {
                        this._tempExit.Add(mTarget);
                    }
                }

                this.HandleTargetInOut(this._tempEnter, this._tempExit);

                this._tempEnter.Clear();
                this._tempExit.Clear();
                this._tempOldTargets.Clear();
            }
        }