diff options
Diffstat (limited to 'src/scripts')
| -rw-r--r-- | src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp | 205 | ||||
| -rw-r--r-- | src/scripts/northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp | 24 | 
2 files changed, 157 insertions, 72 deletions
diff --git a/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp b/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp index 1f7a0bcf1ed..3feef804d3b 100644 --- a/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp +++ b/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp @@ -19,23 +19,30 @@  #include "ScriptedPch.h"  #include "azjol_nerub.h" +//SQL: UPDATE creature_template SET mechanic_immune_mask = 1073741823 WHERE  name like "anub'arak%"; +  enum Spells  {      SPELL_CARRION_BEETLES                         = 53520,      SPELL_SUMMON_CARRION_BEETLES                  = 53521,      SPELL_LEECHING_SWARM                          = 53467, -    SPELL_IMPALE                                  = 53454, -    H_SPELL_IMPALE                                = 59446,      SPELL_POUND                                   = 53472, -    H_SPELL_POUND                                 = 59433, +    SPELL_POUND_H                                 = 59433,      SPELL_SUBMERGE                                = 53421, +    SPELL_IMPALE_DMG                              = 53454, +    SPELL_IMPALE_DMG_H                            = 59446, +    SPELL_IMPALE_SHAKEGROUND                      = 53455, +    SPELL_IMPALE_SPIKE                            = 53539,   //this is not the correct visual effect +    //SPELL_IMPALE_TARGET                           = 53458,  };  enum Creatures  {      CREATURE_GUARDIAN                             = 29216,      CREATURE_VENOMANCER                           = 29217, -    CREATURE_DATTER                               = 29213 +    CREATURE_DATTER                               = 29213, +    CREATURE_IMPALE_TARGET                        = 89, +    DISPLAY_INVISIBLE                             = 11686  };  // not in db @@ -59,12 +66,27 @@ enum      ACHIEV_TIMED_START_EVENT                      = 20381,  }; +enum Phases  +{ +    PHASE_MELEE                                   = 0, +    PHASE_UNDERGROUND                             = 1, +    IMPALE_PHASE_TARGET                           = 0, +    IMPALE_PHASE_ATTACK                           = 1, +    IMPALE_PHASE_DMG                              = 2 +}; +  const Position SpawnPoint[2] =  {      { 550.7, 282.8, 224.3 },      { 551.1, 229.4, 224.3 },  }; +const Position SpawnPointGuardian[2] = +{  +    { 550.348633, 316.006805, 234.2947 }, +    { 550.188660, 324.264557, 237.7412 }, +}; +  struct boss_anub_arakAI : public ScriptedAI  {      boss_anub_arakAI(Creature *c) : ScriptedAI(c), lSummons(me) @@ -79,36 +101,38 @@ struct boss_anub_arakAI : public ScriptedAI      bool bVenomancerSummoned;      bool bDatterSummoned;      uint8 uiPhase; -    uint32 uiPhaseTimer; - +    uint32 uiUndergroundPhase;      uint32 uiCarrionBeetlesTimer;      uint32 uiLeechingSwarmTimer; -    uint32 uiImpaleTimer;      uint32 uiPoundTimer;      uint32 uiSubmergeTimer;      uint32 uiUndergroundTimer;      uint32 uiVenomancerTimer;      uint32 uiDatterTimer; - +     +    uint32 uiImpaleTimer; +    uint32 uiImpalePhase; +    uint64 uiImpaleTarget; +          SummonList lSummons;      void Reset()      { -          uiCarrionBeetlesTimer = 8*IN_MILISECONDS;          uiLeechingSwarmTimer = 20*IN_MILISECONDS;          uiImpaleTimer = 9*IN_MILISECONDS;          uiPoundTimer = 15*IN_MILISECONDS; -        uiPhase = 0; -        uiPhaseTimer = 0; +        uiPhase = PHASE_MELEE; +        uiUndergroundPhase = 0;          bChanneling = false; +        uiImpalePhase = IMPALE_PHASE_TARGET;          me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);          me->RemoveAura(SPELL_SUBMERGE);          lSummons.DespawnAll(); - +                 if (pInstance)          {              pInstance->SetData(DATA_ANUBARAK_EVENT, NOT_STARTED); @@ -116,10 +140,26 @@ struct boss_anub_arakAI : public ScriptedAI          }      } -    void EnterCombat(Unit * /*who*/) +    Creature* DoSummonImpaleTarget(Unit *pTarget)      { -        DoScriptText(SAY_AGGRO, me); +        Position targetPos; +        pTarget->GetPosition(&targetPos); + +        if (TempSummon* pImpaleTarget = me->SummonCreature(CREATURE_IMPALE_TARGET, targetPos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 6*IN_MILISECONDS)) +        { +            uiImpaleTarget = pImpaleTarget->GetGUID(); +            pImpaleTarget->SetReactState(REACT_PASSIVE); +            pImpaleTarget->SetDisplayId(DISPLAY_INVISIBLE); +            pImpaleTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); +            return pImpaleTarget; +        } + +        return NULL; +    } +    void EnterCombat(Unit *pWho) +    { +        DoScriptText(SAY_AGGRO, me);          if (pInstance)          {              pInstance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS); @@ -127,34 +167,50 @@ struct boss_anub_arakAI : public ScriptedAI          }      } -      void UpdateAI(const uint32 diff)      { -        //Return since we have no target          if (!UpdateVictim())              return; -        if (bChanneling == true) -        { -            for (uint8 i = 0; i < 4; ++i) -                DoCast(me->getVictim(), SPELL_SUMMON_CARRION_BEETLES, true); -            bChanneling = false; -        } - -        if (uiPhase == 1) -        { +        switch (uiPhase) +        {        +        case PHASE_UNDERGROUND:              if (uiImpaleTimer <= diff)              { -                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) -                    me->CastSpell(pTarget, DUNGEON_MODE(SPELL_IMPALE,H_SPELL_IMPALE), true); -                uiImpaleTimer = 9*IN_MILISECONDS; +                switch(uiImpalePhase) +                {                     +                case IMPALE_PHASE_TARGET: +                    if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))  +                    { +                        if (Creature *pImpaleTarget = DoSummonImpaleTarget(target)) +                            pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SHAKEGROUND, true); +                        uiImpaleTimer = 3*IN_MILISECONDS; +                        uiImpalePhase = IMPALE_PHASE_ATTACK; +                    } +                    break; +                case IMPALE_PHASE_ATTACK: +                    if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget)) +                    { +                        pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SPIKE, false); +                        pImpaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND); +                    } +                    uiImpalePhase = IMPALE_PHASE_DMG; +                    uiImpaleTimer = 1*IN_MILISECONDS; +                    break; +                case IMPALE_PHASE_DMG: +                    if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget)) +                        me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_IMPALE_DMG, SPELL_IMPALE_DMG_H), true); +                    uiImpalePhase = IMPALE_PHASE_TARGET; +                    uiImpaleTimer = 9*IN_MILISECONDS; +                    break; +                }              } else uiImpaleTimer -= diff;              if (!bGuardianSummoned)              {                  for (uint8 i = 0; i < 2; ++i)                  { -                    if (Creature *Guardian = me->SummonCreature(CREATURE_GUARDIAN,SpawnPoint[i],TEMPSUMMON_CORPSE_DESPAWN,0)) +                    if (Creature *Guardian = me->SummonCreature(CREATURE_GUARDIAN,SpawnPointGuardian[i],TEMPSUMMON_CORPSE_DESPAWN,0))                      {                          Guardian->AddThreat(me->getVictim(), 0.0f);                          DoZoneInCombat(Guardian); @@ -167,7 +223,7 @@ struct boss_anub_arakAI : public ScriptedAI              {                  if (uiVenomancerTimer <= diff)                  { -                    if (uiPhaseTimer > 1) +                    if (uiUndergroundPhase > 1)                      {                          for (uint8 i = 0; i < 2; ++i)                          { @@ -186,7 +242,7 @@ struct boss_anub_arakAI : public ScriptedAI              {                  if (uiDatterTimer <= diff)                  { -                    if (uiPhaseTimer > 2) +                    if (uiUndergroundPhase > 2)                      {                          for (uint8 i = 0; i < 2; ++i)                          { @@ -205,61 +261,72 @@ struct boss_anub_arakAI : public ScriptedAI              {                  me->RemoveAura(SPELL_SUBMERGE);                  me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); -                uiPhase = 0; +                uiPhase = PHASE_MELEE;              } else uiUndergroundTimer -= diff; -        } +            break; -        if (uiPhase == 0) -        { -            if (uiLeechingSwarmTimer <= diff) +        case PHASE_MELEE: +            if (((uiUndergroundPhase == 0 && HealthBelowPct(75)) +                || (uiUndergroundPhase == 1 && HealthBelowPct(50)) +                || (uiUndergroundPhase == 2 && HealthBelowPct(25))) +                && !me->hasUnitState(UNIT_STAT_CASTING))              { -                DoCast(me, SPELL_LEECHING_SWARM, true); -                uiLeechingSwarmTimer = 19*IN_MILISECONDS; -            } else uiLeechingSwarmTimer -= diff; +                bGuardianSummoned = false; +                bVenomancerSummoned = false; +                bDatterSummoned = false; + +                uiUndergroundTimer = 40*IN_MILISECONDS; +                uiVenomancerTimer = 25*IN_MILISECONDS; +                uiDatterTimer = 32*IN_MILISECONDS; + +                uiImpalePhase = 0; +                uiImpaleTimer = 9*IN_MILISECONDS; + +                DoCast(me, SPELL_SUBMERGE, false); +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); +                 +                uiPhase = PHASE_UNDERGROUND; +                ++uiUndergroundPhase; +            } -            if (uiCarrionBeetlesTimer <= diff) +            if (bChanneling == true) +            { +                for (uint8 i = 0; i < 8; ++i) +                DoCast(me->getVictim(), SPELL_SUMMON_CARRION_BEETLES, true); +                bChanneling = false; +            } +            else if (uiCarrionBeetlesTimer <= diff)              {                  bChanneling = true;                  DoCastVictim(SPELL_CARRION_BEETLES);                  uiCarrionBeetlesTimer = 25*IN_MILISECONDS;              } else uiCarrionBeetlesTimer -= diff; +             +            if (uiLeechingSwarmTimer <= diff) +            { +                DoCast(me, SPELL_LEECHING_SWARM, true); +                uiLeechingSwarmTimer = 19*IN_MILISECONDS; +            } else uiLeechingSwarmTimer -= diff;              if (uiPoundTimer <= diff)              { -                 DoCastVictim(SPELL_POUND); -                 uiPoundTimer = 16.5*IN_MILISECONDS; +                if (Unit *target = me->getVictim()) +                { +                    if (Creature *pImpaleTarget = DoSummonImpaleTarget(target)) +                        me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_POUND, SPELL_POUND_H), false); +                } +                uiPoundTimer = 16.5*IN_MILISECONDS;              } else uiPoundTimer -= diff; -        } - -        if ((uiPhaseTimer == 0 && HealthBelowPct(75)) -            || (uiPhaseTimer == 1 && HealthBelowPct(50)) -            || (uiPhaseTimer == 2 && HealthBelowPct(25))) -        { -            ++uiPhaseTimer; - -            bGuardianSummoned = false; -            bVenomancerSummoned = false; -            bDatterSummoned = false; - -            uiUndergroundTimer = 40*IN_MILISECONDS; -            uiVenomancerTimer = 25*IN_MILISECONDS; -            uiDatterTimer = 32*IN_MILISECONDS; - -            DoCast(me, SPELL_SUBMERGE, false); - -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); -            uiPhase = 1; -        } - -        if (uiPhase != 1)              DoMeleeAttackIfReady(); +            break; +        }      } - -    void JustDied(Unit * /*pKiller*/) +     +    void JustDied(Unit *pKiller)      {          DoScriptText(SAY_DEATH, me); - +        lSummons.DespawnAll();          if (pInstance)              pInstance->SetData(DATA_ANUBARAK_EVENT, DONE);      } @@ -268,7 +335,6 @@ struct boss_anub_arakAI : public ScriptedAI      {          if (pVictim == me)              return; -          DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);      } @@ -276,7 +342,6 @@ struct boss_anub_arakAI : public ScriptedAI      {          lSummons.Summon(summon);      } -  };  CreatureAI* GetAI_boss_anub_arak(Creature *pCreature) diff --git a/src/scripts/northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp b/src/scripts/northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp index 4d7f1fa2172..d12dbd604ba 100644 --- a/src/scripts/northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp +++ b/src/scripts/northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp @@ -37,6 +37,7 @@ struct instance_azjol_nerub : public ScriptedInstance      uint64 uiWatcherGashra;      uint64 uiWatcherSilthik;      uint64 uiWatcherNarjil; +    uint64 uiAnubarakDoor[3];      uint64 uiKrikthirDoor; @@ -45,6 +46,7 @@ struct instance_azjol_nerub : public ScriptedInstance     void Initialize()     {          memset(&auiEncounter, 0, sizeof(auiEncounter)); +        memset(&uiAnubarakDoor, 0, sizeof(uiAnubarakDoor));          uiKrikthir = 0;          uiHadronox = 0; @@ -85,9 +87,19 @@ struct instance_azjol_nerub : public ScriptedInstance                  if (auiEncounter[0] == DONE)                      HandleGameObject(NULL,true,pGo);                  break; +            case 192396: +                uiAnubarakDoor[0] = pGo->GetGUID(); +                break; +            case 192397: +                uiAnubarakDoor[1] = pGo->GetGUID(); +                break; +            case 192398: +                uiAnubarakDoor[2] = pGo->GetGUID(); +                break;          }      } +      uint64 GetData64(uint32 identifier)      {          switch(identifier) @@ -113,9 +125,17 @@ struct instance_azjol_nerub : public ScriptedInstance                  HandleGameObject(uiKrikthirDoor,true);              break;          case DATA_HADRONOX_EVENT: -            auiEncounter[1] = data; break; +            auiEncounter[1] = data; +            break;          case DATA_ANUBARAK_EVENT: -            auiEncounter[2] = data; break; +            auiEncounter[2] = data; +            if (data == IN_PROGRESS) +                for (uint8 i = 0; i < 3; ++i) +                    HandleGameObject(uiAnubarakDoor[i], false); +            else if (data == NOT_STARTED || data == DONE)  +                for (uint8 i = 0; i < 3; ++i) +                    HandleGameObject(uiAnubarakDoor[i], true); +            break;          }          if (data == DONE)  | 
