aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp48
-rw-r--r--src/bindings/scripts/include/sc_creature.h12
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp52
3 files changed, 72 insertions, 40 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index 7bc7c1015cb..f352583dd3f 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -15,6 +15,54 @@ struct TSpellSummary {
uint8 Effects; // set of enum SelectEffect
} *SpellSummary;
+void SummonList::Despawn(Creature *summon)
+{
+ uint64 guid = summon->GetGUID();
+ for(iterator i = begin(); i != end(); ++i)
+ {
+ if(*i == guid)
+ {
+ erase(i);
+ return;
+ }
+ }
+}
+
+void SummonList::DespawnEntry(uint32 entry)
+{
+ for(iterator i = begin(); i != end(); ++i)
+ {
+ if(Creature *summon = (Creature*)Unit::GetUnit(*m_creature, *i))
+ {
+ if(summon->GetEntry() == entry)
+ {
+ summon->setDeathState(JUST_DIED);
+ summon->RemoveCorpse();
+ i = erase(i);
+ --i;
+ }
+ }
+ else
+ {
+ i = erase(i);
+ --i;
+ }
+ }
+}
+
+void SummonList::DespawnAll()
+{
+ for(iterator i = begin(); i != end(); ++i)
+ {
+ if(Creature *summon = (Creature*)Unit::GetUnit(*m_creature, *i))
+ {
+ summon->setDeathState(JUST_DIED);
+ summon->RemoveCorpse();
+ }
+ }
+ clear();
+}
+
bool ScriptedAI::IsVisible(Unit* who) const
{
if (!who)
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index e85e7d45f8f..da40e2eab60 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -11,6 +11,18 @@
#include "CreatureAI.h"
#include "Creature.h"
+class SummonList : std::list<uint64>
+{
+public:
+ SummonList(Creature* creature) : m_creature(creature) {}
+ void Summon(Creature *summon) {push_back(summon->GetGUID());}
+ void Despawn(Creature *summon);
+ void DespawnEntry(uint32 entry);
+ void DespawnAll();
+private:
+ Creature *m_creature;
+};
+
struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
{
ScriptedAI(Creature* creature) : m_creature(creature), InCombat(false) {}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
index 349d1d0bf28..ab3f513eaf8 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
@@ -22,7 +22,6 @@ EndScriptData */
#include "precompiled.h"
#include "def_zulaman.h"
-//#include "spell.h"
//Speech
#define YELL_TRANSFORM_TO_LYNX "Let me introduce to you my new bruddahs: fang and claw!"
@@ -142,18 +141,9 @@ static TransformStruct Transform[] =
struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
{
- boss_zuljinAI(Creature *c) : ScriptedAI(c)
+ boss_zuljinAI(Creature *c) : ScriptedAI(c), Summons(m_creature)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
- // wait for core patch be accepted
- SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_CLAW_RAGE_DAMAGE);
- if(TempSpell)
- {
- //if(TempSpell->DmgClass != SPELL_DAMAGE_CLASS_MELEE)
- // TempSpell->DmgClass = SPELL_DAMAGE_CLASS_MELEE;
- if(TempSpell->EffectApplyAuraName[2] != SPELL_AURA_MOD_STUN)
- TempSpell->EffectApplyAuraName[2] = SPELL_AURA_MOD_STUN;
- }
Reset();
}
ScriptedInstance *pInstance;
@@ -183,6 +173,8 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
uint32 Flame_Breath_Timer;
uint32 Pillar_Of_Fire_Timer;
+ SummonList Summons;
+
void Reset()
{
if(pInstance)
@@ -213,9 +205,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
ClawTargetGUID = 0;
TankGUID = 0;
- DespawnAdds();
- DespawnSummons(CREATURE_FEATHER_VORTEX);
- DespawnSummons(CREATURE_COLUMN_OF_FIRE);
+ Summons.DespawnAll();
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 47174);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
@@ -260,7 +250,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
DoYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
- DespawnSummons(CREATURE_COLUMN_OF_FIRE);
+ Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE);
if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[3]))
Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
@@ -328,32 +318,14 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
}
}
- void DespawnSummons(uint32 entry)
+ void JustSummoned(Creature *summon)
{
- std::list<Creature*> templist;
- float x, y, z;
- m_creature->GetPosition(x, y, z);
-
- {
- CellPair pair(Trinity::ComputeCellPair(x, y));
- Cell cell(pair);
- cell.data.Part.reserved = ALL_DISTRICT;
- cell.SetNoCreate();
-
- Trinity::AllCreaturesOfEntryInRange check(m_creature, entry, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
-
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
-
- CellLock<GridReadGuard> cell_lock(cell, pair);
- cell_lock->Visit(cell_lock, cSearcher, *(m_creature->GetMap()));
- }
+ Summons.Summon(summon);
+ }
- for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end(); ++i)
- {
- (*i)->SetVisibility(VISIBILITY_OFF);
- (*i)->setDeathState(JUST_DIED);
- }
+ void SummonedCreatureDespawn(Creature *summon)
+ {
+ Summons.Despawn(summon);
}
void EnterPhase(uint32 NextPhase)
@@ -404,7 +376,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
if(NextPhase == 3)
{
m_creature->RemoveAurasDueToSpell(SPELL_ENERGY_STORM);
- DespawnSummons(CREATURE_FEATHER_VORTEX);
+ Summons.DespawnEntry(CREATURE_FEATHER_VORTEX);
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
}
break;