Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp b/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp
- index 1c54887..3e052e8 100644
- --- a/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp
- +++ b/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp
- @@ -45,6 +45,9 @@ enum
- NPC_SVALA_SORROW = 26668,
- NPC_ARTHAS_IMAGE = 29280,
- + NPC_CHANNELER = 27281,
- + NPC_RITUAL_TARGET = 27327,
- + NPC_SCOURGE_HULK = 26555, // used to check the achiev
- SPELL_ARTHAS_VISUAL = 54134,
- @@ -53,10 +56,19 @@ enum
- SPELL_TRANSFORMING_FLOATING = 54140,
- SPELL_TRANSFORMING_CHANNEL = 54142,
- - SPELL_RITUAL_OF_SWORD = 48276,
- - SPELL_CALL_FLAMES = 48258,
- + SPELL_RITUAL_OF_SWORD = 48276, // teleports the boss - casts 54159 on boss (disarm)
- + SPELL_RITUAL_STRIKE = 48331, // damage spell - has script target - 27327
- + SPELL_CALL_FLAMES = 48258, // sends script event 17841
- SPELL_SINISTER_STRIKE = 15667,
- - SPELL_SINISTER_STRIKE_H = 59409
- + SPELL_SINISTER_STRIKE_H = 59409,
- +
- + SPELL_SUMMON_CHANNELER_1 = 48271,
- + SPELL_SUMMON_CHANNELER_2 = 48274,
- + SPELL_SUMMON_CHANNELER_3 = 48275,
- +
- + // spells used by channelers
- + SPELL_PARALIZE = 48278, // should apply effect 48267
- + SPELL_SHADOWS_IN_THE_DARK = 59407
- };
- /*######
- @@ -67,13 +79,13 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- {
- boss_svalaAI(Creature* pCreature) : ScriptedAI(pCreature)
- {
- - m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
- + m_pInstance = (instance_pinnacle*)pCreature->GetInstanceData();
- m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty();
- m_bIsIntroDone = false;
- Reset();
- }
- - ScriptedInstance* m_pInstance;
- + instance_pinnacle* m_pInstance;
- bool m_bIsRegularMode;
- Creature* pArthas;
- @@ -82,6 +94,10 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- uint32 m_uiIntroTimer;
- uint32 m_uiIntroCount;
- + uint32 m_uiSinisterStrikeTimer;
- + uint32 m_uiCallFlamesTimer;
- + bool m_bHasDoneRitual;
- +
- void Reset()
- {
- pArthas = NULL;
- @@ -89,6 +105,10 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- m_uiIntroTimer = 2500;
- m_uiIntroCount = 0;
- + m_uiSinisterStrikeTimer = 10000;
- + m_uiCallFlamesTimer = urand(10000, 15000);
- + m_bHasDoneRitual = false;
- +
- if (m_creature->isAlive() && m_pInstance && m_pInstance->GetData(TYPE_SVALA) > IN_PROGRESS)
- {
- if (m_creature->GetEntry() != NPC_SVALA_SORROW)
- @@ -140,6 +160,14 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- pArthas = pSummoned;
- pSummoned->SetFacingToObject(m_creature);
- }
- + else if (pSummoned->GetEntry() == NPC_CHANNELER)
- + {
- + if (!m_bIsRegularMode)
- + pSummoned->CastSpell(pSummoned, SPELL_SHADOWS_IN_THE_DARK, true);
- +
- + // ToDo: fix this spell target and effect
- + //pSummoned->CastSpell(m_creature, SPELL_PARALIZE, true);
- + }
- }
- void SummonedCreatureDespawn(Creature* pDespawned)
- @@ -157,6 +185,16 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- m_creature->UpdateEntry(NPC_SVALA_SORROW);
- }
- + // cast ritual strike after starting the ritual
- + else if (pSpell->Id == SPELL_RITUAL_OF_SWORD)
- + DoCastSpellIfCan(m_creature, SPELL_RITUAL_STRIKE, CAST_TRIGGERED);
- + }
- +
- + void SpellHitTarget(Unit* pTarget, const SpellEntry* pSpell)
- + {
- + // restore movement after ritual is finished
- + if (pTarget->GetEntry() == NPC_RITUAL_TARGET)
- + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
- }
- void KilledUnit(Unit* pVictim)
- @@ -167,6 +205,10 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- case 1: DoScriptText(SAY_SLAY_2, m_creature); break;
- case 2: DoScriptText(SAY_SLAY_3, m_creature); break;
- }
- +
- + // set achiev to true if boss kills a hulk
- + if (pVictim->GetEntry() == NPC_SCOURGE_HULK && m_pInstance)
- + m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_HULK, true);
- }
- void JustDied(Unit* pKiller)
- @@ -188,7 +230,7 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- void UpdateAI(const uint32 uiDiff)
- {
- - if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
- + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() || m_creature->HasAura(SPELL_RITUAL_OF_SWORD))
- {
- if (m_bIsIntroDone)
- return;
- @@ -235,6 +277,48 @@ struct MANGOS_DLL_DECL boss_svalaAI : public ScriptedAI
- return;
- }
- + if(m_uiSinisterStrikeTimer < uiDiff)
- + {
- + if (DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_SINISTER_STRIKE : SPELL_SINISTER_STRIKE_H) == CAST_OK)
- + m_uiSinisterStrikeTimer = 10000;
- + }
- + else
- + m_uiSinisterStrikeTimer -= uiDiff;
- +
- + if(m_uiCallFlamesTimer < uiDiff)
- + {
- + if (DoCastSpellIfCan(m_creature, SPELL_CALL_FLAMES) == CAST_OK)
- + m_uiCallFlamesTimer = urand(10000, 15000);
- + }
- + else
- + m_uiCallFlamesTimer -= uiDiff;
- +
- + // As from patch notes: Svala Sorrowgrave now casts Ritual of the Sword 1 time during the encounter, down from 3.
- + if(m_creature->GetHealthPercent() < 50.0f && !m_bHasDoneRitual)
- + {
- + if(Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
- + {
- + if (DoCastSpellIfCan(pTarget, SPELL_RITUAL_OF_SWORD, CAST_TRIGGERED) == CAST_OK)
- + {
- + // summon channelers
- + DoCastSpellIfCan(m_creature, SPELL_SUMMON_CHANNELER_1, CAST_TRIGGERED);
- + DoCastSpellIfCan(m_creature, SPELL_SUMMON_CHANNELER_2, CAST_TRIGGERED);
- + DoCastSpellIfCan(m_creature, SPELL_SUMMON_CHANNELER_3, CAST_TRIGGERED);
- +
- + switch(urand(0, 3))
- + {
- + case 0: DoScriptText(SAY_SACRIFICE_1, m_creature); break;
- + case 1: DoScriptText(SAY_SACRIFICE_2, m_creature); break;
- + case 2: DoScriptText(SAY_SACRIFICE_3, m_creature); break;
- + case 3: DoScriptText(SAY_SACRIFICE_4, m_creature); break;
- + }
- +
- + m_creature->GetMotionMaster()->MoveIdle();
- + m_bHasDoneRitual = true;
- + }
- + }
- + }
- +
- DoMeleeAttackIfReady();
- }
- };
- @@ -255,17 +339,35 @@ bool AreaTrigger_at_svala_intro(Player* pPlayer, AreaTriggerEntry const* pAt)
- return false;
- }
- -void AddSC_boss_svala()
- +bool ProcessEventId_event_call_flames(uint32 uiEventId, Object* pSource, Object* pTarget, bool bIsStart)
- {
- - Script *newscript;
- + if (instance_pinnacle* pInstance = (instance_pinnacle*)((Creature*)pSource)->GetInstanceData())
- + {
- + if (pInstance->GetData(TYPE_SVALA) != IN_PROGRESS)
- + return false;
- - newscript = new Script;
- - newscript->Name = "boss_svala";
- - newscript->GetAI = &GetAI_boss_svala;
- - newscript->RegisterSelf();
- + pInstance->DoProcessCallFlamesEvent();
- + return true;
- + }
- + return false;
- +}
- - newscript = new Script;
- - newscript->Name = "at_svala_intro";
- - newscript->pAreaTrigger = &AreaTrigger_at_svala_intro;
- - newscript->RegisterSelf();
- +void AddSC_boss_svala()
- +{
- + Script* pNewScript;
- +
- + pNewScript = new Script;
- + pNewScript->Name = "boss_svala";
- + pNewScript->GetAI = &GetAI_boss_svala;
- + pNewScript->RegisterSelf();
- +
- + pNewScript = new Script;
- + pNewScript->Name = "at_svala_intro";
- + pNewScript->pAreaTrigger = &AreaTrigger_at_svala_intro;
- + pNewScript->RegisterSelf();
- +
- + pNewScript = new Script;
- + pNewScript->Name = "event_call_flames";
- + pNewScript->pProcessEventId = &ProcessEventId_event_call_flames;
- + pNewScript->RegisterSelf();
- }
- diff --git a/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp b/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp
- index 03527f0..c5daccb 100644
- --- a/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp
- +++ b/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp
- @@ -32,6 +32,22 @@ instance_pinnacle::instance_pinnacle(Map* pMap) : ScriptedInstance(pMap)
- void instance_pinnacle::Initialize()
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
- +
- + for (uint8 i = 0; i < MAX_SPECIAL_ACHIEV_CRITS; ++i)
- + m_abAchievCriteria[i] = false;
- +}
- +
- +void instance_pinnacle::OnCreatureCreate(Creature* pCreature)
- +{
- + switch(pCreature->GetEntry())
- + {
- + case NPC_YMIRON:
- + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid();
- + break;
- + case NPC_FLAME_BRAZIER:
- + m_lFlameBraziersList.push_back(pCreature->GetObjectGuid());
- + break;
- + }
- }
- void instance_pinnacle::OnObjectCreate(GameObject* pGo)
- @@ -41,9 +57,15 @@ void instance_pinnacle::OnObjectCreate(GameObject* pGo)
- case GO_DOOR_SKADI:
- if (m_auiEncounter[TYPE_SKADI] == DONE)
- pGo->SetGoState(GO_STATE_ACTIVE);
- - m_mGoEntryGuidStore[GO_DOOR_SKADI] = pGo->GetObjectGuid();
- break;
- + case GO_DOOR_YMIRON:
- + if (m_auiEncounter[TYPE_YMIRON] == DONE)
- + pGo->SetGoState(GO_STATE_ACTIVE);
- + break;
- + default:
- + return;
- }
- + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid();
- }
- void instance_pinnacle::SetData(uint32 uiType, uint32 uiData)
- @@ -52,6 +74,9 @@ void instance_pinnacle::SetData(uint32 uiType, uint32 uiData)
- {
- case TYPE_SVALA:
- m_auiEncounter[uiType] = uiData;
- + // set the achiev to false at the beginning of the event
- + if (uiData == IN_PROGRESS)
- + SetSpecialAchievementCriteria(TYPE_ACHIEV_HULK, false);
- break;
- case TYPE_GORTOK:
- m_auiEncounter[uiType] = uiData;
- @@ -59,11 +84,12 @@ void instance_pinnacle::SetData(uint32 uiType, uint32 uiData)
- case TYPE_SKADI:
- if (uiData == DONE)
- DoUseDoorOrButton(GO_DOOR_SKADI);
- -
- m_auiEncounter[uiType] = uiData;
- break;
- case TYPE_YMIRON:
- m_auiEncounter[uiType] = uiData;
- + if (uiData == DONE)
- + DoUseDoorOrButton(GO_DOOR_YMIRON);
- break;
- default:
- error_log("SD2: Instance Pinnacle: SetData = %u for type %u does not exist/not implemented.", uiType, uiData);
- @@ -115,6 +141,37 @@ void instance_pinnacle::Load(const char* chrIn)
- OUT_LOAD_INST_DATA_COMPLETE;
- }
- +void instance_pinnacle::SetSpecialAchievementCriteria(uint32 uiType, bool bIsMet)
- +{
- + if (uiType < MAX_SPECIAL_ACHIEV_CRITS)
- + m_abAchievCriteria[uiType] = bIsMet;
- +}
- +
- +bool instance_pinnacle::CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/)
- +{
- + switch (uiCriteriaId)
- + {
- + case ACHIEV_CRIT_INCREDIBLE_HULK:
- + return m_abAchievCriteria[TYPE_ACHIEV_HULK];
- + case ACHIEV_CRIT_GIRL_LOVES_SKADI:
- + return m_abAchievCriteria[TYPE_ACHIEV_LOVE_SKADI];
- + case ACHIEV_CRIT_KINGS_BANE:
- + return false;
- +
- + default:
- + return false;
- + }
- +}
- +
- +void instance_pinnacle::DoProcessCallFlamesEvent()
- +{
- + for (GUIDList::const_iterator itr = m_lFlameBraziersList.begin(); itr != m_lFlameBraziersList.end(); ++itr)
- + {
- + if (Creature* pFlame = instance->GetCreature(*itr))
- + pFlame->CastSpell(pFlame, SPELL_BALL_OF_FLAME, true);
- + }
- +}
- +
- InstanceData* GetInstanceData_instance_pinnacle(Map* pMap)
- {
- return new instance_pinnacle(pMap);
- diff --git a/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h b/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h
- index ae70c7b..e91b274 100644
- --- a/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h
- +++ b/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h
- @@ -8,19 +8,34 @@
- enum
- {
- MAX_ENCOUNTER = 4,
- + MAX_SPECIAL_ACHIEV_CRITS = 2,
- TYPE_SVALA = 0,
- TYPE_GORTOK = 1,
- TYPE_SKADI = 2,
- TYPE_YMIRON = 3,
- + TYPE_ACHIEV_HULK = 0,
- + TYPE_ACHIEV_LOVE_SKADI = 1,
- +
- GO_STASIS_GENERATOR = 188593,
- GO_DOOR_SKADI = 192173,
- + GO_DOOR_YMIRON = 192174,
- + NPC_FLAME_BRAZIER = 27273, // throw flames at players on Svalna event
- + NPC_YMIRON = 26861,
- NPC_FURBOLG = 26684,
- NPC_WORGEN = 26683,
- NPC_JORMUNGAR = 26685,
- - NPC_RHINO = 26686
- + NPC_RHINO = 26686,
- +
- + ACHIEV_CRIT_INCREDIBLE_HULK = 7322, // Svala achiev - 2043
- + ACHIEV_CRIT_KINGS_BANE = 7598, // Ymiron achiev - 2157
- + ACHIEV_CRIT_GIRL_LOVES_SKADI = 7595, // Skadi achiev - 2156
- +
- + ACHIEV_START_SKADI_ID = 17726, // Starts Skadi timed achiev - 1873
- +
- + SPELL_BALL_OF_FLAME = 48246, // spell used by the flame braziers
- };
- class MANGOS_DLL_DECL instance_pinnacle : public ScriptedInstance
- @@ -30,6 +45,7 @@ class MANGOS_DLL_DECL instance_pinnacle : public ScriptedInstance
- void Initialize();
- + void OnCreatureCreate(Creature* pCreature);
- void OnObjectCreate(GameObject* pGo);
- void SetData(uint32 uiType, uint32 uiData);
- @@ -38,9 +54,17 @@ class MANGOS_DLL_DECL instance_pinnacle : public ScriptedInstance
- const char* Save() { return m_strInstData.c_str(); }
- void Load(const char* chrIn);
- + void SetSpecialAchievementCriteria(uint32 uiType, bool bIsMet);
- + bool CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/);
- +
- + void DoProcessCallFlamesEvent();
- +
- private:
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- + bool m_abAchievCriteria[MAX_SPECIAL_ACHIEV_CRITS];
- std::string m_strInstData;
- +
- + GUIDList m_lFlameBraziersList;
- };
- #endif
- diff --git a/sql/mangos_scriptname_full.sql b/sql/mangos_scriptname_full.sql
- index 3f1fae8..da15924 100644
- --- a/sql/mangos_scriptname_full.sql
- +++ b/sql/mangos_scriptname_full.sql
- @@ -1276,6 +1276,9 @@ DELETE FROM scripted_areatrigger WHERE entry=5140;
- INSERT INTO scripted_areatrigger VALUES (5140,'at_svala_intro');
- UPDATE creature_template SET ScriptName='boss_ymiron' WHERE entry=26861;
- UPDATE instance_template SET ScriptName='instance_pinnacle' WHERE map=575;
- +DELETE FROM scripted_event_id WHERE id=17841;
- +INSERT INTO scripted_event_id VALUES
- +(17841,'event_call_flames');
- /* VAULT OF ARCHAVON */
Add Comment
Please, Sign In to add comment