public void Update(int targetGuid, int targetHealthPercent)
        {
            Update(targetGuid, targetHealthPercent, Targets);

            if (CombatCreatureGuid.Updated(reader))
            {
                Update(CombatCreatureGuid.Value, 100f, Creatures);
            }

            if (CombatDamageTakenGuid.Updated(reader))
            {
                Update(CombatDamageTakenGuid.Value, 100f, DamageTaken);
            }

            if (CombatDamageDoneGuid.Updated(reader))
            {
                Update(CombatDamageDoneGuid.Value, 100f, DamageDone);
            }

            if (CombatDeadGuid.Updated(reader))
            {
                Update(CombatDeadGuid.Value, 0, Creatures);
                Update(CombatDeadGuid.Value, 0, Deads);

                if (DamageTaken.Exists(x => x.Guid == CombatDeadGuid.Value))
                {
                    Update(CombatDeadGuid.Value, 0, DamageTaken);
                }

                if (DamageDone.Exists(x => x.Guid == CombatDeadGuid.Value))
                {
                    Update(CombatDeadGuid.Value, 0, DamageDone);
                }

                if (Targets.Exists(x => x.Guid == CombatDeadGuid.Value))
                {
                    Update(CombatDeadGuid.Value, 0, Targets);
                }

                if (Targets.Exists(x => x.Guid == CombatDeadGuid.Value) &&
                    (DamageDone.Exists(x => x.Guid == CombatDeadGuid.Value) || DamageTaken.Exists(x => x.Guid == CombatDeadGuid.Value)))
                {
                    KillCredit?.Invoke(this, EventArgs.Empty);
                }
            }
        }
예제 #2
0
    protected override void Observe()
    {
        List <GameObject> currentTargets = GameManager.singleton.Players.FindAll(player =>
                                                                                 Vector3.Distance(player.transform.position, transform.position) < ObserveRadius &&
                                                                                 Utils.IsFreeBetweenPlayer(player, transform.position + Offset));

        foreach (GameObject newTarget in currentTargets)
        {
            if (Targets.Exists(x => x == newTarget))
            {
                CallEvent(new TargetStay(gameObject, newTarget));
            }
            else
            {
                CallEvent(new TargetEnter(gameObject, newTarget));
            }
        }

        foreach (GameObject oldTarget in Targets)
        {
            if (oldTarget != null && !currentTargets.Exists(x => x == oldTarget))
            {
                CallEvent(new TargetOut(gameObject, oldTarget));
            }
        }

        if (currentTargets.Count == 0)
        {
            if (NearestTarget != null)
            {
                NearestTarget = null;
                CallEvent(new AllTargetsEnd(gameObject));
            }
        }
        else
        {
            GameObject target = Utils.FindNearestGameObject(currentTargets, transform.position);
            if (NearestTarget == null)
            {
                CallEvent(new FirstTarget(gameObject, target));
            }
            NearestTarget = target;
        }
    }