Пример #1
0
        /// <summary>
        /// SetTotemsAsNeeded() - manages casting totems as called for by environment and
        /// user configuration values. This code uses:
        ///     http://www.yawb.info/2009/08/25/learning-about-totems-tips-to-aid-your-growing-shamanism/
        /// as a guideline for totem usage while leveling.
        /// </summary>
        private bool SetTotemsAsNeeded()
        {
            bool castTotem = false;

            try
            {
                if (!_me.Fleeing && (Shaman.cfg.FarmingLowLevel || _me.IsMoving))
                {
                    return(false);
                }

                // limit how frequently we check totems.  needs to be often,
                // .. but not each loop.
                // ..
                if (_TotemCheckTimer.ElapsedMilliseconds < 1500)
                {
                    // if this isn't first time here since reset, then wait for 2 seconds
                    if (!_me.Fleeing && _TotemCheckTimer.ElapsedMilliseconds > 0 && TotemsWereSet())
                    {
                        return(false);
                    }

                    // otherwise, only 0 if first check after last .Reset
                    //  ..  so continue processing
                }

                if (TotemsWereSet() && _ptTotems.Distance(_me.Location) > Shaman.cfg.DistanceForTotemRecall)
                {
                    Shaman.Dlog("Recalling Totems that were set {0:F1} yds away at point {1}", _ptTotems.Distance(_me.Location), _ptTotems.ToString());
                    RecallTotemsForMana();
                }

                _TotemCheckTimer.Reset();
                _TotemCheckTimer.Start();

                //-----
                // if you make it past the following gate, only limited tests are needed for each totem
                //-----
                if (IsPVP() || Shaman.IsRAF())
                {
                    ;
                }
                else if (Shaman.IsFightStressful() || !Shaman.cfg.PVE_SaveForStress_TotemsSelected)
                {
                    ;
                }
                else
                {
                    Shaman.Dlog("not setting totems until a stressful situation");
                    return(false);
                }

                // check which totems exist
                bool bAnyTotemsUp = TotemExist(TOTEM_EARTH) ||
                                    TotemExist(TOTEM_FIRE) ||
                                    TotemExist(TOTEM_WATER) ||
                                    TotemExist(TOTEM_AIR);

                Shaman.Dlog("SetTotemsAsNeeded:  earth: " + BoolToYN(TotemExist(TOTEM_EARTH)) + "  fire: " + BoolToYN(TotemExist(TOTEM_FIRE)) + "  water: " + BoolToYN(TotemExist(TOTEM_WATER)) + "  air: " + BoolToYN(TotemExist(TOTEM_AIR)));

                _WereTotemsSet = bAnyTotemsUp;  // _WereTotemsSet || removed because only matters if they exist

                // Quick scan for mobs that cast fear (only in RAF)
                //////////////////////////////////////////////////////////////////////
                Shaman.foundMobsThatFear = _me.Fleeing;
                if (Shaman.foundMobsThatFear)
                {
                    Shaman.Slog("Tremor Totem:  detected fear mob");
                }

                // Totem Bar Set
                // -- add handling for changing totem bar setup temporarily if needed for tremor totem
                //////////////////////////////////////////////////////////////////////
                const string totemBar = "Call of the Elements";
                if (!bAnyTotemsUp && SpellManager.HasSpell(totemBar))
                {
                    TotemId saveEarthTotemSetup = TotemId.TREMOR_TOTEM;

                    // if mobs that fear are found and tremor not in bar setup already, add temporarily just for cast
                    if (Shaman.foundMobsThatFear && _totemBar[TOTEM_EARTH] != TotemId.TREMOR_TOTEM)
                    {
                        saveEarthTotemSetup = _totemBar[TOTEM_EARTH];
                        TotemSelect(TOTEM_EARTH, TotemId.TREMOR_TOTEM);
                    }

                    if (Shaman.Safe_CastSpell(totemBar, Shaman.SpellRange.NoCheck, Shaman.SpellWait.Complete))
                    {
                        castTotem      = true;
                        _WereTotemsSet = true;
                        _ptTotems      = _me.Location;

                        if (IsRAF())
                        {
                            Dlog("SetTotemsAsNeeded: set totems at <{0}> {1:F1} yds from Leader", _ptTotems.ToString(), GroupTank.Distance);
                        }
                        else
                        {
                            Dlog("SetTotemsAsNeeded: set totems at <{0}>", _ptTotems.ToString());
                        }
                    }

                    // if we changed the earth totem on bar, restore back to configured value
                    if (saveEarthTotemSetup != TotemId.TREMOR_TOTEM)
                    {
                        TotemSelect(TOTEM_EARTH, saveEarthTotemSetup);
                    }
                }
                else
                {
                    // Earth Totems First
                    //////////////////////////////////////////////////////////////////////
                    if (foundMobsThatFear && HasTotemSpell(TotemId.TREMOR_TOTEM) && TotemId.TREMOR_TOTEM != (TotemId)_totem[TOTEM_EARTH].CreatedBySpellId)
                    {
                        castTotem = castTotem || TotemCast(TotemId.TREMOR_TOTEM);
                    }
                    else if (0 != _totemBar[TOTEM_EARTH])
                    {
                        if (!TotemExist(TOTEM_EARTH) && HasTotemSpell(_totemBar[TOTEM_EARTH]))
                        {
                            castTotem = castTotem || TotemCast(_totemBar[TOTEM_EARTH]);
                        }

                        if (!TotemExist(TOTEM_EARTH) && Shaman.typeShaman == Shaman.ShamanType.Enhance && HasTotemSpell(TotemId.STRENGTH_OF_EARTH_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.STRENGTH_OF_EARTH_TOTEM);
                        }

                        if (!TotemExist(TOTEM_EARTH) && Shaman.typeShaman != Shaman.ShamanType.Enhance && HasTotemSpell(TotemId.STONESKIN_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.STONESKIN_TOTEM);
                        }
                    }

                    // Fire Totems
                    //////////////////////////////////////////////////////////////////////
                    if (_countMeleeEnemy >= 3 && !IsHealerOnly())
                    {
                        if (!_me.GotTarget || !IsImmunneToFire(_me.CurrentTarget))
                        {
                            if (!TotemExist(TOTEM_FIRE) || (!TotemExist(TotemId.MAGMA_TOTEM) && !TotemExist(TotemId.FIRE_ELEMENTAL_TOTEM)))
                            {
                                if (HasTotemSpell(TotemId.MAGMA_TOTEM))
                                {
                                    castTotem = castTotem || TotemCast(TotemId.MAGMA_TOTEM);
                                }
                                else if (_countMeleeEnemy >= 4 && HasTotemSpell(TotemId.FLAMETONGUE_TOTEM) && !TotemExist(TotemId.FLAMETONGUE_TOTEM))
                                {
                                    Dlog("SetTotemsAsNeeded: 4 or more mobs and Magma not trained, using Flametongue to allow Fire Nova");
                                    castTotem = castTotem || TotemCast(TotemId.FLAMETONGUE_TOTEM);
                                }
                            }
                        }
                    }

                    if (0 != _totemBar[TOTEM_FIRE] && !TotemExist(TOTEM_FIRE))
                    {
                        if (!TotemExist(TOTEM_FIRE) && HasTotemSpell(_totemBar[TOTEM_FIRE]))
                        {
                            castTotem = castTotem || TotemCast(_totemBar[TOTEM_FIRE]);
                        }
                        if (!TotemExist(TOTEM_FIRE) && Shaman.typeShaman != Shaman.ShamanType.Resto && HasTotemSpell(TotemId.SEARING_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.SEARING_TOTEM);
                        }
                        if (!TotemExist(TOTEM_FIRE) && HasTotemSpell(TotemId.FLAMETONGUE_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.FLAMETONGUE_TOTEM);
                        }
                    }

                    // Water Totems
                    //////////////////////////////////////////////////////////////////////
                    if (0 != _totemBar[TOTEM_WATER])
                    {
                        if (!TotemExist(TOTEM_WATER) && HasTotemSpell(_totemBar[TOTEM_WATER]))
                        {
                            castTotem = castTotem || TotemCast(_totemBar[TOTEM_WATER]);
                        }

                        if (!TotemExist(TOTEM_WATER) && HasTotemSpell(TotemId.MANA_SPRING_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.MANA_SPRING_TOTEM);
                        }
                    }

                    // Air Totems
                    //////////////////////////////////////////////////////////////////////
                    if (0 != _totemBar[TOTEM_AIR])
                    {
                        if (!TotemExist(TOTEM_AIR) && HasTotemSpell(_totemBar[TOTEM_WATER]))
                        {
                            castTotem = castTotem || TotemCast(_totemBar[TOTEM_AIR]);
                        }
                        if (!TotemExist(TOTEM_AIR) && Shaman.typeShaman == Shaman.ShamanType.Resto && HasTotemSpell(TotemId.GROUNDING_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.GROUNDING_TOTEM);
                        }
                        if (!TotemExist(TOTEM_AIR) && Shaman.typeShaman == Shaman.ShamanType.Enhance && HasTotemSpell(TotemId.WINDFURY_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.WINDFURY_TOTEM);
                        }
                        if (!TotemExist(TOTEM_AIR) && Shaman.typeShaman == Shaman.ShamanType.Elemental && HasTotemSpell(TotemId.WRATH_OF_AIR_TOTEM))
                        {
                            castTotem = castTotem || TotemCast(TotemId.WRATH_OF_AIR_TOTEM);
                        }
                    }

                    _WereTotemsSet = _WereTotemsSet || TotemExist(TOTEM_EARTH) || TotemExist(TOTEM_FIRE) || TotemExist(TOTEM_WATER) || TotemExist(TOTEM_AIR);

                    if (!bAnyTotemsUp && _WereTotemsSet)
                    {
                        _ptTotems = _me.Location;
                    }
                }
            }
            catch (ThreadAbortException) { throw; }
            catch (Exception e)
            {
                Log(Color.Red, "An Exception occured. Check debug log for details.");
                Logging.WriteDebug("HB EXCEPTION in SetTotemsAsNeeded()");
                Logging.WriteException(e);
            }

            // would like to remove this code, but seeing duplicate totem sets
            if (castTotem)
            {
                ObjectManager.Update();
                TotemManagerUpdate();
            }

            return(castTotem);
        }
Пример #2
0
        private void TotemSetupBar()
        {
            string[] aBar = new string[5];
            if (IsPVP())
            {
                aBar[TOTEM_EARTH] = Shaman.cfg.PVP_TotemEarth;
                aBar[TOTEM_FIRE]  = Shaman.cfg.PVP_TotemFire;
                aBar[TOTEM_WATER] = Shaman.cfg.PVP_TotemWater;
                aBar[TOTEM_AIR]   = Shaman.cfg.PVP_TotemAir;
            }
            else if (Shaman.IsRAF())
            {
                aBar[TOTEM_EARTH] = Shaman.cfg.RAF_TotemEarth;
                aBar[TOTEM_FIRE]  = Shaman.cfg.RAF_TotemFire;
                aBar[TOTEM_WATER] = Shaman.cfg.RAF_TotemWater;
                aBar[TOTEM_AIR]   = Shaman.cfg.RAF_TotemAir;
            }
            else
            {
                aBar[TOTEM_EARTH] = Shaman.cfg.PVE_TotemEarth;
                aBar[TOTEM_FIRE]  = Shaman.cfg.PVE_TotemFire;
                aBar[TOTEM_WATER] = Shaman.cfg.PVE_TotemWater;
                aBar[TOTEM_AIR]   = Shaman.cfg.PVE_TotemAir;
            }

            /*
             *          Shaman.Dlog("value from cfgdlg:  Earth - {0}", _totemBar[TOTEM_EARTH]);
             *          Shaman.Dlog("value from cfgdlg:  Fire  - {0}", _totemBar[TOTEM_FIRE ]);
             *          Shaman.Dlog("value from cfgdlg:  Water - {0}", _totemBar[TOTEM_WATER]);
             *          Shaman.Dlog("value from cfgdlg:  Air   - {0}", _totemBar[TOTEM_AIR  ]);
             */
            // Earth - if configured spell is None or a real spellname, select that
            if (0 != String.Compare("Auto", aBar[TOTEM_EARTH], true))
            {
                TotemSelect(TOTEM_EARTH, aBar[TOTEM_EARTH]);
            }
            else if (Shaman.typeShaman == Shaman.ShamanType.Enhance && HasTotemSpell(TotemId.STRENGTH_OF_EARTH_TOTEM))
            {
                TotemSelect(TOTEM_EARTH, TotemId.STRENGTH_OF_EARTH_TOTEM);
            }
            else if (IsRAF() && HasTotemSpell(TotemId.STRENGTH_OF_EARTH_TOTEM))
            {
                TotemSelect(TOTEM_EARTH, TotemId.STRENGTH_OF_EARTH_TOTEM);
            }
            else if (HasTotemSpell(TotemId.STONESKIN_TOTEM))
            {
                TotemSelect(TOTEM_EARTH, TotemId.STONESKIN_TOTEM);
            }
            else
            {
                TotemSelect(TOTEM_EARTH, "None");
            }

            // Fire - if configured spell is None or a real spellname, select that
            if (0 != String.Compare("Auto", aBar[TOTEM_FIRE], true))
            {
                TotemSelect(TOTEM_FIRE, aBar[TOTEM_FIRE]);
            }
            else if (HasTotemSpell(TotemId.FLAMETONGUE_TOTEM) && (Shaman.typeShaman == Shaman.ShamanType.Resto || Shaman.IsHealerOnly()))
            {
                TotemSelect(TOTEM_FIRE, TotemId.FLAMETONGUE_TOTEM);
            }
            else if (HasTotemSpell(TotemId.SEARING_TOTEM))
            {
                TotemSelect(TOTEM_FIRE, TotemId.SEARING_TOTEM);
            }
            else
            {
                TotemSelect(TOTEM_FIRE, "None");
            }

            // Water - if configured spell is None or a real spellname, select that
            if (0 != String.Compare("Auto", aBar[TOTEM_WATER], true))
            {
                TotemSelect(TOTEM_WATER, aBar[TOTEM_WATER]);
            }
            else if (HasTotemSpell(TotemId.HEALING_STREAM_TOTEM) && Shaman.IsRAF())
            {
                TotemSelect(TOTEM_WATER, TotemId.HEALING_STREAM_TOTEM);
            }
            else if (_hasGlyphOfHealingStreamTotem && IsPVP())
            {
                TotemSelect(TOTEM_WATER, TotemId.HEALING_STREAM_TOTEM);
            }
            else if (HasTotemSpell(TotemId.ELEMENTAL_RESISTANCE_TOTEM) && IsPVP())
            {
                TotemSelect(TOTEM_WATER, TotemId.ELEMENTAL_RESISTANCE_TOTEM);
            }
            else if (HasTotemSpell(TotemId.HEALING_STREAM_TOTEM))
            {
                TotemSelect(TOTEM_WATER, TotemId.HEALING_STREAM_TOTEM);
            }
            else if (HasTotemSpell(TotemId.MANA_SPRING_TOTEM))
            {
                TotemSelect(TOTEM_WATER, TotemId.MANA_SPRING_TOTEM);
            }
            else
            {
                TotemSelect(TOTEM_WATER, "None");
            }

            // Air - if configured spell is None or a real spellname, select that
            if (0 != String.Compare("Auto", aBar[TOTEM_AIR], true))
            {
                TotemSelect(TOTEM_AIR, aBar[TOTEM_AIR]);
            }
            else if (HasTotemSpell(TotemId.GROUNDING_TOTEM) && Shaman.typeShaman == Shaman.ShamanType.Resto)
            {
                TotemSelect(TOTEM_AIR, TotemId.GROUNDING_TOTEM);
            }
            else if (HasTotemSpell(TotemId.WINDFURY_TOTEM) && Shaman.typeShaman == Shaman.ShamanType.Enhance)
            {
                TotemSelect(TOTEM_AIR, TotemId.WINDFURY_TOTEM);
            }
            else if (HasTotemSpell(TotemId.WRATH_OF_AIR_TOTEM) && (Shaman.typeShaman == Shaman.ShamanType.Elemental || Shaman.typeShaman == Shaman.ShamanType.Resto))
            {
                TotemSelect(TOTEM_AIR, TotemId.WRATH_OF_AIR_TOTEM);
            }
            else if (IsRAF() && HasTotemSpell(TotemId.WINDFURY_TOTEM))
            {
                TotemSelect(TOTEM_AIR, TotemId.WINDFURY_TOTEM);
            }
            else if (IsRAF() && HasTotemSpell(TotemId.GROUNDING_TOTEM))
            {
                TotemSelect(TOTEM_AIR, TotemId.GROUNDING_TOTEM);
            }
            else
            {
                TotemSelect(TOTEM_AIR, "None");
            }

            Shaman.Slog("Totem Bar[Earth]: {0}", _totemBar[TOTEM_EARTH]);
            Shaman.Slog("Totem Bar[Fire ]: {0}", _totemBar[TOTEM_FIRE]);
            Shaman.Slog("Totem Bar[Water]: {0}", _totemBar[TOTEM_WATER]);
            Shaman.Slog("Totem Bar[Air  ]: {0}", _totemBar[TOTEM_AIR]);
        }