*Utgarde Pinnacle: Svala fixes - Fix some crashes, complete ritual code and change defines by enums, by Tartalo

*Fix Acherus Flightmaster for Alliance, by MrSmite
*Fix The Party's Over achievement (Prince Taldaram) & Implement Good Grief achievement (Maiden of Grief), by Tartalo
*Fix certaint things entering the threat list and never leaving, bugging mob's HP regeneration (ie: Priest's Lightwell).. again. Thanks Gyullo.

--HG--
branch : trunk
This commit is contained in:
maximius
2009-10-06 13:16:10 -07:00
parent a3de0f7ba0
commit dd84dfd56d
7 changed files with 152 additions and 108 deletions

View File

@@ -27,48 +27,49 @@ EndScriptData */
#include "precompiled.h"
#include "def_ahnkahet.h"
#define SPELL_BLOODTHIRST 55968 //Trigger Spell + add aura
#define SPELL_CONJURE_FLAME_SPHERE 55931
#define SPELL_FLAME_SPHERE_SUMMON_1 55895// 1x 30106
#define H_SPELL_FLAME_SPHERE_SUMMON_1 59511// 1x 31686
#define H_SPELL_FLAME_SPHERE_SUMMON_2 59512// 1x 31687
#define SPELL_FLAME_SPHERE_SPAWN_EFFECT 55891
#define SPELL_FLAME_SPHERE_VISUAL 55928
#define SPELL_FLAME_SPHERE_PERIODIC 55926
#define H_SPELL_FLAME_SPHERE_PERIODIC 59508
#define SPELL_FLAME_SPHERE_DEATH_EFFECT 55947
#define SPELL_BEAM_VISUAL 60342
#define SPELL_EMBRACE_OF_THE_VAMPYR 55959
#define H_SPELL_EMBRACE_OF_THE_VAMPYR 59513
#define SPELL_VANISH 55964
#define CREATURE_FLAME_SPHERE 30106
#define H_CREATURE_FLAME_SPHERE_1 31686
#define H_CREATURE_FLAME_SPHERE_2 31687
#define DATA_EMBRACE_DMG 20000
#define H_DATA_EMBRACE_DMG 40000
#define DATA_GROUND_POSITION_Z 11.4
#define DATA_SPHERE_DISTANCE 20
#define DATA_SPHERE_ANGLE_OFFSET 1
#define ACHIEVEMENT_THE_PARTY_IS_OVER 1861
//not in db
//Yell
#define SAY_AGGRO -1619021
#define SAY_SLAY_1 -1619022
#define SAY_SLAY_2 -1619023
#define SAY_DEATH -1619024
#define SAY_FEED_1 -1619025
#define SAY_FEED_2 -1619026
#define SAY_VANISH_1 -1619027
#define SAY_VANISH_2 -1619028
enum Spells
{
SPELL_BLOODTHIRST = 55968, //Trigger Spell + add aura
SPELL_CONJURE_FLAME_SPHERE = 55931,
SPELL_FLAME_SPHERE_SUMMON_1 = 55895,// 1x 30106
H_SPELL_FLAME_SPHERE_SUMMON_1 = 59511,// 1x 31686
H_SPELL_FLAME_SPHERE_SUMMON_2 = 59512,// 1x 31687
SPELL_FLAME_SPHERE_SPAWN_EFFECT = 55891,
SPELL_FLAME_SPHERE_VISUAL = 55928,
SPELL_FLAME_SPHERE_PERIODIC = 55926,
H_SPELL_FLAME_SPHERE_PERIODIC = 59508,
SPELL_FLAME_SPHERE_DEATH_EFFECT = 55947,
SPELL_BEAM_VISUAL = 60342,
SPELL_EMBRACE_OF_THE_VAMPYR = 55959,
H_SPELL_EMBRACE_OF_THE_VAMPYR = 59513,
SPELL_VANISH = 55964,
CREATURE_FLAME_SPHERE = 30106,
H_CREATURE_FLAME_SPHERE_1 = 31686,
H_CREATURE_FLAME_SPHERE_2 = 31687
};
enum Misc
{
DATA_EMBRACE_DMG = 20000,
H_DATA_EMBRACE_DMG = 40000,
DATA_SPHERE_DISTANCE = 20,
DATA_SPHERE_ANGLE_OFFSET = 1
};
#define DATA_GROUND_POSITION_Z 11.4
enum Achievements
{
ACHIEVEMENT_THE_PARTY_IS_OVER = 1861
};
enum Yells
{
SAY_AGGRO = -1619021,
SAY_SLAY_1 = -1619022,
SAY_SLAY_2 = -1619023,
SAY_DEATH = -1619024,
SAY_FEED_1 = -1619025,
SAY_FEED_2 = -1619026,
SAY_VANISH_1 = -1619027,
SAY_VANISH_2 = -1619028
};
enum CombatPhase
{
NORMAL,
@@ -264,26 +265,18 @@ struct TRINITY_DLL_DECL boss_taldaramAI : public ScriptedAI
{
pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE);
//Count players
Unit *target = NULL;
std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList();
std::vector<Unit *> target_list;
for(std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
//The Party's Over achievement:
AchievementEntry const *AchievThePartyIsOver = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_PARTY_IS_OVER);
Map* pMap = m_creature->GetMap();
if (pMap && pMap->IsDungeon() && HeroicMode && AchievThePartyIsOver)
{
target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
// exclude pets & totems
if (target && target->GetTypeId() == TYPEID_PLAYER)
target_list.push_back(target);
target = NULL;
}
if (HeroicMode && target_list.size() < 5)
{
AchievementEntry const *AchievThePartyIsOver = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_PARTY_IS_OVER);
if (AchievThePartyIsOver)
{
for(std::vector<Unit *>::iterator itr = target_list.begin(); itr!= target_list.end(); ++itr)
((Player*)(*itr))->CompletedAchievement(AchievThePartyIsOver);
}
Map::PlayerList const &players = pMap->GetPlayers();
uint8 count = 0;
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
++count;
if (count < 5)
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
itr->getSource()->CompletedAchievement(AchievThePartyIsOver);
}
}
}

View File

@@ -34,6 +34,11 @@ enum Yells
SAY_STUN = -1603006
};
enum Achievements
{
ACHIEVEMENT_GOOD_GRIEF = 1866
};
struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI
{
boss_maiden_of_griefAI(Creature *c) : ScriptedAI(c)
@@ -49,6 +54,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI
uint32 StormOfGriefTimer;
uint32 ShockOfSorrowTimer;
uint32 PillarOfWoeTimer;
uint32 AchievTimer;
void Reset()
{
@@ -56,6 +62,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI
StormOfGriefTimer = 10000;
ShockOfSorrowTimer = 20000+rand()%5000;
PillarOfWoeTimer = 5000 + rand()%10000;
AchievTimer = 0;
if (pInstance)
pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, NOT_STARTED);
@@ -74,6 +81,11 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI
//Return since we have no target
if (!UpdateVictim())
return;
//Achievement counter
if (pInstance)
if (pInstance->GetData(DATA_MAIDEN_OF_GRIEF_EVENT) == IN_PROGRESS)
AchievTimer += diff;
if(IsHeroic)
{
@@ -122,6 +134,16 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI
if (pInstance)
pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, DONE);
AchievementEntry const *AchievGoodGrief = GetAchievementStore()->LookupEntry(ACHIEVEMENT_GOOD_GRIEF);
Map* pMap = m_creature->GetMap();
if (HeroicMode && AchievTimer < 60000 && pMap && pMap->IsDungeon() && AchievGoodGrief)
{
Map::PlayerList const &players = pMap->GetPlayers();
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
itr->getSource()->CompletedAchievement(AchievGoodGrief);
}
}
void KilledUnit(Unit *victim)
{

View File

@@ -154,8 +154,8 @@ struct TRINITY_DLL_DECL instance_halls_of_stone : public ScriptedInstance
{
switch(type)
{
case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[0];
case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[1];
case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[0];
case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[1];
case DATA_SJONNIR_EVENT: return m_auiEncounter[2];
case DATA_BRANN_EVENT: return m_auiEncounter[3];
}

View File

@@ -12,63 +12,63 @@ update creature_template set scriptname = 'boss_svala' where entry = '';
#include "precompiled.h"
#include "def_pinnacle.h"
//Spells
#define SPELL_CALL_FLAMES 48258
#define SPELL_RITUAL_OF_THE_SWORD 48276 //Effect #1 Teleport, Effect #2 Dummy
#define SPELL_SINSTER_STRIKE 15667
#define H_SPELL_SINSTER_STRIKE 59409
#define SPELL_SVALA_TRANSFORMING1 54140
#define SPELL_SVALA_TRANSFORMING2 54205
enum Spells
{
SPELL_CALL_FLAMES = 48258,
SPELL_RITUAL_OF_THE_SWORD = 48276, //Effect #1 Teleport, Effect #2 Dummy
SPELL_SINSTER_STRIKE = 15667,
H_SPELL_SINSTER_STRIKE = 59409,
SPELL_SVALA_TRANSFORMING1 = 54140,
SPELL_SVALA_TRANSFORMING2 = 54205
};
//not in db
//Yells
#define SAY_DIALOG_WITH_ARTHAS_1 -1575015
#define SAY_DIALOG_WITH_ARTHAS_2 -1575016
#define SAY_DIALOG_WITH_ARTHAS_3 -1575017
#define SAY_AGGRO -1575018
#define SAY_SLAY_1 -1575019
#define SAY_SLAY_2 -1575020
#define SAY_SLAY_3 -1575021
#define SAY_DEATH -1575022
#define SAY_SACRIFICE_PLAYER_1 -1575023
#define SAY_SACRIFICE_PLAYER_2 -1575024
#define SAY_SACRIFICE_PLAYER_3 -1575025
#define SAY_SACRIFICE_PLAYER_4 -1575026
#define SAY_SACRIFICE_PLAYER_5 -1575027
#define SAY_DIALOG_OF_ARTHAS_1 -1575028
#define SAY_DIALOG_OF_ARTHAS_2 -1575029
//creatures
#define CREATURE_ARTHAS 24266 // Image of Arthas
#define CREATURE_SVALA_SORROWGRAVE 26668 // Svala after transformation
#define CREATURE_SVALA 29281 // Svala before transformation
#define CREATURE_RITUAL_CHANNELER 27281
//ritual channeler's spells
#define SPELL_PARALYZE 48278
#define SPELL_SHADOWS_IN_THE_DARK 59407
//other data
#define DATA_SVALA_DISPLAY_ID 11686
enum Yells
{
SAY_DIALOG_WITH_ARTHAS_1 = -1575015,
SAY_DIALOG_WITH_ARTHAS_2 = -1575016,
SAY_DIALOG_WITH_ARTHAS_3 = -1575017,
SAY_AGGRO = -1575018,
SAY_SLAY_1 = -1575019,
SAY_SLAY_2 = -1575020,
SAY_SLAY_3 = -1575021,
SAY_DEATH = -1575022,
SAY_SACRIFICE_PLAYER_1 = -1575023,
SAY_SACRIFICE_PLAYER_2 = -1575024,
SAY_SACRIFICE_PLAYER_3 = -1575025,
SAY_SACRIFICE_PLAYER_4 = -1575026,
SAY_SACRIFICE_PLAYER_5 = -1575027,
SAY_DIALOG_OF_ARTHAS_1 = -1575028,
SAY_DIALOG_OF_ARTHAS_2 = -1575029
};
enum Creatures
{
CREATURE_ARTHAS = 24266, // Image of Arthas
CREATURE_SVALA_SORROWGRAVE = 26668, // Svala after transformation
CREATURE_SVALA = 29281, // Svala before transformation
CREATURE_RITUAL_CHANNELER = 27281,
//ritual channeler's spells
SPELL_PARALYZE = 48278,
SPELL_SHADOWS_IN_THE_DARK = 59407
};
enum Misc
{
DATA_SVALA_DISPLAY_ID = 11686
};
enum IntroPhase
{
IDLE,
INTRO,
FINISHED
};
enum CombatPhase
{
NORMAL,
SACRIFICING
};
struct Locations
{
float x, y, z;
};
static Locations RitualChannelerLocations[]=
{
{296.42, -355.01, 90.94},
@@ -107,7 +107,7 @@ struct TRINITY_DLL_DECL boss_svalaAI : public ScriptedAI
{
if (!pWho)
return;
if (pWho->isTargetableForAttack() && m_creature->IsHostileTo(pWho) && Phase == IDLE && m_creature->IsWithinDistInMap(pWho, 40))
if (Phase == IDLE && pWho->isTargetableForAttack() && m_creature->IsHostileTo(pWho) && Phase == IDLE && m_creature->IsWithinDistInMap(pWho, 40))
{
Phase = INTRO;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -125,6 +125,8 @@ struct TRINITY_DLL_DECL boss_svalaAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if (Phase != INTRO)
return;
if (uiIntroTimer < diff)
{
if(!pArthas)
@@ -279,7 +281,9 @@ struct TRINITY_DLL_DECL boss_svala_sorrowgraveAI : public ScriptedAI
{
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);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
//Spell doesn't teleport
DoTeleportPlayer(pSacrificeTarget, 296.632, -346.075, 90.63, 4.6);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLY_MODE);
DoTeleportTo(296.632, -346.075, 120.85);
Phase = SACRIFICING;
@@ -309,6 +313,16 @@ struct TRINITY_DLL_DECL boss_svala_sorrowgraveAI : public ScriptedAI
}
if (bSacrificed && pSacrificeTarget && pSacrificeTarget->isAlive())
m_creature->DealDamage(pSacrificeTarget, pSacrificeTarget->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
//go down
Phase = NORMAL;
pSacrificeTarget = NULL;
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
while (pTarget && pTarget->GetTypeId() != TYPEID_PLAYER)
pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (pTarget)
m_creature->GetMotionMaster()->MoveChase(pTarget);
uiSacrificeTimer = 8000;
}