/// <summary>Performs the initial modifications to the volatile ability properties.</summary>
        private byte ModifyInitials()
        {
            if (!_pendingInfo.ConstantInfo.IgnoreOwnModifiers)
            {
                List <AbilityModifier> myModifiers = AbilityMgr.GetAbilityPreCastModifiers(_pendingInfo.Entry);
                if (myModifiers != null)
                {
                    foreach (AbilityModifier modifier in myModifiers)
                    {
                        byte result = modifier.ModifyAbility(_caster, _pendingInfo);

                        if (result > 0)
                        {
                            return(result);
                        }
                    }
                }
            }

            // Morales and items should not run through general handlers
            if (_pendingInfo.SpecialCost < 0 || _pendingInfo.ConstantInfo.Origin == AbilityOrigin.AO_ITEM)
            {
                return(0);
            }

            if (_caster is Player)
            {
                ((Player)_caster).TacInterface.ModifyInitials(_pendingInfo);
            }
            _caster.StsInterface.ModifyAbilityVolatiles(_pendingInfo);
            return(0);
        }
        public void ReloadTactics()
        {
            List <ushort> tacList          = new List <ushort>();
            bool          sendTacticUpdate = false;

            if (_myPlayer._Value.Tactic1 != 0 && !tacList.Contains(_myPlayer._Value.Tactic1))
            {
                tacList.Add(_myPlayer._Value.Tactic1);
            }
            if (_myPlayer._Value.Tactic2 != 0 && !tacList.Contains(_myPlayer._Value.Tactic2))
            {
                tacList.Add(_myPlayer._Value.Tactic2);
            }
            if (_myPlayer._Value.Tactic3 != 0 && !tacList.Contains(_myPlayer._Value.Tactic3))
            {
                tacList.Add(_myPlayer._Value.Tactic3);
            }
            if (_myPlayer._Value.Tactic4 != 0 && !tacList.Contains(_myPlayer._Value.Tactic4))
            {
                tacList.Add(_myPlayer._Value.Tactic4);
            }

            int maxAllowedTactics = _myPlayer.AdjustedLevel / 10;

            while (tacList.Count > maxAllowedTactics)
            {
                tacList.RemoveAt(tacList.Count - 1);
                sendTacticUpdate = true;
            }

            foreach (NewBuff buff in _activeBuffs)
            {
                buff.BuffHasExpired = true;

                if (_modifyingTactics.Contains(buff.Entry))
                {
                    _modifyingTactics.Remove(buff.Entry);

                    List <ushort> toRemove = new List <ushort>();

                    if (AbilityMgr.HasPreCastModifiers(buff.Entry))
                    {
                        foreach (AbilityModifier mod in AbilityMgr.GetAbilityPreCastModifiers(buff.Entry))
                        {
                            if (mod.Affecting == 0)
                            {
                                _generalPreCastModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                            else if (mod.Affecting <= 3)
                            {
                                _speclinePreCastModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                            else
                            {
                                toRemove.Add(mod.Affecting);
                            }
                        }

                        foreach (ushort rem in toRemove)
                        {
                            _abilityPreCastModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                        }

                        toRemove.Clear();
                    }

                    if (AbilityMgr.HasModifiers(buff.Entry))
                    {
                        foreach (AbilityModifier mod in AbilityMgr.GetAbilityModifiers(buff.Entry))
                        {
                            if (mod.Affecting == 0)
                            {
                                _generalModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                            else if (mod.Affecting <= 3)
                            {
                                _speclineModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                            else
                            {
                                toRemove.Add(mod.Affecting);
                            }
                        }

                        foreach (ushort rem in toRemove)
                        {
                            _abilityModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                        }

                        toRemove.Clear();
                    }

                    if (AbilityMgr.HasBuffModifiers(buff.Entry))
                    {
                        foreach (AbilityModifier mod in AbilityMgr.GetBuffModifiers(buff.Entry))
                        {
                            if (mod.Affecting == 0)
                            {
                                _generalBuffModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                            else if (mod.Affecting <= 3)
                            {
                                _speclineBuffModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                            else
                            {
                                toRemove.Add(mod.Affecting);
                            }
                        }

                        foreach (ushort rem in toRemove)
                        {
                            _buffModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                        }
                    }
                }

                _activeTactics.Remove(buff.Entry);
            }

            _activeBuffs.Clear();

            foreach (ushort id in tacList)
            {
                if (id == 0 || _activeTactics.Contains(id))
                {
                    continue;
                }
                BuffInfo b = AbilityMgr.GetBuffInfo(id);

                if (b == null)
                {
                    _myPlayer.SendClientMessage("Nonexistent tactic: " + id + " " + AbilityMgr.GetAbilityNameFor(id));
                    continue;
                }

                if (!_myPlayer.AbtInterface.IsValidTactic(id))
                {
                    _myPlayer.SendClientMessage("Invalid tactic: " + id + " " + AbilityMgr.GetAbilityNameFor(id));
                    sendTacticUpdate = true;
                    continue;
                }

                if (!string.IsNullOrEmpty(b.AuraPropagation))
                {
                    _myPlayer.BuffInterface.QueueBuff(new BuffQueueInfo(_myPlayer, _myPlayer.AbtInterface.GetMasteryLevelFor(AbilityMgr.GetMasteryTreeFor(b.Entry)), b, BuffEffectInvoker.CreateAura, RegisterTacticBuff));
                }
                else
                {
                    _myPlayer.BuffInterface.QueueBuff(new BuffQueueInfo(_myPlayer, _myPlayer.AbtInterface.GetMasteryLevelFor(AbilityMgr.GetMasteryTreeFor(b.Entry)), b, RegisterTacticBuff));
                }
                _activeTactics.Add(id);
            }

            // Update the saved list for the server
            for (int i = 0; i < 4; ++i)
            {
                _myPlayer._Value.SetTactic((byte)(i + 1), i < _activeTactics.Count ? _activeTactics[i] : (ushort)0);
            }

            if (sendTacticUpdate)
            {
                SendTactics();
            }
        }
        public void UnregisterGeneralBuff(NewBuff buff)
        {
            List <ushort> toRemove = new List <ushort>();

            #region PreCast
            if (AbilityMgr.HasPreCastModifiers(buff.Entry))
            {
                foreach (AbilityModifier mod in AbilityMgr.GetAbilityPreCastModifiers(buff.Entry))
                {
                    if (mod.Affecting == 0)
                    {
                        _generalPreCastModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                    }
                    else if (mod.Affecting <= 3)
                    {
                        _speclinePreCastModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                    }
                    else
                    {
                        toRemove.Add(mod.Affecting);
                    }
                }

                foreach (ushort rem in toRemove)
                {
                    _abilityPreCastModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                }

                toRemove.Clear();
            }

            #endregion

            #region Cast

            if (AbilityMgr.HasModifiers(buff.Entry))
            {
                foreach (AbilityModifier mod in AbilityMgr.GetAbilityModifiers(buff.Entry))
                {
                    if (mod.Affecting == 0)
                    {
                        _generalModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                    }
                    else if (mod.Affecting <= 3)
                    {
                        _speclineModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                    }
                    else
                    {
                        toRemove.Add(mod.Affecting);
                    }
                }

                foreach (ushort rem in toRemove)
                {
                    _abilityModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                }

                toRemove.Clear();
            }

            #endregion

            #region Buff

            if (AbilityMgr.HasBuffModifiers(buff.Entry))
            {
                foreach (AbilityModifier mod in AbilityMgr.GetBuffModifiers(buff.Entry))
                {
                    if (mod.Affecting == 0)
                    {
                        _generalBuffModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                    }
                    else if (mod.Affecting <= 3)
                    {
                        _speclineBuffModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                    }
                    else
                    {
                        toRemove.Add(mod.Affecting);
                    }
                }

                foreach (ushort rem in toRemove)
                {
                    _buffModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                }
            }

            #endregion
        }
        /// <summary>
        /// Registers a given buff's ability and buff modifiers.
        /// </summary>
        public void RegisterGeneralBuff(NewBuff buff)
        {
            #region PreCast
            if (AbilityMgr.HasPreCastModifiers(buff.Entry))
            {
                List <AbilityModifier> abilityPreCastModifiers = AbilityMgr.GetAbilityPreCastModifiers(buff.Entry);

                foreach (AbilityModifier mod in abilityPreCastModifiers)
                {
                    if (mod.Affecting == 0)
                    {
                        _generalPreCastModifiers.Add(mod);
                    }

                    else if (mod.Affecting <= 3)
                    {
                        if (!_speclinePreCastModifiers.ContainsKey((ushort)(mod.Affecting - 1)))
                        {
                            _speclinePreCastModifiers.Add((ushort)(mod.Affecting - 1), new List <AbilityModifier>());
                        }
                        _speclinePreCastModifiers[(byte)(mod.Affecting - 1)].Add(mod);
                    }

                    else
                    {
                        if (!_abilityPreCastModifiers.ContainsKey(mod.Affecting))
                        {
                            _abilityPreCastModifiers.Add(mod.Affecting, new List <AbilityModifier>());
                        }

                        _abilityPreCastModifiers[mod.Affecting].Add(mod);
                    }

                    for (AbilityModifierEffect effect = mod.Effect; effect != null; effect = effect.nextMod)
                    {
                        buff.AddBuffParameter(effect.BuffLine, effect.PrimaryValue);
                    }
                }
            }

            #endregion

            #region Cast

            if (AbilityMgr.HasModifiers(buff.Entry))
            {
                List <AbilityModifier> abilityModifiers = AbilityMgr.GetAbilityModifiers(buff.Entry);

                foreach (AbilityModifier mod in abilityModifiers)
                {
                    if (mod.Affecting == 0)
                    {
                        _generalModifiers.Add(mod);
                    }

                    else if (mod.Affecting <= 3)
                    {
                        if (!_speclineModifiers.ContainsKey((ushort)(mod.Affecting - 1)))
                        {
                            _speclineModifiers.Add((ushort)(mod.Affecting - 1), new List <AbilityModifier>());
                        }
                        _speclineModifiers[(byte)(mod.Affecting - 1)].Add(mod);
                    }

                    else
                    {
                        if (!_abilityModifiers.ContainsKey(mod.Affecting))
                        {
                            _abilityModifiers.Add(mod.Affecting, new List <AbilityModifier>());
                        }

                        _abilityModifiers[mod.Affecting].Add(mod);
                    }


                    for (AbilityModifierEffect effect = mod.Effect; effect != null; effect = effect.nextMod)
                    {
                        buff.AddBuffParameter(effect.BuffLine, effect.PrimaryValue);
                    }
                }
            }

            #endregion

            #region Buff
            if (AbilityMgr.HasBuffModifiers(buff.Entry))
            {
                List <AbilityModifier> buffModifiers = AbilityMgr.GetBuffModifiers(buff.Entry);

                foreach (AbilityModifier mod in buffModifiers)
                {
                    if (mod.Affecting == 0)
                    {
                        _generalBuffModifiers.Add(mod);
                    }

                    else if (mod.Affecting <= 3)
                    {
                        if (!_speclineBuffModifiers.ContainsKey((ushort)(mod.Affecting - 1)))
                        {
                            _speclineBuffModifiers.Add((ushort)(mod.Affecting - 1), new List <AbilityModifier>());
                        }
                        _speclineBuffModifiers[(byte)(mod.Affecting - 1)].Add(mod);
                    }

                    else
                    {
                        if (!_buffModifiers.ContainsKey(mod.Affecting))
                        {
                            _buffModifiers.Add(mod.Affecting, new List <AbilityModifier>());
                        }

                        _buffModifiers[mod.Affecting].Add(mod);
                    }


                    for (AbilityModifierEffect effect = mod.Effect; effect != null; effect = effect.nextMod)
                    {
                        buff.AddBuffParameter(effect.BuffLine, effect.PrimaryValue);
                    }
                }
            }

            #endregion
        }
        /// <summary>
        /// Registers the tactic's ability and buff modifiers.
        /// </summary>
        public void RegisterTacticBuff(NewBuff b)
        {
            bool bAdded = false;

            _activeBuffs.Add(b);

            #region PreCast
            if (AbilityMgr.HasPreCastModifiers(b.Entry))
            {
                List <AbilityModifier> tacPrecastModifiers = AbilityMgr.GetAbilityPreCastModifiers(b.Entry);

                foreach (AbilityModifier mod in tacPrecastModifiers)
                {
                    if (mod.Affecting == 0)
                    {
                        _generalPreCastModifiers.Add(mod);
                    }

                    else if (mod.Affecting <= 3)
                    {
                        if (!_speclinePreCastModifiers.ContainsKey((ushort)(mod.Affecting - 1)))
                        {
                            _speclinePreCastModifiers.Add((ushort)(mod.Affecting - 1), new List <AbilityModifier>());
                        }
                        _speclinePreCastModifiers[(byte)(mod.Affecting - 1)].Add(mod);
                    }

                    else
                    {
                        if (!_abilityPreCastModifiers.ContainsKey(mod.Affecting))
                        {
                            _abilityPreCastModifiers.Add(mod.Affecting, new List <AbilityModifier>());
                        }

                        _abilityPreCastModifiers[mod.Affecting].Add(mod);
                    }

                    for (AbilityModifierEffect effect = mod.Effect; effect != null; effect = effect.nextMod)
                    {
                        b.AddBuffParameter(effect.BuffLine, effect.PrimaryValue);
                    }
                }

                bAdded = true;
            }

            #endregion

            #region Cast

            if (AbilityMgr.HasModifiers(b.Entry))
            {
                List <AbilityModifier> tacModifiers = AbilityMgr.GetAbilityModifiers(b.Entry);

                foreach (AbilityModifier mod in tacModifiers)
                {
                    if (mod.Affecting == 0)
                    {
                        _generalModifiers.Add(mod);
                    }

                    else if (mod.Affecting <= 3)
                    {
                        if (!_speclineModifiers.ContainsKey((ushort)(mod.Affecting - 1)))
                        {
                            _speclineModifiers.Add((ushort)(mod.Affecting - 1), new List <AbilityModifier>());
                        }
                        _speclineModifiers[(byte)(mod.Affecting - 1)].Add(mod);
                    }

                    else
                    {
                        if (!_abilityModifiers.ContainsKey(mod.Affecting))
                        {
                            _abilityModifiers.Add(mod.Affecting, new List <AbilityModifier>());
                        }

                        _abilityModifiers[mod.Affecting].Add(mod);
                    }

                    for (AbilityModifierEffect effect = mod.Effect; effect != null; effect = effect.nextMod)
                    {
                        b.AddBuffParameter(effect.BuffLine, effect.PrimaryValue);
                    }
                }

                bAdded = true;
            }

            #endregion

            #region Buff
            if (AbilityMgr.HasBuffModifiers(b.Entry))
            {
                List <AbilityModifier> tacBuffModifiers = AbilityMgr.GetBuffModifiers(b.Entry);

                foreach (AbilityModifier mod in tacBuffModifiers)
                {
                    if (mod.Affecting == 0)
                    {
                        _generalBuffModifiers.Add(mod);
                    }

                    else if (mod.Affecting <= 3)
                    {
                        if (!_speclineBuffModifiers.ContainsKey((ushort)(mod.Affecting - 1)))
                        {
                            _speclineBuffModifiers.Add((ushort)(mod.Affecting - 1), new List <AbilityModifier>());
                        }
                        _speclineBuffModifiers[(byte)(mod.Affecting - 1)].Add(mod);
                    }

                    else
                    {
                        if (!_buffModifiers.ContainsKey(mod.Affecting))
                        {
                            _buffModifiers.Add(mod.Affecting, new List <AbilityModifier>());
                        }

                        _buffModifiers[mod.Affecting].Add(mod);
                    }

                    for (AbilityModifierEffect effect = mod.Effect; effect != null; effect = effect.nextMod)
                    {
                        b.AddBuffParameter(effect.BuffLine, effect.PrimaryValue);
                    }
                }

                bAdded = true;
            }

            #endregion

            if (bAdded)
            {
                _modifyingTactics.Add(b.Entry);
            }
        }
        /// <summary>
        /// Verifies that the player can legitimately assign the requested tactic.
        /// </summary>
        public void ValidateTactics()
        {
            List <NewBuff> removeList = new List <NewBuff>();

            foreach (var buff in _activeBuffs)
            {
                if (!_myPlayer.AbtInterface.IsValidTactic(buff.Entry))
                {
                    buff.BuffHasExpired = true;

                    if (_modifyingTactics.Contains(buff.Entry))
                    {
                        _modifyingTactics.Remove(buff.Entry);

                        List <ushort> toRemove = new List <ushort>();

                        if (AbilityMgr.HasPreCastModifiers(buff.Entry))
                        {
                            foreach (AbilityModifier mod in AbilityMgr.GetAbilityPreCastModifiers(buff.Entry))
                            {
                                if (mod.Affecting == 0)
                                {
                                    _generalPreCastModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                                }
                                else if (mod.Affecting <= 3)
                                {
                                    _speclinePreCastModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                                }
                                else
                                {
                                    toRemove.Add(mod.Affecting);
                                }
                            }

                            foreach (ushort rem in toRemove)
                            {
                                _abilityPreCastModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                            }

                            toRemove.Clear();
                        }

                        if (AbilityMgr.HasModifiers(buff.Entry))
                        {
                            foreach (AbilityModifier mod in AbilityMgr.GetAbilityModifiers(buff.Entry))
                            {
                                if (mod.Affecting == 0)
                                {
                                    _generalModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                                }
                                else if (mod.Affecting <= 3)
                                {
                                    _speclineModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                                }
                                else
                                {
                                    toRemove.Add(mod.Affecting);
                                }
                            }

                            foreach (ushort rem in toRemove)
                            {
                                _abilityModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                            }

                            toRemove.Clear();
                        }

                        if (AbilityMgr.HasBuffModifiers(buff.Entry))
                        {
                            foreach (AbilityModifier mod in AbilityMgr.GetBuffModifiers(buff.Entry))
                            {
                                if (mod.Affecting == 0)
                                {
                                    _generalBuffModifiers.RemoveAll(fmod => fmod.Source == buff.Entry);
                                }
                                else if (mod.Affecting <= 3)
                                {
                                    _speclineBuffModifiers[(byte)(mod.Affecting - 1)].RemoveAll(fmod => fmod.Source == buff.Entry);
                                }
                                else
                                {
                                    toRemove.Add(mod.Affecting);
                                }
                            }

                            foreach (ushort rem in toRemove)
                            {
                                _buffModifiers[rem].RemoveAll(fmod => fmod.Source == buff.Entry);
                            }
                        }
                    }

                    removeList.Add(buff);
                    _activeTactics.Remove(buff.Entry);
                }
            }

            foreach (var buff in removeList)
            {
                _activeBuffs.Remove(buff);
            }

            SendTactics();
        }