/// <summary>
        /// Resurrects this unit.
        /// </summary>
        public virtual void RezUnit()
        {
            AiInterface.ProcessCombatEnd();
            States.Remove((byte)CreatureState.Dead); // Death State
            Health = TotalHealth;
            Region.UpdateRange(this, true);

            //EvtInterface.Notify(EventName.ON_REZURECT, this, null);
        }
        public virtual void Fight()
        {
            // Here we are processng aggro every 0.25 s
            if (WorldMgr.WorldSettingsMgr.GetGenericSetting(11) == 1)
            {
                ProcessAggro();
            }
            // Check for pet leashing.
            if (_pet != null)
            {
                long tick = TCPManager.GetTimeStampMS();

                if (tick > _nextDistanceCheckTime)
                {
                    _nextDistanceCheckTime = tick + 250;

                    if (_pet.Owner != null && !_pet.WorldPosition.IsWithinRadiusFeet(_pet.Owner.WorldPosition, 250))
                    {
                        _pet.Owner.SendClientMessage("Your pet is too far away from you, and has been dismissed.", ChatLogFilters.CHATLOGFILTERS_ABILITY_ERROR);
                        _pet.Dismiss(null, null);
                        return;
                    }

                    Player playerTarget = Combat.CurrentTarget as Player;
                    if (playerTarget != null && (playerTarget.StealthLevel > 0) && !_pet.WorldPosition.IsWithinRadiusFeet(playerTarget.WorldPosition, 30))
                    {
                        _pet.AiInterface.ProcessCombatEnd();
                        AI.Debugger?.SendClientMessage("[MR]: Lost track of stealthed player " + playerTarget.Name + ", ending combat.");
                        return;
                    }
                }
            }

            if (Combat != null && Combat.CurrentTarget != null && (Combat.CurrentTarget.IsDead || Combat.CurrentTarget.PendingDisposal || Combat.CurrentTarget.IsDisposed))
            {
                AI.Debugger?.SendClientMessage("[MR]: Current target is dead or disposed, reacquiring...");
                Aggros.Remove(Combat.CurrentTarget.Oid);

                Combat.SetTarget(null, TargetTypes.TARGETTYPES_TARGET_ENEMY);

                if (_pet != null)
                {
                    if (_pet.AIMode != (byte)PetCommand.Passive && !_pet.IsHeeling)
                    {
                        AI.Debugger?.SendClientMessage("[MR]: Pet seeking attackable unit...");
                        Combat.SetTarget(_pet.AiInterface.GetAttackableUnit(), TargetTypes.TARGETTYPES_TARGET_ENEMY);
                    }
                }

                else
                {
                    Unit nextTarget = GetNextTarget();
                    Combat.SetTarget(nextTarget, TargetTypes.TARGETTYPES_TARGET_ENEMY);
                    if (nextTarget != null && _unit.IsKeepLord)
                    {
                        _unit.Say("Die " + nextTarget.Name + "!");
                    }
                }

                if (Combat.CurrentTarget != null)
                {
                    StartCombat(Combat.CurrentTarget);
                }

                else
                {
                    AI.Debugger?.SendClientMessage("[MR]: Failed to acquire a new target. Disengaging.");
                    AI.ProcessCombatEnd();
                    return;
                }
            }

            if (_unit != null && !_unit.IsDisabled || _unit != null && !_unit.IsStaggered)
            {
                Combat.TryAttack();
                TryUseAbilities();
            }

            foreach (Player player in _unit.PlayersInRange.ToList())
            {
                if (player != null && player.DebugMode)
                {
                    player.SendClientMessage("[MR]: Unit: " + _unit.Name + " (OID: " + _unit.Oid + ") Current Hate: " + GetAggro(player.Oid).Hatred);
                }
            }
        }