aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2008-12-14 11:55:32 -0600
committermegamage <none@none>2008-12-14 11:55:32 -0600
commit1d2179a52957f019e5603917c78f4c552f8dba20 (patch)
treec00cc0f78f7cb539fd2e128973024560a5d800df /src
parent29f92cbd902eb08fb0f0ffa08c5dfa58c3776df7 (diff)
*Fix a bug that shade of Akama causes crash.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp172
1 files changed, 91 insertions, 81 deletions
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
index 833e8eb985c..c87457e8b32 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -30,7 +30,7 @@ EndScriptData */
#define SAY_FREE -1564015
#define SAY_BROKEN_FREE_01 -1564016
#define SAY_BROKEN_FREE_02 -1564017
-
+
#define GOSSIP_ITEM "We are ready to fight alongside you, Akama"
struct Location
@@ -188,48 +188,53 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
bool IsBanished;
bool HasKilledAkama;
+ bool reseting;
void Reset()
{
+ reseting = true;
+
m_creature->setActive(true); // TODO: setActive(true, time);
FindChannelers();
if(!Channelers.empty())
- {
- for(std::list<uint64>::iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
{
- Creature* Channeler = NULL;
- Channeler = ((Creature*)Unit::GetUnit(*m_creature, *itr));
- if(Channeler)
+ for(std::list<uint64>::iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
{
- if(Channeler->isDead())
+ Creature* Channeler = NULL;
+ Channeler = ((Creature*)Unit::GetUnit(*m_creature, *itr));
+ if(Channeler)
{
- Channeler->RemoveCorpse();
- Channeler->Respawn();
- }
- if(m_creature->isAlive())
- {
- Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL, true);
- Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL_2, true);
- Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
- }else error_log("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly");
- }
-
- }
+ if(Channeler->isDead())
+ {
+ Channeler->RemoveCorpse();
+ Channeler->Respawn();
+ }
+ if(m_creature->isAlive())
+ {
+ Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL, true);
+ Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL_2, true);
+ Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+ }else error_log("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly");
+ }
+
+ }
if(!Sorcerers.empty())
- {
+ {
for(std::list<uint64>::iterator itr = Sorcerers.begin(); itr != Sorcerers.end(); ++itr)
+ {
if(Creature* Sorcerer = ((Creature*)Unit::GetUnit(*m_creature, *itr)))
if(Sorcerer->isAlive())
{
Sorcerer->SetVisibility(VISIBILITY_OFF);
- Sorcerer->DealDamage(Sorcerer, Sorcerer->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ Sorcerer->Kill(Sorcerer);
}
+ }
+ Sorcerers.clear();
+ }
- Sorcerers.clear();
- }
if(Unit* Akama = Unit::GetUnit(*m_creature, AkamaGUID))
Akama->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
@@ -253,6 +258,8 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
if(pInstance && m_creature->isAlive())
pInstance->SetData(DATA_SHADEOFAKAMAEVENT, NOT_STARTED);
+
+ reseting = false;
}
void Aggro(Unit* who) { }
@@ -274,6 +281,9 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
void IncrementDeathCount(uint64 guid = 0) // If guid is set, will remove it from list of sorcerer
{
+ if(reseting)
+ return;
+
debug_log("SD2: Increasing Death Count for Shade of Akama encounter");
++DeathCount;
m_creature->RemoveSingleAuraFromStack(SPELL_SHADE_SOUL_CHANNEL_2, 0);
@@ -290,7 +300,7 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
uint32 random = rand()%2;
float X = SpawnLocations[random].x;
float Y = SpawnLocations[random].y;
- // max of 6 sorcerers can be summoned
+ // max of 6 sorcerers can be summoned
if((rand()%3 == 0) && (DeathCount > 0) && (SorcererCount < 7))
{
Creature* Sorcerer = m_creature->SummonCreature(CREATURE_SORCERER, X, Y, Z_SPAWN, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
@@ -388,9 +398,9 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
{
float x, y, z;
Akama->GetPosition(x,y,z);
- // They move towards AKama
+ // They move towards AKama
Defender->GetMotionMaster()->MovePoint(0, x, y, z);
- Defender->AI()->AttackStart(Akama);
+ Defender->AI()->AttackStart(Akama);
}else move = false;
}else move = false;
if(!move)
@@ -416,10 +426,10 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveChase(Akama);
Akama->GetMotionMaster()->Clear();
- // Shade should move to Akama, not the other way around
+ // Shade should move to Akama, not the other way around
Akama->GetMotionMaster()->MoveIdle();
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- // Crazy amount of threat
+ // Crazy amount of threat
m_creature->AddThreat(Akama, 10000000.0f);
Akama->AddThreat(m_creature, 10000000.0f);
m_creature->Attack(Akama, true);
@@ -551,7 +561,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
if(Shade)
{
pInstance->SetData(DATA_SHADEOFAKAMAEVENT, IN_PROGRESS);
- // Prevent players from trying to restart event
+ // Prevent players from trying to restart event
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
((boss_shade_of_akamaAI*)Shade->AI())->SetAkamaGUID(m_creature->GetGUID());
((boss_shade_of_akamaAI*)Shade->AI())->SetSelectableChannelers();
@@ -572,17 +582,17 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
switch(id)
{
- case 0: ++WayPointId; break;
+ case 0: ++WayPointId; break;
- case 1:
- if(Unit* Shade = Unit::GetUnit(*m_creature, ShadeGUID))
- {
- m_creature->SetUInt64Value(UNIT_FIELD_TARGET, ShadeGUID);
- DoCast(Shade, SPELL_AKAMA_SOUL_RETRIEVE);
- EndingTalkCount = 0;
- SoulRetrieveTimer = 16000;
- }
- break;
+ case 1:
+ if(Unit* Shade = Unit::GetUnit(*m_creature, ShadeGUID))
+ {
+ m_creature->SetUInt64Value(UNIT_FIELD_TARGET, ShadeGUID);
+ DoCast(Shade, SPELL_AKAMA_SOUL_RETRIEVE);
+ EndingTalkCount = 0;
+ SoulRetrieveTimer = 16000;
+ }
+ break;
}
}
@@ -598,7 +608,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 15 && !HasYelledOnce)
{
- DoScriptText(SAY_LOW_HEALTH, m_creature);
+ DoScriptText(SAY_LOW_HEALTH, m_creature);
HasYelledOnce = true;
}
@@ -650,44 +660,44 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
}
if(SummonBrokenTimer && BrokenSummonIndex < 4)
- {
- if(SummonBrokenTimer <= diff)
{
- for(uint8 i = 0; i < 4; ++i)
+ if(SummonBrokenTimer <= diff)
{
- float x = BrokenCoords[BrokenSummonIndex].x + (i*5);
- float y = BrokenCoords[BrokenSummonIndex].y + (1*5);
- float z = BrokenCoords[BrokenSummonIndex].z;
- float o = BrokenCoords[BrokenSummonIndex].o;
- Creature* Broken = m_creature->SummonCreature(CREATURE_BROKEN, x, y, z, o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000);
- if(Broken)
+ for(uint8 i = 0; i < 4; ++i)
{
- float wx = BrokenWP[BrokenSummonIndex].x + (i*5);
- float wy = BrokenWP[BrokenSummonIndex].y + (i*5);
- float wz = BrokenWP[BrokenSummonIndex].z;
- Broken->GetMotionMaster()->MovePoint(0, wx, wy, wz);
- Broken->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- BrokenList.push_back(Broken->GetGUID());
+ float x = BrokenCoords[BrokenSummonIndex].x + (i*5);
+ float y = BrokenCoords[BrokenSummonIndex].y + (1*5);
+ float z = BrokenCoords[BrokenSummonIndex].z;
+ float o = BrokenCoords[BrokenSummonIndex].o;
+ Creature* Broken = m_creature->SummonCreature(CREATURE_BROKEN, x, y, z, o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000);
+ if(Broken)
+ {
+ float wx = BrokenWP[BrokenSummonIndex].x + (i*5);
+ float wy = BrokenWP[BrokenSummonIndex].y + (i*5);
+ float wz = BrokenWP[BrokenSummonIndex].z;
+ Broken->GetMotionMaster()->MovePoint(0, wx, wy, wz);
+ Broken->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ BrokenList.push_back(Broken->GetGUID());
+ }
}
- }
- ++BrokenSummonIndex;
- SummonBrokenTimer = 1000;
- }else SummonBrokenTimer -= diff;
- }
+ ++BrokenSummonIndex;
+ SummonBrokenTimer = 1000;
+ }else SummonBrokenTimer -= diff;
+ }
if(SoulRetrieveTimer)
if(SoulRetrieveTimer <= diff)
- {
- switch(EndingTalkCount)
{
+ switch(EndingTalkCount)
+ {
case 0:
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
++EndingTalkCount;
SoulRetrieveTimer = 2000;
SummonBrokenTimer = 1;
- break;
+ break;
case 1:
- DoScriptText(SAY_FREE, m_creature);
+ DoScriptText(SAY_FREE, m_creature);
++EndingTalkCount;
SoulRetrieveTimer = 25000;
break;
@@ -697,40 +707,40 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
bool Yelled = false;
for(std::list<uint64>::iterator itr = BrokenList.begin(); itr != BrokenList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
- {
- if(!Yelled)
{
- DoScriptText(SAY_BROKEN_FREE_01, pUnit);
- Yelled = true;
+ if(!Yelled)
+ {
+ DoScriptText(SAY_BROKEN_FREE_01, pUnit);
+ Yelled = true;
+ }
+ pUnit->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
}
- pUnit->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
- }
}
++EndingTalkCount;
SoulRetrieveTimer = 1500;
break;
case 3:
if(!BrokenList.empty())
- {
+ {
for(std::list<uint64>::iterator itr = BrokenList.begin(); itr != BrokenList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
// This is the incorrect spell, but can't seem to find the right one.
pUnit->CastSpell(pUnit, 39656, true);
- }
+ }
++EndingTalkCount;
SoulRetrieveTimer = 5000;
- break;
+ break;
case 4:
if(!BrokenList.empty())
- {
+ {
for(std::list<uint64>::iterator itr = BrokenList.begin(); itr != BrokenList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit((*m_creature), *itr))
pUnit->MonsterYell(SAY_BROKEN_FREE_02, LANG_UNIVERSAL, 0);
- }
+ }
SoulRetrieveTimer = 0;
break;
- }
- }else SoulRetrieveTimer -= diff;
+ }
+ }else SoulRetrieveTimer -= diff;
if(!m_creature->getVictim() || !m_creature->SelectHostilTarget())
return;
@@ -738,8 +748,8 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
if(DestructivePoisonTimer < diff)
{
Unit* Shade = Unit::GetUnit((*m_creature), ShadeGUID);
- if (Shade && Shade->isAlive())
- DoCast(Shade, SPELL_DESTRUCTIVE_POISON);
+ if (Shade && Shade->isAlive())
+ DoCast(Shade, SPELL_DESTRUCTIVE_POISON);
DestructivePoisonTimer = 15000;
}else DestructivePoisonTimer -= diff;