diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/include/sc_creature.cpp | 48 | ||||
-rw-r--r-- | src/bindings/scripts/include/sc_creature.h | 12 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp | 52 |
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; |