diff options
| author | Shauren <shauren.trinity@gmail.com> | 2016-03-13 11:21:13 +0100 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-04-09 17:05:24 +0200 | 
| commit | 5c0517c6ef9660d970935f9b1b65596913c917c5 (patch) | |
| tree | 1e85d6557817bc5570e64f1ced2c2f2959334c1d /src | |
| parent | 7cf6eca4250ee353b3ab1f58c7665b201fe9ea10 (diff) | |
Merge branch 'Golrag-sindragosa_ice_tomb_target' into 3.3.5
(cherry picked from commit 895878010e7dc3fb342bcae5e216bc1543828213)
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/AI/CoreAI/UnitAI.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/AI/CoreAI/UnitAI.h | 4 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp | 73 | 
3 files changed, 60 insertions, 20 deletions
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 22971062fcc..85a93bd91c2 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -279,5 +279,8 @@ bool NonTankTargetSelector::operator()(Unit const* target) const      if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER)          return false; +    if (HostileReference* currentVictim = _source->getThreatManager().getCurrentVictim()) +        return target->GetGUID() != currentVictim->getUnitGuid(); +      return target != _source->GetVictim();  } diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 6f7f10a8a11..df218333ed4 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -107,11 +107,11 @@ struct TC_GAME_API SpellTargetSelector : public std::unary_function<Unit*, bool>  struct TC_GAME_API NonTankTargetSelector : public std::unary_function<Unit*, bool>  {      public: -        NonTankTargetSelector(Creature* source, bool playerOnly = true) : _source(source), _playerOnly(playerOnly) { } +        NonTankTargetSelector(Unit* source, bool playerOnly = true) : _source(source), _playerOnly(playerOnly) { }          bool operator()(Unit const* target) const;      private: -        Creature const* _source; +        Unit* _source;          bool _playerOnly;  }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index bbbf222a4e7..38b3932d742 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -134,6 +134,7 @@ enum FrostwingData      DATA_WHELP_MARKER           = 2,      DATA_LINKED_GAMEOBJECT      = 3,      DATA_TRAPPED_PLAYER         = 4, +    DATA_IS_THIRD_PHASE         = 5  };  enum MovementPoints @@ -196,20 +197,19 @@ class FrostBombExplosion : public BasicEvent          ObjectGuid _sindragosaGUID;  }; -class FrostBeaconSelector +class FrostBeaconSelector : NonTankTargetSelector  {      public: -        FrostBeaconSelector(Unit* source) : _source(source) { } +        FrostBeaconSelector(Unit* source) : NonTankTargetSelector(source, true) { } -        bool operator()(Unit* target) const +        bool operator()(WorldObject* target) const          { -            return target->GetTypeId() == TYPEID_PLAYER && -                target != _source->GetVictim() && -                !target->HasAura(SPELL_ICE_TOMB_UNTARGETABLE); -        } +            if (Unit* unitTarget = target->ToUnit()) +                return !NonTankTargetSelector::operator()(unitTarget) || +                    unitTarget->HasAura(SPELL_ICE_TOMB_UNTARGETABLE); -    private: -        Unit* _source; +            return false; +        }  };  class boss_sindragosa : public CreatureScript @@ -326,9 +326,15 @@ class boss_sindragosa : public CreatureScript              uint32 GetData(uint32 type) const override              { -                if (type == DATA_MYSTIC_BUFFET_STACK) -                    return _mysticBuffetStack; -                return 0xFFFFFFFF; +                switch (type) +                { +                    case DATA_MYSTIC_BUFFET_STACK: +                        return _mysticBuffetStack; +                    case DATA_IS_THIRD_PHASE: +                        return _isThirdPhase; +                    default: +                        return 0xFFFFFFFF; +                }              }              void MovementInform(uint32 type, uint32 point) override @@ -418,7 +424,6 @@ class boss_sindragosa : public CreatureScript                  if (spell->Id == 70127)                      if (Aura const* mysticBuffet = target->GetAura(spell->Id))                          _mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount()); -              }              void UpdateAI(uint32 diff) override @@ -493,11 +498,7 @@ class boss_sindragosa : public CreatureScript                              me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar);                              break;                          case EVENT_ICE_TOMB: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, FrostBeaconSelector(me))) -                            { -                                Talk(EMOTE_WARN_FROZEN_ORB, target); -                                me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, 1, nullptr, TRIGGERED_FULL_MASK); -                            } +                            me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, 1, nullptr, TRIGGERED_FULL_MASK);                              events.ScheduleEvent(EVENT_ICE_TOMB, urand(16000, 23000));                              break;                          case EVENT_FROST_BOMB: @@ -1575,6 +1576,41 @@ class spell_frostwarden_handler_focus_fire : public SpellScriptLoader          }  }; +class spell_sindragosa_ice_tomb_target : public SpellScriptLoader +{ +public: +    spell_sindragosa_ice_tomb_target() : SpellScriptLoader("spell_sindragosa_ice_tomb_target") { } + +    class spell_sindragosa_ice_tomb_target_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_sindragosa_ice_tomb_target_SpellScript); + +        void FilterTargets(std::list<WorldObject*>& unitList) +        { +            Unit* caster = GetCaster(); +            unitList.remove_if(FrostBeaconSelector(caster)); +        } + +        void HandleSindragosaTalk(SpellEffIndex /*effIndex*/) +        { +            if (Creature* creatureCaster = GetCaster()->ToCreature()) +                if (creatureCaster->GetAI()->GetData(DATA_IS_THIRD_PHASE)) +                    creatureCaster->AI()->Talk(EMOTE_WARN_FROZEN_ORB, GetHitUnit()); +        } + +        void Register() override +        { +            OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +            OnEffectLaunchTarget += SpellEffectFn(spell_sindragosa_ice_tomb_target_SpellScript::HandleSindragosaTalk, EFFECT_0, SPELL_EFFECT_DUMMY); +        } +    }; + +    SpellScript* GetSpellScript() const override +    { +        return new spell_sindragosa_ice_tomb_target_SpellScript(); +    } +}; +  class at_sindragosa_lair : public AreaTriggerScript  {      public: @@ -1640,6 +1676,7 @@ void AddSC_boss_sindragosa()      new spell_frostwarden_handler_focus_fire();      new spell_trigger_spell_from_caster("spell_sindragosa_ice_tomb", SPELL_ICE_TOMB_DUMMY, TRIGGERED_IGNORE_SET_FACING);      new spell_trigger_spell_from_caster("spell_sindragosa_ice_tomb_dummy", SPELL_FROST_BEACON); +    new spell_sindragosa_ice_tomb_target();      new at_sindragosa_lair();      new achievement_all_you_can_eat();  }  | 
