*Ahn'kahet: Jedoga shadowseeker scripted, by WarHead

*Cleanup.

--HG--
branch : trunk
This commit is contained in:
maximius
2009-10-18 16:07:41 -07:00
parent 3af23bc26c
commit 17ada9e1b2
19 changed files with 877 additions and 323 deletions
+5
View File
@@ -0,0 +1,5 @@
UPDATE `creature_template` SET `ScriptName`='boss_jedoga_shadowseeker' WHERE `entry`='29310' LIMIT 1;
UPDATE `creature_template` SET `ScriptName`='mob_jedoga_initiand' WHERE `entry`='30114' LIMIT 1;
UPDATE `creature_template` SET `ScriptName`='npc_jedogas_aufseher_trigger' WHERE `entry`='30181' LIMIT 1;
@@ -561,7 +561,7 @@ struct TRINITY_DLL_DECL npc_dughal_stormwingAI : public npc_escortAI
}
}
void EnterCombat(Unit* who) { }
void EnterCombat(Unit* who) {}
void Reset() {}
void JustDied(Unit* killer)
@@ -1006,7 +1006,7 @@ struct TRINITY_DLL_DECL npc_tobias_seecherAI : public npc_escortAI
{
npc_tobias_seecherAI(Creature *c) :npc_escortAI(c) {}
void EnterCombat(Unit* who) { }
void EnterCombat(Unit* who) {}
void Reset() {}
void JustDied(Unit* killer)
@@ -40,7 +40,7 @@ struct TRINITY_DLL_DECL boss_mothersmolderwebAI : public ScriptedAI
MothersMilk_Timer = 10000;
}
void EnterCombat(Unit *who) { }
void EnterCombat(Unit *who) {}
void DamageTaken(Unit *done_by, uint32 &damage)
{
@@ -38,9 +38,9 @@ struct TRINITY_DLL_DECL mobs_ghoul_flayerAI : public ScriptedAI
{
mobs_ghoul_flayerAI(Creature *c) : ScriptedAI(c) {}
void Reset() { }
void Reset() {}
void EnterCombat(Unit* who) { }
void EnterCombat(Unit* who) {}
void JustDied(Unit* Killer)
{
@@ -93,7 +93,7 @@ struct TRINITY_DLL_DECL npc_darrowshire_spiritAI : public ScriptedAI
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
void EnterCombat(Unit *who) { }
void EnterCombat(Unit *who) {}
};
CreatureAI* GetAI_npc_darrowshire_spirit(Creature* pCreature)
@@ -158,7 +158,7 @@ static Locations SpawnPosition[]=
{-11.9, -18, 0.361, 5.87}
};
static uint32 PaladinEntry[]= {CHAMPION_BLOODWRATH, CHAMPION_LIGHTREND, CHAMPION_SWIFTBLADE, CHAMPION_SUNSTRIKER};
static uint32 PaladinEntry[] = {CHAMPION_BLOODWRATH, CHAMPION_LIGHTREND, CHAMPION_SWIFTBLADE, CHAMPION_SUNSTRIKER};
/*######
## npc_second_trial_paladin
@@ -182,7 +182,8 @@ struct TRINITY_DLL_DECL npc_secondTrialAI : public ScriptedAI
uint32 timerJudLight;
uint32 timerCommand;
void Reset() {
void Reset()
{
timer = 2000;
questPhase = 0;
@@ -196,95 +197,93 @@ struct TRINITY_DLL_DECL npc_secondTrialAI : public ScriptedAI
spellJudLight = false;
spellCommand = false;
switch(m_creature->GetEntry()) {
case CHAMPION_BLOODWRATH :
spellFlashLight = true;
timerFlashLight = TIMER_FLASH_OF_LIGHT;
break;
case CHAMPION_LIGHTREND :
spellJustice = true;
timerJustice = 500;
break;
case CHAMPION_SWIFTBLADE :
spellJudLight = false; // Misses Script Effect // http://www.wowhead.com/?spell=20271
timerJudLight = 500;
break;
case CHAMPION_SUNSTRIKER :
spellFlashLight = true;
spellJudLight = false; // Misses Script Effect // http://www.wowhead.com/?spell=20271
spellCommand = false; // Misses Dummy // http://www.wowhead.com/?spell=20375
timerFlashLight = TIMER_FLASH_OF_LIGHT;
timerJudLight = 500;
timerCommand = 1500;
break;
switch(m_creature->GetEntry())
{
case CHAMPION_BLOODWRATH:
spellFlashLight = true;
timerFlashLight = TIMER_FLASH_OF_LIGHT;
break;
case CHAMPION_LIGHTREND:
spellJustice = true;
timerJustice = 500;
break;
case CHAMPION_SWIFTBLADE:
spellJudLight = false; // Misses Script Effect // http://www.wowhead.com/?spell=20271
timerJudLight = 500;
break;
case CHAMPION_SUNSTRIKER:
spellFlashLight = true;
spellJudLight = false; // Misses Script Effect // http://www.wowhead.com/?spell=20271
spellCommand = false; // Misses Dummy // http://www.wowhead.com/?spell=20375
timerFlashLight = TIMER_FLASH_OF_LIGHT;
timerJudLight = 500;
timerCommand = 1500;
break;
}
}
void EnterCombat(Unit *who) { }
void EnterCombat(Unit *who) {}
void UpdateAI(const uint32 diff)
{
if (questPhase == 1) {
if (questPhase == 1)
if (timer < diff)
{
m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_STAND);
m_creature->setFaction(FACTION_HOSTILE);
questPhase = 0;
if (timer < diff) {
m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_STAND);
m_creature->setFaction(FACTION_HOSTILE);
questPhase = 0;
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
m_creature->AddThreat(target, 5000000.0f);
AttackStart(target);
}
}
else
timer -= diff;
Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (target && target->GetTypeId() == TYPEID_PLAYER) // only on players.
{
m_creature->AddThreat(target, 5000000.0f);
AttackStart(target);
}
}
else timer -= diff;
}
if (!UpdateVictim())
if (!UpdateVictim())
return;
// healer
if (spellFlashLight) {
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 70){
if (timerFlashLight < diff) {
DoCast(m_creature, SPELL_FLASH_OF_LIGHT);
timerFlashLight = TIMER_FLASH_OF_LIGHT + rand()%(TIMER_FLASH_OF_LIGHT);
}
else
timerFlashLight -= diff;
}
}
// healer
if (spellFlashLight)
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 70)
if (timerFlashLight < diff)
{
DoCast(m_creature, SPELL_FLASH_OF_LIGHT);
timerFlashLight = TIMER_FLASH_OF_LIGHT + rand()%TIMER_FLASH_OF_LIGHT;
}
else
timerFlashLight -= diff;
if (spellJustice) {
if (timerJustice < diff)
if (spellJustice)
if (timerJustice < diff)
{
DoCast(m_creature, SPELL_SEAL_OF_JUSTICE);
timerJustice = TIMER_SEAL_OF_JUSTICE + rand()%(TIMER_SEAL_OF_JUSTICE);
}
else
timerJustice -= diff;
}
DoCast(m_creature, SPELL_SEAL_OF_JUSTICE);
timerJustice = TIMER_SEAL_OF_JUSTICE + rand()%TIMER_SEAL_OF_JUSTICE;
}
else
timerJustice -= diff;
if (spellJudLight) {
if (timerJudLight < diff) {
DoCast(m_creature, SPELL_JUDGEMENT_OF_LIGHT);
timerJudLight = TIMER_JUDGEMENT_OF_LIGHT + rand()%(TIMER_JUDGEMENT_OF_LIGHT);
}
else
timerJudLight -= diff;
}
if (spellJudLight)
if (timerJudLight < diff)
{
DoCast(m_creature, SPELL_JUDGEMENT_OF_LIGHT);
timerJudLight = TIMER_JUDGEMENT_OF_LIGHT + rand()%TIMER_JUDGEMENT_OF_LIGHT;
}
else
timerJudLight -= diff;
if (spellCommand) {
if (timerCommand < diff) {
DoCast(m_creature, TIMER_SEAL_OF_COMMAND);
timerCommand = TIMER_SEAL_OF_COMMAND + rand()%(TIMER_SEAL_OF_COMMAND);
}
else
timerCommand -= diff;
}
if (spellCommand)
if (timerCommand < diff)
{
DoCast(m_creature, TIMER_SEAL_OF_COMMAND);
timerCommand = TIMER_SEAL_OF_COMMAND + rand()%TIMER_SEAL_OF_COMMAND;
}
else
timerCommand -= diff;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
void Activate(uint64 summonerguid);
@@ -307,79 +306,79 @@ struct TRINITY_DLL_DECL master_kelerun_bloodmournAI : public ScriptedAI
uint64 paladinGuid[4];
void Reset() {
questPhase = 0;
timer = 60000;
paladinPhase = 0;
uint64 paladinGuid[] = {0,0,0,0};
void Reset()
{
questPhase = 0;
timer = 60000;
paladinPhase = 0;
uint64 paladinGuid[] = {0,0,0,0};
}
void EnterCombat(Unit *who) {}
void UpdateAI(const uint32 diff)
{
// Quest accepted but object not activated, object despawned (if in sync 1 minute!)
if (questPhase == 1) {
if (timer < diff) Reset();
else timer -= diff;
}
// fight the 4 paladin mobs phase
else if (questPhase == 2) {
// Quest accepted but object not activated, object despawned (if in sync 1 minute!)
if (questPhase == 1)
{
if (timer < diff)
Reset();
else
timer -= diff;
}
// fight the 4 paladin mobs phase
else if (questPhase == 2)
{
if (timer < diff)
{
if (Creature* paladinSpawn = Unit::GetCreature((*m_creature), paladinGuid[paladinPhase]))
{
CAST_AI(npc_secondTrialAI, paladinSpawn->AI())->Activate(m_creature->GetGUID());
if (timer < diff) {
switch(paladinPhase)
{
case 0:
DoScriptText(TEXT_SECOND_TRIAL_1,m_creature);
break;
case 1:
DoScriptText(TEXT_SECOND_TRIAL_2,m_creature);
break;
case 2:
DoScriptText(TEXT_SECOND_TRIAL_3,m_creature);
break;
case 3:
DoScriptText(TEXT_SECOND_TRIAL_4,m_creature);
break;
}
}
else
Reset();
Creature* paladinSpawn;
paladinSpawn = (Unit::GetCreature((*m_creature), paladinGuid[paladinPhase]));
if (paladinSpawn) {
CAST_AI(npc_secondTrialAI, paladinSpawn->AI())->Activate(m_creature->GetGUID());
switch(paladinPhase) {
case 0:
DoScriptText(TEXT_SECOND_TRIAL_1,m_creature);
break;
case 1:
DoScriptText(TEXT_SECOND_TRIAL_2,m_creature);
break;
case 2:
DoScriptText(TEXT_SECOND_TRIAL_3,m_creature);
break;
case 3:
DoScriptText(TEXT_SECOND_TRIAL_4,m_creature);
break;
}
questPhase = 4;
timer = OFFSET_NEXT_ATTACK;
}
else
Reset();
questPhase=4;
timer = OFFSET_NEXT_ATTACK;
timer -= diff;
}
else timer -= diff;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
void StartEvent()
{
if (questPhase == 1) { // no player check, quest can be finished as group, so no complex PlayerGUID/group search code
if (questPhase == 1)
{ // no player check, quest can be finished as group, so no complex PlayerGUID/group search code
for (int i = 0; i<4; ++i) {
Creature* Summoned;
Summoned = DoSpawnCreature(PaladinEntry[i], SpawnPosition[i].x, SpawnPosition[i].y, SpawnPosition[i].z, SpawnPosition[i].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 180000);
for (uint8 i = 0; i < 4; ++i)
if (Creature *pSummoned = DoSpawnCreature(PaladinEntry[i], SpawnPosition[i].x, SpawnPosition[i].y, SpawnPosition[i].z, SpawnPosition[i].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 180000))
paladinGuid[i] = pSummoned->GetGUID();
if (Summoned)
paladinGuid[i] = Summoned->GetGUID();
}
timer = OFFSET_NEXT_ATTACK;
questPhase = 2;
timer = OFFSET_NEXT_ATTACK;
questPhase = 2;
}
}
@@ -394,7 +393,8 @@ bool GossipHello_master_kelerun_bloodmourn(Player* pPlayer, Creature* pCreature)
// Escort quests or any other event-driven quests. If player in party, all players that can accept this quest will receive confirmation box to accept quest.
// !not sure if this really works!
if (CAST_AI(master_kelerun_bloodmournAI, pCreature->AI())->questPhase == 0) {
if (CAST_AI(master_kelerun_bloodmournAI, pCreature->AI())->questPhase == 0)
{
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
pPlayer->SendPreparedQuest(pCreature->GetGUID());
}
@@ -412,65 +412,58 @@ bool QuestAccept_master_kelerun_bloodmourn(Player* pPlayer, Creature* pCreature,
return true;
}
void master_kelerun_bloodmournAI::SecondTrialKill() {
void master_kelerun_bloodmournAI::SecondTrialKill()
{
if (questPhase > 0)
{
++paladinPhase;
if (questPhase > 0) {
++paladinPhase;
if (paladinPhase < 4)
questPhase=2;
else
if (paladinPhase < 4)
questPhase = 2;
else
Reset(); // Quest Complete, QuestComplete handler is in npc_secondTrialAI::JustDied
}
}
void npc_secondTrialAI::JustDied(Unit* Killer) {
if (Killer->GetTypeId() == TYPEID_PLAYER)
{
Creature* Summoner;
Summoner = (Unit::GetCreature((*m_creature), summonerGuid));
if (Summoner)
CAST_AI(master_kelerun_bloodmournAI, Summoner->AI())->SecondTrialKill();
// last kill quest complete for group
if (m_creature->GetEntry() == CHAMPION_SUNSTRIKER) {
if (Group *pGroup = CAST_PLR(Killer)->GetGroup())
{
for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player *pGroupGuy = itr->getSource();
// for any leave or dead (with not released body) group member at appropriate distance
if (pGroupGuy && pGroupGuy->IsAtGroupRewardDistance(m_creature) && !pGroupGuy->GetCorpse() && pGroupGuy->GetQuestStatus(QUEST_SECOND_TRIAL) == QUEST_STATUS_INCOMPLETE)
pGroupGuy->CompleteQuest(QUEST_SECOND_TRIAL);
}
}
else {
if (CAST_PLR(Killer)->GetQuestStatus(QUEST_SECOND_TRIAL) == QUEST_STATUS_INCOMPLETE)
CAST_PLR(Killer)->CompleteQuest(QUEST_SECOND_TRIAL);
}
}
}
}
void npc_secondTrialAI::KilledUnit(Unit* Killed) {
if (Killed->GetTypeId() == TYPEID_PLAYER) {
if (CAST_PLR(Killed)->GetQuestStatus(QUEST_SECOND_TRIAL) == QUEST_STATUS_INCOMPLETE)
CAST_PLR(Killed)->FailQuest(QUEST_SECOND_TRIAL);
}
}
}
void npc_secondTrialAI::Activate(uint64 summonerguid) {
void npc_secondTrialAI::JustDied(Unit* Killer)
{
if (Killer->GetTypeId() == TYPEID_PLAYER)
{
if (Creature *pSummoner = Unit::GetCreature((*m_creature), summonerGuid))
CAST_AI(master_kelerun_bloodmournAI, Summoner->AI())->SecondTrialKill();
questPhase=1;
summonerGuid = summonerguid;
// last kill quest complete for group
if (m_creature->GetEntry() == CHAMPION_SUNSTRIKER)
{
if (Group *pGroup = CAST_PLR(Killer)->GetGroup())
{
for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player *pGroupGuy = itr->getSource();
// for any leave or dead (with not released body) group member at appropriate distance
if (pGroupGuy && pGroupGuy->IsAtGroupRewardDistance(m_creature) && !pGroupGuy->GetCorpse() && pGroupGuy->GetQuestStatus(QUEST_SECOND_TRIAL) == QUEST_STATUS_INCOMPLETE)
pGroupGuy->CompleteQuest(QUEST_SECOND_TRIAL);
}
}
else if (CAST_PLR(Killer)->GetQuestStatus(QUEST_SECOND_TRIAL) == QUEST_STATUS_INCOMPLETE)
CAST_PLR(Killer)->CompleteQuest(QUEST_SECOND_TRIAL);
}
}
}
void npc_secondTrialAI::KilledUnit(Unit* Killed)
{
if (Killed->GetTypeId() == TYPEID_PLAYER)
if (CAST_PLR(Killed)->GetQuestStatus(QUEST_SECOND_TRIAL) == QUEST_STATUS_INCOMPLETE)
CAST_PLR(Killed)->FailQuest(QUEST_SECOND_TRIAL);
}
void npc_secondTrialAI::Activate(uint64 summonerguid)
{
questPhase = 1;
summonerGuid = summonerguid;
}
CreatureAI* GetAI_master_kelerun_bloodmourn(Creature* pCreature)
{
@@ -489,7 +482,7 @@ CreatureAI* GetAI_npc_secondTrial(Creature* pCreature)
bool GOHello_go_second_trial(Player* pPlayer, GameObject* pGO)
{
// find spawn :: master_kelerun_bloodmourn
if (Creature* pCreature = pGO->FindNearestCreature(MASTER_KELERUN_BLOODMOURN, 30.0f))
if (Creature *pCreature = pGO->FindNearestCreature(MASTER_KELERUN_BLOODMOURN, 30.0f))
CAST_AI(master_kelerun_bloodmournAI, pCreature->AI())->StartEvent();
return true;
@@ -537,24 +530,15 @@ struct TRINITY_DLL_DECL npc_apprentice_mirvedaAI : public ScriptedAI
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (pPlayer)
if (Player* pPlayer = Unit::GetPlayer(PlayerGUID))
CAST_PLR(pPlayer)->FailQuest(QUEST_UNEXPECTED_RESULT);
}
}
void UpdateAI(const uint32 diff)
{
if (KillCount >= 3)
{
if (PlayerGUID)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (pPlayer)
CAST_PLR(pPlayer)->CompleteQuest(QUEST_UNEXPECTED_RESULT);
}
}
if (KillCount >= 3 && PlayerGUID)
if (Player* pPlayer = Unit::GetPlayer(PlayerGUID))
CAST_PLR(pPlayer)->CompleteQuest(QUEST_UNEXPECTED_RESULT);
if (Summon)
{
@@ -594,7 +578,7 @@ struct Location
float x, y, z;
};
static Location SpawnLocations[]=
static Location SpawnLocations[] =
{
{8270.68, -7188.53, 139.619},
{8284.27, -7187.78, 139.603},
@@ -647,11 +631,8 @@ struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (pPlayer)
if (Player* pPlayer = Unit::GetPlayer(PlayerGUID))
CAST_PLR(pPlayer)->FailQuest(QUEST_POWERING_OUR_DEFENSES);
}
}
void UpdateAI(const uint32 diff)
@@ -661,14 +642,12 @@ struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI
DoScriptText(EMOTE, m_creature);
Completed = true;
if (PlayerGUID)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (pPlayer)
if (Player* pPlayer = Unit::GetPlayer(PlayerGUID))
CAST_PLR(pPlayer)->CompleteQuest(QUEST_POWERING_OUR_DEFENSES);
}
m_creature->DealDamage(m_creature,m_creature->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
}else EndTimer -= diff;
} else EndTimer -= diff;
if (WaveTimer < diff && !Completed && Progress)
{
@@ -191,7 +191,7 @@ struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI
{
mob_pure_energyAI(Creature *c) : ScriptedAI(c) {}
void Reset() { }
void Reset() {}
void JustDied(Unit* slayer)
{
@@ -202,9 +202,9 @@ struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI
}
}
void EnterCombat(Unit *who) { }
void MoveInLineOfSight(Unit *who) { }
void AttackStart(Unit *who) { }
void EnterCombat(Unit *who) {}
void MoveInLineOfSight(Unit *who) {}
void AttackStart(Unit *who) {}
};
CreatureAI* GetAI_mob_pure_energy(Creature* pCreature)
@@ -51,7 +51,7 @@ const float afKaelLandPoint[] = {225.045, -276.236, -5.434};
// If we assume DB handle summon, summon appear somewhere outside the platform where Orb is
struct TRINITY_DLL_DECL npc_kalecgosAI : public ScriptedAI
{
npc_kalecgosAI(Creature* pCreature) : ScriptedAI(pCreature) { }
npc_kalecgosAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 m_uiTransformTimer;
@@ -42,7 +42,7 @@ struct TRINITY_DLL_DECL boss_gehennasAI : public ScriptedAI
GehennasCurse_Timer = 12000;
}
void EnterCombat(Unit *who) { }
void EnterCombat(Unit *who) {}
void UpdateAI(const uint32 diff)
{
@@ -118,9 +118,9 @@ struct TRINITY_DLL_DECL mob_scarlet_traineeAI : public npc_escortAI
uint32 Start_Timer;
void Reset() { }
void WaypointReached(uint32 uiPoint) { }
void EnterCombat(Unit* who) { }
void Reset() {}
void WaypointReached(uint32 uiPoint) {}
void EnterCombat(Unit* who) {}
void UpdateAI(const uint32 diff)
{
@@ -86,7 +86,7 @@ struct TRINITY_DLL_DECL mob_freed_soulAI : public ScriptedAI
DoScriptText(RAND(SAY_ZAPPED0,SAY_ZAPPED1,SAY_ZAPPED2,SAY_ZAPPED3), m_creature);
}
void EnterCombat(Unit* who) { }
void EnterCombat(Unit* who) {}
};
CreatureAI* GetAI_mob_freed_soul(Creature* pCreature)
@@ -45,9 +45,9 @@ struct TRINITY_DLL_DECL npc_forest_frogAI : public ScriptedAI
ScriptedInstance *pInstance;
void Reset() { }
void Reset() {}
void EnterCombat(Unit *who) { }
void EnterCombat(Unit *who) {}
void DoSpawnRandom()
{
@@ -18,88 +18,572 @@
/* ScriptData
SDName: boss_jedoga_shadowseeker
SDAuthor: LordVanMartin
SD%Complete: 0
SDComment:
SDAuthor: WarHead
SD%Complete: 100%
SDComment: Complete - BUT THE TRIGGER NEEDS DATA WHETHER THE PRISON OF TALDARAM IS OFFLINE !
SDCategory: Ahn'kahet
EndScriptData */
/*** SQL START ***
update creature_template set scriptname = 'boss_jedoga' where entry = '';
*** SQL END ***/
#include "precompiled.h"
#include "def_ahnkahet.h"
#define SPELL_CYCLONE_STRIKE 56855
#define H_SPELL_CYCLONE_STRIKE 60030//kein unterschied zu 56855 außer das 60030 1,5sec cast ist
#define SPELL_LIGHTNING_BOLT 56891
#define H_SPELL_LIGHTNING_BOLT 60032
#define SPELL_THUNDERSHOCK 56926//AOE works
#define H_SPELL_THUNDERSHOCK 60029//AOE works
#define SPELL_GIFT_OF_THE_HERALD 56219//triggert if sucessfull sacreficed
#define TEXT_AGGRO -1619000
#define TEXT_SACRIFICE_1_1 -1619001
#define TEXT_SACRIFICE_1_2 -1619002
#define TEXT_SACRIFICE_2_1 -1619003
#define TEXT_SACRIFICE_2_2 -1619004
#define TEXT_SLAY_1 -1619005
#define TEXT_SLAY_2 -1619006
#define TEXT_SLAY_3 -1619007
#define TEXT_DEATH -1619008
#define TEXT_PREACHING_1 -1619009
#define TEXT_PREACHING_2 -1619010
#define TEXT_PREACHING_3 -1619011
#define TEXT_PREACHING_4 -1619012
#define TEXT_PREACHING_5 -1619013
//not in db
#define SAY_AGGRO -1619000
#define SAY_C_SACRIFICE_1 -1619001
#define SAY_C_SACRIFICE_2 -1619002
#define SAY_SACRIFICE_1 -1619003
#define SAY_SACRIFICE_2 -1619004
#define SAY_SLAY_1 -1619005
#define SAY_SLAY_2 -1619006
#define SAY_SLAY_3 -1619007
#define SAY_DEATH -1619008
#define SAY_PREACHING_1 -1619009
#define SAY_PREACHING_2 -1619010
#define SAY_PREACHING_3 -1619011
#define SAY_PREACHING_4 -1619012
#define SAY_PREACHING_5 -1619013
#define SPELL_SPHERE_VISUAL 56075
#define SPELL_GIFT_OF_THE_HERALD 56219
struct TRINITY_DLL_DECL boss_jedogaAI : public ScriptedAI
#define SPELL_CYCLONE_STRIKE 56855 // Self
#define SPELL_CYCLONE_STRIKE_H 60030
#define SPELL_LIGHTNING_BOLT 56891 // 40Y
#define SPELL_LIGHTNING_BOLT_H 60032 // 40Y
#define SPELL_THUNDERSHOCK 56926 // 30Y
#define SPELL_THUNDERSHOCK_H 60029 // 30Y
float JEDOGA_POS[2][4] =
{
boss_jedogaAI(Creature *c) : ScriptedAI(c) {}
{372.330994f, -705.278015f, -0.624178f, 5.427970f},
{372.330994f, -705.278015f, -16.179716f, 5.427970f}
};
struct MANGOS_DLL_DECL boss_jedoga_shadowseekerAI : public ScriptedAI
{
boss_jedoga_shadowseekerAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
HeroicMode = c->GetMap()->IsHeroic();
MaxDistance = 45.0f;
FirstTime = true;
predone = false;
}
ScriptedInstance* pInstance;
uint32 uiOpFerTimer,
uiCycloneTimer,
uiBoltTimer,
uiThunderTimer;
bool predone,
bOpFerok,
bOnGround,
bOpFerokFail,
bCanDown;
bool FirstTime;
void Reset()
{
uiOpFerTimer = urand(15000,20000);
uiCycloneTimer = 3000;
uiBoltTimer = 7000;
uiThunderTimer = 12000;
bOpFerok = false;
bOpFerokFail = false;
bOnGround = false;
bCanDown = false;
if (pInstance)
{
if (!FirstTime)
pInstance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, FAIL);
pInstance->SetData64(DATA_PL_JEDOGA_TARGET, 0);
pInstance->SetData64(DATA_ADD_JEDOGA_OPFER, 0);
pInstance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
}
MoveUp();
FirstTime = false;
}
void Reset() {}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
if (!pInstance || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == 30181))
return;
DoScriptText(TEXT_AGGRO, m_creature);
m_creature->SetInCombatWithZone();
pInstance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, IN_PROGRESS);
}
void AttackStart(Unit* who) {}
void MoveInLineOfSight(Unit* who) {}
void AttackStart(Unit* who)
{
if (!who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == 30181))
return;
ScriptedAI::AttackStart(who);
}
void KilledUnit(Unit* Victim)
{
if (!Victim || Victim->GetTypeId() != TYPEID_PLAYER)
return;
DoScriptText(RAND(TEXT_SLAY_1, TEXT_SLAY_2, TEXT_SLAY_3), m_creature);
}
void JustDied(Unit* Killer)
{
DoScriptText(TEXT_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, DONE);
}
void MoveInLineOfSight(Unit* who)
{
if (!pInstance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == 30181))
return;
if (!predone && who->GetTypeId() == TYPEID_PLAYER && m_creature->GetDistance(who) < 100.0f)
{
DoScriptText(RAND(TEXT_PREACHING_1, TEXT_PREACHING_2, TEXT_PREACHING_3, TEXT_PREACHING_4, TEXT_PREACHING_5), m_creature);
predone = true;
}
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS || !bOnGround)
return;
if (!m_creature->getVictim() && who->isTargetableForAttack() && m_creature->IsHostileTo(who) && who->isInAccessiblePlaceFor(m_creature))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
{
if (!m_creature->getVictim())
{
who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
AttackStart(who);
}
else if (m_creature->GetMap()->IsDungeon())
{
who->SetInCombatWith(m_creature);
m_creature->AddThreat(who, 0.0f);
}
}
}
}
void MoveDown()
{
if (!pInstance)
return;
bOpFerokFail = false;
pInstance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 0);
m_creature->GetMotionMaster()->MovePoint(1, JEDOGA_POS[1][0], JEDOGA_POS[1][1], JEDOGA_POS[1][2]);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
m_creature->SendMonsterMove(JEDOGA_POS[1][0], JEDOGA_POS[1][1], JEDOGA_POS[1][2], 0, MOVEFLAG_JUMP, 0);
m_creature->Relocate(JEDOGA_POS[1][0], JEDOGA_POS[1][1], JEDOGA_POS[1][2], JEDOGA_POS[1][3]);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
m_creature->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
bOnGround = true;
if (UpdateVictim())
{
AttackStart(m_creature->getVictim());
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
}
else
{
if (Unit* pTarget = Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_PL_JEDOGA_TARGET)))
{
AttackStart(pTarget);
pInstance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
EnterCombat(pTarget);
}
else if (!m_creature->isInCombat())
EnterEvadeMode();
}
}
void MoveUp()
{
if (!pInstance)
return;
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
m_creature->AttackStop();
m_creature->RemoveAllAuras();
m_creature->LoadCreaturesAddon();
m_creature->GetMotionMaster()->MovePoint(0, JEDOGA_POS[0][0], JEDOGA_POS[0][1], JEDOGA_POS[0][2]);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
m_creature->SendMonsterMove(JEDOGA_POS[0][0], JEDOGA_POS[0][1], JEDOGA_POS[0][2], 0, MOVEFLAG_JUMP, 0);
m_creature->Relocate(JEDOGA_POS[0][0], JEDOGA_POS[0][1], JEDOGA_POS[0][2], JEDOGA_POS[0][3]);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
m_creature->StopMoving();
pInstance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 1);
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) OpferRufen();
bOnGround = false;
uiOpFerTimer = urand(15000,30000);
}
void OpferRufen()
{
if (!pInstance)
return;
uint64 opfer = pInstance->GetData64(DATA_ADD_JEDOGA_INITIAND);
if (opfer)
{
DoScriptText(RAND(TEXT_SACRIFICE_1_1, TEXT_SACRIFICE_1_2), m_creature);
pInstance->SetData64(DATA_ADD_JEDOGA_OPFER, opfer);
} else
bCanDown = true;
}
void Opfern()
{
DoScriptText(RAND(TEXT_SACRIFICE_2_1, TEXT_SACRIFICE_2_2), m_creature);
m_creature->InterruptNonMeleeSpells(false);
m_creature->CastSpell(m_creature, SPELL_GIFT_OF_THE_HERALD, false);
bOpFerok = false;
bCanDown = true;
}
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && pInstance->GetData(DATA_ALL_INITIAND_DEAD))
MoveDown();
if (bOpFerok && !bOnGround && !bCanDown) Opfern();
if (bOpFerokFail && !bOnGround && !bCanDown)
bCanDown = true;
if (bCanDown)
{
MoveDown();
bCanDown = false;
}
if (bOnGround)
{
if (!UpdateVictim())
return;
if (uiCycloneTimer < diff)
{
m_creature->CastSpell(m_creature, HEROIC(SPELL_CYCLONE_STRIKE, SPELL_CYCLONE_STRIKE_H), false);
uiCycloneTimer = urand(15000,30000);
} else uiCycloneTimer -= diff;
if (uiBoltTimer < diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
m_creature->CastSpell(pTarget, HEROIC(SPELL_LIGHTNING_BOLT, SPELL_LIGHTNING_BOLT_H), false);
uiBoltTimer = urand(15000,30000);
} else uiBoltTimer -= diff;
if (uiThunderTimer < diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
m_creature->CastSpell(pTarget, HEROIC(SPELL_THUNDERSHOCK, SPELL_THUNDERSHOCK_H), false);
uiThunderTimer = urand(15000,30000);
} else uiThunderTimer -= diff;
if (uiOpFerTimer < diff)
MoveUp();
else
uiOpFerTimer -= diff;
DoMeleeAttackIfReady();
}
}
};
struct MANGOS_DLL_DECL mob_jedoga_initiandAI : public ScriptedAI
{
mob_jedoga_initiandAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 checktimer;
bool walking;
void Reset()
{
if (!pInstance)
return;
walking = false;
checktimer = 2000;
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
{
m_creature->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
else
{
m_creature->CastSpell(m_creature, SPELL_SPHERE_VISUAL, false);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
}
void JustDied(Unit* Killer)
{
if (!Killer || !pInstance) return;
if (walking)
{
Creature* boss = m_creature->GetMap()->GetCreature(pInstance->GetData64(DATA_JEDOGA_SHADOWSEEKER));
if (boss && !CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok) CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->opferfail = true;
if (Killer->GetTypeId() == TYPEID_PLAYER) pInstance->SetData(DATA_INITIAND_KILLED, 1);
pInstance->SetData64(DATA_ADD_JEDOGA_OPFER, 0);
walking = false;
}
if (Killer->GetTypeId() == TYPEID_PLAYER) pInstance->SetData64(DATA_PL_JEDOGA_TARGET, Killer->GetGUID());
}
void EnterCombat(Unit* who)
{
if ((pInstance && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who) return;
}
void AttackStart(Unit* victim)
{
if ((pInstance && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !victim) return;
ScriptedAI::AttackStart(victim);
}
void MoveInLineOfSight(Unit* who)
{
if ((pInstance && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who) return;
ScriptedAI::MoveInLineOfSight(who);
}
void MovementInform(uint32 uiType, uint32 uiPointId)
{
if (uiType != POINT_MOTION_TYPE || !pInstance) return;
switch(uiPointId)
{
case 1:
{
Creature* boss = m_creature->GetMap()->GetCreature(pInstance->GetData64(DATA_JEDOGA_SHADOWSEEKER));
if (boss)
{
CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok = true;
CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = false;
m_creature->DealDamage(boss, m_creature->GetHealth());
m_creature->setDeathState(JUST_DIED);
}
}
break;
}
}
void UpdateAI(const uint32 diff)
{
if (pInstance && checktimer < diff)
{
if (m_creature->GetGUID() == pInstance->GetData64(DATA_ADD_JEDOGA_OPFER) && !walking)
{
m_creature->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
float distance = m_creature->GetDistance(JEDOGA_POS[1][0], JEDOGA_POS[1][1], JEDOGA_POS[1][2]);
if (distance < 9.0f)
m_creature->SetSpeed(MOVE_WALK, 0.5f, true);
else if (distance < 15.0f)
m_creature->SetSpeed(MOVE_WALK, 0.75f, true);
else if (distance < 20.0f)
m_creature->SetSpeed(MOVE_WALK, 1.0f, true);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MovePoint(1, JEDOGA_POS[1][0], JEDOGA_POS[1][1], JEDOGA_POS[1][2]);
walking = true;
}
if (!walking)
{
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && m_creature->HasAura(SPELL_SPHERE_VISUAL))
{
m_creature->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS && !m_creature->HasAura(SPELL_SPHERE_VISUAL))
{
m_creature->CastSpell(m_creature, SPELL_SPHERE_VISUAL, false);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
}
checktimer = 2000;
} else checktimer -= diff;
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
void JustDied(Unit* killer)
// ------------------------------------------------------------------------------------------------------------
// Jedogas Aufseher - Entry: 30181
// ------------------------------------------------------------------------------------------------------------
#define SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1 60342
#define SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2 56312
struct MANGOS_DLL_DECL npc_jedogas_aufseher_triggerAI : public Scripted_NoMovementAI
{
npc_jedogas_aufseher_triggerAI(Creature* c) : Scripted_NoMovementAI(c)
{
DoScriptText(SAY_DEATH, m_creature);
pInstance = c->GetInstanceData();
c->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
c->setFaction(35);
removed = false;
removed2 = false;
casted = false;
casted2 = false;
}
void KilledUnit(Unit *victim)
ScriptedInstance* pInstance;
bool removed,
removed2,
casted,
casted2;
void Reset() {}
void EnterCombat(Unit* who) {}
void AttackStart(Unit* victim) {}
void MoveInLineOfSight(Unit* who) {}
void UpdateAI(const uint32 diff)
{
if (victim == m_creature)
if (!pInstance)
return;
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature);
if (!removed && m_creature->GetPositionX() > 440.0f)
{ /* NEEDS DATA WHETHER THE PRISON OF TALDARAM IS OFFLINE !
if (pInstance->GetData(EVENT_VORRICHTUNGEN))
{
m_creature->InterruptNonMeleeSpells(true);
removed = true;
return;
}*/
if (pInstance->GetData(DATA_PRINCE_TALDARAM_EVENT) == DONE)
{
m_creature->InterruptNonMeleeSpells(true);
removed = true;
return;
}
if (!casted)
{
m_creature->CastSpell(m_creature, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1, false);
casted = true;
}
}
if (!removed2 && m_creature->GetPositionX() < 440.0f)
{
if (!casted2 && pInstance->GetData(DATA_JEDOGA_TRIGGER_SWITCH))
{
m_creature->CastSpell(m_creature, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2, false);
casted2 = true;
}
if (casted2 && !pInstance->GetData(DATA_JEDOGA_TRIGGER_SWITCH))
{
m_creature->InterruptNonMeleeSpells(true);
casted2 = false;
}
if (!removed2 && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == DONE)
{
m_creature->InterruptNonMeleeSpells(true);
removed2 = true;
}
}
}
};
CreatureAI* GetAI_boss_jedoga(Creature* pCreature)
CreatureAI* GetAI_boss_jedoga_shadowseeker(Creature* pCreature)
{
return new boss_jedogaAI (pCreature);
return new boss_jedoga_shadowseekerAI (pCreature);
}
void AddSC_boss_jedoga()
CreatureAI* GetAI_mob_jedoga_initiand(Creature* pCreature)
{
Script *newscript;
return new mob_jedoga_initiandAI (pCreature);
}
CreatureAI* GetAI_npc_jedogas_aufseher_trigger(Creature* pCreature)
{
return new npc_jedogas_aufseher_triggerAI (pCreature);
}
void AddSC_boss_jedoga_shadowseeker()
{
Script* newscript;
newscript = new Script;
newscript->Name = "boss_jedoga";
newscript->GetAI = &GetAI_boss_jedoga;
newscript->Name = "boss_jedoga_shadowseeker";
newscript->GetAI = &GetAI_boss_jedoga_shadowseeker;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_jedoga_initiand";
newscript->GetAI = &GetAI_mob_jedoga_initiand;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_jedogas_aufseher_trigger";
newscript->GetAI = &GetAI_npc_jedogas_aufseher_trigger;
newscript->RegisterSelf();
}
@@ -37,4 +37,12 @@
#define DATA_SPHERE2_EVENT 14
#define DATA_PRINCE_TALDARAM_PLATFORM 15
#define DATA_PL_JEDOGA_TARGET 16
#define DATA_ADD_JEDOGA_OPFER 17
#define DATA_JEDOGA_RESET_INITIANDS 18
#define DATA_JEDOGA_TRIGGER_SWITCH 19
#define DATA_ADD_JEDOGA_INITIAND 20
#define DATA_ALL_INITIAND_DEAD 21
#define DATA_INITIAND_KILLED 22
#endif
@@ -26,7 +26,10 @@ EndScriptData */
#include "precompiled.h"
#include "def_ahnkahet.h"
#define MAX_ENCOUNTER 5
#define MAX_ENCOUNTER 5
#define MAX_JEDOGA_INITIANDS 15
#define AchievementVolunteerWork 2056
/* Ahn'kahet encounters:
0 - Elder Nadox
@@ -50,21 +53,39 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
uint64 Prince_TaldaramPlatform;
uint64 Prince_TaldaramGate;
uint64 InitiandGUIDs[MAX_JEDOGA_INITIANDS];
uint64 JedogaSacrifices;
uint64 JedogaTarget;
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint32 spheres[2];
uint8 InitiandCnt,
switchtrigger,
initiandkilled;
void Initialize()
{
Elder_Nadox =0;
Prince_Taldaram =0;
Jedoga_Shadowseeker =0;
Herald_Volazj =0;
Amanitar =0;
Elder_Nadox =0;
Prince_Taldaram =0;
Jedoga_Shadowseeker =0;
Herald_Volazj =0;
Amanitar =0;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
m_auiEncounter[i] = NOT_STARTED;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
m_auiEncounter[i] = NOT_STARTED;
spheres[0] = NOT_STARTED;
spheres[1] = NOT_STARTED;
InitiandCnt = 0;
switchtrigger = 0;
initiandkilled = 0;
JedogaSacrifices = 0;
JedogaTarget = 0;
for (uint8 i=0; i<MAX_JEDOGA_INITIANDS; ++i)
InitiandGUIDs[i] = 0;
}
bool IsEncounterInProgress() const
@@ -79,11 +100,12 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
{
switch(pCreature->GetEntry())
{
case 29309: Elder_Nadox = pCreature->GetGUID(); break;
case 29308: Prince_Taldaram = pCreature->GetGUID(); break;
case 29310: Jedoga_Shadowseeker = pCreature->GetGUID(); break;
case 29311: Herald_Volazj = pCreature->GetGUID(); break;
case 30258: Amanitar = pCreature->GetGUID(); break;
case 29309: Elder_Nadox = pCreature->GetGUID(); break;
case 29308: Prince_Taldaram = pCreature->GetGUID(); break;
case 29310: Jedoga_Shadowseeker = pCreature->GetGUID(); break;
case 29311: Herald_Volazj = pCreature->GetGUID(); break;
case 30258: Amanitar = pCreature->GetGUID(); break;
case 30114: InitiandGUIDs[InitiandCnt++] = pCreature->GetGUID(); break;
}
}
@@ -114,6 +136,15 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
}
}
void SetData64(uint32 idx, uint64 guid)
{
switch(idx)
{
case DATA_ADD_JEDOGA_OPFER: JedogaSacrifices = guid; break;
case DATA_PL_JEDOGA_TARGET: JedogaTarget = guid; break;
}
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
@@ -126,6 +157,26 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
case DATA_SPHERE1: return Prince_TaldaramSpheres[0];
case DATA_SPHERE2: return Prince_TaldaramSpheres[1];
case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform;
case DATA_ADD_JEDOGA_INITIAND:
{
uint8 i = 0;
uint32 rnd = urand(0,MAX_JEDOGA_INITIANDS-1);
do
{
if (i == rnd)
{
Creature* cr = instance->GetCreature(InitiandGUIDs[i]);
if (cr && cr->isAlive()) return InitiandGUIDs[i];
else
{
i = 0;
rnd = urand(0,MAX_JEDOGA_INITIANDS-1);
}
} else ++i;
} while (i < MAX_JEDOGA_INITIANDS);
}
case DATA_ADD_JEDOGA_OPFER: return JedogaSacrifices;
case DATA_PL_JEDOGA_TARGET: return JedogaTarget;
}
return 0;
}
@@ -134,30 +185,50 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
{
switch(type)
{
case DATA_ELDER_NADOX_EVENT:
m_auiEncounter[0] = data;break;
case DATA_PRINCE_TALDARAM_EVENT:
if (data == DONE)
{
HandleGameObject(Prince_TaldaramGate,true);
}
m_auiEncounter[1] = data; break;
case DATA_JEDOGA_SHADOWSEEKER_EVENT:
m_auiEncounter[2] = data; break;
case DATA_HERALD_VOLAZJ:
m_auiEncounter[3] = data; break;
case DATA_AMANITAR:
m_auiEncounter[4] = data; break;
case DATA_SPHERE1_EVENT:
spheres[0] = data; break;
case DATA_SPHERE2_EVENT:
spheres[1] = data; break;
}
if (data == DONE)
{
SaveToDB();
case DATA_ELDER_NADOX_EVENT: m_auiEncounter[0] = data; break;
case DATA_PRINCE_TALDARAM_EVENT:
if (data == DONE)
HandleGameObject(Prince_TaldaramGate,true);
m_auiEncounter[1] = data;
break;
case DATA_JEDOGA_SHADOWSEEKER_EVENT:
m_auiEncounter[2] = data;
if (data == DONE)
{
for (uint8 i = 0; i < MAX_JEDOGA_INITIANDS; ++i)
{
Creature* cr = instance->GetCreature(InitiandGUIDs[i]);
if (cr && cr->isAlive())
{
cr->SetVisibility(VISIBILITY_OFF);
cr->setDeathState(JUST_DIED);
cr->RemoveCorpse();
}
}
if (!initiandkilled && instance->IsHeroic())
DoCompleteAchievement(AchievementVolunteerWork);
}
break;
case DATA_HERALD_VOLAZJ: m_auiEncounter[3] = data; break;
case DATA_AMANITAR: m_auiEncounter[4] = data; break;
case DATA_SPHERE1_EVENT: spheres[0] = data; break;
case DATA_SPHERE2_EVENT: spheres[1] = data; break;
case DATA_JEDOGA_TRIGGER_SWITCH: switchtrigger = data; break;
case DATA_INITIAND_KILLED: initiandkilled = data; break;
case DATA_JEDOGA_RESET_INITIANDS:
for (uint8 i=0; i < MAX_JEDOGA_INITIANDS; ++i)
{
Creature* cr = instance->GetCreature(InitiandGUIDs[i]);
if (cr)
{
cr->Respawn();
if (!cr->IsInEvadeMode()) cr->AI()->EnterEvadeMode();
}
}
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
@@ -171,25 +242,30 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
case DATA_AMANITAR: return m_auiEncounter[4];
case DATA_SPHERE1_EVENT: return spheres[0];
case DATA_SPHERE2_EVENT: return spheres[1];
case DATA_ALL_INITIAND_DEAD:
for (uint8 i=0; i<MAX_JEDOGA_INITIANDS; ++i)
{
Creature* cr = instance->GetCreature(InitiandGUIDs[i]);
if (!cr || (cr && cr->isAlive())) return 0;
}
return 1;
case DATA_JEDOGA_TRIGGER_SWITCH: return switchtrigger;
case DATA_INITIAND_KILLED: return initiandkilled;
}
return 0;
}
std::string GetSaveData()
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string str_data;
std::ostringstream saveStream;
saveStream << "A K " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
<< m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " "
<< spheres[0] << " " << spheres[1];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
return saveStream.str();
}
void Load(const char* in)
@@ -303,7 +303,7 @@ void AddSC_boss_anub_arak()
Script *newscript;
newscript = new Script;
newscript->Name="boss_anub_arak";
newscript->Name = "boss_anub_arak";
newscript->GetAI = &GetAI_boss_anub_arak;
newscript->RegisterSelf();
}
@@ -685,7 +685,7 @@ struct TRINITY_DLL_DECL dummy_dragonAI : public ScriptedAI
struct TRINITY_DLL_DECL mob_tenebronAI : public dummy_dragonAI
{
mob_tenebronAI(Creature* pCreature) : dummy_dragonAI(pCreature) { }
mob_tenebronAI(Creature* pCreature) : dummy_dragonAI(pCreature) {}
uint32 m_uiShadowBreathTimer;
uint32 m_uiShadowFissureTimer;
@@ -755,7 +755,7 @@ CreatureAI* GetAI_mob_tenebron(Creature* pCreature)
struct TRINITY_DLL_DECL mob_shadronAI : public dummy_dragonAI
{
mob_shadronAI(Creature* pCreature) : dummy_dragonAI(pCreature) { }
mob_shadronAI(Creature* pCreature) : dummy_dragonAI(pCreature) {}
uint32 m_uiShadowBreathTimer;
uint32 m_uiShadowFissureTimer;
@@ -831,7 +831,7 @@ CreatureAI* GetAI_mob_shadron(Creature* pCreature)
struct TRINITY_DLL_DECL mob_vesperonAI : public dummy_dragonAI
{
mob_vesperonAI(Creature* pCreature) : dummy_dragonAI(pCreature) { }
mob_vesperonAI(Creature* pCreature) : dummy_dragonAI(pCreature) {}
uint32 m_uiShadowBreathTimer;
uint32 m_uiShadowFissureTimer;
@@ -1009,7 +1009,7 @@ CreatureAI* GetAI_mob_acolyte_of_vesperon(Creature* pCreature)
struct TRINITY_DLL_DECL mob_twilight_eggsAI : public ScriptedAI
{
mob_twilight_eggsAI(Creature* pCreature) : ScriptedAI(pCreature) { }
mob_twilight_eggsAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 m_uiFadeArmorTimer;
@@ -1018,8 +1018,8 @@ struct TRINITY_DLL_DECL mob_twilight_eggsAI : public ScriptedAI
m_uiFadeArmorTimer = 1000;
}
void AttackStart(Unit* pWho) { }
void MoveInLineOfSight(Unit* pWho) { }
void AttackStart(Unit* pWho) {}
void MoveInLineOfSight(Unit* pWho) {}
};
CreatureAI* GetAI_mob_twilight_eggs(Creature* pCreature)
@@ -1033,7 +1033,7 @@ CreatureAI* GetAI_mob_twilight_eggs(Creature* pCreature)
struct TRINITY_DLL_DECL mob_twilight_whelpAI : public ScriptedAI
{
mob_twilight_whelpAI(Creature* pCreature) : ScriptedAI(pCreature) { }
mob_twilight_whelpAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 m_uiFadeArmorTimer;
@@ -806,7 +806,7 @@ void AddSC_boss_palehoof()
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_palehoof_orb";
newscript->Name = "mob_palehoof_orb";
newscript->GetAI = &GetAI_mob_palehoof_orb;
newscript->RegisterSelf();
@@ -135,7 +135,7 @@ struct TRINITY_DLL_DECL npc_air_force_botsAI : public ScriptedAI
SpawnAssociation* m_pSpawnAssoc;
uint64 m_uiSpawnedGUID;
void Reset() { }
void Reset() {}
Creature* SummonGuard()
{
@@ -274,6 +274,7 @@ extern void AddSC_instance_azjol_nerub();
extern void AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet
extern void AddSC_boss_amanitar();
extern void AddSC_boss_taldaram();
extern void AddSC_boss_jedoga_shadowseeker();
extern void AddSC_boss_elder_nadox();
extern void AddSC_boss_volazj();
extern void AddSC_boss_anubrekhan(); //Naxxramas
@@ -704,6 +705,7 @@ void AddScripts()
AddSC_boss_amanitar();
AddSC_boss_taldaram(); //Azjol-Nerub Ahn'kahet
AddSC_boss_elder_nadox();
AddSC_boss_jedoga_shadowseeker();
AddSC_boss_volazj();
AddSC_instance_ahnkahet();
AddSC_boss_krik_thir(); //Azjol-Nerub Azjol-Nerub