Esempio n. 1
0
        void Apply(AuraEffect aurEff, AuraEffectHandleModes mode)
        {
            List <TempSummon> MinionList = new List <TempSummon>();

            GetTarget().GetAllMinionsByEntry(MinionList, (uint)GetSpellInfo().GetEffect(0).MiscValue);

            // Get the last summoned RoF, save it and despawn older ones
            foreach (var creature in MinionList)
            {
                TempSummon summon = creature.ToTempSummon();

                if (ringOfFrost && summon)
                {
                    if (summon.GetTimer() > ringOfFrost.GetTimer())
                    {
                        ringOfFrost.DespawnOrUnsummon();
                        ringOfFrost = summon;
                    }
                    else
                    {
                        summon.DespawnOrUnsummon();
                    }
                }
                else if (summon)
                {
                    ringOfFrost = summon;
                }
            }
        }
Esempio n. 2
0
        void Apply(AuraEffect aurEff, AuraEffectHandleModes mode)
        {
            List <TempSummon> minions = new List <TempSummon>();

            GetTarget().GetAllMinionsByEntry(minions, (uint)Global.SpellMgr.GetSpellInfo(SpellIds.RingOfFrostSummon, GetCastDifficulty()).GetEffect(0).MiscValue);

            // Get the last summoned RoF, save it and despawn older ones
            foreach (var summon in minions)
            {
                TempSummon ringOfFrost = GetRingOfFrostMinion();
                if (ringOfFrost)
                {
                    if (summon.GetTimer() > ringOfFrost.GetTimer())
                    {
                        ringOfFrost.DespawnOrUnsummon();
                        _ringOfFrostGUID = summon.GetGUID();
                    }
                    else
                    {
                        summon.DespawnOrUnsummon();
                    }
                }
                else
                {
                    _ringOfFrostGUID = summon.GetGUID();
                }
            }
        }
Esempio n. 3
0
        public void _DespawnAtEvade(TimeSpan delayToRespawn, Creature who = null)
        {
            if (delayToRespawn < TimeSpan.FromSeconds(2))
            {
                Log.outError(LogFilter.Scripts, "_DespawnAtEvade called with delay of {0} seconds, defaulting to 2.", delayToRespawn);
                delayToRespawn = TimeSpan.FromSeconds(2);
            }

            if (!who)
            {
                who = me;
            }

            TempSummon whoSummon = who.ToTempSummon();

            if (whoSummon)
            {
                Log.outWarn(LogFilter.ScriptsAi, "_DespawnAtEvade called on a temporary summon.");
                whoSummon.UnSummon();
                return;
            }

            who.DespawnOrUnsummon(0, delayToRespawn);

            if (instance != null && who == me)
            {
                instance.SetBossState(_bossId, EncounterState.Fail);
            }
        }
Esempio n. 4
0
        void InitializeVisualStalker()
        {
            Aura aura = GetHitAura();

            if (aura != null)
            {
                WorldLocation dest = GetExplTargetDest();
                if (dest != null)
                {
                    int        duration = GetSpellInfo().CalcDuration(GetOriginalCaster());
                    TempSummon summon   = GetCaster().GetMap().SummonCreature(CreatureIds.HealingRainInvisibleStalker, dest, null, (uint)duration, GetOriginalCaster());
                    if (summon == null)
                    {
                        return;
                    }

                    summon.CastSpell(summon, SpellIds.HealingRainVisual, true);

                    var script = aura.GetScript <spell_sha_healing_rain_AuraScript>();
                    if (script != null)
                    {
                        script.SetVisualDummy(summon);
                    }
                }
            }
        }
Esempio n. 5
0
        // helper for summoning wave mobs
        void Summon(uint entry, Position pos)
        {
            TempSummon summon = me.SummonCreature(entry, pos, TempSummonType.CorpseTimedDespawn, 10000);

            if (summon)
            {
                summon.CastSpell(summon, SpellIds.TeleportVisual);
            }
        }
Esempio n. 6
0
        void HandleEffectPeriodic(AuraEffect aurEff)
        {
            TempSummon ringOfFrost = GetRingOfFrostMinion();

            if (ringOfFrost)
            {
                GetTarget().CastSpell(ringOfFrost.GetPosition(), SpellIds.RingOfFrostFreeze, new CastSpellExtraArgs(true));
            }
        }
Esempio n. 7
0
        // helper for summoning wave mobs
        void Summon(uint entry, Position pos)
        {
            TempSummon summon = me.SummonCreature(entry, pos, TempSummonType.CorpseTimedDespawn, 10000);

            if (summon)
            {
                summon.GetAI().DoCast(summon, LadySpells.TELEPORT_VISUAL);
            }
        }
        public override void JustDied(Unit killer)
        {
            TempSummon meSummon = me.ToTempSummon();

            if (meSummon)
            {
                Unit summoner = meSummon.GetSummoner();
                if (summoner)
                {
                    summoner.RemoveAurasDueToSpell(SpellIds.WebWrapWrapped);
                }
            }
        }
Esempio n. 9
0
            public override void JustDied(Unit killer)
            {
                TempSummon summ = me.ToTempSummon();

                if (summ)
                {
                    Unit trapped = summ.GetSummoner();
                    if (trapped)
                    {
                        trapped.RemoveAurasDueToSpell(Spells.Impaled);
                    }
                }

                me.DespawnOrUnsummon();
            }
        public override void EnterEvadeMode(EvadeReason why)
        {
            TempSummon meSummon = me.ToTempSummon();

            if (meSummon)
            {
                Creature summoner = meSummon.GetSummonerCreatureBase();
                if (summoner)
                {
                    summoner.GetAI().DoAction(ActionIds.PetEvade);
                }
                else
                {
                    me.DespawnOrUnsummon();
                }
                return;
            }
            base.EnterEvadeMode(why);
        }
        public override void EnterCombat(Unit who)
        {
            if (_isWatcher)
            {
                _isWatcher = false;

                TempSummon meSummon = me.ToTempSummon();
                if (meSummon)
                {
                    Creature summoner = meSummon.GetSummonerCreatureBase();
                    if (summoner)
                    {
                        summoner.GetAI().DoAction(ActionIds.WatcherEngaged);
                    }
                }
            }

            if (me.HasReactState(ReactStates.Passive))
            {
                List <Creature> others = new List <Creature>();
                me.GetCreatureListWithEntryInGrid(others, 0, 40.0f);
                foreach (Creature other in others)
                {
                    if (other.GetAI().GetData(Misc.DataPetGroup) == _petGroup)
                    {
                        other.SetReactState(ReactStates.Aggressive);
                        other.GetAI().AttackStart(who);
                    }
                }

                TempSummon meSummon = me.ToTempSummon();
                if (meSummon)
                {
                    Creature summoner = meSummon.GetSummonerCreatureBase();
                    if (summoner)
                    {
                        summoner.GetAI().DoAction(ActionIds.PetEngaged);
                    }
                }
            }
            _EnterCombat();
            base.EnterCombat(who);
        }
Esempio n. 12
0
        public void DoAddThreat(Unit victim, float threat)
        {
            uint redirectThreadPct = victim.GetRedirectThreatPercent();
            Unit redirectTarget    = victim.GetRedirectThreatTarget();

            // If victim is personnal spawn, redirect all aggro to summoner
            TempSummon tempSummonVictim = victim.ToTempSummon();

            if (tempSummonVictim)
            {
                if (tempSummonVictim.IsVisibleBySummonerOnly())
                {
                    // Personnal Spawns from same summoner can aggro each other
                    if (!GetOwner().ToTempSummon() ||
                        !GetOwner().ToTempSummon().IsVisibleBySummonerOnly() ||
                        tempSummonVictim.GetSummonerGUID() != GetOwner().ToTempSummon().GetSummonerGUID())
                    {
                        redirectThreadPct = 100;
                        redirectTarget    = tempSummonVictim.GetSummoner();
                    }
                }
            }

            // must check > 0.0f, otherwise dead loop
            if (threat > 0.0f && redirectThreadPct != 0)
            {
                if (redirectTarget != null)
                {
                    float redirectThreat = MathFunctions.CalculatePct(threat, redirectThreadPct);
                    threat -= redirectThreat;
                    if (IsValidProcess(redirectTarget, GetOwner()))
                    {
                        AddThreat(redirectTarget, redirectThreat);
                    }
                }
            }

            AddThreat(victim, threat);
        }
Esempio n. 13
0
            void ActivateCrystal()
            {
                // just to make things easier we'll get the gameobject from the map
                GameObject invoker = instance.GetGameObject(uiActivationCrystal[0]);

                if (!invoker)
                {
                    return;
                }

                SpellInfo spellInfoLightning = Global.SpellMgr.GetSpellInfo(SPELL_ARCANE_LIGHTNING);

                if (spellInfoLightning == null)
                {
                    return;
                }

                // the orb
                TempSummon trigger = invoker.SummonCreature(NPC_DEFENSE_SYSTEM, ArcaneSphere, TempSummonType.ManualDespawn, 0);

                if (!trigger)
                {
                    return;
                }

                // visuals
                trigger.CastSpell(trigger, spellInfoLightning, true, 0, 0, trigger.GetGUID());

                // Kill all mobs registered with SetData64(ADD_TRASH_MOB)
                foreach (var guid in trashMobs)
                {
                    Creature creature = instance.GetCreature(guid);
                    if (creature && creature.IsAlive())
                    {
                        trigger.Kill(creature);
                    }
                }
            }
Esempio n. 14
0
        public override bool OnUse(Player player, Item item, SpellCastTargets targets, ObjectGuid castId)
        {
            GameObject go = null;

            for (byte i = 0; i < ItemScriptConst.CaribouTraps.Length; ++i)
            {
                go = player.FindNearestGameObject(ItemScriptConst.CaribouTraps[i], 5.0f);
                if (go)
                {
                    break;
                }
            }

            if (!go)
            {
                return(false);
            }

            if (go.FindNearestCreature(ItemScriptConst.NpcNesingwaryTrapper, 10.0f, true) || go.FindNearestCreature(ItemScriptConst.NpcNesingwaryTrapper, 10.0f, false) || go.FindNearestGameObject(ItemScriptConst.GoHighQualityFur, 2.0f))
            {
                return(true);
            }

            float x, y, z;

            go.GetClosePoint(out x, out y, out z, go.GetObjectSize() / 3, 7.0f);
            go.SummonGameObject(ItemScriptConst.GoHighQualityFur, go, Quaternion.WAxis, 1);
            TempSummon summon = player.SummonCreature(ItemScriptConst.NpcNesingwaryTrapper, x, y, z, go.GetOrientation(), TempSummonType.DeadDespawn, 1000);

            if (summon)
            {
                summon.SetVisible(false);
                summon.SetReactState(ReactStates.Passive);
                summon.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc);
            }
            return(false);
        }
Esempio n. 15
0
        public CypherStrings VisualizeBoundary(int duration, Unit owner = null, bool fill = false)
        {
            if (!owner)
            {
                return(0);
            }

            if (_boundary.Empty())
            {
                return(CypherStrings.CreatureMovementNotBounded);
            }

            List <KeyValuePair <int, int> > Q = new List <KeyValuePair <int, int> >();
            List <KeyValuePair <int, int> > alreadyChecked = new List <KeyValuePair <int, int> >();
            List <KeyValuePair <int, int> > outOfBounds    = new List <KeyValuePair <int, int> >();

            Position startPosition = owner.GetPosition();

            if (!CheckBoundary(startPosition)) // fall back to creature position
            {
                startPosition = me.GetPosition();
                if (!CheckBoundary(startPosition))
                {
                    startPosition = me.GetHomePosition();
                    if (!CheckBoundary(startPosition)) // fall back to creature home position
                    {
                        return(CypherStrings.CreatureNoInteriorPointFound);
                    }
                }
            }
            float spawnZ = startPosition.GetPositionZ() + SharedConst.BoundaryVisualizeSpawnHeight;

            bool boundsWarning = false;

            Q.Add(new KeyValuePair <int, int>(0, 0));
            while (!Q.Empty())
            {
                var  front = Q.First();
                bool hasOutOfBoundsNeighbor = false;
                foreach (var off in new List <KeyValuePair <int, int> >()
                {
                    new KeyValuePair <int, int>(1, 0), new KeyValuePair <int, int>(0, 1), new KeyValuePair <int, int>(-1, 0), new KeyValuePair <int, int>(0, -1)
                })
                {
                    var next = new KeyValuePair <int, int>(front.Key + off.Key, front.Value + off.Value);
                    if (next.Key > SharedConst.BoundaryVisualizeFailsafeLimit || next.Key < -SharedConst.BoundaryVisualizeFailsafeLimit || next.Value > SharedConst.BoundaryVisualizeFailsafeLimit || next.Value < -SharedConst.BoundaryVisualizeFailsafeLimit)
                    {
                        boundsWarning = true;
                        continue;
                    }
                    if (!alreadyChecked.Contains(next)) // never check a coordinate twice
                    {
                        Position nextPos = new Position(startPosition.GetPositionX() + next.Key * SharedConst.BoundaryVisualizeStepSize, startPosition.GetPositionY() + next.Value * SharedConst.BoundaryVisualizeStepSize, startPosition.GetPositionZ());
                        if (CheckBoundary(nextPos))
                        {
                            Q.Add(next);
                        }
                        else
                        {
                            outOfBounds.Add(next);
                            hasOutOfBoundsNeighbor = true;
                        }
                        alreadyChecked.Add(next);
                    }
                    else
                    {
                        if (outOfBounds.Contains(next))
                        {
                            hasOutOfBoundsNeighbor = true;
                        }
                    }
                }
                if (fill || hasOutOfBoundsNeighbor)
                {
                    var        pos   = new Position(startPosition.GetPositionX() + front.Key * SharedConst.BoundaryVisualizeStepSize, startPosition.GetPositionY() + front.Value * SharedConst.BoundaryVisualizeStepSize, spawnZ);
                    TempSummon point = owner.SummonCreature(SharedConst.BoundaryVisualizeCreature, pos, TempSummonType.TimedDespawn, (uint)(duration * Time.InMilliseconds));
                    if (point)
                    {
                        point.SetObjectScale(SharedConst.BoundaryVisualizeCreatureScale);
                        point.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.Stunned | UnitFlags.ImmuneToNpc);
                        if (!hasOutOfBoundsNeighbor)
                        {
                            point.AddUnitFlag(UnitFlags.NotSelectable);
                        }
                    }
                    Q.Remove(front);
                }
            }
            return(boundsWarning ? CypherStrings.CreatureMovementMaybeUnbounded : 0);
        }
Esempio n. 16
0
 public void SetVisualDummy(TempSummon summon)
 {
     _visualDummy = summon.GetGUID();
     summon.GetPosition(out _x, out _y, out _z);
 }