Utgarde Keep, Utgarde Pinnacle: Cleanup Svala Sorrowgrave

Better handling of sacrifice target storing his GUID on ScriptedInstance to
share it between npcs.

--HG--
branch : trunk
This commit is contained in:
Tartalo
2010-04-07 01:04:38 +02:00
parent 668dd91368
commit b58dc98b2b
3 changed files with 119 additions and 77 deletions
@@ -1,14 +1,19 @@
/* Script Data Start /* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
SDName: Boss svala * This program is free software; you can redistribute it and/or modify
SDAuthor: Tartalo * it under the terms of the GNU General Public License as published by
SD%Complete: * the Free Software Foundation; either version 2 of the License, or
SDComment: * (at your option) any later version.
SDCategory: *
Script Data End */ * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*** SQL START ***
update creature_template set scriptname = 'boss_svala' where entry = '';
*** SQL END ***/
#include "ScriptedPch.h" #include "ScriptedPch.h"
#include "utgarde_pinnacle.h" #include "utgarde_pinnacle.h"
@@ -68,12 +73,15 @@ enum CombatPhase
NORMAL, NORMAL,
SACRIFICING SACRIFICING
}; };
static Position RitualChannelerPos[]= static Position RitualChannelerPos[]=
{ {
{296.42, -355.01, 90.94}, {296.42, -355.01, 90.94},
{302.36, -352.01, 90.54}, {302.36, -352.01, 90.54},
{291.39, -350.89, 90.54} {291.39, -350.89, 90.54}
}; };
static Position ArthasPos = { 295.81, -366.16, 92.57, 1.58 };
static Position SvalaPos = { 296.632, -346.075, 90.6307, 1.58 };
struct boss_svalaAI : public ScriptedAI struct boss_svalaAI : public ScriptedAI
{ {
@@ -89,16 +97,16 @@ struct boss_svalaAI : public ScriptedAI
IntroPhase Phase; IntroPhase Phase;
TempSummon* pArthas; TempSummon* pArthas;
uint64 ArthasGUID; uint64 uiArthasGUID;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
void Reset() void Reset()
{ {
Phase = IDLE; Phase = IDLE;
uiIntroTimer = 1000; uiIntroTimer = 1*IN_MILISECONDS;
uiIntroPhase = 0; uiIntroPhase = 0;
ArthasGUID = 0; uiArthasGUID = 0;
if (pInstance) if (pInstance)
pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED); pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED);
@@ -114,11 +122,11 @@ struct boss_svalaAI : public ScriptedAI
Phase = INTRO; Phase = INTRO;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (Creature *pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_MANUAL_DESPAWN)) if (Creature *pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN))
{ {
pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5); pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5);
ArthasGUID = pArthas->GetGUID(); uiArthasGUID = pArthas->GetGUID();
} }
} }
} }
@@ -132,7 +140,7 @@ struct boss_svalaAI : public ScriptedAI
if (uiIntroTimer <= diff) if (uiIntroTimer <= diff)
{ {
Creature *pArthas = Unit::GetCreature(*m_creature, ArthasGUID); Creature *pArthas = Unit::GetCreature(*m_creature, uiArthasGUID);
if (!pArthas) if (!pArthas)
return; return;
@@ -141,28 +149,28 @@ struct boss_svalaAI : public ScriptedAI
case 0: case 0:
DoScriptText(SAY_DIALOG_WITH_ARTHAS_1, m_creature); DoScriptText(SAY_DIALOG_WITH_ARTHAS_1, m_creature);
++uiIntroPhase; ++uiIntroPhase;
uiIntroTimer = 3500; uiIntroTimer = 3.5*IN_MILISECONDS;
break; break;
case 1: case 1:
DoScriptText(SAY_DIALOG_OF_ARTHAS_1, pArthas); DoScriptText(SAY_DIALOG_OF_ARTHAS_1, pArthas);
++uiIntroPhase; ++uiIntroPhase;
uiIntroTimer = 3500; uiIntroTimer = 3.5*IN_MILISECONDS;
break; break;
case 2: case 2:
DoScriptText(SAY_DIALOG_WITH_ARTHAS_2, m_creature); DoScriptText(SAY_DIALOG_WITH_ARTHAS_2, m_creature);
++uiIntroPhase; ++uiIntroPhase;
uiIntroTimer = 3500; uiIntroTimer = 3.5*IN_MILISECONDS;
break; break;
case 3: case 3:
DoScriptText(SAY_DIALOG_OF_ARTHAS_2, pArthas); DoScriptText(SAY_DIALOG_OF_ARTHAS_2, pArthas);
++uiIntroPhase; ++uiIntroPhase;
uiIntroTimer = 3500; uiIntroTimer = 3.5*IN_MILISECONDS;
break; break;
case 4: case 4:
DoScriptText(SAY_DIALOG_WITH_ARTHAS_3, m_creature); DoScriptText(SAY_DIALOG_WITH_ARTHAS_3, m_creature);
DoCast(m_creature, SPELL_SVALA_TRANSFORMING1); DoCast(m_creature, SPELL_SVALA_TRANSFORMING1);
++uiIntroPhase; ++uiIntroPhase;
uiIntroTimer = 2800; uiIntroTimer = 2.8*IN_MILISECONDS;
break; break;
case 5: case 5:
DoCast(m_creature, SPELL_SVALA_TRANSFORMING2); DoCast(m_creature, SPELL_SVALA_TRANSFORMING2);
@@ -170,12 +178,12 @@ struct boss_svalaAI : public ScriptedAI
uiIntroTimer = 200; uiIntroTimer = 200;
break; break;
case 6: case 6:
if (Creature* pSvalaSorrowgrave = m_creature->SummonCreature(CREATURE_SVALA_SORROWGRAVE, 296.632, -346.075, 90.6307, 1.58, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000)) if (Creature* pSvalaSorrowgrave = m_creature->SummonCreature(CREATURE_SVALA_SORROWGRAVE, SvalaPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60*IN_MILISECONDS))
{ {
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID); m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID);
pArthas->ToTempSummon()->UnSummon(); pArthas->ToTempSummon()->UnSummon();
ArthasGUID = 0; uiArthasGUID = 0;
Phase = FINISHED; Phase = FINISHED;
} }
else else
@@ -201,9 +209,10 @@ struct mob_ritual_channelerAI : public Scripted_NoMovementAI
} }
// called by svala sorrowgrave to set guid of victim // called by svala sorrowgrave to set guid of victim
void SetGUID(const uint64 &guid, int32 id) void DoAction(uint32 action)
{ {
if (Unit *pVictim = m_creature->GetUnit(*m_creature, guid)) if (pInstance)
if (Unit *pVictim = m_creature->GetUnit(*m_creature, pInstance->GetData64(DATA_SACRIFICED_PLAYER)))
DoCast(pVictim, SPELL_PARALYZE); DoCast(pVictim, SPELL_PARALYZE);
} }
@@ -227,7 +236,6 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
CombatPhase Phase; CombatPhase Phase;
SummonList summons; SummonList summons;
Unit* pSacrificeTarget;
bool bSacrificed; bool bSacrificed;
@@ -235,10 +243,10 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
void Reset() void Reset()
{ {
uiSinsterStrikeTimer = 7000; uiSinsterStrikeTimer = 7*IN_MILISECONDS;
uiCallFlamesTimer = 10000; uiCallFlamesTimer = 10*IN_MILISECONDS;
uiRitualOfSwordTimer = 20000; uiRitualOfSwordTimer = 20*IN_MILISECONDS;
uiSacrificeTimer = 8000; uiSacrificeTimer = 8*IN_MILISECONDS;
bSacrificed = false; bSacrificed = false;
@@ -248,10 +256,12 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
summons.DespawnAll(); summons.DespawnAll();
pSacrificeTarget = NULL;
if (pInstance) if (pInstance)
{
pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED); pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED);
pInstance->SetData64(DATA_SACRIFICED_PLAYER,0);
}
} }
void EnterCombat(Unit* who) void EnterCombat(Unit* who)
@@ -283,7 +293,7 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
if (uiSinsterStrikeTimer <= diff) if (uiSinsterStrikeTimer <= diff)
{ {
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_SINSTER_STRIKE, H_SPELL_SINSTER_STRIKE)); DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_SINSTER_STRIKE, H_SPELL_SINSTER_STRIKE));
uiSinsterStrikeTimer = urand(5000,9000); uiSinsterStrikeTimer = urand(5*IN_MILISECONDS,9*IN_MILISECONDS);
} else uiSinsterStrikeTimer -= diff; } else uiSinsterStrikeTimer -= diff;
if (uiCallFlamesTimer <= diff) if (uiCallFlamesTimer <= diff)
@@ -291,15 +301,14 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{ {
DoCast(pTarget, SPELL_CALL_FLAMES); DoCast(pTarget, SPELL_CALL_FLAMES);
uiCallFlamesTimer = urand(8000,12000); uiCallFlamesTimer = urand(8*IN_MILISECONDS,12*IN_MILISECONDS);
} }
} else uiCallFlamesTimer -= diff; } else uiCallFlamesTimer -= diff;
if (!bSacrificed) if (!bSacrificed)
if (uiRitualOfSwordTimer <= diff) if (uiRitualOfSwordTimer <= diff)
{ {
pSacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (Unit* pSacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
if (pSacrificeTarget)
{ {
DoScriptText(RAND(SAY_SACRIFICE_PLAYER_1,SAY_SACRIFICE_PLAYER_2,SAY_SACRIFICE_PLAYER_3,SAY_SACRIFICE_PLAYER_4,SAY_SACRIFICE_PLAYER_5),m_creature); DoScriptText(RAND(SAY_SACRIFICE_PLAYER_1,SAY_SACRIFICE_PLAYER_2,SAY_SACRIFICE_PLAYER_3,SAY_SACRIFICE_PLAYER_4,SAY_SACRIFICE_PLAYER_5),m_creature);
DoCast(pSacrificeTarget, SPELL_RITUAL_OF_THE_SWORD); DoCast(pSacrificeTarget, SPELL_RITUAL_OF_THE_SWORD);
@@ -308,11 +317,14 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLY_MODE); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLY_MODE);
DoTeleportTo(296.632, -346.075, 120.85); DoTeleportTo(296.632, -346.075, 120.85);
Phase = SACRIFICING; Phase = SACRIFICING;
if (pInstance)
{
pInstance->SetData64(DATA_SACRIFICED_PLAYER,pSacrificeTarget->GetGUID());
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
if (Creature* pRitualChanneler = m_creature->SummonCreature(CREATURE_RITUAL_CHANNELER, RitualChannelerPos[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000)) if (Creature* pSummon = m_creature->SummonCreature(CREATURE_RITUAL_CHANNELER, RitualChannelerPos[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000))
if (pRitualChanneler->AI()) pSummon->AI()->DoAction(0);
pRitualChanneler->AI()->SetGUID(pSacrificeTarget->GetGUID()); }
bSacrificed = true; bSacrificed = true;
} }
@@ -324,7 +336,8 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
{ {
if (uiSacrificeTimer <= diff) if (uiSacrificeTimer <= diff)
{ {
if (!summons.empty() && pSacrificeTarget && pSacrificeTarget->isAlive()) Unit* pSacrificeTarget = pInstance ? Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_SACRIFICED_PLAYER)) : NULL;
if (pInstance && !summons.empty() && pSacrificeTarget && pSacrificeTarget->isAlive())
m_creature->Kill(pSacrificeTarget, false); // durability damage? m_creature->Kill(pSacrificeTarget, false); // durability damage?
//go down //go down
@@ -334,7 +347,7 @@ struct boss_svala_sorrowgraveAI : public ScriptedAI
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
m_creature->GetMotionMaster()->MoveChase(pTarget); m_creature->GetMotionMaster()->MoveChase(pTarget);
uiSacrificeTimer = 8000; uiSacrificeTimer = 8*IN_MILISECONDS;
} }
else uiSacrificeTimer -= diff; else uiSacrificeTimer -= diff;
} }
@@ -10,9 +10,12 @@
3 - King Ymiron 3 - King Ymiron
*/ */
#define ENTRY_SKADI_THE_RUTHLESS_DOOR 192173 enum GameObjects
#define ENTRY_KING_YMIRON_DOOR 192174 {
#define ENTRY_GORK_PALEHOOF_SPHERE 188593 ENTRY_SKADI_THE_RUTHLESS_DOOR = 192173,
ENTRY_KING_YMIRON_DOOR = 192174,
ENTRY_GORK_PALEHOOF_SPHERE = 188593
};
struct instance_pinnacle : public ScriptedInstance struct instance_pinnacle : public ScriptedInstance
{ {
@@ -34,6 +37,7 @@ struct instance_pinnacle : public ScriptedInstance
uint64 uiPalehoofOrb; uint64 uiPalehoofOrb;
uint64 uiSvala; uint64 uiSvala;
uint64 uiSacrificedPlayer;
uint32 m_auiEncounter[MAX_ENCOUNTER]; uint32 m_auiEncounter[MAX_ENCOUNTER];
@@ -43,6 +47,24 @@ struct instance_pinnacle : public ScriptedInstance
{ {
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
m_auiEncounter[i] = NOT_STARTED; m_auiEncounter[i] = NOT_STARTED;
uiSvalaSorrowgrave = 0;
uiGortokPalehoof = 0;
uiSkadiTheRuthless = 0;
uiKingYmiron = 0;
uiSkadiTheRuthlessDoor = 0;
uiKingYmironDoor = 0;
uiGortokPalehoofSphere = 0;
uiFrenziedWorgen = 0;
uiRavenousFurbolg = 0;
uiFerociousRhino = 0;
uiMassiveJormungar = 0;
uiPalehoofOrb = 0;
uiSvala = 0;
uiSacrificedPlayer = 0;
} }
bool IsEncounterInProgress() const bool IsEncounterInProgress() const
@@ -119,6 +141,12 @@ struct instance_pinnacle : public ScriptedInstance
SaveToDB(); SaveToDB();
} }
void SetData64(uint32 type, uint64 data)
{
if (type == DATA_SACRIFICED_PLAYER)
uiSacrificedPlayer = data;
}
uint32 GetData(uint32 type) uint32 GetData(uint32 type)
{ {
switch(type) switch(type)
@@ -181,7 +209,7 @@ struct instance_pinnacle : public ScriptedInstance
std::istringstream loadStream(in); std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3; loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
if (dataHead1 == 'U' && dataHead2 == 'K') if (dataHead1 == 'U' && dataHead2 == 'P')
{ {
m_auiEncounter[0] = data0; m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1; m_auiEncounter[1] = data1;
@@ -20,7 +20,8 @@ enum Data64
DATA_MOB_MASSIVE_JORMUNGAR, DATA_MOB_MASSIVE_JORMUNGAR,
DATA_MOB_FEROCIOUS_RHINO, DATA_MOB_FEROCIOUS_RHINO,
DATA_MOB_ORB, DATA_MOB_ORB,
DATA_GORTOK_PALEHOOF_SPHERE DATA_GORTOK_PALEHOOF_SPHERE,
DATA_SACRIFICED_PLAYER
}; };
#endif #endif