diff options
| author | Shauren <shauren.trinity@gmail.com> | 2012-06-05 14:53:18 +0200 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2012-06-05 14:53:18 +0200 | 
| commit | 295b1a00c8fa111c8a959fd2bf58534f759d7d5d (patch) | |
| tree | 0870ab0980745e671deb7b727ca4fb13818d5ef4 /src/server/scripts | |
| parent | 7e71488a1ea9f86b605821980a5ee7dbbb375b81 (diff) | |
Scripts/Icecrown Citadel: Fixed Sindragosa, Spinestalker and Rimefang flying in after related trash packs are dead - this solution is resistant to grid unload.
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp | 22 | ||||
| -rwxr-xr-x | src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp | 187 | 
2 files changed, 108 insertions, 101 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 734639a8b51..9baf6ba7a00 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -651,7 +651,7 @@ class npc_spinestalker : public CreatureScript                  // Increase add count                  if (!me->isDead())                  { -                    _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1);  // this cannot be in Reset because reset also happens on evade +                    _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetGUID());  // this cannot be in Reset because reset also happens on evade                      Reset();                  }              } @@ -674,13 +674,12 @@ class npc_spinestalker : public CreatureScript              void JustRespawned()              {                  ScriptedAI::JustRespawned(); -                _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1);  // this cannot be in Reset because reset also happens on evade +                _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetGUID());  // this cannot be in Reset because reset also happens on evade              }              void JustDied(Unit* /*killer*/)              {                  _events.Reset(); -                _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0);              }              void DoAction(int32 const action) @@ -778,7 +777,7 @@ class npc_rimefang : public CreatureScript                  // Increase add count                  if (!me->isDead())                  { -                    _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1);  // this cannot be in Reset because reset also happens on evade +                    _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetGUID());  // this cannot be in Reset because reset also happens on evade                      Reset();                  }              } @@ -801,13 +800,12 @@ class npc_rimefang : public CreatureScript              void JustRespawned()              {                  ScriptedAI::JustRespawned(); -                _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1);  // this cannot be in Reset because reset also happens on evade +                _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetGUID());  // this cannot be in Reset because reset also happens on evade              }              void JustDied(Unit* /*killer*/)              {                  _events.Reset(); -                _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0);              }              void DoAction(int32 const action) @@ -934,7 +932,8 @@ class npc_sindragosa_trash : public CreatureScript                  // Increase add count                  if (!me->isDead())                  { -                    _instance->SetData(_frostwyrmId, 1);  // this cannot be in Reset because reset also happens on evade +                    if (me->GetEntry() == NPC_FROSTWING_WHELP) +                        _instance->SetData64(_frostwyrmId, me->GetGUID());  // this cannot be in Reset because reset also happens on evade                      Reset();                  }              } @@ -956,13 +955,8 @@ class npc_sindragosa_trash : public CreatureScript                  ScriptedAI::JustRespawned();                  // Increase add count -                _instance->SetData(_frostwyrmId, 1);  // this cannot be in Reset because reset also happens on evade -            } - -            void JustDied(Unit* /*killer*/) -            { -                // Decrease add count -                _instance->SetData(_frostwyrmId, 0); +                if (me->GetEntry() == NPC_FROSTWING_WHELP) +                    _instance->SetData64(_frostwyrmId, me->GetGUID());  // this cannot be in Reset because reset also happens on evade              }              void SetData(uint32 type, uint32 data) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index cb83efc748f..288fde28c38 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -89,6 +89,13 @@ WeeklyQuest const WeeklyQuestData[WeeklyNPCs] =      {NPC_VALITHRIA_DREAMWALKER_QUEST, {QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10, QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25}}, // Respite for a Tormented Soul  }; +enum FrostwyrmFlags +{ +    FLAG_SPINESTALKER_SUMMONED  = 0x01, +    FLAG_RIMEFANG_SUMMONED      = 0x02, +    FLAG_SINDRAGOSA_SUMMONED    = 0x04, +}; +  class instance_icecrown_citadel : public InstanceMapScript  {      public: @@ -138,9 +145,6 @@ class instance_icecrown_citadel : public InstanceMapScript                  FrozenThroneEdgeGUID = 0;                  FrozenThroneWindGUID = 0;                  FrozenThroneWarningGUID = 0; -                FrostwyrmCount = 0; -                SpinestalkerTrashCount = 0; -                RimefangTrashCount = 0;                  IsBonedEligible = true;                  IsOozeDanceEligible = true;                  IsNauseaEligible = true; @@ -148,6 +152,7 @@ class instance_icecrown_citadel : public InstanceMapScript                  ColdflameJetsState = NOT_STARTED;                  BloodQuickeningState = NOT_STARTED;                  BloodQuickeningMinutes = 0; +                FrostwyrmFlags = 0;              }              void FillInitialWorldStates(WorldPacket& data) @@ -279,9 +284,13 @@ class instance_icecrown_citadel : public InstanceMapScript                          break;                      case NPC_SPINESTALKER:                          SpinestalkerGUID = creature->GetGUID(); +                        if (!creature->isAlive()) +                            FrostwyrmFlags |= FLAG_SPINESTALKER_SUMMONED;                          break;                      case NPC_RIMEFANG:                          RimefangGUID = creature->GetGUID(); +                        if (!creature->isAlive()) +                            FrostwyrmFlags |= FLAG_RIMEFANG_SUMMONED;                          break;                      case NPC_THE_LICH_KING:                          TheLichKingGUID = creature->GetGUID(); @@ -347,6 +356,56 @@ class instance_icecrown_citadel : public InstanceMapScript                          if (Creature* crok = instance->GetCreature(CrokScourgebaneGUID))                              crok->AI()->SetGUID(creature->GetGUID(), ACTION_VRYKUL_DEATH);                          break; +                    case NPC_FROSTWING_WHELP: +                        if (creature->AI()->GetData(1/*DATA_FROSTWYRM_OWNER*/) == DATA_SPINESTALKER) +                        { +                            if (FrostwyrmFlags & FLAG_SPINESTALKER_SUMMONED) +                                return; + +                            SpinestalkerTrash.erase(creature->GetGUID()); +                            if (SpinestalkerTrash.empty()) +                            { +                                FrostwyrmFlags |= FLAG_SPINESTALKER_SUMMONED; +                                if (Creature* spinestalk = instance->GetCreature(SpinestalkerGUID)) +                                    spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); +                            } +                        } +                        else +                        { +                            if (FrostwyrmFlags & FLAG_RIMEFANG_SUMMONED) +                                return; + +                            RimefangTrash.erase(creature->GetGUID()); +                            if (RimefangTrash.empty()) +                            { +                                FrostwyrmFlags |= FLAG_RIMEFANG_SUMMONED; +                                if (Creature* spinestalk = instance->GetCreature(RimefangGUID)) +                                    spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); +                            } +                        } +                        break; +                    case NPC_RIMEFANG: +                    case NPC_SPINESTALKER: +                    { +                        if (FrostwyrmFlags & FLAG_SINDRAGOSA_SUMMONED) +                            return; + +                        if (instance->IsHeroic() && !HeroicAttempts) +                            return; + +                        if (GetBossState(DATA_SINDRAGOSA) == DONE) +                            return; + +                        FrostwyrmGUIDs.erase(creature->GetGUID()); +                        if (FrostwyrmGUIDs.empty()) +                        { +                            FrostwyrmFlags |= FLAG_SINDRAGOSA_SUMMONED; +                            instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY()); +                            if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos)) +                                boss->AI()->DoAction(ACTION_START_FROSTWYRM); +                        } +                        break; +                    }                      default:                          break;                  } @@ -538,11 +597,17 @@ class instance_icecrown_citadel : public InstanceMapScript                  switch (type)                  {                      case DATA_SINDRAGOSA_FROSTWYRMS: -                        return FrostwyrmCount; +                        if (FrostwyrmFlags & FLAG_SINDRAGOSA_SUMMONED) +                            return 255; +                        return FrostwyrmGUIDs.size();                      case DATA_SPINESTALKER: -                        return SpinestalkerTrashCount; +                        if (FrostwyrmFlags & FLAG_SPINESTALKER_SUMMONED) +                            return 255; +                        return SpinestalkerTrash.size();                      case DATA_RIMEFANG: -                        return RimefangTrashCount; +                        if (FrostwyrmFlags & FLAG_RIMEFANG_SUMMONED) +                            return 255; +                        return RimefangTrash.size();                      case DATA_COLDFLAME_JETS:                          return ColdflameJetsState;                      case DATA_TEAM_IN_INSTANCE: @@ -741,6 +806,9 @@ class instance_icecrown_citadel : public InstanceMapScript                                          sindra->DespawnOrUnsummon();                              }                          } +                        // Reached when loading from DB +                        if (state == DONE) +                            FrostwyrmFlags |= FLAG_SINDRAGOSA_SUMMONED;                          break;                      case DATA_THE_LICH_KING:                      { @@ -798,89 +866,17 @@ class instance_icecrown_citadel : public InstanceMapScript                          IsOrbWhispererEligible = data ? true : false;                          break;                      case DATA_SINDRAGOSA_FROSTWYRMS: -                    { -                        if (FrostwyrmCount == 255) -                            return; - -                        if (instance->IsHeroic() && !HeroicAttempts) -                            return; - -                        if (GetBossState(DATA_SINDRAGOSA) == DONE) -                            return; - -                        switch (data) -                        { -                            case 0: -                                if (FrostwyrmCount) -                                { -                                    --FrostwyrmCount; -                                    if (!FrostwyrmCount) -                                    { -                                        instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY()); -                                        if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos)) -                                            boss->AI()->DoAction(ACTION_START_FROSTWYRM); -                                    } -                                } -                                break; -                            case 1: -                                ++FrostwyrmCount; -                                break; -                            default: -                                FrostwyrmCount = data; -                                break; -                        } +                        if (data == 255) +                            FrostwyrmFlags |= FLAG_SINDRAGOSA_SUMMONED;                          break; -                    }                      case DATA_SPINESTALKER: -                    { -                        if (SpinestalkerTrashCount == 255) -                            return; - -                        switch (data) -                        { -                            case 0: -                                if (SpinestalkerTrashCount) -                                { -                                    --SpinestalkerTrashCount; -                                    if (!SpinestalkerTrashCount) -                                        if (Creature* spinestalk = instance->GetCreature(SpinestalkerGUID)) -                                            spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); -                                } -                                break; -                            case 1: -                                ++SpinestalkerTrashCount; -                                break; -                            default: -                                SpinestalkerTrashCount = data; -                                break; -                        } +                        if (data == 255) +                            FrostwyrmFlags |= FLAG_SPINESTALKER_SUMMONED;                          break; -                    }                      case DATA_RIMEFANG: -                    { -                        if (RimefangTrashCount == 255) -                            return; - -                        switch (data) -                        { -                            case 0: -                                if (RimefangTrashCount) -                                { -                                    --RimefangTrashCount; -                                    if (!RimefangTrashCount) -                                        if (Creature* rime = instance->GetCreature(RimefangGUID)) -                                            rime->AI()->DoAction(ACTION_START_FROSTWYRM); -                                } -                                break; -                            case 1: -                                ++RimefangTrashCount; -                                break; -                            default: -                                RimefangTrashCount = data; -                                break; -                        } +                        if (data == 255) +                            FrostwyrmFlags |= FLAG_RIMEFANG_SUMMONED;                          break; -                    }                      case DATA_COLDFLAME_JETS:                          ColdflameJetsState = data;                          if (ColdflameJetsState == DONE) @@ -922,6 +918,22 @@ class instance_icecrown_citadel : public InstanceMapScript                  }              } +            void SetData64(uint32 id, uint64 data) +            { +                switch (id) +                { +                    case DATA_SINDRAGOSA_FROSTWYRMS: +                        FrostwyrmGUIDs.insert(data); +                        break; +                    case DATA_SPINESTALKER: +                        SpinestalkerTrash.insert(data); +                        break; +                    case DATA_RIMEFANG: +                        RimefangTrash.insert(data); +                        break; +                } +            } +              bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)              {                  switch (criteria_id) @@ -1289,12 +1301,13 @@ class instance_icecrown_citadel : public InstanceMapScript              uint64 PillarsUnchainedGUID;              uint32 TeamInInstance;              uint32 ColdflameJetsState; -            uint32 FrostwyrmCount; -            uint32 SpinestalkerTrashCount; -            uint32 RimefangTrashCount; +            std::set<uint64> FrostwyrmGUIDs; +            std::set<uint64> SpinestalkerTrash; +            std::set<uint64> RimefangTrash;              uint32 BloodQuickeningState;              uint32 HeroicAttempts;              uint16 BloodQuickeningMinutes; +            uint16 FrostwyrmFlags;              bool IsBonedEligible;              bool IsOozeDanceEligible;              bool IsNauseaEligible;  | 
