diff options
author | megamage <none@none> | 2008-10-17 21:44:37 -0500 |
---|---|---|
committer | megamage <none@none> | 2008-10-17 21:44:37 -0500 |
commit | bac1fb628e6c9d27f5f51e426e55d1d89920e763 (patch) | |
tree | 75918572ae9cc4a0c58827b93a2b646e25996bef | |
parent | 16dcd3727935841c94982165ef240d53d3b06db9 (diff) |
[svn] Merge branch r50 with trunk.
--HG--
branch : trunk
18 files changed, 4793 insertions, 1261 deletions
diff --git a/src/bindings/scripts/Makefile.am b/src/bindings/scripts/Makefile.am index 7e63fef6245..a08a8d078a0 100644 --- a/src/bindings/scripts/Makefile.am +++ b/src/bindings/scripts/Makefile.am @@ -366,8 +366,12 @@ scripts/zone/wailing_caverns/instance_wailing_caverns.cpp \ scripts/zone/western_plaguelands/western_plaguelands.cpp \ scripts/zone/winterspring/winterspring.cpp \ scripts/zone/zangarmarsh/zangarmarsh.cpp \ +scripts/zone/zulaman/boss_akilzon.cpp \ +scripts/zone/zulaman/boss_halazzi.cpp \ +scripts/zone/zulaman/boss_hexlord.cpp \ scripts/zone/zulaman/boss_janalai.cpp \ scripts/zone/zulaman/boss_nalorakk.cpp \ +scripts/zone/zulaman/boss_zuljin.cpp \ scripts/zone/zulaman/def_zulaman.h \ scripts/zone/zulaman/instance_zulaman.cpp \ scripts/zone/zulaman/zulaman.cpp \ diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp index db69ef04934..bef021af6f5 100644 --- a/src/bindings/scripts/ScriptMgr.cpp +++ b/src/bindings/scripts/ScriptMgr.cpp @@ -580,9 +580,14 @@ extern void AddSC_boss_hazzarah(); extern void AddSC_boss_renataki(); extern void AddSC_boss_wushoolay(); extern void AddSC_instance_zulgurub(); + //Zul'Aman +extern void AddSC_boss_akilzon(); +extern void AddSC_boss_halazzi(); +extern void AddSC_boss_hex_lord_malacrass(); extern void AddSC_boss_janalai(); extern void AddSC_boss_nalorakk(); +extern void AddSC_boss_zuljin(); extern void AddSC_instance_zulaman(); extern void AddSC_zulaman(); @@ -1759,10 +1764,14 @@ void ScriptsInit() AddSC_instance_zulgurub(); //Zul'Aman - AddSC_boss_janalai(); - AddSC_boss_nalorakk(); - AddSC_instance_zulaman(); - AddSC_zulaman(); + AddSC_boss_akilzon(); + AddSC_boss_halazzi(); + AddSC_boss_hex_lord_malacrass(); + AddSC_boss_janalai(); + AddSC_boss_nalorakk(); + AddSC_boss_zuljin(); + AddSC_instance_zulaman(); + AddSC_zulaman(); // ------------------- diff --git a/src/bindings/scripts/VC71/71ScriptDev2.vcproj b/src/bindings/scripts/VC71/71ScriptDev2.vcproj index 205ea135b45..52dab53a239 100644 --- a/src/bindings/scripts/VC71/71ScriptDev2.vcproj +++ b/src/bindings/scripts/VC71/71ScriptDev2.vcproj @@ -117,1471 +117,1992 @@ </References> <Files> <Filter - Name="Scripts"> + Name="Scripts" + > <Filter - Name="boss"> + Name="boss" + > <File - RelativePath="..\scripts\boss\boss_emeriss.cpp"> + RelativePath="..\scripts\boss\boss_emeriss.cpp" + > </File> <File - RelativePath="..\scripts\boss\boss_lethon.cpp"> + RelativePath="..\scripts\boss\boss_lethon.cpp" + > </File> <File - RelativePath="..\scripts\boss\boss_taerar.cpp"> + RelativePath="..\scripts\boss\boss_taerar.cpp" + > </File> <File - RelativePath="..\scripts\boss\boss_ysondre.cpp"> + RelativePath="..\scripts\boss\boss_ysondre.cpp" + > </File> </Filter> <Filter - Name="creature"> + Name="creature" + > <File - RelativePath="..\scripts\creature\mob_event_ai.cpp"> + RelativePath="..\scripts\creature\mob_event_ai.cpp" + > </File> <File - RelativePath="..\scripts\creature\mob_event_ai.h"> + RelativePath="..\scripts\creature\mob_event_ai.h" + > </File> <File - RelativePath="..\scripts\creature\mob_generic_creature.cpp"> + RelativePath="..\scripts\creature\mob_generic_creature.cpp" + > </File> <File - RelativePath="..\scripts\creature\simple_ai.cpp"> + RelativePath="..\scripts\creature\simple_ai.cpp" + > </File> <File - RelativePath="..\scripts\creature\simple_ai.h"> + RelativePath="..\scripts\creature\simple_ai.h" + > </File> </Filter> <Filter - Name="guard"> + Name="guard" + > <File - RelativePath="..\scripts\guard\guard_ai.cpp"> + RelativePath="..\scripts\guard\guard_ai.cpp" + > </File> <File - RelativePath="..\scripts\guard\guard_ai.h"> + RelativePath="..\scripts\guard\guard_ai.h" + > </File> <File - RelativePath="..\scripts\guard\guards.cpp"> + RelativePath="..\scripts\guard\guards.cpp" + > </File> </Filter> <Filter - Name="honor"> + Name="honor" + > </Filter> <Filter - Name="npc"> + Name="npc" + > <File - RelativePath="..\scripts\npc\npc_escortAI.cpp"> + RelativePath="..\scripts\npc\npc_escortAI.cpp" + > </File> <File - RelativePath="..\scripts\npc\npc_escortAI.h"> + RelativePath="..\scripts\npc\npc_escortAI.h" + > </File> <File - RelativePath="..\scripts\npc\npc_innkeeper.cpp"> + RelativePath="..\scripts\npc\npc_innkeeper.cpp" + > </File> <File - RelativePath="..\scripts\npc\npc_professions.cpp"> + RelativePath="..\scripts\npc\npc_professions.cpp" + > </File> <File - RelativePath="..\scripts\npc\npcs_special.cpp"> + RelativePath="..\scripts\npc\npcs_special.cpp" + > </File> </Filter> <Filter - Name="servers"> + Name="servers" + > </Filter> <Filter - Name="custom"> + Name="custom" + > <File - RelativePath="..\scripts\custom\custom_example.cpp"> + RelativePath="..\scripts\custom\custom_example.cpp" + > </File> <File - RelativePath="..\scripts\custom\custom_gossip_codebox.cpp"> + RelativePath="..\scripts\custom\custom_gossip_codebox.cpp" + > </File> <File - RelativePath="..\scripts\custom\test.cpp"> + RelativePath="..\scripts\custom\test.cpp" + > </File> </Filter> <Filter - Name="areatrigger"> + Name="areatrigger" + > <File - RelativePath="..\scripts\areatrigger\areatrigger_scripts.cpp"> + RelativePath="..\scripts\areatrigger\areatrigger_scripts.cpp" + > </File> </Filter> <Filter - Name="go"> + Name="go" + > <File - RelativePath="..\scripts\go\go_scripts.cpp"> + RelativePath="..\scripts\go\go_scripts.cpp" + > </File> </Filter> <Filter - Name="item"> + Name="item" + > <File - RelativePath="..\scripts\item\item_scripts.cpp"> + RelativePath="..\scripts\item\item_scripts.cpp" + > </File> <File - RelativePath="..\scripts\item\item_test.cpp"> + RelativePath="..\scripts\item\item_test.cpp" + > </File> </Filter> <Filter - Name="zone"> + Name="zone" + > <Filter - Name="Alterac Mountains"> + Name="Alterac Mountains" + > <File - RelativePath="..\scripts\zone\alterac_mountains\alterac_mountains.cpp"> + RelativePath="..\scripts\zone\alterac_mountains\alterac_mountains.cpp" + > </File> </Filter> <Filter - Name="Ashenvale Forest"> + Name="Ashenvale Forest" + > </Filter> <Filter - Name="Azshara"> + Name="Azshara" + > <File - RelativePath="..\scripts\zone\azshara\azshara.cpp"> + RelativePath="..\scripts\zone\azshara\azshara.cpp" + > </File> <File - RelativePath="..\scripts\zone\azshara\boss_azuregos.cpp"> + RelativePath="..\scripts\zone\azshara\boss_azuregos.cpp" + > </File> </Filter> <Filter - Name="Badlands"> + Name="Badlands" + > </Filter> <Filter - Name="Barrens"> + Name="Barrens" + > <File - RelativePath="..\scripts\zone\barrens\the_barrens.cpp"> + RelativePath="..\scripts\zone\barrens\the_barrens.cpp" + > </File> </Filter> <Filter - Name="Blackfathom Depths"> + Name="Blackfathom Depths" + > </Filter> <Filter - Name="Arathi Highlands"> + Name="Arathi Highlands" + > </Filter> <Filter - Name="Deadmines"> + Name="Deadmines" + > <File - RelativePath="..\scripts\zone\deadmines\deadmines.cpp"> + RelativePath="..\scripts\zone\deadmines\deadmines.cpp" + > </File> </Filter> <Filter - Name="Deadwind Pass"> + Name="Deadwind Pass" + > </Filter> <Filter - Name="Desolace"> + Name="Desolace" + > </Filter> <Filter - Name="Dire Maul"> + Name="Dire Maul" + > </Filter> <Filter - Name="Dun Morogh"> + Name="Dun Morogh" + > <File - RelativePath="..\scripts\zone\dun_morogh\dun_morogh.cpp"> + RelativePath="..\scripts\zone\dun_morogh\dun_morogh.cpp" + > </File> </Filter> <Filter - Name="Durotar"> + Name="Durotar" + > </Filter> <Filter - Name="Duskwood"> + Name="Duskwood" + > </Filter> <Filter - Name="Dustwallow Marsh"> + Name="Dustwallow Marsh" + > <File - RelativePath="..\scripts\zone\dustwallow_marsh\dustwallow_marsh.cpp"> + RelativePath="..\scripts\zone\dustwallow_marsh\dustwallow_marsh.cpp" + > </File> </Filter> <Filter - Name="Blackwing Lair"> + Name="Blackwing Lair" + > <File - RelativePath="..\scripts\zone\blackwing_lair\boss_broodlord_lashlayer.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_broodlord_lashlayer.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_chromaggus.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_chromaggus.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_ebonroc.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_ebonroc.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_firemaw.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_firemaw.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_flamegor.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_flamegor.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_nefarian.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_nefarian.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_razorgore.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_razorgore.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_vaelastrasz.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_vaelastrasz.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\boss_victor_nefarius.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\boss_victor_nefarius.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackwing_lair\instance_blackwing_lair.cpp"> + RelativePath="..\scripts\zone\blackwing_lair\instance_blackwing_lair.cpp" + > </File> </Filter> <Filter - Name="Bloodmyst Isle"> + Name="Bloodmyst Isle" + > <File - RelativePath="..\scripts\zone\bloodmyst_isle\bloodmyst_isle.cpp"> + RelativePath="..\scripts\zone\bloodmyst_isle\bloodmyst_isle.cpp" + > </File> </Filter> <Filter - Name="Gruul's Lair"> + Name="Gruul's Lair" + > <File - RelativePath="..\scripts\zone\gruuls_lair\boss_gruul.cpp"> + RelativePath="..\scripts\zone\gruuls_lair\boss_gruul.cpp" + > </File> <File - RelativePath="..\scripts\zone\gruuls_lair\boss_high_king_maulgar.cpp"> + RelativePath="..\scripts\zone\gruuls_lair\boss_high_king_maulgar.cpp" + > </File> <File - RelativePath="..\scripts\zone\gruuls_lair\def_gruuls_lair.h"> + RelativePath="..\scripts\zone\gruuls_lair\def_gruuls_lair.h" + > </File> <File - RelativePath="..\scripts\zone\gruuls_lair\instance_gruuls_lair.cpp"> + RelativePath="..\scripts\zone\gruuls_lair\instance_gruuls_lair.cpp" + > </File> </Filter> <Filter - Name="Burning Steppes"> + Name="Burning Steppes" + > <File - RelativePath="..\scripts\zone\burning_steppes\burning_steppes.cpp"> + RelativePath="..\scripts\zone\burning_steppes\burning_steppes.cpp" + > </File> </Filter> <Filter - Name="Darkshore"> + Name="Darkshore" + > <File - RelativePath="..\scripts\zone\darkshore\darkshore.cpp"> + RelativePath="..\scripts\zone\darkshore\darkshore.cpp" + > </File> </Filter> <Filter - Name="Eastern Plaguelands"> + Name="Eastern Plaguelands" + > <File - RelativePath="..\scripts\zone\eastern_plaguelands\eastern_plaguelands.cpp"> + RelativePath="..\scripts\zone\eastern_plaguelands\eastern_plaguelands.cpp" + > </File> </Filter> <Filter - Name="Moonglade"> + Name="Moonglade" + > <File - RelativePath="..\scripts\zone\moonglade\moonglade.cpp"> + RelativePath="..\scripts\zone\moonglade\moonglade.cpp" + > </File> </Filter> <Filter - Name="Razorfen Kraul"> + Name="Razorfen Kraul" + > </Filter> <Filter - Name="Redridge Mountains"> + Name="Redridge Mountains" + > </Filter> <Filter - Name="Ruins of Ahn'Qiraj"> + Name="Ruins of Ahn'Qiraj" + > <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_ayamiss.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_ayamiss.cpp" + > </File> <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_buru.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_buru.cpp" + > </File> <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_kurinnaxx.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_kurinnaxx.cpp" + > </File> <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_moam.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_moam.cpp" + > </File> <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_ossirian.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_ossirian.cpp" + > </File> <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_rajaxx.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\boss_rajaxx.cpp" + > </File> <File - RelativePath="..\scripts\zone\ruins_of_ahnqiraj\instance_ruins_of_ahnqiraj.cpp"> + RelativePath="..\scripts\zone\ruins_of_ahnqiraj\instance_ruins_of_ahnqiraj.cpp" + > </File> </Filter> <Filter - Name="Swamp of Sorrows"> + Name="Swamp of Sorrows" + > </Filter> <Filter - Name="Scarlet Monastery"> + Name="Scarlet Monastery" + > <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_arcanist_doan.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_arcanist_doan.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_azshir_the_sleepless.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_azshir_the_sleepless.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_bloodmage_thalnos.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_bloodmage_thalnos.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_herod.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_herod.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_fairbanks.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_fairbanks.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_whitemane.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_whitemane.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_houndmaster_loksey.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_houndmaster_loksey.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_interrogator_vishas.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_interrogator_vishas.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_scarlet_commander_mograine.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_scarlet_commander_mograine.cpp" + > </File> <File - RelativePath="..\scripts\zone\scarlet_monastery\boss_scorn.cpp"> + RelativePath="..\scripts\zone\scarlet_monastery\boss_scorn.cpp" + > </File> </Filter> <Filter - Name="Scholomance"> + Name="Scholomance" + > <File - RelativePath="..\scripts\zone\scholomance\boss_darkmaster_gandling.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_darkmaster_gandling.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_death_knight_darkreaver.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_death_knight_darkreaver.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_doctor_theolen_krastinov.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_doctor_theolen_krastinov.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_illucia_barov.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_illucia_barov.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_instructor_malicia.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_instructor_malicia.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_jandice_barov.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_jandice_barov.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_kormok.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_kormok.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_lord_alexei_barov.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_lord_alexei_barov.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_lorekeeper_polkelt.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_lorekeeper_polkelt.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_ras_frostwhisper.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_ras_frostwhisper.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_the_ravenian.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_the_ravenian.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\boss_vectus.cpp"> + RelativePath="..\scripts\zone\scholomance\boss_vectus.cpp" + > </File> <File - RelativePath="..\scripts\zone\scholomance\def_scholomance.h"> + RelativePath="..\scripts\zone\scholomance\def_scholomance.h" + > </File> <File - RelativePath="..\scripts\zone\scholomance\instance_scholomance.cpp"> + RelativePath="..\scripts\zone\scholomance\instance_scholomance.cpp" + > </File> </Filter> <Filter - Name="Searing Gorge"> + Name="Searing Gorge" + > <File - RelativePath="..\scripts\zone\searing_gorge\searing_gorge.cpp"> + RelativePath="..\scripts\zone\searing_gorge\searing_gorge.cpp" + > </File> </Filter> <Filter - Name="Elwynn Forest"> + Name="Elwynn Forest" + > <File - RelativePath="..\scripts\zone\elwynn_forest\elwynn_forest.cpp"> + RelativePath="..\scripts\zone\elwynn_forest\elwynn_forest.cpp" + > </File> </Filter> <Filter - Name="Felwood"> + Name="Felwood" + > <File - RelativePath="..\scripts\zone\felwood\felwood.cpp"> + RelativePath="..\scripts\zone\felwood\felwood.cpp" + > </File> </Filter> <Filter - Name="Feralas"> + Name="Feralas" + > <File - RelativePath="..\scripts\zone\feralas\feralas.cpp"> + RelativePath="..\scripts\zone\feralas\feralas.cpp" + > </File> </Filter> <Filter - Name="Gnomeregan"> + Name="Gnomeregan" + > </Filter> <Filter - Name="Hillsbrad Foothills"> + Name="Hillsbrad Foothills" + > </Filter> <Filter - Name="Hinterlands"> + Name="Hinterlands" + > </Filter> <Filter - Name="Maraudon"> + Name="Maraudon" + > <File - RelativePath="..\scripts\zone\maraudon\boss_celebras_the_cursed.cpp"> + RelativePath="..\scripts\zone\maraudon\boss_celebras_the_cursed.cpp" + > </File> <File - RelativePath="..\scripts\zone\maraudon\boss_landslide.cpp"> + RelativePath="..\scripts\zone\maraudon\boss_landslide.cpp" + > </File> <File - RelativePath="..\scripts\zone\maraudon\boss_noxxion.cpp"> + RelativePath="..\scripts\zone\maraudon\boss_noxxion.cpp" + > </File> <File - RelativePath="..\scripts\zone\maraudon\boss_princess_theradras.cpp"> + RelativePath="..\scripts\zone\maraudon\boss_princess_theradras.cpp" + > </File> </Filter> <Filter - Name="Molten Core"> + Name="Molten Core" + > <File - RelativePath="..\scripts\zone\molten_core\boss_baron_geddon.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_baron_geddon.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_garr.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_garr.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_gehennas.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_gehennas.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_golemagg.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_golemagg.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_lucifron.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_lucifron.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_magmadar.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_magmadar.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_majordomo_executus.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_majordomo_executus.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_ragnaros.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_ragnaros.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_shazzrah.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_shazzrah.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\boss_sulfuron_harbinger.cpp"> + RelativePath="..\scripts\zone\molten_core\boss_sulfuron_harbinger.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\def_molten_core.h"> + RelativePath="..\scripts\zone\molten_core\def_molten_core.h" + > </File> <File - RelativePath="..\scripts\zone\molten_core\instance_molten_core.cpp"> + RelativePath="..\scripts\zone\molten_core\instance_molten_core.cpp" + > </File> <File - RelativePath="..\scripts\zone\molten_core\molten_core.cpp"> + RelativePath="..\scripts\zone\molten_core\molten_core.cpp" + > </File> </Filter> <Filter - Name="Mulgore"> + Name="Mulgore" + > <File - RelativePath="..\scripts\zone\mulgore\mulgore.cpp"> + RelativePath="..\scripts\zone\mulgore\mulgore.cpp" + > </File> </Filter> <Filter - Name="Naxxramas"> + Name="Naxxramas" + > <File - RelativePath="..\scripts\zone\naxxramas\boss_anubrekhan.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_anubrekhan.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_faerlina.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_faerlina.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_feugen.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_feugen.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_gluth.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_gluth.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_gothik.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_gothik.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_grobbulus.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_grobbulus.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_heigan.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_heigan.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_highlord_mograine.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_highlord_mograine.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_kelthuzad.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_kelthuzad.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_lady_blaumeux.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_lady_blaumeux.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_loatheb.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_loatheb.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_maexxna.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_maexxna.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_noth.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_noth.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_patchwerk.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_patchwerk.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_razuvious.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_razuvious.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_sapphiron.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_sapphiron.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_sir_zeliek.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_sir_zeliek.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_stalagg.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_stalagg.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_thaddius.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_thaddius.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\boss_thane_korthazz.cpp"> + RelativePath="..\scripts\zone\naxxramas\boss_thane_korthazz.cpp" + > </File> <File - RelativePath="..\scripts\zone\naxxramas\instance_naxxramas.cpp"> + RelativePath="..\scripts\zone\naxxramas\instance_naxxramas.cpp" + > </File> </Filter> <Filter - Name="Onyxia's Lair"> + Name="Onyxia's Lair" + > <File - RelativePath="..\scripts\zone\onyxias_lair\boss_onyxia.cpp"> + RelativePath="..\scripts\zone\onyxias_lair\boss_onyxia.cpp" + > </File> </Filter> <Filter - Name="Ragefire Chasm"> + Name="Ragefire Chasm" + > </Filter> <Filter - Name="Razorfen Downs"> + Name="Razorfen Downs" + > <File - RelativePath="..\scripts\zone\razorfen_downs\boss_amnennar_the_coldbringer.cpp"> + RelativePath="..\scripts\zone\razorfen_downs\boss_amnennar_the_coldbringer.cpp" + > </File> </Filter> <Filter - Name="Shadowfang Keep"> + Name="Shadowfang Keep" + > <File - RelativePath="..\scripts\zone\shadowfang_keep\def_shadowfang_keep.h"> + RelativePath="..\scripts\zone\shadowfang_keep\def_shadowfang_keep.h" + > </File> <File - RelativePath="..\scripts\zone\shadowfang_keep\instance_shadowfang_keep.cpp"> + RelativePath="..\scripts\zone\shadowfang_keep\instance_shadowfang_keep.cpp" + > </File> <File - RelativePath="..\scripts\zone\shadowfang_keep\shadowfang_keep.cpp"> + RelativePath="..\scripts\zone\shadowfang_keep\shadowfang_keep.cpp" + > </File> </Filter> <Filter - Name="Stonetalon Mountains"> + Name="Stonetalon Mountains" + > <File - RelativePath="..\scripts\zone\stonetalon_mountains\stonetalon_mountains.cpp"> + RelativePath="..\scripts\zone\stonetalon_mountains\stonetalon_mountains.cpp" + > </File> </Filter> <Filter - Name="Stranglethorn Vale"> + Name="Stranglethorn Vale" + > <File - RelativePath="..\scripts\zone\stranglethorn_vale\stranglethorn_vale.cpp"> + RelativePath="..\scripts\zone\stranglethorn_vale\stranglethorn_vale.cpp" + > </File> </Filter> <Filter - Name="Stratholme"> + Name="Stratholme" + > <File - RelativePath="..\scripts\zone\stratholme\boss_baron_rivendare.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_baron_rivendare.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_baroness_anastari.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_baroness_anastari.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_cannon_master_willey.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_cannon_master_willey.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_dathrohan_balnazzar.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_dathrohan_balnazzar.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_magistrate_barthilas.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_magistrate_barthilas.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_maleki_the_pallid.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_maleki_the_pallid.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_nerubenkan.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_nerubenkan.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_order_of_silver_hand.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_order_of_silver_hand.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_postmaster_malown.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_postmaster_malown.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_ramstein_the_gorger.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_ramstein_the_gorger.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\boss_timmy_the_cruel.cpp"> + RelativePath="..\scripts\zone\stratholme\boss_timmy_the_cruel.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\def_stratholme.h"> + RelativePath="..\scripts\zone\stratholme\def_stratholme.h" + > </File> <File - RelativePath="..\scripts\zone\stratholme\instance_stratholme.cpp"> + RelativePath="..\scripts\zone\stratholme\instance_stratholme.cpp" + > </File> <File - RelativePath="..\scripts\zone\stratholme\stratholme.cpp"> + RelativePath="..\scripts\zone\stratholme\stratholme.cpp" + > </File> </Filter> <Filter - Name="Sunken Temple"> + Name="Sunken Temple" + > </Filter> <Filter - Name="Tanaris"> + Name="Tanaris" + > <File - RelativePath="..\scripts\zone\tanaris\tanaris.cpp"> + RelativePath="..\scripts\zone\tanaris\tanaris.cpp" + > </File> </Filter> <Filter - Name="Teldrassil"> + Name="Teldrassil" + > </Filter> <Filter - Name="Temple of Ahn'Qiraj"> + Name="Temple of Ahn'Qiraj" + > <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_bug_trio.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_bug_trio.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_cthun.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_cthun.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_fankriss.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_fankriss.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_huhuran.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_huhuran.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_ouro.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_ouro.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_sartura.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_sartura.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_skeram.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_skeram.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_twinemperors.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_twinemperors.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_viscidus.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\boss_viscidus.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\def_temple_of_ahnqiraj.h"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\def_temple_of_ahnqiraj.h" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\instance_temple_of_ahnqiraj.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\instance_temple_of_ahnqiraj.cpp" + > </File> <File - RelativePath="..\scripts\zone\temple_of_ahnqiraj\mob_anubisath_sentinel.cpp"> + RelativePath="..\scripts\zone\temple_of_ahnqiraj\mob_anubisath_sentinel.cpp" + > </File> </Filter> <Filter - Name="Thousand Needles"> + Name="Thousand Needles" + > </Filter> <Filter - Name="Silithus"> + Name="Silithus" + > <File - RelativePath="..\scripts\zone\silithus\silithus.cpp"> + RelativePath="..\scripts\zone\silithus\silithus.cpp" + > </File> </Filter> <Filter - Name="Silverpine Forest"> + Name="Silverpine Forest" + > <File - RelativePath="..\scripts\zone\silverpine_forest\silverpine_forest.cpp"> + RelativePath="..\scripts\zone\silverpine_forest\silverpine_forest.cpp" + > </File> </Filter> <Filter - Name="Stockade"> + Name="Stockade" + > </Filter> <Filter - Name="Tirisfal Glades"> + Name="Tirisfal Glades" + > <File - RelativePath="..\scripts\zone\tirisfal_glades\tirisfal_glades.cpp"> + RelativePath="..\scripts\zone\tirisfal_glades\tirisfal_glades.cpp" + > </File> </Filter> <Filter - Name="Wailing Caverns"> + Name="Wailing Caverns" + > <File - RelativePath="..\scripts\zone\wailing_caverns\instance_wailing_caverns.cpp"> + RelativePath="..\scripts\zone\wailing_caverns\instance_wailing_caverns.cpp" + > </File> </Filter> <Filter - Name="Western Plaguelands"> + Name="Western Plaguelands" + > <File - RelativePath="..\scripts\zone\western_plaguelands\western_plaguelands.cpp"> + RelativePath="..\scripts\zone\western_plaguelands\western_plaguelands.cpp" + > </File> </Filter> <Filter - Name="Westfall"> + Name="Westfall" + > </Filter> <Filter - Name="Wetlands"> + Name="Wetlands" + > </Filter> <Filter - Name="Winterspring"> + Name="Winterspring" + > <File - RelativePath="..\scripts\zone\winterspring\winterspring.cpp"> + RelativePath="..\scripts\zone\winterspring\winterspring.cpp" + > </File> </Filter> <Filter - Name="Zul'Farrak"> + Name="Zul'Farrak" + > <File - RelativePath="..\scripts\zone\zulfarrak\zulfarrak.cpp"> + RelativePath="..\scripts\zone\zulfarrak\zulfarrak.cpp" + > </File> </Filter> <Filter - Name="Zul'Gurub"> + Name="Zul'Gurub" + > <File - RelativePath="..\scripts\zone\zulgurub\boss_arlokk.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_arlokk.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_gahzranka.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_gahzranka.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_grilek.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_grilek.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_hakkar.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_hakkar.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_hazzarah.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_hazzarah.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_jeklik.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_jeklik.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_jindo.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_jindo.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_mandokir.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_mandokir.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_marli.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_marli.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_renataki.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_renataki.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_thekal.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_thekal.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_venoxis.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_venoxis.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\boss_wushoolay.cpp"> + RelativePath="..\scripts\zone\zulgurub\boss_wushoolay.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\def_zulgurub.h"> + RelativePath="..\scripts\zone\zulgurub\def_zulgurub.h" + > </File> <File - RelativePath="..\scripts\zone\zulgurub\instance_zulgurub.cpp"> + RelativePath="..\scripts\zone\zulgurub\instance_zulgurub.cpp" + > </File> </Filter> <Filter - Name="Uldaman"> + Name="Uldaman" + > <File - RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"> + RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp" + > </File> <File - RelativePath="..\scripts\zone\uldaman\uldaman.cpp"> + RelativePath="..\scripts\zone\uldaman\uldaman.cpp" + > </File> </Filter> <Filter - Name="Un'Goro Crater"> + Name="Un'Goro Crater" + > </Filter> <Filter - Name="Aunchindoun"> + Name="Aunchindoun" + > <Filter - Name="Auchenai Crypts"> + Name="Auchenai Crypts" + > <File - RelativePath="..\scripts\zone\aunchindoun\auchenai_crypts\boss_exarch_maladaar.cpp"> + RelativePath="..\scripts\zone\aunchindoun\auchenai_crypts\boss_exarch_maladaar.cpp" + > </File> </Filter> <Filter - Name="Mana Tombs"> + Name="Mana Tombs" + > <File - RelativePath="..\scripts\zone\aunchindoun\mana_tombs\boss_nexusprince_shaffar.cpp"> + RelativePath="..\scripts\zone\aunchindoun\mana_tombs\boss_nexusprince_shaffar.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\mana_tombs\boss_pandemonius.cpp"> + RelativePath="..\scripts\zone\aunchindoun\mana_tombs\boss_pandemonius.cpp" + > </File> </Filter> <Filter - Name="Sethekk Halls"> + Name="Sethekk Halls" + > <File - RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\boss_darkweaver_syth.cpp"> + RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\boss_darkweaver_syth.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\boss_tailonking_ikiss.cpp"> + RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\boss_tailonking_ikiss.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\def_sethekk_halls.h"> + RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\def_sethekk_halls.h" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\instance_sethekk_halls.cpp"> + RelativePath="..\scripts\zone\aunchindoun\sethekk_halls\instance_sethekk_halls.cpp" + > </File> </Filter> <Filter - Name="Shadow Labyrinth"> + Name="Shadow Labyrinth" + > <File - RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_ambassador_hellmaw.cpp"> + RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_ambassador_hellmaw.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_blackheart_the_inciter.cpp"> + RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_blackheart_the_inciter.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_grandmaster_vorpil.cpp"> + RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_grandmaster_vorpil.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_murmur.cpp"> + RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\boss_murmur.cpp" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\def_shadow_labyrinth.h"> + RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\def_shadow_labyrinth.h" + > </File> <File - RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\instance_shadow_labyrinth.cpp"> + RelativePath="..\scripts\zone\aunchindoun\shadow_labyrinth\instance_shadow_labyrinth.cpp" + > </File> </Filter> </Filter> <Filter - Name="Azuremyst Isle"> + Name="Azuremyst Isle" + > <File - RelativePath="..\scripts\zone\azuremyst_isle\azuremyst_isle.cpp"> + RelativePath="..\scripts\zone\azuremyst_isle\azuremyst_isle.cpp" + > </File> </Filter> <Filter - Name="Black Temple"> + Name="Black Temple" + > <File - RelativePath="..\scripts\zone\black_temple\black_temple.cpp"> + RelativePath="..\scripts\zone\black_temple\black_temple.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_bloodboil.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_bloodboil.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_illidan.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_illidan.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_mother_shahraz.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_mother_shahraz.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_reliquary_of_souls.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_reliquary_of_souls.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_shade_of_akama.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_shade_of_akama.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_supremus.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_supremus.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_teron_gorefiend.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_teron_gorefiend.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\boss_warlord_najentus.cpp"> + RelativePath="..\scripts\zone\black_temple\boss_warlord_najentus.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\def_black_temple.h"> + RelativePath="..\scripts\zone\black_temple\def_black_temple.h" + > </File> <File - RelativePath="..\scripts\zone\black_temple\illidari_council.cpp"> + RelativePath="..\scripts\zone\black_temple\illidari_council.cpp" + > </File> <File - RelativePath="..\scripts\zone\black_temple\instance_black_temple.cpp"> + RelativePath="..\scripts\zone\black_temple\instance_black_temple.cpp" + > </File> </Filter> <Filter - Name="Eversong Woods"> + Name="Eversong Woods" + > <File - RelativePath="..\scripts\zone\eversong_woods\eversong_woods.cpp"> + RelativePath="..\scripts\zone\eversong_woods\eversong_woods.cpp" + > </File> </Filter> <Filter - Name="Ghostlands"> + Name="Ghostlands" + > <File - RelativePath="..\scripts\zone\ghostlands\ghostlands.cpp"> + RelativePath="..\scripts\zone\ghostlands\ghostlands.cpp" + > </File> </Filter> <Filter - Name="Blade's Edge Mountains"> + Name="Blade's Edge Mountains" + > <File - RelativePath="..\scripts\zone\blades_edge_mountains\blades_edge_mountains.cpp"> + RelativePath="..\scripts\zone\blades_edge_mountains\blades_edge_mountains.cpp" + > </File> </Filter> <Filter - Name="Blasted Lands"> + Name="Blasted Lands" + > <File - RelativePath="..\scripts\zone\blasted_lands\blasted_lands.cpp"> + RelativePath="..\scripts\zone\blasted_lands\blasted_lands.cpp" + > </File> <File - RelativePath="..\scripts\zone\blasted_lands\boss_kruul.cpp"> + RelativePath="..\scripts\zone\blasted_lands\boss_kruul.cpp" + > </File> </Filter> <Filter - Name="Hellfire Citadel"> + Name="Hellfire Citadel" + > <Filter - Name="Blood Furnace"> + Name="Blood Furnace" + > <File - RelativePath="..\scripts\zone\hellfire_citadel\blood_furnace\boss_broggok.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\blood_furnace\boss_broggok.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\blood_furnace\boss_kelidan_the_breaker.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\blood_furnace\boss_kelidan_the_breaker.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\blood_furnace\boss_the_maker.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\blood_furnace\boss_the_maker.cpp" + > </File> </Filter> <Filter - Name="Magtheridon's lair"> + Name="Magtheridon's lair" + > <File - RelativePath="..\scripts\zone\hellfire_citadel\magtheridons_lair\boss_magtheridon.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\magtheridons_lair\boss_magtheridon.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\magtheridons_lair\def_magtheridons_lair.h"> + RelativePath="..\scripts\zone\hellfire_citadel\magtheridons_lair\def_magtheridons_lair.h" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\magtheridons_lair\instance_magtheridons_lair.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\magtheridons_lair\instance_magtheridons_lair.cpp" + > </File> </Filter> <Filter - Name="Hellfire Ramparts"> + Name="Hellfire Ramparts" + > <File - RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_omor_the_unscarred.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_omor_the_unscarred.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_watchkeeper_gargolmar.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_watchkeeper_gargolmar.cpp" + > </File> </Filter> <Filter - Name="Shattered Halls"> + Name="Shattered Halls" + > <File - RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\boss_nethekurse.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\boss_nethekurse.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\boss_warbringer_omrogg.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\boss_warbringer_omrogg.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\def_shattered_halls.h"> + RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\def_shattered_halls.h" + > </File> <File - RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\instance_shattered_halls.cpp"> + RelativePath="..\scripts\zone\hellfire_citadel\shattered_halls\instance_shattered_halls.cpp" + > </File> </Filter> </Filter> <Filter - Name="Hellfire Peninsula"> + Name="Hellfire Peninsula" + > <File - RelativePath="..\scripts\zone\hellfire_peninsula\boss_doomlord_kazzak.cpp"> + RelativePath="..\scripts\zone\hellfire_peninsula\boss_doomlord_kazzak.cpp" + > </File> <File - RelativePath="..\scripts\zone\hellfire_peninsula\hellfire_peninsula.cpp"> + RelativePath="..\scripts\zone\hellfire_peninsula\hellfire_peninsula.cpp" + > </File> </Filter> <Filter - Name="Karazhan"> + Name="Karazhan" + > <File - RelativePath="..\scripts\zone\karazhan\boss_curator.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_curator.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_maiden_of_virtue.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_maiden_of_virtue.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_midnight.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_midnight.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_moroes.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_moroes.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_netherspite.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_netherspite.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_nightbane.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_nightbane.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_prince_malchezaar.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_prince_malchezaar.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_shade_of_aran.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_shade_of_aran.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\boss_terestian_illhoof.cpp"> + RelativePath="..\scripts\zone\karazhan\boss_terestian_illhoof.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\bosses_opera.cpp"> + RelativePath="..\scripts\zone\karazhan\bosses_opera.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\def_karazhan.h"> + RelativePath="..\scripts\zone\karazhan\def_karazhan.h" + > </File> <File - RelativePath="..\scripts\zone\karazhan\instance_karazhan.cpp"> + RelativePath="..\scripts\zone\karazhan\instance_karazhan.cpp" + > </File> <File - RelativePath="..\scripts\zone\karazhan\karazhan.cpp"> + RelativePath="..\scripts\zone\karazhan\karazhan.cpp" + > </File> </Filter> <Filter - Name="Nagrand"> + Name="Nagrand" + > <File - RelativePath="..\scripts\zone\nagrand\nagrand.cpp"> + RelativePath="..\scripts\zone\nagrand\nagrand.cpp" + > </File> </Filter> <Filter - Name="Netherstorm"> + Name="Netherstorm" + > <File - RelativePath="..\scripts\zone\netherstorm\netherstorm.cpp"> + RelativePath="..\scripts\zone\netherstorm\netherstorm.cpp" + > </File> </Filter> <Filter - Name="Shadowmoon Valley"> + Name="Shadowmoon Valley" + > <File - RelativePath="..\scripts\zone\shadowmoon_valley\boss_doomwalker.cpp"> + RelativePath="..\scripts\zone\shadowmoon_valley\boss_doomwalker.cpp" + > </File> <File - RelativePath="..\scripts\zone\shadowmoon_valley\shadowmoon_valley.cpp"> + RelativePath="..\scripts\zone\shadowmoon_valley\shadowmoon_valley.cpp" + > </File> </Filter> <Filter - Name="Tempest Keep"> + Name="Tempest Keep" + > <Filter - Name="Arcatraz"> + Name="Arcatraz" + > <File - RelativePath="..\scripts\zone\tempest_keep\arcatraz\arcatraz.cpp"> + RelativePath="..\scripts\zone\tempest_keep\arcatraz\arcatraz.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\arcatraz\boss_harbinger_skyriss.cpp"> + RelativePath="..\scripts\zone\tempest_keep\arcatraz\boss_harbinger_skyriss.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\arcatraz\def_arcatraz.h"> + RelativePath="..\scripts\zone\tempest_keep\arcatraz\def_arcatraz.h" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\arcatraz\instance_arcatraz.cpp"> + RelativePath="..\scripts\zone\tempest_keep\arcatraz\instance_arcatraz.cpp" + > </File> </Filter> <Filter - Name="Botanica"> + Name="Botanica" + > <File - RelativePath="..\scripts\zone\tempest_keep\botanica\boss_high_botanist_freywinn.cpp"> + RelativePath="..\scripts\zone\tempest_keep\botanica\boss_high_botanist_freywinn.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\botanica\boss_laj.cpp"> + RelativePath="..\scripts\zone\tempest_keep\botanica\boss_laj.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\botanica\boss_warp_splinter.cpp"> + RelativePath="..\scripts\zone\tempest_keep\botanica\boss_warp_splinter.cpp" + > </File> </Filter> <Filter - Name="The Eye"> + Name="The Eye" + > <File - RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_astromancer.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_astromancer.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_kaelthas.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_kaelthas.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_void_reaver.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_void_reaver.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_eye\def_the_eye.h"> + RelativePath="..\scripts\zone\tempest_keep\the_eye\def_the_eye.h" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_eye\instance_the_eye.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_eye\instance_the_eye.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_eye\the_eye.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_eye\the_eye.cpp" + > </File> </Filter> <Filter - Name="The Mechanar"> + Name="The Mechanar" + > <File - RelativePath="..\scripts\zone\tempest_keep\the_mechanar\boss_gatewatcher_gyrokill.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_mechanar\boss_gatewatcher_gyrokill.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_mechanar\boss_gatewatcher_ironhand.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_mechanar\boss_gatewatcher_ironhand.cpp" + > </File> <File - RelativePath="..\scripts\zone\tempest_keep\the_mechanar\boss_nethermancer_sepethrea.cpp"> + RelativePath="..\scripts\zone\tempest_keep\the_mechanar\boss_nethermancer_sepethrea.cpp" + > </File> </Filter> </Filter> <Filter - Name="Terokkar Forest"> + Name="Terokkar Forest" + > <File - RelativePath="..\scripts\zone\terokkar_forest\terokkar_forest.cpp"> + RelativePath="..\scripts\zone\terokkar_forest\terokkar_forest.cpp" + > </File> </Filter> <Filter - Name="Zangarmarsh"> + Name="Zangarmarsh" + > <File - RelativePath="..\scripts\zone\zangarmarsh\zangarmarsh.cpp"> + RelativePath="..\scripts\zone\zangarmarsh\zangarmarsh.cpp" + > </File> </Filter> <Filter - Name="Blackrock Spire"> + Name="Blackrock Spire" + > <File - RelativePath="..\scripts\zone\blackrock_spire\boss_drakkisath.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_drakkisath.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_gyth.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_gyth.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_halycon.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_halycon.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_highlord_omokk.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_highlord_omokk.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_mother_smolderweb.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_mother_smolderweb.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_overlord_wyrmthalak.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_overlord_wyrmthalak.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_pyroguard_emberseer.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_pyroguard_emberseer.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_quartermaster_zigris.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_quartermaster_zigris.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_rend_blackhand.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_rend_blackhand.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_shadow_hunter_voshgajin.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_shadow_hunter_voshgajin.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_the_beast.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_the_beast.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_spire\boss_warmaster_voone.cpp"> + RelativePath="..\scripts\zone\blackrock_spire\boss_warmaster_voone.cpp" + > </File> </Filter> <Filter - Name="Stormwind City"> + Name="Stormwind City" + > <File - RelativePath="..\scripts\zone\stormwind\stormwind_city.cpp"> + RelativePath="..\scripts\zone\stormwind\stormwind_city.cpp" + > </File> </Filter> <Filter - Name="Coilfang Resevoir"> + Name="Coilfang Resevoir" + > <Filter - Name="Serpent Shrine Cavern"> + Name="Serpent Shrine Cavern" + > <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_fathomlord_karathress.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_fathomlord_karathress.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_hydross_the_unstable.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_hydross_the_unstable.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lady_vashj.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lady_vashj.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_leotheras_the_blind.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_leotheras_the_blind.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_morogrim_tidewalker.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_morogrim_tidewalker.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\def_serpent_shrine.h"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\def_serpent_shrine.h" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\instance_serpent_shrine.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\instance_serpent_shrine.cpp" + > </File> </Filter> <Filter - Name="Slave Pens"> + Name="Slave Pens" + > </Filter> <Filter - Name="Steam Vault"> + Name="Steam Vault" + > <File - RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\boss_hydromancer_thespia.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\boss_hydromancer_thespia.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\boss_mekgineer_steamrigger.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\boss_mekgineer_steamrigger.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\boss_warlord_kalithresh.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\boss_warlord_kalithresh.cpp" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\def_steam_vault.h"> + RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\def_steam_vault.h" + > </File> <File - RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\instance_steam_vault.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\steam_vault\instance_steam_vault.cpp" + > </File> </Filter> <Filter - Name="Underbog"> + Name="Underbog" + > <File - RelativePath="..\scripts\zone\coilfang_resevoir\underbog\boss_hungarfen.cpp"> + RelativePath="..\scripts\zone\coilfang_resevoir\underbog\boss_hungarfen.cpp" + > </File> </Filter> </Filter> <Filter - Name="Caverns of Time"> + Name="Caverns of Time" + > <Filter - Name="The Dark Portal"> + Name="The Dark Portal" + > <File - RelativePath="..\scripts\zone\caverns_of_time\dark_portal\boss_aeonus.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\dark_portal\boss_aeonus.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\dark_portal\boss_chrono_lord_deja.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\dark_portal\boss_chrono_lord_deja.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\dark_portal\boss_temporus.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\dark_portal\boss_temporus.cpp" + > </File> </Filter> <Filter - Name="Battle for Mt. Hyjal"> + Name="Battle for Mt. Hyjal" + > <File - RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_archimonde.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_archimonde.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\hyjal\def_hyjal.h"> + RelativePath="..\scripts\zone\caverns_of_time\hyjal\def_hyjal.h" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.h"> + RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.h" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\hyjal\instance_hyjal.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\hyjal\instance_hyjal.cpp" + > </File> </Filter> <Filter - Name="Old Hillsbrad"> + Name="Old Hillsbrad" + > <File - RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\boss_captain_skarloc.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\boss_captain_skarloc.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\boss_epoch_hunter.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\boss_epoch_hunter.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\boss_leutenant_drake.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\boss_leutenant_drake.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\def_old_hillsbrad.h"> + RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\def_old_hillsbrad.h" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\instance_old_hillsbrad.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\instance_old_hillsbrad.cpp" + > </File> <File - RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\old_hillsbrad.cpp"> + RelativePath="..\scripts\zone\caverns_of_time\old_hillsbrad\old_hillsbrad.cpp" + > </File> </Filter> </Filter> <Filter - Name="Silvermoon City"> + Name="Silvermoon City" + > <File - RelativePath="..\scripts\zone\silvermoon\silvermoon_city.cpp"> + RelativePath="..\scripts\zone\silvermoon\silvermoon_city.cpp" + > </File> </Filter> <Filter - Name="Darnassus"> + Name="Darnassus" + > </Filter> <Filter - Name="Exodar"> + Name="Exodar" + > </Filter> <Filter - Name="Iron Forge"> + Name="Iron Forge" + > <File - RelativePath="..\scripts\zone\ironforge\ironforge.cpp"> + RelativePath="..\scripts\zone\ironforge\ironforge.cpp" + > </File> </Filter> <Filter - Name="Orgrimmar"> + Name="Orgrimmar" + > <File - RelativePath="..\scripts\zone\orgrimmar\orgrimmar.cpp"> + RelativePath="..\scripts\zone\orgrimmar\orgrimmar.cpp" + > </File> </Filter> <Filter - Name="Shattrath City"> + Name="Shattrath City" + > <File - RelativePath="..\scripts\zone\shattrath\shattrath_city.cpp"> + RelativePath="..\scripts\zone\shattrath\shattrath_city.cpp" + > </File> </Filter> <Filter - Name="Thunder Bluff"> + Name="Thunder Bluff" + > <File - RelativePath="..\scripts\zone\thunder_bluff\thunder_bluff.cpp"> + RelativePath="..\scripts\zone\thunder_bluff\thunder_bluff.cpp" + > </File> </Filter> <Filter - Name="Undercity"> + Name="Undercity" + > <File - RelativePath="..\scripts\zone\undercity\undercity.cpp"> + RelativePath="..\scripts\zone\undercity\undercity.cpp" + > </File> </Filter> <Filter - Name="Zul'Aman"> + Name="Zul'Aman" + > <File - RelativePath="..\scripts\zone\zulaman\boss_janalai.cpp"> + RelativePath="..\scripts\zone\zulaman\boss_akilzon.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulaman\boss_nalorakk.cpp"> + RelativePath="..\scripts\zone\zulaman\boss_halazzi.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulaman\def_zulaman.h"> + RelativePath="..\scripts\zone\zulaman\boss_hexlord.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulaman\instance_zulaman.cpp"> + RelativePath="..\scripts\zone\zulaman\boss_janalai.cpp" + > </File> <File - RelativePath="..\scripts\zone\zulaman\zulaman.cpp"> + RelativePath="..\scripts\zone\zulaman\boss_nalorakk.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\boss_zuljin.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\def_zulaman.h" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\instance_zulaman.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\zulaman.cpp" + > </File> </Filter> <Filter - Name="Isle of Quel'Danas"> + Name="Isle of Quel'Danas" + > <File - RelativePath="..\scripts\zone\isle_of_queldanas\isle_of_queldanas.cpp"> + RelativePath="..\scripts\zone\isle_of_queldanas\isle_of_queldanas.cpp" + > </File> </Filter> <Filter - Name="Magister's Terrace"> + Name="Magister's Terrace" + > <File - RelativePath="..\scripts\zone\magisters_terrace\boss_felblood_kaelthas.cpp"> + RelativePath="..\scripts\zone\magisters_terrace\boss_felblood_kaelthas.cpp" + > </File> <File - RelativePath="..\scripts\zone\magisters_terrace\boss_priestess_delrissa.cpp"> + RelativePath="..\scripts\zone\magisters_terrace\boss_priestess_delrissa.cpp" + > </File> <File - RelativePath="..\scripts\zone\magisters_terrace\boss_selin_fireheart.cpp"> + RelativePath="..\scripts\zone\magisters_terrace\boss_selin_fireheart.cpp" + > </File> <File - RelativePath="..\scripts\zone\magisters_terrace\boss_vexallus.cpp"> + RelativePath="..\scripts\zone\magisters_terrace\boss_vexallus.cpp" + > </File> <File - RelativePath="..\scripts\zone\magisters_terrace\def_magisters_terrace.h"> + RelativePath="..\scripts\zone\magisters_terrace\def_magisters_terrace.h" + > </File> <File - RelativePath="..\scripts\zone\magisters_terrace\instance_magisters_terrace.cpp"> + RelativePath="..\scripts\zone\magisters_terrace\instance_magisters_terrace.cpp" + > </File> </Filter> <Filter - Name="Sunwell Plateau"> + Name="Sunwell Plateau" + > <File - RelativePath="..\scripts\zone\sunwell_plateau\boss_brutallus.cpp"> + RelativePath="..\scripts\zone\sunwell_plateau\boss_brutallus.cpp" + > </File> <File - RelativePath="..\scripts\zone\sunwell_plateau\boss_kalecgos.cpp"> + RelativePath="..\scripts\zone\sunwell_plateau\boss_kalecgos.cpp" + > </File> <File - RelativePath="..\scripts\zone\sunwell_plateau\def_sunwell_plateau.h"> + RelativePath="..\scripts\zone\sunwell_plateau\def_sunwell_plateau.h" + > </File> <File - RelativePath="..\scripts\zone\sunwell_plateau\instance_sunwell_plateau.cpp"> + RelativePath="..\scripts\zone\sunwell_plateau\instance_sunwell_plateau.cpp" + > </File> </Filter> <Filter - Name="Blackrock Depths"> + Name="Blackrock Depths" + > <File - RelativePath="..\scripts\zone\blackrock_depths\blackrock_depths.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\blackrock_depths.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_ambassador_flamelash.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_ambassador_flamelash.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_angerrel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_angerrel.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_anubshiah.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_anubshiah.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_doomrel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_doomrel.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_doperel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_doperel.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_emperor_dagran_thaurissan.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_emperor_dagran_thaurissan.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_general_angerforge.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_general_angerforge.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_gloomrel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_gloomrel.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_gorosh_the_dervish.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_gorosh_the_dervish.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_grizzle.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_grizzle.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_haterel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_haterel.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_high_interrogator_gerstahn.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_high_interrogator_gerstahn.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_magmus.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_magmus.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_moira_bronzebeard.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_moira_bronzebeard.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_seethrel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_seethrel.cpp" + > </File> <File - RelativePath="..\scripts\zone\blackrock_depths\boss_vilerel.cpp"> + RelativePath="..\scripts\zone\blackrock_depths\boss_vilerel.cpp" + > </File> </Filter> <Filter - Name="Loch Modan"> + Name="Loch Modan" + > <File - RelativePath="..\scripts\zone\loch_modan\loch_modan.cpp"> + RelativePath="..\scripts\zone\loch_modan\loch_modan.cpp" + > </File> </Filter> </Filter> </Filter> <Filter - Name="Include"> + Name="Include" + > <File - RelativePath="..\include\precompiled.cpp"> + RelativePath="..\include\precompiled.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> <FileConfiguration - Name="Debug|Win32"> + Name="Release|Win32" + > <Tool Name="VCCLCompilerTool" - UsePrecompiledHeader="1"/> + UsePrecompiledHeader="1" + /> </FileConfiguration> <FileConfiguration - Name="Release|Win32"> + Name="Release|x64" + > <Tool Name="VCCLCompilerTool" - UsePrecompiledHeader="1"/> + UsePrecompiledHeader="1" + /> </FileConfiguration> </File> <File - RelativePath="..\include\precompiled.h"> + RelativePath="..\include\precompiled.h" + > </File> <File - RelativePath="..\include\sc_creature.cpp"> + RelativePath="..\include\sc_creature.cpp" + > </File> <File - RelativePath="..\include\sc_creature.h"> + RelativePath="..\include\sc_creature.h" + > </File> <File - RelativePath="..\include\sc_gossip.h"> + RelativePath="..\include\sc_gossip.h" + > </File> <File - RelativePath="..\include\sc_instance.h"> + RelativePath="..\include\sc_instance.h" + > </File> <File - RelativePath="..\include\sc_item.h"> + RelativePath="..\include\sc_item.h" + > </File> </Filter> <File - RelativePath="..\config.h"> + RelativePath="..\config.h" + > </File> <File - RelativePath="..\ScriptMgr.cpp"> + RelativePath="..\ScriptMgr.cpp" + > </File> <File - RelativePath="..\ScriptMgr.h"> + RelativePath="..\ScriptMgr.h" + > </File> <File - RelativePath="..\svn_revision.h"> + RelativePath="..\svn_revision.h" + > </File> <File - RelativePath="..\system.cpp"> + RelativePath="..\system.cpp" + > </File> </Files> <Globals> diff --git a/src/bindings/scripts/VC80/80ScriptDev2.vcproj b/src/bindings/scripts/VC80/80ScriptDev2.vcproj index d97e8c3b48b..7953c2093f3 100644 --- a/src/bindings/scripts/VC80/80ScriptDev2.vcproj +++ b/src/bindings/scripts/VC80/80ScriptDev2.vcproj @@ -2079,6 +2079,18 @@ Name="Zul'Aman" > <File + RelativePath="..\scripts\zone\zulaman\boss_akilzon.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\boss_halazzi.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\boss_hexlord.cpp" + > + </File> + <File RelativePath="..\scripts\zone\zulaman\boss_janalai.cpp" > </File> @@ -2087,6 +2099,10 @@ > </File> <File + RelativePath="..\scripts\zone\zulaman\boss_zuljin.cpp" + > + </File> + <File RelativePath="..\scripts\zone\zulaman\def_zulaman.h" > </File> diff --git a/src/bindings/scripts/VC90/90ScriptDev2.vcproj b/src/bindings/scripts/VC90/90ScriptDev2.vcproj index 69486ad2325..3e9a52e6401 100644 --- a/src/bindings/scripts/VC90/90ScriptDev2.vcproj +++ b/src/bindings/scripts/VC90/90ScriptDev2.vcproj @@ -2077,6 +2077,18 @@ Name="Zul'Aman" > <File + RelativePath="..\scripts\zone\zulaman\boss_akilzon.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\boss_halazzi.cpp" + > + </File> + <File + RelativePath="..\scripts\zone\zulaman\boss_hexlord.cpp" + > + </File> + <File RelativePath="..\scripts\zone\zulaman\boss_janalai.cpp" > </File> @@ -2085,6 +2097,10 @@ > </File> <File + RelativePath="..\scripts\zone\zulaman\boss_zuljin.cpp" + > + </File> + <File RelativePath="..\scripts\zone\zulaman\def_zulaman.h" > </File> diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp new file mode 100644 index 00000000000..d175a4a2143 --- /dev/null +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp @@ -0,0 +1,524 @@ +/* Copyright ?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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: boss_Akilzon
+SD%Complete: 75%
+SDComment: Missing timer for Call Lightning and Sound ID's
+SQLUpdate:
+#Temporary fix for Soaring Eagles
+
+EndScriptData */
+
+#include "precompiled.h"
+#include "def_zulaman.h"
+#include "Spell.h"
+#include "Weather.h"
+
+#define SPELL_STATIC_DISRUPTION 43622
+#define SPELL_STATIC_VISUAL 45265
+#define SPELL_CALL_LIGHTNING 43661 //Missing timer
+#define SPELL_GUST_OF_WIND 43621
+#define SPELL_ELECTRICAL_STORM 43648
+#define SPELL_BERSERK 45078
+
+#define SPELL_EAGLE_SWOOP 44732
+
+//"Your death gonna be quick, strangers. You shoulda never have come to this place..."
+#define SAY_ONAGGRO "I be da predator! You da prey..."
+#define SAY_ONDEATH "You can't... kill... me spirit!"
+#define SAY_ONSLAY1 "Ya got nothin'!"
+#define SAY_ONSLAY2 "Stop your cryin'!"
+#define SAY_ONSUMMON "Feed, me bruddahs!"
+#define SAY_ONENRAGE "All you be doing is wasting my time!"
+#define SOUND_ONAGGRO 12013
+#define SOUND_ONDEATH 12019
+#define SOUND_ONSLAY1 12017
+#define SOUND_ONSLAY2 12018
+#define SOUND_ONSUMMON 12014
+#define SOUND_ONENRAGE 12016
+
+#define MOB_SOARING_EAGLE 24858
+#define SE_LOC_X_MAX 400
+#define SE_LOC_X_MIN 335
+#define SE_LOC_Y_MAX 1435
+#define SE_LOC_Y_MIN 1370
+
+#define MOB_TEMP_TRIGGER 23920
+
+struct TRINITY_DLL_DECL boss_akilzonAI : public ScriptedAI
+{
+ boss_akilzonAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Reset();
+ }
+ ScriptedInstance *pInstance;
+
+ uint64 TargetGUID;
+ uint64 CycloneGUID;
+ uint64 CloudGUID;
+
+ uint32 StaticDisruption_Timer;
+ uint32 GustOfWind_Timer;
+ uint32 CallLighting_Timer;
+ uint32 ElectricalStorm_Timer;
+ uint32 SDisruptAOEVisual_Timer;
+ uint32 SummonEagles_Timer;
+ uint32 Enrage_Timer;
+
+ uint32 StormCount;
+ uint32 StormSequenceTimer;
+
+ bool isRaining;
+
+ void Reset()
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_AKILZONEVENT, NOT_STARTED);
+
+ StaticDisruption_Timer = (10+rand()%10)*1000; //10 to 20 seconds (bosskillers)
+ GustOfWind_Timer = (20+rand()%10)*1000; //20 to 30 seconds(bosskillers)
+ CallLighting_Timer = (10+rand()%10)*1000; //totaly random timer. can't find any info on this
+ ElectricalStorm_Timer = 60*1000; //60 seconds(bosskillers)
+ Enrage_Timer = 10*60*1000; //10 minutes till enrage(bosskillers)
+ SDisruptAOEVisual_Timer = 99999;
+ SummonEagles_Timer = 99999;
+
+ TargetGUID = 0;
+ CloudGUID = 0;
+ CycloneGUID = 0;
+
+ StormCount = 0;
+ StormSequenceTimer = 0;
+
+ isRaining = false;
+
+ DespawnSummons(MOB_SOARING_EAGLE);
+ SetWeather(WEATHER_STATE_FINE, 0.0f);
+ }
+
+ void Aggro(Unit *who)
+ {
+ DoYell(SAY_ONAGGRO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_ONAGGRO);
+ DoZoneInCombat();
+ if(pInstance)
+ pInstance->SetData(DATA_AKILZONEVENT, IN_PROGRESS);
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ DoYell(SAY_ONDEATH,LANG_UNIVERSAL,NULL);
+ DoPlaySoundToSet(m_creature, SOUND_ONDEATH);
+ if(pInstance)
+ pInstance->SetData(DATA_AKILZONEVENT, DONE);
+ DespawnSummons(MOB_SOARING_EAGLE);
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ switch(rand()%2)
+ {
+ case 0:
+ DoYell(SAY_ONSLAY1, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_ONSLAY1);
+ break;
+ case 1:
+ DoYell(SAY_ONSLAY2, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_ONSLAY2);
+ break;
+ }
+ }
+
+ void DespawnSummons(uint32 entry)
+ {
+ 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()));
+ }
+
+ for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end(); ++i)
+ {
+ (*i)->SetVisibility(VISIBILITY_OFF);
+ (*i)->setDeathState(JUST_DIED);
+ }
+ }
+
+ Player* SelectRandomPlayer(float range = 0.0f, bool alive = true)
+ {
+ Map *map = m_creature->GetMap();
+ if (!map->IsDungeon()) return NULL;
+
+ InstanceMap::PlayerList PlayerList = ((InstanceMap*)map)->GetPlayers();
+ InstanceMap::PlayerList::iterator i;
+ while(PlayerList.size())
+ {
+ i = PlayerList.begin();
+ advance(i, rand()%PlayerList.size());
+ if((range == 0.0f || m_creature->IsWithinDistInMap(*i, range))
+ && (!alive || (*i)->isTargetableForAttack()))
+ return *i;
+ else
+ PlayerList.erase(i);
+ }
+ return NULL;
+ }
+
+ void SetWeather(uint32 weather, float grade)
+ {
+ Map *map = m_creature->GetMap();
+ if (!map->IsDungeon()) return;
+
+ WorldPacket data(SMSG_WEATHER, (4+4+4));
+ data << uint32(weather) << (float)grade << uint8(0);
+
+ ((InstanceMap*)map)->SendToPlayers(&data);
+ }
+
+ void HandleStormSequence(Unit *Cloud) // 1: begin, 2-9: tick, 10: end
+ {
+ if(StormCount < 10 && StormCount > 1)
+ {
+ // deal damage
+ int32 bp0 = 800;
+ for(uint8 i = 2; i < StormCount; ++i)
+ bp0 *= 2;
+
+ CellPair p(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
+ Cell cell(p);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
+
+ std::list<Unit *> tempUnitMap;
+
+ {
+ Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, m_creature, 999);
+ Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check);
+
+ TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
+ TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
+
+ CellLock<GridReadGuard> cell_lock(cell, p);
+ cell_lock->Visit(cell_lock, world_unit_searcher, *(m_creature->GetMap()));
+ cell_lock->Visit(cell_lock, grid_unit_searcher, *(m_creature->GetMap()));
+ }
+
+ for(std::list<Unit*>::iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i)
+ {
+ if(!Cloud->IsWithinDistInMap(*i, 15))
+ {
+ float x, y, z;
+ (*i)->GetPosition(x, y, z);
+ x = rand()%2 ? x + rand()%5 : x - rand()%5;
+ y = rand()%2 ? y + rand()%5 : y - rand()%5;
+ z = Cloud->GetPositionZ() + 2 - rand()%4;
+ if(Unit *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000))
+ {
+ trigger->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ trigger->StopMoving();
+ trigger->CastSpell(trigger, 37248, true);
+ trigger->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, m_creature->GetGUID());
+ }
+ }
+ }
+
+ // visual
+ float x, y, z;
+ for(uint8 i = 0; i < StormCount; ++i)
+ {
+ Cloud->GetPosition(x, y, z);
+ x = rand()%2 ? x + rand()%10 : x - rand()%10;
+ y = rand()%2 ? y + rand()%10 : y - rand()%10;
+ z = z + 2 - rand()%4;
+ if(Unit *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000))
+ {
+ trigger->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ trigger->StopMoving();
+ trigger->CastSpell(trigger, 37248, true);
+ }
+ Cloud->GetPosition(x, y, z);
+ x = rand()%2 ? x + 10 + rand()%10 : x - 10 - rand()%10;
+ y = rand()%2 ? y + 10 + rand()%10 : y - 10 - rand()%10;
+ if(Unit *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2000))
+ {
+ trigger->SetMaxHealth(9999999);
+ trigger->SetHealth(9999999);
+ trigger->CastSpell(trigger, 43661, true);
+ }
+ }
+ }
+
+ StormCount++;
+ if(StormCount > 10)
+ {
+ StormCount = 0; // finish
+ SummonEagles_Timer = 5000;
+ m_creature->InterruptNonMeleeSpells(false);
+ Cloud->RemoveAurasDueToSpell(45213);
+ CloudGUID = 0;
+ if(Unit* Cyclone = Unit::GetUnit(*m_creature, CycloneGUID))
+ Cyclone->RemoveAurasDueToSpell(25160);
+ SetWeather(WEATHER_STATE_FINE, 0.0f);
+ isRaining = false;
+ }
+
+ StormSequenceTimer = 1000;
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!m_creature->SelectHostilTarget() && !m_creature->getVictim())
+ return;
+
+ if(StormCount)
+ {
+ Unit* target = Unit::GetUnit(*m_creature, CloudGUID);
+ if(!target || !target->isAlive())
+ {
+ EnterEvadeMode();
+ return;
+ }
+ else if(Unit* Cyclone = Unit::GetUnit(*m_creature, CycloneGUID))
+ Cyclone->CastSpell(target, 25160, true); // keep casting or...
+
+ if(StormSequenceTimer < diff) {
+ HandleStormSequence(target);
+ }else StormSequenceTimer -= diff;
+ return;
+ }
+
+ if (Enrage_Timer < diff) {
+ DoYell(SAY_ONENRAGE, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_ONENRAGE);
+ m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
+ Enrage_Timer = 600000;
+ }else Enrage_Timer -= diff;
+
+ if (StaticDisruption_Timer < diff) {
+ Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
+ if(!target) target = m_creature->getVictim();
+ TargetGUID = target->GetGUID();
+ m_creature->CastSpell(target, SPELL_STATIC_DISRUPTION, false);
+ m_creature->SetInFront(m_creature->getVictim());
+ StaticDisruption_Timer = (10+rand()%8)*1000; // < 20s
+
+ float dist = m_creature->GetDistance(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
+ if (dist < 5.0f) dist = 5.0f;
+ SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);
+ }else StaticDisruption_Timer -= diff;
+
+ if (SDisruptAOEVisual_Timer < diff) {
+ Unit* SDVictim = Unit::GetUnit((*m_creature), TargetGUID);
+ if(SDVictim && SDVictim->isAlive())
+ SDVictim->CastSpell(SDVictim, SPELL_STATIC_VISUAL, true);
+ SDisruptAOEVisual_Timer = 99999;
+ TargetGUID = 0;
+ }else SDisruptAOEVisual_Timer -= diff;
+
+ if (GustOfWind_Timer < diff) {
+ Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
+ if(!target) target = m_creature->getVictim();
+ DoCast(target, SPELL_GUST_OF_WIND);
+ GustOfWind_Timer = (20+rand()%10)*1000; //20 to 30 seconds(bosskillers)
+ } else GustOfWind_Timer -= diff;
+
+ if (CallLighting_Timer < diff) {
+ DoCast(m_creature->getVictim(), SPELL_CALL_LIGHTNING);
+ CallLighting_Timer = (12 + rand()%5)*1000; //totaly random timer. can't find any info on this
+ } else CallLighting_Timer -= diff;
+
+ if (!isRaining && ElectricalStorm_Timer < 8000 + rand()%5000) {
+ SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f);
+ isRaining = true;
+ }
+
+ if (ElectricalStorm_Timer < diff) {
+ Unit* target = SelectRandomPlayer(50);
+ if(!target) target = m_creature->getVictim();
+ float x, y, z;
+ target->GetPosition(x, y, z);
+ Unit *Cloud = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, m_creature->GetPositionZ() + 10, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
+ if(Cloud)
+ {
+ CloudGUID = Cloud->GetGUID();
+ Cloud->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ Cloud->StopMoving();
+ Cloud->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f);
+ Cloud->setFaction(35);
+ Cloud->SetMaxHealth(9999999);
+ Cloud->SetHealth(9999999);
+ Cloud->CastSpell(Cloud, 45213, true); // cloud visual
+ m_creature->StopMoving();
+ Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ m_creature->CastSpell(Cloud, 43501, false); // siphon soul
+ }
+ Unit *Cyclone = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
+ if(Cyclone)
+ {
+ Cyclone->CastSpell(Cyclone, 25160, true); // wind visual
+ CycloneGUID = Cyclone->GetGUID();
+ }
+ ElectricalStorm_Timer = 60000; //60 seconds(bosskillers)
+ StormCount = 1;
+ StormSequenceTimer = 0;
+ } else ElectricalStorm_Timer -= diff;
+
+ if (SummonEagles_Timer < diff)
+ {
+ DoYell(SAY_ONSUMMON, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_ONSUMMON);
+
+ float x, y, z;
+ m_creature->GetPosition(x, y, z);
+ for (uint8 i = 0; i < 6 + rand()%3; i++)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ x = target->GetPositionX() + 10 - rand()%20;
+ y = target->GetPositionY() + 10 - rand()%20;
+ z = target->GetPositionZ() + 6 + rand()%5 + 10;
+ if(z > 95) z = 95 - rand()%5;
+ }
+
+ Creature *pCreature = m_creature->SummonCreature(MOB_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ if (pCreature)
+ {
+ pCreature->AddThreat(m_creature->getVictim(), 1.0f);
+ pCreature->AI()->AttackStart(m_creature->getVictim());
+ }
+ }
+ SummonEagles_Timer = 999999;
+ } else SummonEagles_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+struct TRINITY_DLL_DECL mob_soaring_eagleAI : public ScriptedAI
+{
+ mob_soaring_eagleAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+ uint32 EagleSwoop_Timer;
+ bool arrived;
+ uint32 TargetGUID;
+
+ void Reset()
+ {
+ EagleSwoop_Timer = 5000 + rand()%5000;
+ arrived = true;
+ TargetGUID = 0;
+ m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ }
+
+ void Aggro(Unit *who) {DoZoneInCombat();}
+
+ void AttackStart(Unit *who)
+ {
+ if (!InCombat)
+ {
+ Aggro(who);
+ InCombat = true;
+ }
+ }
+
+ void MoveInLineOfSight(Unit *) {}
+
+ void MovementInform(uint32, uint32)
+ {
+ arrived = true;
+ if(TargetGUID)
+ {
+ if(Unit* target = Unit::GetUnit(*m_creature, TargetGUID))
+ m_creature->CastSpell(target, SPELL_EAGLE_SWOOP, true);
+ TargetGUID = 0;
+ m_creature->SetSpeed(MOVE_RUN, 1.2f);
+ EagleSwoop_Timer = 5000 + rand()%5000;
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(EagleSwoop_Timer < diff) EagleSwoop_Timer = 0;
+ else EagleSwoop_Timer -= diff;
+
+ if(arrived)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ float x, y, z;
+ if(EagleSwoop_Timer)
+ {
+ x = target->GetPositionX() + 10 - rand()%20;
+ y = target->GetPositionY() + 10 - rand()%20;
+ z = target->GetPositionZ() + 10 + rand()%5;
+ if(z > 95) z = 95 - rand()%5;
+ }
+ else
+ {
+ target->GetContactPoint(m_creature, x, y, z);
+ z += 2;
+ m_creature->SetSpeed(MOVE_RUN, 5.0f);
+ TargetGUID = target->GetGUID();
+ }
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+ m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
+ m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+ arrived = false;
+ }
+ }
+ }
+};
+
+//Soaring Eagle
+CreatureAI* GetAI_mob_soaring_eagle(Creature *_Creature)
+{
+ return new mob_soaring_eagleAI(_Creature);
+}
+
+CreatureAI* GetAI_boss_akilzon(Creature *_Creature)
+{
+ return new boss_akilzonAI(_Creature);
+}
+
+void AddSC_boss_akilzon()
+{
+ Script *newscript = NULL;
+
+ newscript = new Script;
+ newscript->Name="boss_akilzon";
+ newscript->GetAI = GetAI_boss_akilzon;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="mob_akilzon_eagle";
+ newscript->GetAI = GetAI_mob_soaring_eagle;
+ m_scripts[nrscripts++] = newscript;
+}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp new file mode 100644 index 00000000000..24978203861 --- /dev/null +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp @@ -0,0 +1,402 @@ +/* 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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: boss_Halazzi
+SD%Complete: 80
+SDComment:
+SDCategory: Zul¡äAman
+EndScriptData */
+
+#include "precompiled.h"
+#include "def_zulaman.h"
+//#include "spell.h"
+
+#define YELL_AGGRO "Get on your knees and bow to da fang and claw!"
+#define SOUND_AGGRO 12020
+#define YELL_SABER_ONE "You gonna leave in pieces!"
+#define YELL_SABER_TWO "Me gonna carve ya now!"
+#define YELL_SPLIT "Me gonna carve ya now!"
+#define SOUND_SPLIT 12021
+#define YELL_MERGE "Spirit, come back to me!"
+#define SOUND_MERGE 12022
+#define YELL_KILL_ONE "You cant fight the power!"
+#define SOUND_KILL_ONE 12026
+#define YELL_KILL_TWO "You gonna fail!"
+#define SOUND_KILL_TWO 12027
+#define YELL_DEATH "Chaga... choka'jinn."
+#define SOUND_DEATH 12028
+#define YELL_BERSERK "Whatch you be doing? Pissin' yourselves..."
+#define SOUND_BERSERK 12025
+
+#define SPELL_DUAL_WIELD 29651
+#define SPELL_SABER_LASH 43267
+#define SPELL_FRENZY 43139
+#define SPELL_FLAMESHOCK 43303
+#define SPELL_EARTHSHOCK 43305
+#define SPELL_TRANSFORM_SPLIT 43142
+#define SPELL_TRANSFORM_SPLIT2 43573
+#define SPELL_TRANSFORM_MERGE 43271
+#define SPELL_SUMMON_LYNX 43143
+#define SPELL_SUMMON_TOTEM 43302
+#define SPELL_BERSERK 45078
+
+#define MOB_SPIRIT_LYNX 24143
+#define SPELL_LYNX_FRENZY 43290
+#define SPELL_SHRED_ARMOR 43243
+
+#define MOB_TOTEM 24224
+#define SPELL_LIGHTNING 43301
+
+enum PhaseHalazzi
+{
+ PHASE_NONE = 0,
+ PHASE_LYNX = 1,
+ PHASE_SPLIT = 2,
+ PHASE_HUMAN = 3,
+ PHASE_MERGE = 4,
+ PHASE_ENRAGE = 5
+};
+
+struct TRINITY_DLL_DECL boss_halazziAI : public ScriptedAI
+{
+ boss_halazziAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Reset();
+ // wait for core patch be accepted
+ SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SUMMON_TOTEM);
+ if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 1)
+ TempSpell->EffectImplicitTargetA[0] = 1;
+ // need to find out what controls totem's spell cooldown
+ TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_LIGHTNING);
+ if(TempSpell && TempSpell->CastingTimeIndex != 5)
+ TempSpell->CastingTimeIndex = 5; // 2000 ms casting time
+ }
+
+ ScriptedInstance *pInstance;
+
+ uint32 FrenzyTimer;
+ uint32 SaberlashTimer;
+ uint32 ShockTimer;
+ uint32 TotemTimer;
+ uint32 CheckTimer;
+ uint32 BerserkTimer;
+
+ uint32 TransformCount;
+
+ PhaseHalazzi Phase;
+
+ uint64 LynxGUID;
+
+ void Reset()
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_HALAZZIEVENT, NOT_STARTED);
+
+ TransformCount = 0;
+ BerserkTimer = 600000;
+ CheckTimer = 1000;
+
+ DoCast(m_creature, SPELL_DUAL_WIELD, true);
+
+ Phase = PHASE_NONE;
+ EnterPhase(PHASE_LYNX);
+ }
+
+ void Aggro(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS);
+
+ DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_AGGRO);
+
+ EnterPhase(PHASE_LYNX);
+ }
+
+ void JustSummoned(Creature* summon)
+ {
+ summon->AI()->AttackStart(m_creature->getVictim());
+ if(summon->GetEntry() == MOB_SPIRIT_LYNX)
+ LynxGUID = summon->GetGUID();
+ }
+
+ void DamageTaken(Unit *done_by, uint32 &damage)
+ {
+ if(damage >= m_creature->GetHealth() && Phase != PHASE_ENRAGE)
+ damage = 0;
+ }
+
+ void SpellHit(Unit*, const SpellEntry *spell)
+ {
+ if(spell->Id == SPELL_TRANSFORM_SPLIT2)
+ EnterPhase(PHASE_HUMAN);
+ }
+
+ void AttackStart(Unit *who)
+ {
+ if(Phase != PHASE_MERGE) ScriptedAI::AttackStart(who);
+ }
+
+ void EnterPhase(PhaseHalazzi NextPhase)
+ {
+ switch(NextPhase)
+ {
+ case PHASE_LYNX:
+ case PHASE_ENRAGE:
+ if(Phase == PHASE_MERGE)
+ {
+ m_creature->CastSpell(m_creature, SPELL_TRANSFORM_MERGE, true);
+ m_creature->Attack(m_creature->getVictim(), true);
+ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
+ }
+ if(Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID))
+ {
+ Lynx->SetVisibility(VISIBILITY_OFF);
+ Lynx->setDeathState(JUST_DIED);
+ }
+ m_creature->SetMaxHealth(600000);
+ m_creature->SetHealth(600000 - 150000 * TransformCount);
+ FrenzyTimer = 16000;
+ SaberlashTimer = 20000;
+ ShockTimer = 10000;
+ TotemTimer = 12000;
+ break;
+ case PHASE_SPLIT:
+ DoYell(YELL_SPLIT, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_SPLIT);
+ m_creature->CastSpell(m_creature, SPELL_TRANSFORM_SPLIT, true);
+ break;
+ case PHASE_HUMAN:
+ //DoCast(m_creature, SPELL_SUMMON_LYNX, true);
+ DoSpawnCreature(MOB_SPIRIT_LYNX, 0,0,0,0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ m_creature->SetMaxHealth(400000);
+ m_creature->SetHealth(400000);
+ ShockTimer = 10000;
+ TotemTimer = 12000;
+ break;
+ case PHASE_MERGE:
+ if(Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID))
+ {
+ DoYell(YELL_MERGE, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_MERGE);
+ Lynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Lynx->GetMotionMaster()->Clear();
+ Lynx->GetMotionMaster()->MoveFollow(m_creature, 0, 0);
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MoveFollow(Lynx, 0, 0);
+ TransformCount++;
+ }break;
+ default:
+ break;
+ }
+ Phase = NextPhase;
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
+ return;
+
+ if(BerserkTimer < diff)
+ {
+ DoYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_BERSERK);
+ DoCast(m_creature, SPELL_BERSERK, true);
+ BerserkTimer = 60000;
+ }else BerserkTimer -= diff;
+
+ if(Phase == PHASE_LYNX || Phase == PHASE_ENRAGE)
+ {
+ if(SaberlashTimer < diff)
+ {
+ // A tank with more than 490 defense skills should receive no critical hit
+ //m_creature->CastSpell(m_creature, 41296, true);
+ m_creature->CastSpell(m_creature->getVictim(), SPELL_SABER_LASH, true);
+ //m_creature->RemoveAurasDueToSpell(41296);
+ SaberlashTimer = 30000;
+ }else SaberlashTimer -= diff;
+
+ if(FrenzyTimer < diff)
+ {
+ DoCast(m_creature, SPELL_FRENZY);
+ FrenzyTimer = (10+rand()%5)*1000;
+ }else FrenzyTimer -= diff;
+
+ if(Phase == PHASE_LYNX)
+ if(CheckTimer < diff)
+ {
+ if(m_creature->GetHealth() * 4 < m_creature->GetMaxHealth() * (3 - TransformCount))
+ EnterPhase(PHASE_SPLIT);
+ CheckTimer = 1000;
+ }else CheckTimer -= diff;
+ }
+
+ if(Phase == PHASE_HUMAN || Phase == PHASE_ENRAGE)
+ {
+ if(TotemTimer < diff)
+ {
+ DoCast(m_creature, SPELL_SUMMON_TOTEM);
+ TotemTimer = 20000;
+ }else TotemTimer -= diff;
+
+ if(ShockTimer < diff)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
+ {
+ if(target->IsNonMeleeSpellCasted(false))
+ DoCast(target,SPELL_EARTHSHOCK);
+ else
+ DoCast(target,SPELL_FLAMESHOCK);
+ ShockTimer = 10000 + rand()%5000;
+ }
+ }else ShockTimer -= diff;
+
+ if(Phase == PHASE_HUMAN)
+ if(CheckTimer < diff)
+ {
+ if(m_creature->GetHealth() * 10 < m_creature->GetMaxHealth())
+ EnterPhase(PHASE_MERGE);
+ else
+ {
+ Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID);
+ if(Lynx && Lynx->GetHealth() * 10 < Lynx->GetMaxHealth())
+ EnterPhase(PHASE_MERGE);
+ }
+ CheckTimer = 1000;
+ }else CheckTimer -= diff;
+ }
+
+ if(Phase == PHASE_MERGE)
+ {
+ if(CheckTimer < diff)
+ {
+ Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID);
+ if(Lynx && m_creature->IsWithinDistInMap(Lynx, 6.0f))
+ {
+ if(TransformCount < 3)
+ EnterPhase(PHASE_LYNX);
+ else
+ EnterPhase(PHASE_ENRAGE);
+ }
+ CheckTimer = 1000;
+ }else CheckTimer -= diff;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ switch(rand()%2)
+ {
+ case 0:
+ DoYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_KILL_ONE);
+ break;
+
+ case 1:
+ DoYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_KILL_TWO);
+ break;
+ }
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_HALAZZIEVENT, DONE);
+
+ DoYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_DEATH);
+ }
+};
+
+// Spirits Lynx AI
+
+struct TRINITY_DLL_DECL boss_spiritlynxAI : public ScriptedAI
+{
+ boss_spiritlynxAI(Creature *c) : ScriptedAI(c) { Reset(); }
+
+ uint32 FrenzyTimer;
+ uint32 shredder_timer;
+
+ void Reset()
+ {
+ FrenzyTimer = (30+rand()%20)*1000; //frenzy every 30-50 seconds
+ shredder_timer = 4000;
+ }
+
+ void DamageTaken(Unit *done_by, uint32 &damage)
+ {
+ if(damage >= m_creature->GetHealth())
+ damage = 0;
+ }
+
+ void AttackStart(Unit *who)
+ {
+ if(!m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ ScriptedAI::AttackStart(who);
+ }
+
+ void Aggro(Unit *who) {DoZoneInCombat();}
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+ return;
+
+ if(FrenzyTimer < diff)
+ {
+ DoCast(m_creature, SPELL_LYNX_FRENZY);
+ FrenzyTimer = (30+rand()%20)*1000;
+ }else FrenzyTimer -= diff;
+
+ if(shredder_timer < diff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_SHRED_ARMOR);
+ shredder_timer = 4000;
+ }else shredder_timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+};
+
+CreatureAI* GetAI_boss_halazziAI(Creature *_Creature)
+{
+ return new boss_halazziAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_spiritlynxAI(Creature *_Creature)
+{
+ return new boss_spiritlynxAI (_Creature);
+}
+
+void AddSC_boss_halazzi()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name="boss_halazzi";
+ newscript->GetAI = GetAI_boss_halazziAI;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="mob_halazzi_lynx";
+ newscript->GetAI = GetAI_boss_spiritlynxAI;
+ m_scripts[nrscripts++] = newscript;
+}
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp new file mode 100644 index 00000000000..d6a651d68a9 --- /dev/null +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp @@ -0,0 +1,932 @@ +/* Copyright ?2006,2007 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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: Boss_Hex_Lord_Malacrass
+SD%Complete:
+SDComment:
+SDCategory: Zul'Aman
+EndScriptData */
+
+#include "precompiled.h"
+#include "def_zulaman.h"
+
+#define YELL_AGGRO "Da shadow gonna fall on you... "
+#define SOUND_YELL_AGGRO 12041
+#define YELL_SPIRIT_BOLTS "Your soul gonna bleed!"
+#define SOUND_YELL_SPIRIT_BOLTS 12047
+#define YELL_DRAIN_POWER "Darkness comin\' for you"
+#define SOUND_YELL_DRAIN_POWER 12046
+#define YELL_KILL_ONE "Dis a nightmare ya don\' wake up from!"
+#define SOUND_YELL_KILL_ONE 12043
+#define YELL_KILL_TWO "Azzaga choogo zinn!"
+#define SOUND_YELL_KILL_TWO 12044
+#define YELL_DEATH "Dis not... da end of me..."
+#define SOUND_YELL_DEATH 12051
+
+#define SPELL_SPIRIT_BOLTS 43383
+#define SPELL_DRAIN_POWER 44131
+#define SPELL_SIPHON_SOUL 43501
+
+#define MOB_TEMP_TRIGGER 23920
+
+//Defines for various powers he uses after using soul drain
+
+//Druid
+#define SPELL_DR_LIFEBLOOM 43421
+#define SPELL_DR_THORNS 43420
+#define SPELL_DR_MOONFIRE 43545
+
+//Hunter
+#define SPELL_HU_EXPLOSIVE_TRAP 43444
+#define SPELL_HU_FREEZING_TRAP 43447
+#define SPELL_HU_SNAKE_TRAP 43449
+
+//Mage
+#define SPELL_MG_FIREBALL 41383
+#define SPELL_MG_FROSTBOLT 43428
+#define SPELL_MG_FROST_NOVA 43426
+#define SPELL_MG_ICE_LANCE 43427
+
+//Paladin
+#define SPELL_PA_CONSECRATION 43429
+#define SPELL_PA_HOLY_LIGHT 43451
+#define SPELL_PA_AVENGING_WRATH 43430
+
+//Priest
+#define SPELL_PR_HEAL 41372
+#define SPELL_PR_MIND_CONTROL 43550
+#define SPELL_PR_MIND_BLAST 41374
+#define SPELL_PR_SW_DEATH 41375
+#define SPELL_PR_PSYCHIC_SCREAM 43432
+#define SPELL_PR_PAIN_SUPP 44416
+
+//Rogue
+#define SPELL_RO_BLIND 43433
+#define SPELL_RO_SLICE_DICE 43457
+#define SPELL_RO_WOUND_POISON 39665
+
+//Shaman
+#define SPELL_SH_FIRE_NOVA 43436
+#define SPELL_SH_HEALING_WAVE 43548
+#define SPELL_SH_CHAIN_LIGHT 43435
+
+//Warlock
+#define SPELL_WL_CURSE_OF_DOOM 43439
+#define SPELL_WL_RAIN_OF_FIRE 43440
+#define SPELL_WL_UNSTABLE_AFFL 35183
+
+//Warrior
+#define SPELL_WR_SPELL_REFLECT 43443
+#define SPELL_WR_WHIRLWIND 43442
+#define SPELL_WR_MORTAL_STRIKE 43441
+
+#define ORIENT 1.5696
+#define POS_Y 921.2795
+#define POS_Z 33.8883
+
+static float Pos_X[4] = {112.8827, 107.8827, 122.8827, 127.8827};
+
+static uint32 AddEntryList[8]=
+{
+ 24240, //Alyson Antille
+ 24241, //Thurg
+ 24242, //Slither
+ 24243, //Lord Raadan
+ 24244, //Gazakroth
+ 24245, //Fenstalker
+ 24246, //Darkheart
+ 24247 //Koragg
+};
+
+enum AbilityTarget
+{
+ ABILITY_TARGET_SELF = 0,
+ ABILITY_TARGET_VICTIM = 1,
+ ABILITY_TARGET_ENEMY = 2,
+ ABILITY_TARGET_HEAL = 3,
+ ABILITY_TARGET_BUFF = 4,
+ ABILITY_TARGET_SPECIAL = 5
+};
+
+struct PlayerAbilityStruct
+{
+ uint32 spell;
+ AbilityTarget target;
+ uint32 cooldown;
+};
+
+static PlayerAbilityStruct PlayerAbility[][3] =
+{
+ // 1 warrior
+ {{SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000},
+ {SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000},
+ {SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000}},
+ // 2 paladin
+ {{SPELL_PA_CONSECRATION, ABILITY_TARGET_SELF, 10000},
+ {SPELL_PA_HOLY_LIGHT, ABILITY_TARGET_HEAL, 10000},
+ {SPELL_PA_AVENGING_WRATH, ABILITY_TARGET_SELF, 10000}},
+ // 3 hunter
+ {{SPELL_HU_EXPLOSIVE_TRAP, ABILITY_TARGET_SELF, 10000},
+ {SPELL_HU_FREEZING_TRAP, ABILITY_TARGET_SELF, 10000},
+ {SPELL_HU_SNAKE_TRAP, ABILITY_TARGET_SELF, 10000}},
+ // 4 rogue
+ {{SPELL_RO_WOUND_POISON, ABILITY_TARGET_VICTIM, 3000},
+ {SPELL_RO_SLICE_DICE, ABILITY_TARGET_SELF, 10000},
+ {SPELL_RO_BLIND, ABILITY_TARGET_ENEMY, 10000}},
+ // 5 priest
+ {{SPELL_PR_PAIN_SUPP, ABILITY_TARGET_HEAL, 10000},
+ {SPELL_PR_HEAL, ABILITY_TARGET_HEAL, 10000},
+ {SPELL_PR_PSYCHIC_SCREAM, ABILITY_TARGET_SELF, 10000}},
+ // 5* shadow priest
+ {{SPELL_PR_MIND_CONTROL, ABILITY_TARGET_ENEMY, 15000},
+ {SPELL_PR_MIND_BLAST, ABILITY_TARGET_ENEMY, 5000},
+ {SPELL_PR_SW_DEATH, ABILITY_TARGET_ENEMY, 10000}},
+ // 7 shaman
+ {{SPELL_SH_FIRE_NOVA, ABILITY_TARGET_SELF, 10000},
+ {SPELL_SH_HEALING_WAVE, ABILITY_TARGET_HEAL, 10000},
+ {SPELL_SH_CHAIN_LIGHT, ABILITY_TARGET_ENEMY, 8000}},
+ // 8 mage
+ {{SPELL_MG_FIREBALL, ABILITY_TARGET_ENEMY, 5000},
+ {SPELL_MG_FROSTBOLT, ABILITY_TARGET_ENEMY, 5000},
+ {SPELL_MG_ICE_LANCE, ABILITY_TARGET_SPECIAL, 2000}},
+ // 9 warlock
+ {{SPELL_WL_CURSE_OF_DOOM, ABILITY_TARGET_ENEMY, 10000},
+ {SPELL_WL_RAIN_OF_FIRE, ABILITY_TARGET_ENEMY, 10000},
+ {SPELL_WL_UNSTABLE_AFFL, ABILITY_TARGET_ENEMY, 10000}},
+ // 11 druid
+ {{SPELL_DR_LIFEBLOOM, ABILITY_TARGET_HEAL, 10000},
+ {SPELL_DR_THORNS, ABILITY_TARGET_SELF, 10000},
+ {SPELL_DR_MOONFIRE, ABILITY_TARGET_ENEMY, 8000}}
+};
+
+struct TRINITY_DLL_DECL boss_hexlord_addAI : public ScriptedAI
+{
+ ScriptedInstance* pInstance;
+
+ boss_hexlord_addAI(Creature* c) : ScriptedAI(c)
+ {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Reset();
+ }
+
+ void Reset() {}
+
+ void Aggro(Unit* who) {DoZoneInCombat();}
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(pInstance && pInstance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS)
+ EnterEvadeMode();
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
+{
+ boss_hex_lord_malacrassAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ SelectAddEntry();
+ for(uint8 i = 0; i < 4; ++i)
+ AddGUID[i] = 0;
+ Reset();
+ }
+
+ ScriptedInstance *pInstance;
+
+ uint64 AddGUID[4];
+ uint32 AddEntry[4];
+
+ uint64 PlayerGUID;
+
+ uint32 SpiritBolts_Timer;
+ uint32 DrainPower_Timer;
+ uint32 SiphonSoul_Timer;
+ uint32 PlayerAbility_Timer;
+ uint32 CheckAddState_Timer;
+
+ uint32 PlayerClass;
+
+ Unit* SoulDrainTarget;
+
+ void Reset()
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_HEXLORDEVENT, NOT_STARTED);
+
+ SpiritBolts_Timer = 20000;
+ DrainPower_Timer = 60000;
+ SiphonSoul_Timer = 100000;
+ PlayerAbility_Timer = 99999;
+ CheckAddState_Timer = 5000;
+
+ SpawnAdds();
+
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 46916);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 50268674);
+ m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
+ }
+
+ void Aggro(Unit* who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS);
+
+ DoZoneInCombat();
+ DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_AGGRO);
+
+ for(uint8 i = 0; i < 4; ++i)
+ {
+ Unit* Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
+ if(Temp && Temp->isAlive())
+ ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim());
+ else
+ {
+ EnterEvadeMode();
+ break;
+ }
+ }
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ switch(rand()%2)
+ {
+ case 0:
+ DoYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_KILL_ONE);
+ break;
+ case 1:
+ DoYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_KILL_TWO);
+ break;
+ }
+ }
+
+ void JustDied(Unit* victim)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_HEXLORDEVENT, DONE);
+
+ DoYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_DEATH);
+
+ for(uint8 i = 0; i < 4 ; ++i)
+ {
+ Unit* Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
+ if(Temp && Temp->isAlive())
+ Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ }
+ }
+
+ void SelectAddEntry()
+ {
+ std::vector<uint32> AddList;
+
+ for(uint8 i = 0; i < 8; ++i)
+ AddList.push_back(AddEntryList[i]);
+
+ while(AddList.size() > 4)
+ AddList.erase(AddList.begin()+rand()%AddList.size());
+
+ uint8 i = 0;
+ for(std::vector<uint32>::iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i)
+ AddEntry[i] = *itr;
+ }
+
+ void SpawnAdds()
+ {
+ for(uint8 i = 0; i < 4; ++i)
+ {
+ Creature *pCreature = ((Creature*)Unit::GetUnit((*m_creature), AddGUID[i]));
+ if(!pCreature || !pCreature->isAlive())
+ {
+ if(pCreature) pCreature->setDeathState(DEAD);
+ pCreature = m_creature->SummonCreature(AddEntry[i], Pos_X[i], POS_Y, POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
+ if(pCreature) AddGUID[i] = pCreature->GetGUID();
+ }
+ else
+ {
+ pCreature->AI()->EnterEvadeMode();
+ pCreature->Relocate(Pos_X[i], POS_Y, POS_Z, ORIENT);
+ pCreature->StopMoving();
+ }
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() && !m_creature->getVictim() )
+ return;
+
+ if(CheckAddState_Timer < diff)
+ {
+ for(uint8 i = 0; i < 4; ++i)
+ {
+ Unit* Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
+ if(Temp && Temp->isAlive() && !Temp->getVictim())
+ ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim());
+ }
+ CheckAddState_Timer = 5000;
+ }else CheckAddState_Timer -= diff;
+
+ if(DrainPower_Timer < diff)
+ {
+ m_creature->CastSpell(m_creature, SPELL_DRAIN_POWER, true);
+ DoYell(YELL_DRAIN_POWER, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_DRAIN_POWER);
+ DrainPower_Timer = 40000 + rand()%15000; // must cast in 60 sec, or buff/debuff will disappear
+ }else DrainPower_Timer -= diff;
+
+ if(SpiritBolts_Timer < diff)
+ {
+ if(DrainPower_Timer < 12000) // channel 10 sec
+ SpiritBolts_Timer = 13000; // cast drain power first
+ else
+ {
+ m_creature->CastSpell(m_creature, SPELL_SPIRIT_BOLTS, false);
+ DoYell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_SPIRIT_BOLTS);
+ SpiritBolts_Timer = 40000;
+ SiphonSoul_Timer = 10000; // ready to drain
+ PlayerAbility_Timer = 99999;
+ }
+ }else SpiritBolts_Timer -= diff;
+
+ if(SiphonSoul_Timer < diff)
+ {
+ Player* target = SelectRandomPlayer(50);
+ Unit *trigger = DoSpawnCreature(MOB_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
+ if(!target || !trigger) EnterEvadeMode();
+ else
+ {
+ trigger->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
+ trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ trigger->CastSpell(target, SPELL_SIPHON_SOUL, true);
+ trigger->GetMotionMaster()->MoveChase(m_creature);
+
+ //m_creature->CastSpell(target, SPELL_SIPHON_SOUL, true);
+ //m_creature->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, target->GetGUID());
+ //m_creature->SetUInt32Value(UNIT_CHANNEL_SPELL, SPELL_SIPHON_SOUL);
+
+ PlayerGUID = target->GetGUID();
+ PlayerAbility_Timer = 8000 + rand()%2000;
+ PlayerClass = target->getClass() - 1;
+ if(PlayerClass == 10) PlayerClass = 9; // druid
+ if(PlayerClass == 4 && target->HasSpell(15473)) PlayerClass = 5; // shadow priest
+ SiphonSoul_Timer = 99999; // buff lasts 30 sec
+ }
+ }else SiphonSoul_Timer -= diff;
+
+ if(PlayerAbility_Timer < diff)
+ {
+ //Unit* target = Unit::GetUnit(*m_creature, PlayerGUID);
+ //if(target && target->isAlive())
+ {
+ UseAbility();
+ PlayerAbility_Timer = 8000 + rand()%2000;
+ }
+ }else PlayerAbility_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void UseAbility()
+ {
+ uint32 random = rand()%3;
+ Unit *target = NULL;
+ switch(PlayerAbility[PlayerClass][random].target)
+ {
+ case ABILITY_TARGET_SELF:
+ target = m_creature;
+ break;
+ case ABILITY_TARGET_VICTIM:
+ target = m_creature->getVictim();
+ break;
+ case ABILITY_TARGET_ENEMY:
+ default:
+ target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ break;
+ case ABILITY_TARGET_HEAL:
+ target = DoSelectLowestHpFriendly(50, 0);
+ break;
+ case ABILITY_TARGET_BUFF:
+ {
+ std::list<Creature*> templist = DoFindFriendlyMissingBuff(50, PlayerAbility[PlayerClass][random].spell);
+ if(!templist.empty()) target = *(templist.begin());
+ }
+ break;
+ }
+ m_creature->CastSpell(target, PlayerAbility[PlayerClass][random].spell, false);
+ }
+
+ Player* SelectRandomPlayer(float range = 0.0f, bool alive = true)
+ {
+ Map *map = m_creature->GetMap();
+ if (!map->IsDungeon()) return NULL;
+
+ InstanceMap::PlayerList PlayerList = ((InstanceMap*)map)->GetPlayers();
+ InstanceMap::PlayerList::iterator i;
+ while(PlayerList.size())
+ {
+ i = PlayerList.begin();
+ advance(i, rand()%PlayerList.size());
+ if((range == 0.0f || m_creature->IsWithinDistInMap(*i, range))
+ && (!alive || (*i)->isAlive()))
+ return *i;
+ else
+ PlayerList.erase(i);
+ }
+ return NULL;
+ }
+};
+
+#define SPELL_BLOODLUST 43578
+#define SPELL_CLEAVE 15496
+
+struct TRINITY_DLL_DECL boss_thurgAI : public boss_hexlord_addAI
+{
+
+ boss_thurgAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 bloodlust_timer;
+ uint32 cleave_timer;
+
+ void Reset()
+ {
+ bloodlust_timer = 15000;
+ cleave_timer = 10000;
+
+ boss_hexlord_addAI::Reset();
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if(bloodlust_timer < diff)
+ {
+ std::list<Creature*> templist = DoFindFriendlyMissingBuff(50, SPELL_BLOODLUST);
+ if(!templist.empty())
+ {
+ Unit* target = *(templist.begin());
+ m_creature->CastSpell(target, SPELL_BLOODLUST, false);
+ }
+ bloodlust_timer = 12000;
+ }else bloodlust_timer -= diff;
+
+ if(cleave_timer < diff)
+ {
+ m_creature->CastSpell(m_creature->getVictim(),SPELL_CLEAVE, false);
+ cleave_timer = 12000; //3 sec cast
+ }else cleave_timer -= diff;
+ }
+};
+
+#define SPELL_FLASH_HEAL 43575
+#define SPELL_DISPEL_MAGIC 43577
+
+struct TRINITY_DLL_DECL boss_alyson_antilleAI : public boss_hexlord_addAI
+{
+ //Holy Priest
+ boss_alyson_antilleAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 flashheal_timer;
+ uint32 dispelmagic_timer;
+
+ void Reset()
+ {
+ flashheal_timer = 2500;
+ dispelmagic_timer = 10000;
+
+ //AcquireGUID();
+
+ boss_hexlord_addAI::Reset();
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (!who)
+ return;
+
+ if (who->isTargetableForAttack())
+ {
+ if(m_creature->Attack(who, false))
+ {
+ m_creature->GetMotionMaster()->MoveChase(who, 20);
+ m_creature->AddThreat(who, 0.0f);
+ }
+
+ if (!InCombat)
+ {
+ Aggro(who);
+ InCombat = true;
+ }
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+
+ if(flashheal_timer < diff)
+ {
+ Unit* target = DoSelectLowestHpFriendly(99, 30000);
+ if(target)
+ {
+ if(target->IsWithinDistInMap(m_creature, 50))
+ m_creature->CastSpell(target,SPELL_FLASH_HEAL, false);
+ else
+ {
+ // bugged
+ //m_creature->GetMotionMaster()->Clear();
+ //m_creature->GetMotionMaster()->MoveChase(target, 20);
+ }
+ }
+ else
+ {
+ if(rand()%2)
+ {
+ Unit* target = DoSelectLowestHpFriendly(50, 0);
+ m_creature->CastSpell(target, SPELL_DISPEL_MAGIC, false);
+ }
+ else
+ m_creature->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false);
+ }
+ flashheal_timer = 2500;
+ }else flashheal_timer -= diff;
+
+ /*if(dispelmagic_timer < diff)
+ {
+ if(rand()%2)
+ {
+ Unit* target = SelectTarget();
+
+ m_creature->CastSpell(target, SPELL_DISPEL_MAGIC, false);
+ }
+ else
+ m_creature->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false);
+
+ dispelmagic_timer = 12000;
+ }else dispelmagic_timer -= diff;*/
+ }
+};
+
+#define SPELL_FIREBOLT 43584
+
+struct TRINITY_DLL_DECL boss_gazakrothAI : public boss_hexlord_addAI
+{
+ boss_gazakrothAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 firebolt_timer;
+
+ void Reset()
+ {
+ firebolt_timer = 2000;
+ boss_hexlord_addAI::Reset();
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (!who)
+ return;
+
+ if (who->isTargetableForAttack())
+ {
+ if(m_creature->Attack(who, false))
+ {
+ m_creature->GetMotionMaster()->MoveChase(who, 20);
+ m_creature->AddThreat(who, 0.0f);
+ }
+
+ if (!InCombat)
+ {
+ Aggro(who);
+ InCombat = true;
+ }
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if(firebolt_timer < diff)
+ {
+ m_creature->CastSpell(m_creature->getVictim(),SPELL_FIREBOLT, false);
+ firebolt_timer = 700;
+ }else firebolt_timer -= diff;
+ }
+};
+
+#define SPELL_FLAME_BREATH 43582
+#define SPELL_THUNDERCLAP 43583
+
+struct TRINITY_DLL_DECL boss_lord_raadanAI : public boss_hexlord_addAI
+{
+ boss_lord_raadanAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 flamebreath_timer;
+ uint32 thunderclap_timer;
+
+ void Reset()
+ {
+ flamebreath_timer = 8000;
+ thunderclap_timer = 13000;
+
+ boss_hexlord_addAI::Reset();
+
+ }
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if (thunderclap_timer < diff)
+ {
+ m_creature->CastSpell(m_creature->getVictim(),SPELL_THUNDERCLAP, false);
+ thunderclap_timer = 12000;
+ }else thunderclap_timer -= diff;
+
+ if (flamebreath_timer < diff)
+ {
+ m_creature->CastSpell(m_creature->getVictim(),SPELL_FLAME_BREATH, false);
+ flamebreath_timer = 12000;
+ }else flamebreath_timer -= diff;
+ }
+};
+
+#define SPELL_PSYCHIC_WAIL 43590
+
+struct TRINITY_DLL_DECL boss_darkheartAI : public boss_hexlord_addAI
+{
+ boss_darkheartAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 psychicwail_timer;
+
+ void Reset()
+ {
+ psychicwail_timer = 8000;
+
+ boss_hexlord_addAI::Reset();
+
+ }
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if (psychicwail_timer < diff)
+ {
+ m_creature->CastSpell(m_creature->getVictim(),SPELL_PSYCHIC_WAIL, false);
+ psychicwail_timer = 12000;
+ }else psychicwail_timer -= diff;
+ }
+};
+
+#define SPELL_VENOM_SPIT 43579
+
+struct TRINITY_DLL_DECL boss_slitherAI : public boss_hexlord_addAI
+{
+ boss_slitherAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 venomspit_timer;
+
+
+ void Reset()
+ {
+ venomspit_timer = 5000;
+ boss_hexlord_addAI::Reset();
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (!who)
+ return;
+
+ if (who->isTargetableForAttack())
+ {
+ if(m_creature->Attack(who, false))
+ {
+ m_creature->GetMotionMaster()->MoveChase(who, 20);
+ m_creature->AddThreat(who, 0.0f);
+ }
+
+ if (!InCombat)
+ {
+ Aggro(who);
+ InCombat = true;
+ }
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if (venomspit_timer < diff)
+ {
+ Unit* victim = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ m_creature->CastSpell(victim,SPELL_VENOM_SPIT, false);
+ venomspit_timer = 2500;
+ }else venomspit_timer -= diff;
+ }
+};
+
+//Fenstalker
+#define SPELL_VOLATILE_INFECTION 43586
+
+struct TRINITY_DLL_DECL boss_fenstalkerAI : public boss_hexlord_addAI
+{
+ boss_fenstalkerAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 volatileinf_timer;
+
+
+ void Reset()
+ {
+ volatileinf_timer = 15000;
+ boss_hexlord_addAI::Reset();
+
+ }
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if (volatileinf_timer < diff)
+ {
+ // core bug
+ m_creature->getVictim()->CastSpell(m_creature->getVictim(),SPELL_VOLATILE_INFECTION, false);
+ volatileinf_timer = 12000;
+ }else volatileinf_timer -= diff;
+ }
+};
+
+//Koragg
+#define SPELL_COLD_STARE 43593
+#define SPELL_MIGHTY_BLOW 43592
+
+
+struct TRINITY_DLL_DECL boss_koraggAI : public boss_hexlord_addAI
+{
+ boss_koraggAI(Creature *c) : boss_hexlord_addAI(c) {}
+
+ uint32 coldstare_timer;
+ uint32 mightyblow_timer;
+
+
+ void Reset()
+ {
+ coldstare_timer = 15000;
+ mightyblow_timer = 10000;
+ boss_hexlord_addAI::Reset();
+
+ }
+ void UpdateAI(const uint32 diff)
+ {
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ return;
+
+ boss_hexlord_addAI::UpdateAI(diff);
+
+ if (mightyblow_timer < diff)
+ {
+ m_creature->CastSpell(m_creature->getVictim(),SPELL_MIGHTY_BLOW, false);
+ mightyblow_timer = 12000;
+ }
+ if (coldstare_timer < diff)
+ {
+ Unit* victim = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ m_creature->CastSpell(victim,SPELL_COLD_STARE, false);
+ coldstare_timer = 12000;
+ }
+ }
+};
+
+CreatureAI* GetAI_boss_hex_lord_malacrass(Creature *_Creature)
+{
+ return new boss_hex_lord_malacrassAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_thurg(Creature *_Creature)
+{
+ return new boss_thurgAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_alyson_antille(Creature *_Creature)
+{
+ return new boss_alyson_antilleAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_gazakroth(Creature *_Creature)
+{
+ return new boss_gazakrothAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_lord_raadan(Creature *_Creature)
+{
+ return new boss_lord_raadanAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_darkheart(Creature *_Creature)
+{
+ return new boss_darkheartAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_slither(Creature *_Creature)
+{
+ return new boss_slitherAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_fenstalker(Creature *_Creature)
+{
+ return new boss_fenstalkerAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_koragg(Creature *_Creature)
+{
+ return new boss_koraggAI (_Creature);
+}
+void AddSC_boss_hex_lord_malacrass()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name="boss_hexlord_malacrass";
+ newscript->GetAI = GetAI_boss_hex_lord_malacrass;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_thurg";
+ newscript->GetAI = GetAI_boss_thurg;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_gazakroth";
+ newscript->GetAI = GetAI_boss_gazakroth;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_lord_raadan";
+ newscript->GetAI = GetAI_boss_lord_raadan;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_darkheart";
+ newscript->GetAI = GetAI_boss_darkheart;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_slither";
+ newscript->GetAI = GetAI_boss_slither;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_fenstalker";
+ newscript->GetAI = GetAI_boss_fenstalker;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_koragg";
+ newscript->GetAI = GetAI_boss_koragg;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_alyson_antille";
+ newscript->GetAI = GetAI_boss_alyson_antille;
+ m_scripts[nrscripts++] = newscript;
+}
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp index 29452b9fe6f..9aacaded028 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp @@ -1,51 +1,52 @@ -/* Copyright (C) 2006,2007 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
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+/* Copyright(C) 2006,2007 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
+*(at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
/* ScriptData
SDName: Boss_Janalai
SD%Complete: 100
-SDComment:
+SDComment:
SDCategory: Zul'Aman
EndScriptData */
#include "precompiled.h"
#include "def_zulaman.h"
+#include "GridNotifiers.h"
// Jan'alai
// --Spell
#define SPELL_FLAME_BREATH 43140
#define SPELL_FIRE_WALL 43113
#define SPELL_ENRAGE 44779
-#define SPELL_TELETOCENTER 43098
-#define SPELL_SUMMONALL 43097
-#define SPELL_BERSERK 47008
+#define SPELL_SUMMON_PLAYERS 43097
+#define SPELL_TELE_TO_CENTER 43098 // coord
+#define SPELL_HATCH_ALL 43144
+#define SPELL_BERSERK 45078
// -- Fire Bob Spells
-#define MOB_FIRE_BOMB 23920
-#define SPELL_FIRE_BOMB_CHANNEL 42621
-#define SPELL_FIRE_BOMB_THROW 42628
-#define SPELL_FIRE_BOMB_DUMMY 42629
-#define SPELL_FIRE_BOMB_DAMAGE 42630
+#define SPELL_FIRE_BOMB_CHANNEL 42621 // last forever
+#define SPELL_FIRE_BOMB_THROW 42628 // throw visual
+#define SPELL_FIRE_BOMB_DUMMY 42629 // bomb visual
+#define SPELL_FIRE_BOMB_DAMAGE 42630
// -- SAYs
-#define SOUND_AGGRO 12031
+#define SOUND_AGGRO 12031
#define SAY_AGGRO "Spirits of da wind be your doom!"
#define SOUND_FIRE_BOMBS 12032
#define SAY_FIRE_BOMBS "I burn ya now!"
#define SOUND_SUMMON_HATCHER 12033
-#define SAY_SUMMON_HATCHER "Where ma hatcha? Get to work on dem eggs!"
+#define SAY_SUMMON_HATCHER "Where ma hatcha? Get to work on dem templist!"
#define SOUND_ALL_EGGS 12034
#define SAY_ALL_EGGS "I show you strength... in numbers."
#define SOUND_BERSERK 12035
@@ -59,32 +60,32 @@ EndScriptData */ #define SOUND_DEATH 12038
#define SAY_DEATH "Zul'jin... got a surprise for you..."
-#define SOUND_AGGRO_1 12039 //NOT USED need more information
- //NOT USED need more information (random say before aggro?)
-#define SAY_AGGRO_1 "Come, strangers. The spirit of the dragonhawk hot be hungry for worthy souls."
-#define SOUND_AGGRO_2 12040 //NOT USED need more information
- //NOT USED need more information (random say before aggro?)
-#define SAY_AGGRO_2 "Come, friends. Your bodies gonna feed ma hatchlings, and your souls are going to feed me with power!"
+#define SOUND_AGGRO_1 12039 //NOT USED need more information
+#define SAY_AGGRO_1 "Come, strangers. The spirit of the dragonhawk hot be hungry for worthy souls." //NOT USED need more information(random say before aggro?)
+#define SOUND_AGGRO_2 12040 //NOT USED need more information
+#define SAY_AGGRO_2 "Come, friends. Your bodies gonna feed ma HatchNum, and your souls are going to feed me with power!" //NOT USED need more information(random say before aggro?)
// --Summons
#define MOB_AMANI_HATCHER 23818
-#define MOB_HATCHLING 23598
+#define MOB_HATCHLING 23598 // 42493
+#define MOB_EGG 23817
+#define MOB_FIRE_BOMB 23920
// -- Hatcher Spells
-#define SPELL_HATCH_EGG 43734
+#define SPELL_HATCH_EGG 43734 // 42471
// -- Hatchling Spells
-#define SPELL_FLAMEBUFFED 43299
+#define SPELL_FLAMEBUFFET 43299
const int area_dx = 44;
const int area_dy = 51;
-float JanalainPos[1][3] =
+float JanalainPos[1][3] =
{
{-33.93, 1149.27, 19}
};
-float FireWallCoords[4][4] =
+float FireWallCoords[4][4] =
{
{-10.13, 1149.27, 19, 3.1415},
{-33.93, 1123.90, 19, 0.5*3.1415},
@@ -92,76 +93,73 @@ float FireWallCoords[4][4] = {-33.93, 1175.68, 19, 1.5*3.1415}
};
-float hatcherway_l[5][3] =
-{
- {-87.46,1170.09,6},
- {-74.41,1154.75,6},
- {-52.74,1153.32,19},
- {-33.37,1172.46,19},
- {-33.09,1203.87,19}
-};
-
-float hatcherway_r[5][3] =
+float hatcherway[2][5][3] =
{
- {-86.57,1132.85,6},
- {-73.94,1146.00,6},
- {-52.29,1146.51,19},
- {-33.57,1125.72,19},
- {-34.29,1095.22,19}
+ {
+ {-87.46,1170.09,6},
+ {-74.41,1154.75,6},
+ {-52.74,1153.32,19},
+ {-33.37,1172.46,19},
+ {-33.09,1203.87,19}
+ },
+ {
+ {-86.57,1132.85,6},
+ {-73.94,1146.00,6},
+ {-52.29,1146.51,19},
+ {-33.57,1125.72,19},
+ {-34.29,1095.22,19}
+ }
};
struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI
{
boss_janalaiAI(Creature *c) : ScriptedAI(c)
- {
- pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ {
+ pInstance =((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
- uint32 fire_breath_timer;
- uint32 bomb_timer;
- uint32 throw_timer;
- uint32 enrage_timer;
- uint32 finishedbomb_timer;
- uint32 bombcounter;
- uint32 hatchertime;
- uint32 eggs;
- uint32 wipetimer;
- uint32 reset_timer;
+ uint32 FireBreathTimer;
+ uint32 BombTimer;
+ uint32 BombSequenceTimer;
+ uint32 BombCount;
+ uint32 HatcherTimer;
+ uint32 EnrageTimer;
+ uint32 ResetTimer;
+
bool noeggs;
bool enraged;
- bool enragetime;
+ bool isBombing;
- uint64 FireBombGUIDs[40];
- uint64 ThrowControllerGUID;
+ bool isFlameBreathing;
- bool bombing;
+ uint64 FireBombGUIDs[40];
void Reset()
{
if(pInstance)
pInstance->SetData(DATA_JANALAIEVENT, NOT_STARTED);
- fire_breath_timer = 8000;
- bomb_timer = 30000;
- enrage_timer = 300000; // 5 minutes
- finishedbomb_timer = 6000;
- throw_timer = 1000;
- bombcounter = 0;
+ FireBreathTimer = 8000;
+ BombTimer = 30000;
+ BombSequenceTimer = 1000;
+ BombCount = 0;
+ HatcherTimer = 10000;
+ EnrageTimer = 300000;
+ ResetTimer = 5000;
+
noeggs = false;
- hatchertime = 10000;
- wipetimer = 600000; // 10 mins
- bombing =false;
- reset_timer = 5000;
+ isBombing =false;
enraged = false;
- enragetime = false;
- ThrowControllerGUID = 0;
+ isFlameBreathing = false;
for(uint8 i = 0; i < 40; i++)
FireBombGUIDs[i] = 0;
+
+ HatchAllEggs(1);
}
void JustDied(Unit* Killer)
@@ -176,15 +174,15 @@ struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI void KilledUnit(Unit* victim)
{
switch(rand()%2)
- {
- case 0:
- DoYell(SAY_SLAY_1, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY_1);
- break;
- case 1:
- DoYell(SAY_SLAY_2, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY_1);
- break;
+ {
+ case 0:
+ DoYell(SAY_SLAY_1, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature,SOUND_SLAY_1);
+ break;
+ case 1:
+ DoYell(SAY_SLAY_2, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature,SOUND_SLAY_1);
+ break;
}
}
@@ -195,280 +193,289 @@ struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
+// DoZoneInCombat();
}
- void FireWall() // Create Firewall
+ void DamageDeal(Unit* target, uint32 &damage)
{
+ if(isFlameBreathing)
+ {
+ if(!m_creature->HasInArc(M_PI/6, target))
+ damage = 0;
+ }
+ }
+
+ void FireWall()
+ {
+ uint8 WallNum;
Creature* wall = NULL;
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[0][0],FireWallCoords[0][1],FireWallCoords[0][2],FireWallCoords[0][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ for(uint8 i = 0; i < 4; i++)
+ {
+ if(i == 0 || i == 2)
+ WallNum = 3;
+ else
+ WallNum = 2;
+
+ for(uint8 j = 0; j < WallNum; j++)
+ {
+ if(WallNum == 3)
+ wall = m_creature->SummonCreature(MOB_FIRE_BOMB, FireWallCoords[i][0],FireWallCoords[i][1]+5*(j-1),FireWallCoords[i][2],FireWallCoords[i][3],TEMPSUMMON_TIMED_DESPAWN,15000);
+ else
+ wall = m_creature->SummonCreature(MOB_FIRE_BOMB, FireWallCoords[i][0]-2+4*j,FireWallCoords[i][1],FireWallCoords[i][2],FireWallCoords[i][3],TEMPSUMMON_TIMED_DESPAWN,15000);
+ if(wall) wall->CastSpell(wall, SPELL_FIRE_WALL, true);
+ }
+ }
+ }
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[0][0],FireWallCoords[0][1]+5,FireWallCoords[0][2],FireWallCoords[0][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ void SpawnBombs()
+ {
+ float dx, dy;
+ for( int i(0); i < 40; i++)
+ {
+ dx =(rand()%(area_dx))-(area_dx/2);
+ dy =(rand()%(area_dy))-(area_dy/2);
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[0][0],FireWallCoords[0][1]-5,FireWallCoords[0][2],FireWallCoords[0][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ Creature* bomb = DoSpawnCreature(MOB_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
+ if(bomb) FireBombGUIDs[i] = bomb->GetGUID();
+ }
+ BombCount = 0;
+ }
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[1][0]-2,FireWallCoords[1][1]-2,FireWallCoords[1][2],FireWallCoords[1][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ bool HatchAllEggs(uint32 action) //1: reset, 2: isHatching all
+ {
+ std::list<Creature*> templist;
+ float x, y, z;
+ m_creature->GetPosition(x, y, z);
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[1][0]+2,FireWallCoords[1][1]+2,FireWallCoords[1][2],FireWallCoords[1][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ {
+ CellPair pair(Trinity::ComputeCellPair(x, y));
+ Cell cell(pair);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[2][0],FireWallCoords[2][1],FireWallCoords[2][2],FireWallCoords[2][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ Trinity::AllCreaturesOfEntryInRange check(m_creature, MOB_EGG, 100);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[2][0],FireWallCoords[2][1]-5,FireWallCoords[2][2],FireWallCoords[2][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[2][0],FireWallCoords[2][1]+5,FireWallCoords[2][2],FireWallCoords[2][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ CellLock<GridReadGuard> cell_lock(cell, pair);
+ cell_lock->Visit(cell_lock, cSearcher, *(m_creature->GetMap()));
+ }
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[3][0]-2,FireWallCoords[3][1],FireWallCoords[3][2],FireWallCoords[3][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ //error_log("Eggs %d at middle", templist.size());
+ if(!templist.size())
+ return false;
- wall = m_creature->SummonCreature(MOB_FIRE_BOMB,FireWallCoords[3][0]+2,FireWallCoords[3][1],FireWallCoords[3][2],FireWallCoords[3][3],TEMPSUMMON_TIMED_DESPAWN,11500);
- if(wall)
- wall->CastSpell(wall,SPELL_FIRE_WALL,false);
+ for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end(); ++i)
+ {
+ if(action == 1)
+ (*i)->SetDisplayId(10056);
+ else if(action == 2 &&(*i)->GetDisplayId() != 11686)
+ (*i)->CastSpell(*i, SPELL_HATCH_EGG, false);
+ }
+ return true;
}
- void throwBombs() // create Bombs
+ void Boom()
{
- float dx;
- float dy;
- for ( int i(0); i < 40; i++)
+ std::list<Creature*> templist;
+ float x, y, z;
+ m_creature->GetPosition(x, y, z);
+
{
- dx = (rand()%(area_dx))-(area_dx/2);
- dy = (rand()%(area_dy))-(area_dy/2);
+ CellPair pair(Trinity::ComputeCellPair(x, y));
+ Cell cell(pair);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
- Creature* bomb = DoSpawnCreature(MOB_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 13000);
- if(bomb)
- FireBombGUIDs[i] = bomb->GetGUID();
- }
+ Trinity::AllCreaturesOfEntryInRange check(m_creature, MOB_FIRE_BOMB, 100);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
- Creature* ThrowController = DoSpawnCreature(MOB_FIRE_BOMB,0,0,1,0,TEMPSUMMON_TIMED_DESPAWN,10000);
- if(ThrowController)
- ThrowControllerGUID = ThrowController->GetGUID();
+ TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
- bombcounter = 0;
+ CellLock<GridReadGuard> cell_lock(cell, pair);
+ cell_lock->Visit(cell_lock, cSearcher, *(m_creature->GetMap()));
+ }
+ for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end(); ++i)
+ {
+ (*i)->CastSpell(*i, SPELL_FIRE_BOMB_DAMAGE, true);
+ (*i)->RemoveAllAuras();
+ }
}
- void throw5Bombs() //throwanimation
+ void HandleBombSequence()
{
- for ( int i(0); i < 5; i++)
+ if(BombCount < 40)
{
- Unit* ThrowController = NULL;
- Unit* FireBomb = NULL;
- if(ThrowControllerGUID)
- ThrowController = Unit::GetUnit((*m_creature), ThrowControllerGUID);
-
- if(FireBombGUIDs[bombcounter])
- FireBomb = Unit::GetUnit((*m_creature), FireBombGUIDs[bombcounter]);
-
- if(ThrowController && FireBomb)
+ if(Unit *FireBomb = Unit::GetUnit((*m_creature), FireBombGUIDs[BombCount]))
{
- ThrowController->CastSpell(FireBomb,SPELL_FIRE_BOMB_THROW,true);
- FireBomb->CastSpell(FireBomb,SPELL_FIRE_BOMB_DUMMY,false);
- bombcounter ++;
+ FireBomb->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ DoCast(FireBomb, SPELL_FIRE_BOMB_THROW, true);
+ FireBomb->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
+ BombCount++;
+ if(BombCount == 40)
+ {
+ BombSequenceTimer = 5000;
+ }else BombSequenceTimer = 100;
+ }
+ else
+ {
+ Boom();
+ isBombing = false;
+ BombTimer = 20000+rand()%20000;
+ m_creature->RemoveAurasDueToSpell(SPELL_FIRE_BOMB_CHANNEL);
+ if(EnrageTimer <= 10000)
+ EnrageTimer = 0;
+ else
+ EnrageTimer -= 10000;
}
}
void UpdateAI(const uint32 diff)
{
- if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
- return;
-
- if(!bombing) // every Spell if NOT Bombing
+ if(isFlameBreathing)
{
- //FIRE BREATH several videos says every 8Secounds
- if(fire_breath_timer < diff)
+ if(!m_creature->IsNonMeleeSpellCasted(false))
{
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM,0);
- if(target)
- DoCast(target,SPELL_FLAME_BREATH);
- fire_breath_timer = 8000;
- }else fire_breath_timer -=diff;
-
- if(bomb_timer < diff)
+ isFlameBreathing = false;
+ }else return;
+ }
+
+ if(isBombing)
+ {
+ if(BombSequenceTimer < diff)
{
- FireWall();
- bomb_timer = 20000+rand()%20000;
- m_creature->Relocate(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2],0);
- m_creature->SendMonsterMove(JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2],0,0,100);
- DoYell(SAY_FIRE_BOMBS, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature,SOUND_FIRE_BOMBS);
- throwBombs();
- bombing = true;
-
- //Teleport every Player into the middle
- Unit* Temp = NULL;
- std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin();
- for (; i != m_creature->getThreatManager().getThreatList().end(); ++i)
- {
- Temp = Unit::GetUnit((*m_creature),(*i)->getUnitGuid());
- if (Temp && m_creature->GetDistance(Temp) > 30.0)
- DoTeleportPlayer(Temp, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0);
- }
- DoCast(m_creature,SPELL_TELETOCENTER,true); // only Effect Spell
- DoCast(m_creature,SPELL_FIRE_BOMB_CHANNEL,false);
- finishedbomb_timer = 11000;
- }else bomb_timer -=diff;
+ HandleBombSequence();
+ }else BombSequenceTimer -= diff;
+ return;
+ }
+
+ if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
+ return;
- //enrage if under 25% hp before 5 min.
- if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) && !enraged)
+ //enrage if under 25% hp before 5 min.
+ if(!enraged && m_creature->GetHealth() * 4 < m_creature->GetMaxHealth())
+ EnrageTimer = 0;
+
+ if(EnrageTimer < diff)
+ {
+ if(!enraged)
{
- enragetime = true;
- enrage_timer = 600000;
+ m_creature->CastSpell(m_creature, SPELL_ENRAGE, true);
+ enraged = true;
+ EnrageTimer = 300000;
}
-
- //Enrage but only if not bombing
- if(enragetime && !enraged)
+ else
{
DoYell(SAY_BERSERK, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature,SOUND_BERSERK);
- m_creature->InterruptNonMeleeSpells(false);
- DoCast(m_creature,SPELL_ENRAGE);
- enraged = true;
+ DoPlaySoundToSet(m_creature,SOUND_BERSERK);
+ m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
+ EnrageTimer = 300000;
}
- }
+ }else EnrageTimer -= diff;
- //Enrage after 5 minutes
- if(enrage_timer < diff)
+ if(BombTimer < diff)
{
- enragetime = true;
- enrage_timer = 600000;
- }else enrage_timer -=diff;
-
- if(bombing) // every Spell if Bombing
- {
- if(bombcounter < 40)
+ DoYell(SAY_FIRE_BOMBS, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_FIRE_BOMBS);
+
+ m_creature->AttackStop();
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->Relocate(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2],0);
+ m_creature->SendMonsterMove(JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2],0,0,0);
+ m_creature->StopMoving();
+ m_creature->CastSpell(m_creature, SPELL_FIRE_BOMB_CHANNEL, false);
+ //DoTeleportPlayer(m_creature, JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2], 0);
+ //m_creature->CastSpell(m_creature, SPELL_TELE_TO_CENTER, true);
+
+ FireWall();
+ SpawnBombs();
+ isBombing = true;
+ BombSequenceTimer = 100;
+
+ //Teleport every Player into the middle
+ Map *map = m_creature->GetMap();
+ if(!map->IsDungeon()) return;
+ InstanceMap::PlayerList const &PlayerList =((InstanceMap*)map)->GetPlayers();
+ for(InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
- if(throw_timer < diff)
- {
- throw5Bombs();
- throw_timer = 1000;
- }else throw_timer -=diff;
+ if((*i)->isAlive())
+ DoTeleportPlayer(*i, JanalainPos[0][0]-5+rand()%10, JanalainPos[0][1]-5+rand()%10, JanalainPos[0][2], 0);
}
+ //m_creature->CastSpell(Temp, SPELL_SUMMON_PLAYERS, true); // core bug, spell does not work if too far
+ return;
+ }else BombTimer -= diff;
- if(finishedbomb_timer < diff)
- {
- bombing = false;
- finishedbomb_timer = 6000;
- m_creature->RemoveAura(SPELL_FIRE_BOMB_CHANNEL,0);
- m_creature->RemoveAura(SPELL_FIRE_BOMB_CHANNEL,1);
- }else finishedbomb_timer -=diff;
- }
-
- //Call Hatcher
if(!noeggs)
{
- if(hatchertime < diff)
+ if(100 * m_creature->GetHealth() < 35 * m_creature->GetMaxHealth())
{
- if(pInstance->GetData(DATA_J_EGGSLEFT)>0 || pInstance->GetData(DATA_J_EGGSRIGHT) > 0)
- {
- Unit* hatcher = NULL;
+ m_creature->AttackStop();
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->Relocate(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2],0);
+ m_creature->SendMonsterMove(JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2],0,0,0);
+ m_creature->StopMoving();
+ m_creature->CastSpell(m_creature, SPELL_HATCH_ALL, false);
+ HatchAllEggs(2);
+ noeggs = true;
+ }
+ else if(HatcherTimer < diff)
+ {
+ if(HatchAllEggs(0))
+ {
DoYell(SAY_SUMMON_HATCHER, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_SUMMON_HATCHER);
- hatcher = m_creature->SummonCreature(MOB_AMANI_HATCHER,hatcherway_l[0][0],hatcherway_l[0][1],hatcherway_l[0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
- if(hatcher)
- hatcher->GetMotionMaster()->MovePoint(0, hatcherway_l[0][0], hatcherway_l[0][1], hatcherway_l[0][2]);
-
- hatcher = m_creature->SummonCreature(MOB_AMANI_HATCHER,hatcherway_r[0][0],hatcherway_r[0][1],hatcherway_r[0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
- if(hatcher)
- hatcher->GetMotionMaster()->MovePoint(0, hatcherway_r[0][0],hatcherway_r[0][1],hatcherway_r[0][2]);
- hatchertime = 45000;
+ m_creature->SummonCreature(MOB_AMANI_HATCHER,hatcherway[0][0][0],hatcherway[0][0][1],hatcherway[0][0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
+ m_creature->SummonCreature(MOB_AMANI_HATCHER,hatcherway[1][0][0],hatcherway[1][0][1],hatcherway[1][0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
+ HatcherTimer = 90000;
}
else
- {
noeggs = true;
- }
- }else hatchertime -=diff;
- }
-
- //WIPE after 10 minutes
- if(wipetimer < diff)
- {
- DoYell(SAY_BERSERK, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature,SOUND_BERSERK);
- DoCast(m_creature,SPELL_ENRAGE);
-
- wipetimer = 30000;
- }else wipetimer -=diff;
-
- //Hatch All
- if(!noeggs && (m_creature->GetHealth()*100) / m_creature->GetMaxHealth() < 35)
- {
- DoYell(SAY_ALL_EGGS , LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature,SOUND_BERSERK);
-
- if(pInstance)
- eggs = pInstance->GetData(DATA_J_EGGSLEFT);
-
- int i;
- for(i=1;i<=eggs;i=i+1)
- {
- int r = (rand()%20 - 10);
- int s = (rand()%20 - 10);
- m_creature->SummonCreature(MOB_HATCHLING,JanalainPos[0][0]+s,JanalainPos[0][1]+r,JanalainPos[0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,15000);
-
- if(pInstance)
- pInstance->SetData(DATA_J_HATCHLEFT,1);
- }
-
- if(pInstance)
- eggs = pInstance->GetData(DATA_J_EGGSRIGHT);
-
- for(i=1;i<=eggs;i=i+1)
- {
- int r = (rand()%20 - 10);
- int s = (rand()%20 - 10);
- m_creature->SummonCreature(MOB_HATCHLING,JanalainPos[0][0]+s,JanalainPos[0][1]+r,JanalainPos[0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,15000);
- if(pInstance)
- pInstance->SetData(DATA_J_HATCHRIGHT,1);
- }
-
- noeggs = true;
+ }else HatcherTimer -= diff;
}
- //check for reset ... exploit preventing ... pulled from his podest
- if(reset_timer < diff)
+ if(ResetTimer < diff)
{
- if(m_creature->GetPositionX() < -70 || m_creature->GetPositionX() > 0)
+ /*float x, y, z;
+ m_creature->GetPosition(x, y, z);
+ if(x < -70 || x > 0 || y > 1176 || y < 1121 || z < 18)
+ EnterEvadeMode();*/
+ ResetTimer = 5000;
+ }else ResetTimer -= diff;
+
+ DoMeleeAttackIfReady();
+
+ if(FireBreathTimer < diff)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
- EnterEvadeMode();
- reset_timer = 5000; //every 5 Seca
+ m_creature->AttackStop();
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->CastSpell(target, SPELL_FLAME_BREATH, false);
+ m_creature->StopMoving();
+ isFlameBreathing = true;
}
- }else reset_timer -=diff;
-
- DoMeleeAttackIfReady();
- }
+ FireBreathTimer = 8000;
+ }else FireBreathTimer -= diff;
+ }
};
CreatureAI* GetAI_boss_janalaiAI(Creature *_Creature)
{
- return new boss_janalaiAI (_Creature);
+ return new boss_janalaiAI(_Creature);
}
struct TRINITY_DLL_DECL mob_jandalai_firebombAI : public ScriptedAI
{
mob_jandalai_firebombAI(Creature *c) : ScriptedAI(c){Reset();}
- uint32 bomb_timer;
+ void Reset() {}
- void Reset()
+ void SpellHit(Unit *caster, const SpellEntry *spell)
{
- bomb_timer = 12000;
+ if(spell->Id == SPELL_FIRE_BOMB_THROW)
+ m_creature->CastSpell(m_creature, SPELL_FIRE_BOMB_DUMMY, true);
}
void Aggro(Unit* who) {}
@@ -477,253 +484,187 @@ struct TRINITY_DLL_DECL mob_jandalai_firebombAI : public ScriptedAI void MoveInLineOfSight(Unit* who) {}
- void UpdateAI(const uint32 diff)
- {
- if(bomb_timer < diff) //Boom
- {
- m_creature->CastSpell(m_creature,SPELL_FIRE_BOMB_DAMAGE,false);
- bomb_timer = 1800000;
- }else bomb_timer -=diff;
- }
+ void UpdateAI(const uint32 diff) {}
};
CreatureAI* GetAI_mob_jandalai_firebombAI(Creature *_Creature)
{
- return new mob_jandalai_firebombAI (_Creature);
+ return new mob_jandalai_firebombAI(_Creature);
}
struct TRINITY_DLL_DECL mob_amanishi_hatcherAI : public ScriptedAI
{
mob_amanishi_hatcherAI(Creature *c) : ScriptedAI(c)
- {
- pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ {
+ pInstance =((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
uint32 waypoint;
- bool waytype;
- bool start;
- bool hatch;
- bool wait;
- uint32 hatchlings;
- uint32 waittimer;
- uint32 eggs;
- uint32 delete_timer;
+ uint32 HatchNum;
+ uint32 WaitTimer;
+
+ bool side;
+ bool hasChangedSide;
+ bool isHatching;
void Reset()
{
+ side =(m_creature->GetPositionY() < 1150);
waypoint = 0;
- waytype = 0;
- hatch = false;
- start = false;
- wait = false;
- waittimer = 4000;
- hatchlings = 0;
- eggs = 0;
- delete_timer = 10000;
-
- //m_creature->RemoveAllAuras();
- //m_creature->DeleteThreatList();
- //m_creature->CombatStop();
- //DoGoHome();
+ isHatching = false;
+ hasChangedSide = false;
+ WaitTimer = 1;
+ HatchNum = 0;
+ }
+
+ bool HatchEggs(uint32 num)
+ {
+ 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, 23817, 50);
+ 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()));
+ }
+
+ //error_log("Eggs %d at %d", templist.size(), side);
+
+ for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end() && num > 0; ++i)
+ {
+ if((*i)->GetDisplayId() != 11686)
+ {
+ (*i)->CastSpell(*i, SPELL_HATCH_EGG, false);
+ num--;
+ }
+ }
+
+ if(num)
+ return false; // no more templist
+ else
+ return true;
}
- void Aggro(Unit* who)
+ void Aggro(Unit* who) {}
+ void AttackStart(Unit*) {}
+ void MoveInLineOfSight(Unit*) {}
+ void MovementInform(uint32, uint32)
{
+ if(waypoint == 5)
+ {
+ isHatching = true;
+ HatchNum = 1;
+ WaitTimer = 5000;
+ }
+ else
+ WaitTimer = 1;
}
void UpdateAI(const uint32 diff)
- {
- if(pInstance && (pInstance->GetData(DATA_JANALAIEVENT) == 1))
+ {
+ if(!pInstance || !(pInstance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
{
- if(!start && !hatch)
+ m_creature->SetVisibility(VISIBILITY_OFF);
+ m_creature->setDeathState(JUST_DIED);
+ return;
+ }
+
+ if(!isHatching)
+ {
+ if(WaitTimer)
{
- waytype = ( m_creature->GetPositionY() > 1150);
- waypoint = 1;
- start = true;
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MovePoint(0,hatcherway[side][waypoint][0],hatcherway[side][waypoint][1],hatcherway[side][waypoint][2]);
+ waypoint++;
+ WaitTimer = 0;
}
-
- if(start && !hatch)
+ }
+ else
+ {
+ if(WaitTimer < diff)
{
- if(wait)
+ if(HatchEggs(HatchNum))
{
- if(waittimer < diff)
- {
- wait = false;
- waittimer = 4000;
- waypoint++;
-
- if (waypoint == 5)
- {
- hatch = true;
- waittimer = 0;
- hatchlings = 1;
- }
- }
- else
- {
- waittimer -=diff;
- }
+ HatchNum++;
+ WaitTimer = 10000;
}
- else
+ else if(!hasChangedSide)
{
- m_creature->GetMotionMaster()->Clear();
- if(waytype)
- m_creature->GetMotionMaster()->MovePoint(0,hatcherway_l[waypoint][0],hatcherway_l[waypoint][1],hatcherway_l[waypoint][2]);
- else
- m_creature->GetMotionMaster()->MovePoint(0,hatcherway_r[waypoint][0],hatcherway_r[waypoint][1],hatcherway_r[waypoint][2]);
- wait= true;
+ side = side ? 0 : 1;
+ isHatching = false;
+ waypoint = 3;
+ WaitTimer = 1;
+ hasChangedSide = true;
}
- }
-
- if(start && hatch)
- {
- if(waittimer < diff)
+ else
{
- if(!pInstance)
- return;
-
- waittimer = 4000;
- Unit* hatchling;
-
- if(waytype)
- {
- eggs = pInstance->GetData(DATA_J_EGGSLEFT);
-
- if(eggs > 0)
- DoCast(m_creature,SPELL_HATCH_EGG);
-
- int i;
- for(i=1;i<=hatchlings;i=i+1)
- {
- eggs = pInstance->GetData(DATA_J_EGGSLEFT);
- if(eggs <= 0)
- {
- if (waytype) waytype = false; else waytype = true;
- waittimer = 15000;
- hatch = false;
- waypoint = 4;
- wait = true;
- i = hatchlings;
- }
- else
- {
- hatchling = DoSpawnCreature(MOB_HATCHLING,rand()%4-2,rand()%4-2,0,0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,15000);
- pInstance->SetData(DATA_J_HATCHLEFT,1);
- }
- }
-
- DoCast(m_creature,SPELL_HATCH_EGG);
-
- if(hatchlings < 5)
- hatchlings++;
- }
- else
- {
- eggs = pInstance->GetData(DATA_J_EGGSRIGHT);
-
- if(eggs > 0)
- DoCast(m_creature,SPELL_HATCH_EGG);
-
- int i;
- for(i=1;i<=hatchlings;i=i+1)
- {
- eggs = pInstance->GetData(DATA_J_EGGSRIGHT);
- if(eggs <= 0)
- {
- if (waytype) waytype = false; else waytype = true;
- waittimer = 15000;
- hatch = false;
- waypoint = 4;
- wait = true;
- i = hatchlings;
- }
- else
- {
- hatchling = DoSpawnCreature(MOB_HATCHLING,rand()%4-2,rand()%4-2,0,0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,15000);
- pInstance->SetData(DATA_J_HATCHRIGHT,1);
- }
- }
-
- DoCast(m_creature,SPELL_HATCH_EGG);
- hatchlings++;
- }
- }else waittimer -=diff;
- }
- }
- else
- {
- if(delete_timer < diff)
- {
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- delete_timer = 10000;
- }else delete_timer -=diff;
+ m_creature->SetVisibility(VISIBILITY_OFF);
+ m_creature->setDeathState(JUST_DIED);
+ }
+ }else WaitTimer -= diff;
}
}
};
CreatureAI* GetAI_mob_amanishi_hatcherAI(Creature *_Creature)
{
- return new mob_amanishi_hatcherAI (_Creature);
+ return new mob_amanishi_hatcherAI(_Creature);
}
struct TRINITY_DLL_DECL mob_hatchlingAI : public ScriptedAI
{
mob_hatchlingAI(Creature *c) : ScriptedAI(c)
- {
- pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ {
+ pInstance =((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
-
- uint32 buffer_timer;
- uint32 delete_timer;
- bool start;
+ uint32 BuffetTimer;
void Reset()
{
- buffer_timer = 7000;
- delete_timer = 10000;
- start = false;
- }
+ BuffetTimer = 7000;
+ if(m_creature->GetPositionY() > 1150)
+ m_creature->GetMotionMaster()->MovePoint(0, hatcherway[0][3][0]+rand()%4-2,1150+rand()%4-2,hatcherway[0][3][2]);
+ else
+ m_creature->GetMotionMaster()->MovePoint(0,hatcherway[1][3][0]+rand()%4-2,1150+rand()%4-2,hatcherway[1][3][2]);
- void Aggro(Unit *who)
- {
+ m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
}
+ void Aggro(Unit *who) {/*DoZoneInCombat();*/}
+
void UpdateAI(const uint32 diff)
{
- if(!start)
+ if(!pInstance || !(pInstance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
{
- if(m_creature->GetPositionY() > 1150)
- m_creature->GetMotionMaster()->MovePoint(0, hatcherway_l[3][0]+rand()%4-2,hatcherway_l[3][1]+rand()%4-2,hatcherway_l[3][2]);
- else
- m_creature->GetMotionMaster()->MovePoint(0,hatcherway_r[3][0]+rand()%4-2,hatcherway_r[3][1]+rand()%4-2,hatcherway_r[3][2]);
- start = true;
+ m_creature->SetVisibility(VISIBILITY_OFF);
+ m_creature->setDeathState(JUST_DIED);
+ return;
}
- if(delete_timer < diff && (pInstance && !(pInstance->GetData(DATA_JANALAIEVENT) == 1)))
- {
- if(!(m_creature->getVictim()))
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- delete_timer = 10000;
- }else delete_timer -=diff;
-
- if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+ if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
- if (buffer_timer < diff)
+ if(BuffetTimer < diff)
{
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM,0);
- if(target)
- DoCast(target,SPELL_FLAMEBUFFED);
-
- buffer_timer = 7000;
- }else buffer_timer -=diff;
+ m_creature->CastSpell(m_creature->getVictim(), SPELL_FLAMEBUFFET, false);
+ BuffetTimer = 10000;
+ }else BuffetTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -731,30 +672,58 @@ struct TRINITY_DLL_DECL mob_hatchlingAI : public ScriptedAI CreatureAI* GetAI_mob_hatchlingAI(Creature *_Creature)
{
- return new mob_hatchlingAI (_Creature);
+ return new mob_hatchlingAI(_Creature);
+}
+
+struct TRINITY_DLL_DECL mob_eggAI : public ScriptedAI
+{
+ mob_eggAI(Creature *c) : ScriptedAI(c){}
+ void Reset() {}
+ void Aggro(Unit* who) {}
+ void AttackStart(Unit* who) {}
+ void MoveInLineOfSight(Unit* who) {}
+ void UpdateAI(const uint32 diff) {}
+
+ void SpellHit(Unit *caster, const SpellEntry *spell)
+ {
+ if(spell->Id == SPELL_HATCH_EGG)
+ {
+ DoSpawnCreature(MOB_HATCHLING, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
+ m_creature->SetDisplayId(11686);
+ }
+ }
+};
+
+CreatureAI* GetAI_mob_eggAI(Creature *_Creature)
+{
+ return new mob_eggAI(_Creature);
}
void AddSC_boss_janalai()
{
Script *newscript;
-
newscript = new Script;
newscript->Name="boss_janalai";
newscript->GetAI = GetAI_boss_janalaiAI;
- m_scripts[nrscripts++] = newscript;
+ m_scripts[nrscripts++] = newscript;
newscript = new Script;
- newscript->Name="mob_jandalai_firebomb";
+ newscript->Name="mob_janalai_firebomb";
newscript->GetAI = GetAI_mob_jandalai_firebombAI;
- m_scripts[nrscripts++] = newscript;
+ m_scripts[nrscripts++] = newscript;
newscript = new Script;
- newscript->Name="mob_amanishi_hatcher";
+ newscript->Name="mob_janalai_hatcher";
newscript->GetAI = GetAI_mob_amanishi_hatcherAI;
- m_scripts[nrscripts++] = newscript;
+ m_scripts[nrscripts++] = newscript;
newscript = new Script;
- newscript->Name="mob_hatchling";
+ newscript->Name="mob_janalai_hatchling";
newscript->GetAI = GetAI_mob_hatchlingAI;
m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="mob_janalai_egg";
+ newscript->GetAI = GetAI_mob_eggAI;
+ m_scripts[nrscripts++] = newscript;
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp index e73a97c5eb4..3a99a6ed97c 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp @@ -1,18 +1,18 @@ /* Copyright (C) 2006,2007 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
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+* 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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
/* ScriptData
SDName: Boss_Nalorakk
@@ -22,6 +22,7 @@ SDCategory: Zul'Aman EndScriptData */
#include "precompiled.h"
+#include "def_zulaman.h"
//TODO: Trash Waves
@@ -36,6 +37,7 @@ EndScriptData */ #define SOUND_NALORAKK_EVENT2 12079
*/
+
//General defines
#define YELL_AGGRO "You be dead soon enough!"
#define SOUND_YELL_AGGRO 12070
@@ -45,15 +47,14 @@ EndScriptData */ #define SOUND_YELL_KILL_TWO 12076
#define YELL_DEATH "I... be waitin' on da udda side...."
#define SOUND_YELL_DEATH 12077
- //Never seen this being used, so just guessing from what I hear.
-#define YELL_BERSERK "You had your chance, now it be too late!"
+#define YELL_BERSERK "You had your chance, now it be too late!" //Never seen this being used, so just guessing from what I hear.
#define SOUND_YELL_BERSERK 12074
-#define SPELL_BERSERK 45078 //unsure, this increases damage, size and speed
+#define SPELL_BERSERK 45078
//Defines for Troll form
#define SPELL_BRUTALSWIPE 42384
-//#define SPELL_MANGLE 42389 This doesn't seem to apply the mangle debuff after all
+#define SPELL_MANGLE 42389
#define SPELL_MANGLEEFFECT 44955
#define SPELL_SURGE 42402
#define SPELL_BEARFORM 42377
@@ -72,184 +73,215 @@ EndScriptData */ #define YELL_SHIFTEDTOBEAR "You call on da beast, you gonna get more dan you bargain for!"
#define SOUND_YELL_TOBEAR 12072
+
struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
{
- boss_nalorakkAI(Creature *c) : ScriptedAI(c) {Reset();}
+ boss_nalorakkAI(Creature *c) : ScriptedAI(c) {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Reset();
+ }
+
+ ScriptedInstance *pInstance;
- uint32 ChangeForm_Timer;
uint32 BrutalSwipe_Timer;
uint32 Mangle_Timer;
uint32 Surge_Timer;
+
uint32 LaceratingSlash_Timer;
uint32 RendFlesh_Timer;
uint32 DeafeningRoar_Timer;
- uint32 ShapeShiftCheck_Timer;
+
+ uint32 ShapeShift_Timer;
uint32 Berserk_Timer;
+
+ uint64 ChargeTargetGUID;
+ uint64 TankGUID;
+
bool inBearForm;
- bool Berserking;
- bool ChangedToBear;
- bool ChangedToTroll;
void Reset()
{
- ChangeForm_Timer = 45000;
- BrutalSwipe_Timer = 12000;
- Mangle_Timer = 15000;
- Surge_Timer = 20000;
- LaceratingSlash_Timer = 6000;
- RendFlesh_Timer = 6000;
- DeafeningRoar_Timer = 20000;
- ShapeShiftCheck_Timer = 40000;
+ if(pInstance)
+ pInstance->SetData(DATA_NALORAKKEVENT, NOT_STARTED);
+
+ Surge_Timer = 15000 + rand()%5000;
+ BrutalSwipe_Timer = 7000 + rand()%5000;
+ Mangle_Timer = 10000 + rand()%5000;
+ ShapeShift_Timer = 45000 + rand()%5000;
Berserk_Timer = 600000;
+
+ ChargeTargetGUID = 0;
+ TankGUID = 0;
+
inBearForm = false;
- Berserking = false;
- ChangedToBear = false;
- ChangedToTroll = true;
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
}
void Aggro(Unit *who)
{
+ if(pInstance)
+ pInstance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS);
+
DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_AGGRO);
+// DoZoneInCombat();
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_NALORAKKEVENT, DONE);
+
+ DoYell(YELL_DEATH,LANG_UNIVERSAL,NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_DEATH);
}
- void KilledUnit(Unit* victim)
+ void KilledUnit(Unit* victim)
{
switch(rand()%2)
{
- case 0:
- DoYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature, SOUND_YELL_KILL_ONE);
- break;
- case 1:
- DoYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature, SOUND_YELL_KILL_TWO);
- break;
+ case 0:
+ DoYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_KILL_ONE);
+ break;
+ case 1:
+ DoYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_KILL_TWO);
+ break;
}
}
- void JustDied(Unit* Killer)
+ void MovementInform(uint32, uint32)
{
- DoYell(YELL_DEATH,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature, SOUND_YELL_DEATH);
+ if(ChargeTargetGUID)
+ {
+ if(Unit* target = Unit::GetUnit(*m_creature, ChargeTargetGUID))
+ m_creature->CastSpell(target, SPELL_SURGE, true);
+ ChargeTargetGUID = 0;
+ }
}
void UpdateAI(const uint32 diff)
{
- //Return since we have no target
- if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
+ if(TankGUID)
+ {
+ if(!ChargeTargetGUID)
+ {
+ m_creature->SetSpeed(MOVE_RUN, 1.2f);
+ m_creature->GetMotionMaster()->Clear();
+ if(Unit* target = Unit::GetUnit(*m_creature, TankGUID))
+ m_creature->GetMotionMaster()->MoveChase(target);
+ TankGUID = 0;
+ }
+ return;
+ }
+
+ if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
return;
- //Berserking
- if ((Berserk_Timer < diff) && (!Berserking))
+ if(Berserk_Timer < diff)
{
- DoCast(m_creature, SPELL_BERSERK);
+ DoCast(m_creature, SPELL_BERSERK, true);
DoYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_BERSERK);
- Berserking = true;
+ Berserk_Timer = 600000;
}else Berserk_Timer -= diff;
- //Don't check if we're shapeshifted every UpdateAI
- if (ShapeShiftCheck_Timer < diff)
- {
- //This will return true if we have bearform aura
- inBearForm = m_creature->HasAura(SPELL_BEARFORM, 0);
- ShapeShiftCheck_Timer = 1000;
- }else ShapeShiftCheck_Timer -= diff;
-
- //Spells for Troll Form (only to be casted if we NOT have bear phase aura)
- if (!inBearForm)
+ if(ShapeShift_Timer < diff)
{
- //We just changed to troll form!
- if (!ChangedToTroll)
+ if(inBearForm)
{
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
DoYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_TOTROLL);
- ChangedToTroll = true;
- ChangedToBear = false;
- //Reset spell timers
- LaceratingSlash_Timer = 6000 + rand()%19000;
- RendFlesh_Timer = 6000 + rand()%19000;
- DeafeningRoar_Timer = 15000 + rand()%10000;
- ShapeShiftCheck_Timer = 40000;
+ m_creature->RemoveAurasDueToSpell(SPELL_BEARFORM);
+ Surge_Timer = 15000 + rand()%5000;
+ BrutalSwipe_Timer = 7000 + rand()%5000;
+ Mangle_Timer = 10000 + rand()%5000;
+ ShapeShift_Timer = 45000 + rand()%5000;
+ inBearForm = false;
}
+ else
+ {
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
+ DoYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_YELL_TOBEAR);
+ DoCast(m_creature, SPELL_BEARFORM, true);
+ LaceratingSlash_Timer = 2000; // dur 18s
+ RendFlesh_Timer = 3000; // dur 5s
+ DeafeningRoar_Timer = 5000 + rand()%5000; // dur 2s
+ ShapeShift_Timer = 20000 + rand()%5000; // dur 30s
+ inBearForm = true;
+ }
+ }else ShapeShift_Timer -= diff;
- //Brutal Swipe (some sources may say otherwise, but I've never seen this in Bear form)
- if (BrutalSwipe_Timer < diff)
+ if(!inBearForm)
+ {
+ if(BrutalSwipe_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_BRUTALSWIPE);
- BrutalSwipe_Timer = 7000 + rand()%13000;
+ BrutalSwipe_Timer = 7000 + rand()%5000;
}else BrutalSwipe_Timer -= diff;
- //Mangle
- if (Mangle_Timer < diff)
+ if(Mangle_Timer < diff)
{
- DoCast(m_creature->getVictim(), SPELL_MANGLEEFFECT);
- Mangle_Timer = 3000 + rand()%17000;
+ if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0))
+ {
+ DoCast(m_creature->getVictim(), SPELL_MANGLE);
+ Mangle_Timer = 1000;
+ }
+ else Mangle_Timer = 10000 + rand()%5000;
}else Mangle_Timer -= diff;
- //Surge
- if (Surge_Timer < diff)
+ if(Surge_Timer < diff)
{
- //select a random unit other than the main tank
- Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 1);
-
- //if there aren't other units, cast on the tank
- if(!target)
- target = m_creature->getVictim();
-
- DoCast(target, SPELL_SURGE);
-
DoYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_SURGE);
- Surge_Timer = 15000 + rand()%17500;
+ Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 1);
+ if(!target) target = m_creature->getVictim();
+ TankGUID = m_creature->getVictim()->GetGUID();
+ ChargeTargetGUID = target->GetGUID();
+
+ float x, y, z;
+ target->GetContactPoint(m_creature, x, y, z);
+ m_creature->SetSpeed(MOVE_RUN, 5.0f);
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
+
+ Surge_Timer = 15000 + rand()%5000;
+ return;
}else Surge_Timer -= diff;
-
- //Change to Bear Form if we're in Troll Form for 45sec
- if (ChangeForm_Timer < diff)
- {
- DoCast(m_creature, SPELL_BEARFORM);
- //And 30sec (bear form) + 45sec (troll form) before we should cast this again
- ChangeForm_Timer = 75000;
- }else ChangeForm_Timer -= diff;
}
- //Spells for Bear Form (only to be casted if we have bear phase aura)
- else
- {
- //We just changed to bear form!
- if (!ChangedToBear)
- {
- DoYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature, SOUND_YELL_TOBEAR);
- ChangedToBear = true;
- ChangedToTroll = false;
- //Reset spell timers
- Surge_Timer = 15000 + rand()%17500;
- BrutalSwipe_Timer = 7000 + rand()%13000;
- Mangle_Timer = 3000 + rand()%17000;
- ShapeShiftCheck_Timer = 25000;
- }
-
- //Lacerating Slash
- if (LaceratingSlash_Timer < diff)
+ else {
+ if(LaceratingSlash_Timer < diff)
{
- DoCast(m_creature->getVictim(), SPELL_LACERATINGSLASH);
- LaceratingSlash_Timer = 6000 + rand()%19000;
+ if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0))
+ DoCast(m_creature->getVictim(), SPELL_LACERATINGSLASH);
+ else
+ {
+ int32 bp0 = 3470;
+ m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_LACERATINGSLASH, &bp0, NULL, NULL, false);
+ }
+ LaceratingSlash_Timer = 18000 + rand()%5000;
}else LaceratingSlash_Timer -= diff;
- //Rend Flesh
- if (RendFlesh_Timer < diff)
+ if(RendFlesh_Timer < diff)
{
- DoCast(m_creature->getVictim(), SPELL_RENDFLESH);
- RendFlesh_Timer = 6000 + rand()%19000;
+ if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0))
+ DoCast(m_creature->getVictim(), SPELL_RENDFLESH);
+ else
+ {
+ int32 bp1 = 4670;
+ m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_RENDFLESH, NULL, &bp1, NULL, false);
+ }
+ RendFlesh_Timer = 5000 + rand()%5000;
}else RendFlesh_Timer -= diff;
- //Deafening Roar
- if (DeafeningRoar_Timer < diff)
+ if(DeafeningRoar_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_DEAFENINGROAR);
- DeafeningRoar_Timer = 15000 + rand()%10000;
+ DeafeningRoar_Timer = 15000 + rand()%5000;
}else DeafeningRoar_Timer -= diff;
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp new file mode 100644 index 00000000000..a73ced22de6 --- /dev/null +++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp @@ -0,0 +1,683 @@ +/* Copyright (C) 2006,2007,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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: Boss_ZulJin
+SD%Complete: 85%
+SDComment:
+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!"
+#define SOUND_TRANSFORM_TO_LYNX 12094
+
+#define YELL_TRANSFORM_TO_BEAR "Got me some new tricks...like me bruddah bear!"
+#define SOUND_TRANSFORM_TO_BEAR 12092
+
+#define YELL_TRANSFORM_TO_DRAGONHAWK "Ya don' have to look to da sky to see da dragonhawk!"
+#define SOUND_TRANSFORM_TO_DRAGONHAWK 12095
+
+#define YELL_TRANSFORM_TO_EAGLE "Dere be no hidin' from da eagle!"
+#define SOUND_TRANSFORM_TO_EAGLE 12093
+
+#define YELL_KILL_ONE "Da Amani de chuka!"
+#define SOUND_KILL_ONE 12098
+
+#define YELL_KILL_TWO "Lot more gonna fall like you!"
+#define SOUND_KILL_TWO 12099
+
+#define YELL_FIRE_BREATH "Fire kill you just as quick!"
+#define SOUND_FIRE_BRETH 12096
+
+#define YELL_AGGRO "Nobody badduh dan me!"
+#define SOUND_AGGRO 12091
+
+#define YELL_BERSERK "You too slow! Me too strong!"
+#define SOUND_BERSERK 12097
+
+#define YELL_DEATH "Mebbe me fall...but da Amani empire...never gonna die..."
+#define SOUND_DEATH 12100
+
+//Still not used, need more info
+#define YELL_INTRO "Everybody always wanna take from us. Now we gonna start takin' back. Anybody who get in our way...gonna drown in their own blood! De Amani empire be back now...seekin' vengeance. And we gonna start...with you!"
+#define SOUND_INTRO 12090
+
+//Spells:
+// ====== Troll Form
+#define SPELL_WHIRLWIND 17207
+#define SPELL_GRIEVOUS_THROW 43093 // remove debuff after full healed
+// ====== Bear Form
+#define SPELL_CREEPING_PARALYSIS 43095 // should cast on the whole raid
+#define SPELL_OVERPOWER 43456 // use after melee attack dodged
+// ====== Eagle Form
+#define SPELL_ENERGY_STORM 43983 // enemy area aura, trigger 42577
+#define SPELL_ZAP_INFORM 42577
+#define SPELL_ZAP_DAMAGE 43137 // 1250 damage
+#define SPELL_SUMMON_CYCLONE 43112 // summon four feather vortex
+#define CREATURE_FEATHER_VORTEX 24136
+#define SPELL_CYCLONE_VISUAL 43119 // trigger 43147 visual
+#define SPELL_CYCLONE_PASSIVE 43120 // trigger 43121 (4y aoe) every second
+//Lynx Form
+#define SPELL_CLAW_RAGE_HASTE 42583
+#define SPELL_CLAW_RAGE_TRIGGER 43149
+#define SPELL_CLAW_RAGE_DAMAGE 43150
+#define SPELL_LYNX_RUSH_HASTE 43152
+#define SPELL_LYNX_RUSH_DAMAGE 43153
+//Dragonhawk Form
+#define SPELL_FLAME_WHIRL 43213 // trigger two spells
+#define SPELL_FLAME_BREATH 43215
+#define SPELL_SUMMON_PILLAR 43216 // summon 24187
+#define CREATURE_COLUMN_OF_FIRE 24187
+#define SPELL_PILLAR_TRIGGER 43218 // trigger 43217
+
+//cosmetic
+#define SPELL_SPIRIT_AURA 42466
+#define SPELL_SIPHON_SOUL 43501
+
+//Transforms:
+#define SPELL_SHAPE_OF_THE_BEAR 42594 // 15% dmg
+#define SPELL_SHAPE_OF_THE_EAGLE 42606
+#define SPELL_SHAPE_OF_THE_LYNX 42607 // haste melee 30%
+#define SPELL_SHAPE_OF_THE_DRAGONHAWK 42608
+
+#define SPELL_BERSERK 45078
+
+
+#define PHASE_BEAR 0
+#define PHASE_EAGLE 1
+#define PHASE_LYNX 2
+#define PHASE_DRAGONHAWK 3
+#define PHASE_TROLL 4
+
+//coords for going for changing form
+#define CENTER_X 120.148811
+#define CENTER_Y 703.713684
+#define CENTER_Z 45.111477
+
+struct SpiritInfoStruct
+{
+ uint32 entry;
+ float x, y, z, orient;
+};
+
+static SpiritInfoStruct SpiritInfo[] =
+{
+ {23878, 147.87, 706.51, 45.11, 3.04},
+ {23880, 88.95, 705.49, 45.11, 6.11},
+ {23877, 137.23, 725.98, 45.11, 3.71},
+ {23879, 104.29, 726.43, 45.11, 5.43}
+};
+
+struct TransformStruct
+{
+ uint32 sound;
+ char* text;
+ uint32 spell, unaura;
+};
+
+static TransformStruct Transform[] =
+{
+ {SOUND_TRANSFORM_TO_BEAR, YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND},
+ {SOUND_TRANSFORM_TO_EAGLE, YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR},
+ {SOUND_TRANSFORM_TO_LYNX, YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE},
+ {SOUND_TRANSFORM_TO_DRAGONHAWK, YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX}
+};
+
+struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
+{
+ boss_zuljinAI(Creature *c) : ScriptedAI(c)
+ {
+ 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;
+
+ uint64 SpiritGUID[4];
+ uint64 ClawTargetGUID;
+ uint64 TankGUID;
+
+ uint32 Phase;
+ uint32 health_20;
+
+ uint32 Intro_Timer;
+ uint32 Berserk_Timer;
+
+ uint32 Whirlwind_Timer;
+ uint32 Grievous_Throw_Timer;
+
+ uint32 Creeping_Paralysis_Timer;
+ uint32 Overpower_Timer;
+
+ uint32 Claw_Rage_Timer;
+ uint32 Lynx_Rush_Timer;
+ uint32 Claw_Counter;
+ uint32 Claw_Loop_Timer;
+
+ uint32 Flame_Whirl_Timer;
+ uint32 Flame_Breath_Timer;
+ uint32 Pillar_Of_Fire_Timer;
+
+ void Reset()
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_ZULJINEVENT, NOT_STARTED);
+
+ Phase = 0;
+
+ health_20 = m_creature->GetMaxHealth()*0.2;
+
+ Intro_Timer = 37000;
+ Berserk_Timer = 600000;
+
+ Whirlwind_Timer = 7000;
+ Grievous_Throw_Timer = 8000;
+
+ Creeping_Paralysis_Timer = 7000;
+ Overpower_Timer = 0;
+
+ Claw_Rage_Timer = 5000;
+ Lynx_Rush_Timer = 14000;
+ Claw_Loop_Timer = 0;
+ Claw_Counter = 0;
+
+ Flame_Whirl_Timer = 5000;
+ Flame_Breath_Timer = 6000;
+ Pillar_Of_Fire_Timer = 7000;
+
+ ClawTargetGUID = 0;
+ TankGUID = 0;
+
+ DespawnAdds();
+ DespawnSummons(CREATURE_FEATHER_VORTEX);
+ DespawnSummons(CREATURE_COLUMN_OF_FIRE);
+
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 47174);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
+ m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ }
+
+ void Aggro(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_ZULJINEVENT, IN_PROGRESS);
+
+ DoZoneInCombat();
+
+ DoYell(YELL_INTRO,LANG_UNIVERSAL,NULL);
+ DoPlaySoundToSet(m_creature, SOUND_INTRO);
+ SpawnAdds();
+ EnterPhase(0);
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if(Intro_Timer)
+ return;
+
+ switch(rand()%2)
+ {
+ case 0:
+ DoYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_KILL_ONE);
+ break;
+ case 1:
+ DoYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_KILL_TWO);
+ break;
+ }
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_ZULJINEVENT, DONE);
+
+ DoYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_DEATH);
+ DespawnSummons(CREATURE_COLUMN_OF_FIRE);
+
+ if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[3]))
+ Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ }
+
+ void AttackStart(Unit *who)
+ {
+ if(!who)
+ return;
+
+ if (who->isTargetableForAttack())
+ {
+ if(Phase == 2)
+ m_creature->Attack(who, false);
+ else
+ DoStartAttackAndMovement(who);
+
+ if (!InCombat)
+ {
+ Aggro(who);
+ InCombat = true;
+ }
+ }
+ }
+
+ void DoMeleeAttackIfReady()
+ {
+ if( !m_creature->IsNonMeleeSpellCasted(false))
+ {
+ if(m_creature->isAttackReady() && m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+ {
+ if(Phase == 1 && !Overpower_Timer)
+ {
+ uint32 health = m_creature->getVictim()->GetHealth();
+ m_creature->AttackerStateUpdate(m_creature->getVictim());
+ if(m_creature->getVictim() && health == m_creature->getVictim()->GetHealth())
+ {
+ m_creature->CastSpell(m_creature->getVictim(), SPELL_OVERPOWER, false);
+ Overpower_Timer = 5000;
+ }
+ }else m_creature->AttackerStateUpdate(m_creature->getVictim());
+ m_creature->resetAttackTimer();
+ }
+ }
+ }
+
+ void SpawnAdds()
+ {
+ Creature *pCreature = NULL;
+ for(uint8 i = 0; i < 4; i++)
+ {
+ pCreature = m_creature->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].x, SpiritInfo[i].y, SpiritInfo[i].z, SpiritInfo[i].orient, TEMPSUMMON_DEAD_DESPAWN, 0);
+ if(pCreature)
+ {
+ pCreature->CastSpell(pCreature, SPELL_SPIRIT_AURA, true);
+ pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ SpiritGUID[i] = pCreature->GetGUID();
+ }
+ }
+ }
+
+ void DespawnAdds()
+ {
+ for(uint8 i = 0; i < 4; i++)
+ {
+ Unit* Temp = NULL;
+ if(SpiritGUID[i])
+ {
+ if(Temp = Unit::GetUnit(*m_creature, SpiritGUID[i]))
+ {
+ Temp->SetVisibility(VISIBILITY_OFF);
+ Temp->setDeathState(DEAD);
+ }
+ }
+ SpiritGUID[i] = 0;
+ }
+ }
+
+ void DespawnSummons(uint32 entry)
+ {
+ 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()));
+ }
+
+ for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end(); ++i)
+ {
+ (*i)->SetVisibility(VISIBILITY_OFF);
+ (*i)->setDeathState(JUST_DIED);
+ }
+ }
+
+ void EnterPhase(uint32 NextPhase)
+ {
+ switch(NextPhase)
+ {
+ case 0:
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ m_creature->Relocate(CENTER_X, CENTER_Y, CENTER_Z,0);
+ m_creature->SendMonsterMove(CENTER_X, CENTER_Y, CENTER_Z,0,0,100);
+ DoResetThreat();
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->RemoveAurasDueToSpell(Transform[Phase].unaura);
+ DoCast(m_creature, Transform[Phase].spell);
+ DoYell(Transform[Phase].text, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, Transform[Phase].sound);
+ if(Phase > 0)
+ {
+ if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[Phase - 1]))
+ Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ }
+ if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[NextPhase - 1]))
+ Temp->CastSpell(m_creature, SPELL_SIPHON_SOUL, false); // should m cast on temp
+ if(NextPhase == 2)
+ {
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->CastSpell(m_creature, SPELL_ENERGY_STORM, true); // enemy aura
+ for(uint8 i = 0; i < 4; i++)
+ {
+ Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ if(Vortex)
+ {
+ Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true);
+ Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true);
+ Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Vortex->SetSpeed(MOVE_RUN, 1.0f);
+ Vortex->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
+ DoZoneInCombat(Vortex);
+ }
+ }
+ }
+ else
+ m_creature->AI()->AttackStart(m_creature->getVictim());
+ if(NextPhase == 3)
+ {
+ m_creature->RemoveAurasDueToSpell(SPELL_ENERGY_STORM);
+ DespawnSummons(CREATURE_FEATHER_VORTEX);
+ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
+ }
+ break;
+ default:
+ break;
+ }
+ Phase = NextPhase;
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!TankGUID)
+ {
+ if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
+ return;
+
+ if(m_creature->GetHealth() < health_20 * (4 - Phase))
+ EnterPhase(Phase + 1);
+ }
+
+ if(Berserk_Timer < diff)
+ {
+ m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
+ DoYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_BERSERK);
+ Berserk_Timer = 60000;
+ }else Berserk_Timer -= diff;
+
+ switch (Phase)
+ {
+ case 0:
+ if(Intro_Timer)
+ {
+ if(Intro_Timer <= diff)
+ {
+ DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ DoPlaySoundToSet(m_creature, SOUND_AGGRO);
+ Intro_Timer = 0;
+ }else Intro_Timer -= diff;
+ }
+
+ if(Whirlwind_Timer < diff)
+ {
+ DoCast(m_creature, SPELL_WHIRLWIND);
+ Whirlwind_Timer = 15000 + rand()%5000;
+ }else Whirlwind_Timer -= diff;
+
+ if(Grievous_Throw_Timer < diff)
+ {
+ if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ m_creature->CastSpell(target, SPELL_GRIEVOUS_THROW, false);
+ Grievous_Throw_Timer = 10000;
+ }else Grievous_Throw_Timer -= diff;
+ break;
+
+ case 1:
+ if(Creeping_Paralysis_Timer < diff)
+ {
+ DoCast(m_creature, SPELL_CREEPING_PARALYSIS);
+ Creeping_Paralysis_Timer = 20000;
+ }else Creeping_Paralysis_Timer -= diff;
+
+ if(Overpower_Timer < diff)
+ {
+ // implemented in DoMeleeAttackIfReady()
+ Overpower_Timer = 0;
+ }else Overpower_Timer -= diff;
+ break;
+
+ case 2:
+ return;
+
+ case 3:
+ if(Claw_Rage_Timer <= diff)
+ {
+ if(!TankGUID)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ TankGUID = m_creature->getVictim()->GetGUID();
+ m_creature->SetSpeed(MOVE_RUN, 5.0f);
+ AttackStart(target); // change victim
+ Claw_Rage_Timer = 0;
+ Claw_Loop_Timer = 500;
+ Claw_Counter = 0;
+ }
+ }
+ else if(!Claw_Rage_Timer) // do not do this when Lynx_Rush
+ {
+ if(Claw_Loop_Timer < diff)
+ {
+ Unit* target = m_creature->getVictim();
+ if(!target || !target->isTargetableForAttack()) target = Unit::GetUnit(*m_creature, TankGUID);
+ if(!target || !target->isTargetableForAttack()) target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ if(target)
+ {
+ AttackStart(target);
+ if(m_creature->IsWithinDistInMap(target, ATTACK_DISTANCE))
+ {
+ m_creature->CastSpell(target, SPELL_CLAW_RAGE_DAMAGE, true);
+ Claw_Counter++;
+ if(Claw_Counter == 12)
+ {
+ Claw_Rage_Timer = 15000 + rand()%5000;
+ m_creature->SetSpeed(MOVE_RUN, 1.2f);
+ AttackStart(Unit::GetUnit(*m_creature, TankGUID));
+ TankGUID = 0;
+ return;
+ }
+ else
+ Claw_Loop_Timer = 500;
+ }
+ }else EnterEvadeMode(); // if(target)
+ }else Claw_Loop_Timer -= diff;
+ } //if(TankGUID)
+ }else Claw_Rage_Timer -= diff;
+
+ if(Lynx_Rush_Timer <= diff)
+ {
+ if(!TankGUID)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ TankGUID = m_creature->getVictim()->GetGUID();
+ m_creature->SetSpeed(MOVE_RUN, 5.0f);
+ AttackStart(target); // change victim
+ Lynx_Rush_Timer = 0;
+ Claw_Counter = 0;
+ }
+ }
+ else if(!Lynx_Rush_Timer)
+ {
+ Unit* target = m_creature->getVictim();
+ if(!target || !target->isTargetableForAttack())
+ {
+ target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ AttackStart(target);
+ }
+ if(target)
+ {
+ if(m_creature->IsWithinDistInMap(target, ATTACK_DISTANCE))
+ {
+ m_creature->CastSpell(target, SPELL_LYNX_RUSH_DAMAGE, true);
+ Claw_Counter++;
+ if(Claw_Counter == 9)
+ {
+ Lynx_Rush_Timer = 15000 + rand()%5000;
+ m_creature->SetSpeed(MOVE_RUN, 1.2f);
+ AttackStart(Unit::GetUnit(*m_creature, TankGUID));
+ TankGUID = 0;
+ }
+ else
+ AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
+ }
+ }else EnterEvadeMode(); // if(target)
+ } //if(TankGUID)
+ }else Lynx_Rush_Timer -= diff;
+
+ break;
+ case 4:
+ if(Flame_Whirl_Timer < diff)
+ {
+ DoCast(m_creature, SPELL_FLAME_WHIRL);
+ Flame_Whirl_Timer = 12000;
+ }Flame_Whirl_Timer -= diff;
+
+ if(Pillar_Of_Fire_Timer < diff)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ float x, y, z;
+ target->GetPosition(x, y, z);
+ Creature* Pillar = m_creature->SummonCreature(CREATURE_COLUMN_OF_FIRE, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
+ if(Pillar)
+ {
+ Pillar->CastSpell(Pillar, SPELL_PILLAR_TRIGGER, true);
+ Pillar->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+ }
+ Pillar_Of_Fire_Timer = 10000;
+ }else Pillar_Of_Fire_Timer -= diff;
+
+ if(Flame_Breath_Timer < diff)
+ {
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ m_creature->CastSpell(m_creature, SPELL_FLAME_BREATH, false);
+ Flame_Breath_Timer = 10000;
+ }else Flame_Breath_Timer -= diff;
+ break;
+
+ default:
+ break;
+ }
+
+ if(!TankGUID)
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_zuljin(Creature *_Creature)
+{
+ return new boss_zuljinAI (_Creature);
+}
+
+struct TRINITY_DLL_DECL do_nothingAI : public ScriptedAI
+{
+ do_nothingAI(Creature *c) : ScriptedAI(c) {}
+ void Reset() {}
+ void Aggro(Unit* who) {}
+ void AttackStart(Unit* who) {}
+ void MoveInLineOfSight(Unit* who) {}
+ void UpdateAI(const uint32 diff) {}
+};
+
+CreatureAI* GetAI_do_nothing(Creature *_Creature)
+{
+ return new do_nothingAI (_Creature);
+}
+
+struct TRINITY_DLL_DECL feather_vortexAI : public ScriptedAI
+{
+ feather_vortexAI(Creature *c) : ScriptedAI(c) {}
+
+ void Reset() {}
+
+ void Aggro(Unit* target) {}
+
+ void SpellHit(Unit *caster, const SpellEntry *spell)
+ {
+ if(spell->Id == SPELL_ZAP_INFORM)
+ m_creature->CastSpell(caster, SPELL_ZAP_DAMAGE, true);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ //if the vortex reach the target, it change his target to another player
+ if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+ AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
+ }
+};
+
+CreatureAI* GetAI_feather_vortexAI(Creature *_Creature)
+{
+ return new feather_vortexAI (_Creature);
+}
+
+void AddSC_boss_zuljin()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name="boss_zuljin";
+ newscript->GetAI = GetAI_boss_zuljin;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="do_nothing";
+ newscript->GetAI = GetAI_do_nothing;
+ m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name="mob_zuljin_vortex";
+ newscript->GetAI = GetAI_feather_vortexAI;
+ m_scripts[nrscripts++] = newscript;
+}
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h b/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h index 66694fe51b6..d01da90b9d1 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h +++ b/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h @@ -1,17 +1,18 @@ /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+* This program is free software licensed under GPL version 2
+* Please see the included DOCS/LICENSE.TXT for more information */
#ifndef DEF_ZULAMAN_H
#define DEF_ZULAMAN_H
-#define DATA_JANALAI 1
-#define DATA_JANALAIEVENT 2
-#define DATA_J_EGGSLEFT 3
-#define DATA_J_EGGSRIGHT 4
-#define DATA_J_HATCHLEFT 5
-#define DATA_J_HATCHRIGHT 6
+#define DATA_NALORAKKEVENT 1
+#define DATA_AKILZONEVENT 2
+#define DATA_JANALAIEVENT 3
+#define DATA_HALAZZIEVENT 4
+#define DATA_HEXLORDEVENT 5
+#define DATA_ZULJINEVENT 6
+#define DATA_CHESTLOOTED 7
+#define TYPE_RAND_VENDOR_1 8
+#define TYPE_RAND_VENDOR_2 9
-#define TYPE_RAND_VENDOR_1 7
-#define TYPE_RAND_VENDOR_2 8
#endif
diff --git a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp index 4dc87adbbf1..109e01e5189 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp +++ b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp @@ -1,48 +1,94 @@ /* Copyright (C) 2006,2007 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
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+* 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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
/* ScriptData
-SDName: Instance_Zulaman
+SDName: instance_zulaman
SD%Complete: 80
-SDComment:
+SDComment:
SDCategory: Zul'Aman
EndScriptData */
#include "precompiled.h"
#include "def_zulaman.h"
-#define ENCOUNTERS 1
+#define ENCOUNTERS 6
#define RAND_VENDOR 2
+//187021 //Harkor's Satchel
+//186648 //Tanzar's Trunk
+//186672 //Ashli's Bag
+//186667 //Kraz's Package
+// Chests spawn at bear/eagle/dragonhawk/lynx bosses
+// The loots depend on how many bosses have been killed, but not the entries of the chests
+// But we cannot add loots to gameobject, so we have to use the fixed loot_template
+struct SHostageInfo
+{
+ uint32 npc, go;
+ float x, y, z, o;
+};
+
+static SHostageInfo HostageInfo[] =
+{
+ {23790, 186648, -57, 1343, 40.77, 3.2}, // bear
+ {23999, 187021, 400, 1414, 74.36, 3.3}, // eagle
+ {24001, 186672, -35, 1134, 18.71, 1.9}, // dragonhawk
+ {24024, 186667, 413, 1117, 6.32, 3.1} // lynx
+
+};
+
struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
{
instance_zulaman(Map *Map) : ScriptedInstance(Map) {Initialize();};
- uint64 janalai;
- uint32 janalai_eggs_l;
- uint32 janalai_eggs_r;
+ uint64 HarkorsSatchelGUID;
+ uint64 TanzarsTrunkGUID;
+ uint64 AshlisBagGUID;
+ uint64 KrazsPackageGUID;
+
+ uint64 HexLordGateGUID;
+ uint64 ZulJinGateGUID;
+ uint64 AkilzonDoorGUID;
+ uint64 ZulJinDoorGUID;
+ uint64 HalazziDoorGUID;
+
+ uint32 QuestTimer;
+ uint16 BossKilled;
+ uint16 QuestMinute;
+ uint16 ChestLooted;
uint32 Encounters[ENCOUNTERS];
uint32 RandVendor[RAND_VENDOR];
void Initialize()
{
- janalai = 0;
- janalai_eggs_l = 20;
- janalai_eggs_r = 20;
+ HarkorsSatchelGUID = 0;
+ TanzarsTrunkGUID = 0;
+ AshlisBagGUID = 0;
+ KrazsPackageGUID = 0;
+
+ uint64 HexLordGateGUID = 0;
+ uint64 ZulJinGateGUID = 0;
+ uint64 AkilzonDoorGUID = 0;
+ uint64 HalazziDoorGUID = 0;
+ uint64 ZulJinDoorGUID = 0;
+
+ QuestTimer = 0;
+ QuestMinute = 21;
+ BossKilled = 0;
+ ChestLooted = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounters[i] = NOT_STARTED;
@@ -50,7 +96,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance RandVendor[i] = NOT_STARTED;
}
- bool IsEncounterInProgress() const
+ bool IsEncounterInProgress() const
{
for(uint8 i = 0; i < ENCOUNTERS; i++)
if(Encounters[i] == IN_PROGRESS) return true;
@@ -59,47 +105,171 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance }
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
- {
+ {
switch(creature_entry)
{
- case 23578:
- janalai = creature->GetGUID();
- break;
+ case 23578://janalai
+ case 23863://zuljin
+ case 24239://hexlord
+ case 23577://halazzi
+ case 23576://nalorakk
+ default: break;
+ }
+ }
+
+ void OnObjectCreate(GameObject *go)
+ {
+ switch(go->GetEntry())
+ {
+ case 186303: HalazziDoorGUID = go->GetGUID(); break;
+ case 186304: ZulJinGateGUID = go->GetGUID(); break;
+ case 186305: HexLordGateGUID = go->GetGUID(); break;
+ case 186858: AkilzonDoorGUID = go->GetGUID(); break;
+ case 186859: ZulJinDoorGUID = go->GetGUID(); break;
+
+ case 187021: HarkorsSatchelGUID = go->GetGUID(); break;
+ case 186648: TanzarsTrunkGUID = go->GetGUID(); break;
+ case 186672: AshlisBagGUID = go->GetGUID(); break;
+ case 186667: KrazsPackageGUID = go->GetGUID(); break;
+ default: break;
+
}
+ CheckInstanceStatus();
}
- uint64 GetData64(uint32 identifier)
+ void OpenDoor(uint64 DoorGUID, bool open)
{
- if(identifier == DATA_JANALAI && janalai)
- return janalai;
+ if(((InstanceMap*)instance)->GetPlayers().size())
+ if(Player* first = ((InstanceMap*)instance)->GetPlayers().front())
+ if(GameObject *Door = GameObject::GetGameObject(*first, DoorGUID))
+ Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ }
- return 0;
+ void SummonHostage(uint8 num)
+ {
+ if(QuestMinute && ((InstanceMap*)instance)->GetPlayers().size())
+ if(Player* first = ((InstanceMap*)instance)->GetPlayers().front())
+ if(Unit* Hostage = first->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0))
+ {
+ Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
+ }
+
+ void CheckInstanceStatus()
+ {
+ if(BossKilled >= 4)
+ OpenDoor(HexLordGateGUID, true);
+
+ if(BossKilled >= 5)
+ OpenDoor(ZulJinGateGUID, true);
+ }
+
+ void UpdateWorldState(uint32 field, uint32 value)
+ {
+ WorldPacket data(SMSG_UPDATE_WORLD_STATE, 8);
+ data << field << value;
+ ((InstanceMap*)instance)->SendToPlayers(&data);
+ }
+
+ const char* Save()
+ {
+ std::ostringstream ss;
+ ss << "S " << BossKilled << " " << ChestLooted << " " << QuestMinute;
+ char* data = new char[ss.str().length()+1];
+ strcpy(data, ss.str().c_str());
+ //error_log("SD2: Zul'aman saved, %s.", data);
+ return data;
+ }
+
+ void Load(const char* load)
+ {
+ if(!load) return;
+ std::istringstream ss(load);
+ //error_log("SD2: Zul'aman loaded, %s.", ss.str().c_str());
+ char dataHead; // S
+ uint16 data1, data2, data3;
+ ss >> dataHead >> data1 >> data2 >> data3;
+ //error_log("SD2: Zul'aman loaded, %d %d %d.", data1, data2, data3);
+ if(dataHead == 'S')
+ {
+ BossKilled = data1;
+ ChestLooted = data2;
+ QuestMinute = data3;
+ }else error_log("SD2: Zul'aman: corrupted save data.");
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
- case DATA_JANALAIEVENT:
- if(data == 0)
+ case DATA_NALORAKKEVENT:
+ Encounters[0] = data;
+ if(data == DONE)
+ {
+ if(QuestMinute)
{
- janalai_eggs_l = 20;
- janalai_eggs_r = 20;
+ QuestMinute += 15;
+ UpdateWorldState(3106, QuestMinute);
}
- Encounters[0] = data;
- break;
- case DATA_J_HATCHLEFT:
- janalai_eggs_l -= data;
- break;
- case DATA_J_HATCHRIGHT:
- janalai_eggs_r -= data;
- break;
- case TYPE_RAND_VENDOR_1:
- RandVendor[0] = data;
- break;
- case TYPE_RAND_VENDOR_2:
- RandVendor[1] = data;
- break;
+ SummonHostage(0);
+ }
+ break;
+ case DATA_AKILZONEVENT:
+ Encounters[1] = data;
+ OpenDoor(AkilzonDoorGUID, data != IN_PROGRESS);
+ if(data == DONE)
+ {
+ if(QuestMinute)
+ {
+ QuestMinute += 10;
+ UpdateWorldState(3106, QuestMinute);
+ }
+ SummonHostage(1);
+ }
+ break;
+ case DATA_JANALAIEVENT:
+ Encounters[2] = data;
+ if(data == DONE) SummonHostage(2);
+ break;
+ case DATA_HALAZZIEVENT:
+ Encounters[3] = data;
+ OpenDoor(HalazziDoorGUID, data != IN_PROGRESS);
+ if(data == DONE) SummonHostage(3);
+ break;
+ case DATA_HEXLORDEVENT:
+ Encounters[4] = data;
+ if(data == IN_PROGRESS)
+ OpenDoor(HexLordGateGUID, false);
+ else if(data == NOT_STARTED)
+ CheckInstanceStatus();
+ break;
+ case DATA_ZULJINEVENT:
+ Encounters[5] = data;
+ OpenDoor(ZulJinDoorGUID, data != IN_PROGRESS);
+ break;
+ case DATA_CHESTLOOTED:
+ ChestLooted++;
+ SaveToDB();
+ break;
+ case TYPE_RAND_VENDOR_1:
+ RandVendor[0] = data;
+ break;
+ case TYPE_RAND_VENDOR_2:
+ RandVendor[1] = data;
+ break;
+ }
+
+ if(data == DONE)
+ {
+ BossKilled++;
+ if(QuestMinute && BossKilled >= 4)
+ {
+ QuestMinute = 0;
+ UpdateWorldState(3104, 0);
+ }
+ CheckInstanceStatus();
+ SaveToDB();
}
}
@@ -107,18 +277,36 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance {
switch(type)
{
- case DATA_JANALAIEVENT:
- return Encounters[0];
- case DATA_J_EGGSLEFT:
- return janalai_eggs_l;
- case DATA_J_EGGSRIGHT:
- return janalai_eggs_r;
- case TYPE_RAND_VENDOR_1:
- return RandVendor[0];
- case TYPE_RAND_VENDOR_2:
- return RandVendor[1];
+ case DATA_NALORAKKEVENT: return Encounters[0];
+ case DATA_AKILZONEVENT: return Encounters[1];
+ case DATA_JANALAIEVENT: return Encounters[2];
+ case DATA_HALAZZIEVENT: return Encounters[3];
+ case DATA_HEXLORDEVENT: return Encounters[4];
+ case DATA_ZULJINEVENT: return Encounters[5];
+ case DATA_CHESTLOOTED: return ChestLooted;
+ case TYPE_RAND_VENDOR_1: return RandVendor[0];
+ case TYPE_RAND_VENDOR_2: return RandVendor[1];
+ default: return 0;
+ }
+ }
+
+ void Update(uint32 diff)
+ {
+ if(QuestMinute)
+ {
+ if(QuestTimer < diff)
+ {
+ QuestMinute--;
+ SaveToDB();
+ QuestTimer += 60000;
+ if(QuestMinute)
+ {
+ UpdateWorldState(3104, 1);
+ UpdateWorldState(3106, QuestMinute);
+ }else UpdateWorldState(3104, 0);
+ }
+ QuestTimer -= diff;
}
- return 0;
}
};
diff --git a/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp index 9c66cbfc79a..316081b9dc0 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp +++ b/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp @@ -1,18 +1,18 @@ /* 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
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+* 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
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
/* ScriptData
SDName: Zulaman
@@ -39,7 +39,7 @@ EndContentData */ struct TRINITY_DLL_DECL npc_forest_frogAI : public ScriptedAI
{
npc_forest_frogAI(Creature* c) : ScriptedAI(c)
- {
+ {
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
@@ -57,23 +57,23 @@ struct TRINITY_DLL_DECL npc_forest_frogAI : public ScriptedAI uint32 cEntry = 0;
switch(rand()%11)
{
- case 0: cEntry = 24024; break; //Kraz
- case 1: cEntry = 24397; break; //Mannuth
- case 2: cEntry = 24403; break; //Deez
- case 3: cEntry = 24404; break; //Galathryn
- case 4: cEntry = 24405; break; //Adarrah
- case 5: cEntry = 24406; break; //Fudgerick
- case 6: cEntry = 24407; break; //Darwen
- case 7: cEntry = 24445; break; //Mitzi
- case 8: cEntry = 24448; break; //Christian
- case 9: cEntry = 24453; break; //Brennan
- case 10: cEntry = 24455; break; //Hollee
+ case 0: cEntry = 24024; break; //Kraz
+ case 1: cEntry = 24397; break; //Mannuth
+ case 2: cEntry = 24403; break; //Deez
+ case 3: cEntry = 24404; break; //Galathryn
+ case 4: cEntry = 24405; break; //Adarrah
+ case 5: cEntry = 24406; break; //Fudgerick
+ case 6: cEntry = 24407; break; //Darwen
+ case 7: cEntry = 24445; break; //Mitzi
+ case 8: cEntry = 24448; break; //Christian
+ case 9: cEntry = 24453; break; //Brennan
+ case 10: cEntry = 24455; break; //Hollee
}
if( !pInstance->GetData(TYPE_RAND_VENDOR_1) )
- if(rand()%10 == 1) cEntry = 24408; //Gunter
+ if(rand()%10 == 1) cEntry = 24408; //Gunter
if( !pInstance->GetData(TYPE_RAND_VENDOR_2) )
- if(rand()%10 == 1) cEntry = 24409; //Kyren
+ if(rand()%10 == 1) cEntry = 24409; //Kyren
if( cEntry ) m_creature->UpdateEntry(cEntry);
@@ -97,6 +97,73 @@ CreatureAI* GetAI_npc_forest_frog(Creature *_Creature) return new npc_forest_frogAI (_Creature);
}
+/*######
+## npc_zulaman_hostage
+######*/
+
+#define GOSSIP_HOSTAGE1 "I am glad to help you."
+
+static uint32 HostageInfo[] = {23790, 23999, 24024, 24001};
+
+struct TRINITY_DLL_DECL npc_zulaman_hostageAI : public ScriptedAI
+{
+ npc_zulaman_hostageAI(Creature *c) : ScriptedAI(c) {IsLoot = false;}
+ bool IsLoot;
+ uint64 PlayerGUID;
+ void Reset() {}
+ void Aggro(Unit *who) {}
+ void JustDied(Unit *)
+ {
+ Player* player = (Player*)Unit::GetUnit(*m_creature, PlayerGUID);
+ if(player) player->SendLoot(m_creature->GetGUID(), LOOT_CORPSE);
+ }
+ void UpdateAI(const uint32 diff)
+ {
+ if(IsLoot) m_creature->CastSpell(m_creature, 7, false);
+ }
+};
+
+bool GossipHello_npc_zulaman_hostage(Player* player, Creature* _Creature)
+{
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
+ return true;
+}
+
+bool GossipSelect_npc_zulaman_hostage(Player* player, Creature* _Creature, uint32 sender, uint32 action)
+{
+ if(action == GOSSIP_ACTION_INFO_DEF + 1)
+ player->CLOSE_GOSSIP_MENU();
+
+ if(!_Creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
+ return true;
+ _Creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
+ ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
+ if(pInstance)
+ {
+ uint8 progress = pInstance->GetData(DATA_CHESTLOOTED);
+ pInstance->SetData(DATA_CHESTLOOTED, 0);
+ float x, y, z;
+ _Creature->GetPosition(x, y, z);
+ Creature* summon = _Creature->SummonCreature(HostageInfo[progress], x-2, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
+ if(summon)
+ {
+ ((npc_zulaman_hostageAI*)summon->AI())->PlayerGUID = player->GetGUID();
+ ((npc_zulaman_hostageAI*)summon->AI())->IsLoot = true;
+ summon->SetDisplayId(10056);
+ summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ summon->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
+ }
+ return true;
+}
+
+CreatureAI* GetAI_npc_zulaman_hostage(Creature *_Creature)
+{
+ return new npc_zulaman_hostageAI(_Creature);
+}
+
void AddSC_zulaman()
{
Script *newscript;
@@ -105,4 +172,11 @@ void AddSC_zulaman() newscript->Name="npc_forest_frog";
newscript->GetAI = GetAI_npc_forest_frog;
m_scripts[nrscripts++] = newscript;
+
+ newscript = new Script;
+ newscript->Name = "npc_zulaman_hostage";
+ newscript->GetAI = GetAI_npc_zulaman_hostage;
+ newscript->pGossipHello = GossipHello_npc_zulaman_hostage;
+ newscript->pGossipSelect = GossipSelect_npc_zulaman_hostage;
+ m_scripts[nrscripts++] = newscript;
}
diff --git a/src/bindings/scripts/sql/Updates/r57_trinity.sql b/src/bindings/scripts/sql/Updates/r57_trinity.sql new file mode 100644 index 00000000000..bbdb29af158 --- /dev/null +++ b/src/bindings/scripts/sql/Updates/r57_trinity.sql @@ -0,0 +1,39 @@ +/*sql for zulaman*/
+UPDATE `creature_template` SET `ScriptName` = 'boss_nalorakk' WHERE `entry` = 23576;
+UPDATE `creature_template` SET `flags_extra` = 33 WHERE `entry` = 23576; /*no crush*/
+
+UPDATE `creature_template` set `ScriptName` = 'boss_akilzon' where entry = 23574;
+UPDATE `creature_template` set `ScriptName` = 'mob_akilzon_eagle' where `entry`=24858; /*default is event ai*/
+
+UPDATE `creature_template` SET `ScriptName` = 'boss_halazzi' WHERE `entry` = '23577';
+UPDATE `creature_template` SET `ScriptName` = 'mob_halazzi_lynx' WHERE `entry` = '24143';
+UPDATE `creature_template` SET `ScriptName` = '' WHERE `entry` = '24224'; /*totem default `spell1` = '43301' should be in DB*/
+
+UPDATE `creature_template` SET `ScriptName` = 'boss_janalai' WHERE `entry` = '23578';
+UPDATE `creature_template` SET `ScriptName` = 'mob_janalai_hatcher' WHERE `entry` = '23818';
+UPDATE `creature_template` SET `ScriptName` = 'mob_janalai_hatchling' WHERE `entry` = '23598';
+UPDATE `creature_template` SET `ScriptName` = 'mob_janalai_egg' WHERE `entry` = '23817';
+UPDATE `creature_template` SET `ScriptName` = 'mob_janalai_firebomb' WHERE `entry` = '23920';
+
+UPDATE `creature_template` SET `ScriptName` = 'boss_hexlord_malacrass' WHERE `entry` =24239;
+UPDATE `creature_template` SET `ScriptName` = 'boss_alyson_antille' WHERE `entry` =24240;
+UPDATE `creature_template` SET `ScriptName` = 'boss_thurg' WHERE `entry` =24241;
+UPDATE `creature_template` SET `ScriptName` = 'boss_slither' WHERE `entry` =24242;
+UPDATE `creature_template` SET `ScriptName` = 'boss_lord_raadan' WHERE `entry` =24243;
+UPDATE `creature_template` SET `ScriptName` = 'boss_gazakroth' WHERE `entry` =24244;
+UPDATE `creature_template` SET `ScriptName` = 'boss_fenstalker' WHERE `entry` =24245;
+UPDATE `creature_template` SET `ScriptName` = 'boss_darkheart' WHERE `entry` =24246;
+UPDATE `creature_template` SET `ScriptName` = 'boss_koragg' WHERE `entry` =24247;
+UPDATE `creature` SET `position_x` = '117.8827',`position_y` = '921.2795',`position_z` = '33.8883',`orientation` = '1.5696' WHERE `id` = '24239' LIMIT 1;
+UPDATE `creature_template` SET `faction_A` = '1890', `faction_H` = '1890' WHERE `entry` in ('24240', '24241', '24242', '24243', '24244', '24245', '24246', '24247');
+
+UPDATE `creature_template` SET `ScriptName` = 'boss_zuljin' WHERE `entry` =23863;
+UPDATE `creature_template` SET `ScriptName` = 'do_nothing' WHERE `entry` = '24187';
+UPDATE `creature_template` SET `ScriptName` = 'mob_zuljin_vortex' WHERE `entry` = '24136';
+UPDATE `creature_template` SET `minlevel` = '73', `maxlevel` = '73' WHERE `entry` IN (24187, 24136);
+DELETE FROM `spell_proc_event` WHERE `entry` = 43983;
+INSERT INTO `spell_proc_event` VALUES ('43983', '0', '0', '0', '0', '0', '16384', '0', '0');
+DELETE FROM `spell_script_target` WHERE `entry` = 42577;
+INSERT INTO `spell_script_target` VALUES ('42577', '1', '24136');
+
+UPDATE `creature_template` SET `lootid` = `entry`, `ScriptName` = 'npc_zulaman_hostage' WHERE `entry` IN (23790, 23999, 24024, 24001);
\ No newline at end of file diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index b9348b5f568..4d001b37183 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -773,51 +773,118 @@ enum SpellImmunity enum Targets { TARGET_SELF = 1, + //TARGET_UNIT_CASTER TARGET_RANDOM_ENEMY_CHAIN_IN_AREA = 2, // only one spell has that, but regardless, it's a target type after all + //TARGET_UNIT_NEARBY_ENEMY + TARGET_UNIT_SINGLE_UNKNOWN = 3, + TARGET_UNIT_NEARBY_ALLY = 4, TARGET_PET = 5, + //TARGET_UNIT_PET TARGET_CHAIN_DAMAGE = 6, + //TARGET_UNIT_TARGET_ENEMY + TARGET_UNIT_AREA_ENTRY = 7, TARGET_AREAEFFECT_CUSTOM = 8, + //TARGET_UNIT_AREA_ENTRY_GROUND TARGET_INNKEEPER_COORDINATES = 9, // uses in teleport to innkeeper spells + //TARGET_DEST_HOME + TARGET_UNIT_TARGET_DEST_CASTER = 11, // teleport target to caster TARGET_ALL_ENEMY_IN_AREA = 15, + //TARGET_UNIT_AREA_ENEMY TARGET_ALL_ENEMY_IN_AREA_INSTANT = 16, + //TARGET_UNIT_AREA_ENEMY_GROUND TARGET_TABLE_X_Y_Z_COORDINATES = 17, // uses in teleport spells and some other + //TARGET_DEST_TABLE TARGET_EFFECT_SELECT = 18, // highly depends on the spell effect + //TARGET_DEST_CASTER_GROUND TARGET_ALL_PARTY_AROUND_CASTER = 20, + //TARGET_UNIT_PARTY_CASTER TARGET_SINGLE_FRIEND = 21, + //TARGET_UNIT_TARGET_ALLY TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB + //TARGET_DEST_CASTER TARGET_GAMEOBJECT = 23, + //TARGET_OBJECT_OPEN TARGET_IN_FRONT_OF_CASTER = 24, + //TARGET_UNIT_CONE_ENEMY TARGET_DUELVSPLAYER = 25, + //TARGET_UNIT_SINGLE TARGET_GAMEOBJECT_ITEM = 26, + //TARGET_OBJECT_ITEM_PICKLOCK TARGET_MASTER = 27, + //TARGET_UNIT_MASTER TARGET_ALL_ENEMY_IN_AREA_CHANNELED = 28, + //TARGET_UNIT_AREA_ENEMY_CHANNEL + TARGET_UNIT_AREA_ALLY_CHANNEL = 29, // 28,29 only used for effect 27, if interrupt channel, pstAA cancel TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER = 30, // in TargetB used only with TARGET_ALL_AROUND_CASTER and in self casting range in TargetA + //TARGET_UNIT_AREA_ALLY TARGET_ALL_FRIENDLY_UNITS_IN_AREA = 31, + //TARGET_UNIT_AREA_ALLY_GROUND TARGET_MINION = 32, + //TARGET_DEST_SUMMON TARGET_ALL_PARTY = 33, + //TARGET_UNIT_AREA_PARTY TARGET_ALL_PARTY_AROUND_CASTER_2 = 34, // used in Tranquility + //TARGET_UNIT_AREA_PARTY_GROUND TARGET_SINGLE_PARTY = 35, + //TARGET_UNIT_TARGET_PARTY + TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown TARGET_AREAEFFECT_PARTY = 37, + //TARGET_UNIT_PARTY_TARGET TARGET_SCRIPT = 38, + //TARGET_UNIT_NEARBY_ENTRY TARGET_SELF_FISHING = 39, - TARGET_TOTEM_EARTH = 41, - TARGET_TOTEM_WATER = 42, - TARGET_TOTEM_AIR = 43, - TARGET_TOTEM_FIRE = 44, + //TARGET_UNIT_CASTER_FISHING + TARGET_OBJECT_USE = 40, + TARGET_DEST_CASTER_FRONT_LEFT = 41, //earth totem + TARGET_DEST_CASTER_BACK_LEFT = 42, //water totem + TARGET_DEST_CASTER_BACK_RIGHT = 43, //air totem + TARGET_DEST_CASTER_FRONT_RIGHT = 44, //fire totem TARGET_CHAIN_HEAL = 45, + //TARGET_UNIT_CHAINHEAL TARGET_SCRIPT_COORDINATES = 46, - TARGET_DYNAMIC_OBJECT = 47, - TARGET_SUMMON = 48, + //TARGET_DEST_TABLE_UNKNOWN + TARGET_DEST_CASTER_FRONT = 47, + TARGET_DEST_CASTER_BACK = 48, + TARGET_DEST_CASTER_RIGHT = 49, + TARGET_DEST_CASTER_LEFT = 50, + TARGET_OBJECT_AREA = 51, TARGET_AREAEFFECT_CUSTOM_2 = 52, + //TARGET_DUMMY TARGET_CURRENT_ENEMY_COORDINATES = 53, // set unit coordinates as dest, only 16 target B imlemented + //TARGET_DEST_TARGET_ENEMY + TARGET_UNIT_CONE_ENEMY_UNKNOWN = 54, + TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell TARGET_RANDOM_RAID_MEMBER = 56, + //TARGET_UNIT_AREA_RAID TARGET_SINGLE_FRIEND_2 = 57, + //TARGET_UNIT_TARGET_RAID + TARGET_UNIT_CONE_ALLY = 59, + TARGET_UNIT_AREA_SCRIPT = 60, TARGET_AREAEFFECT_PARTY_AND_CLASS = 61, + //TARGET_UNIT_CLASS_TARGET + TARGET_TEST = 62, // for a test spell TARGET_DUELVSPLAYER_COORDINATES = 63, - TARGET_BEHIND_VICTIM = 65, // uses in teleport behind spells + //TARGET_DEST_TARGET_ENEMY_UNKNOWN + TARGET_DEST_TARGET_FRONT = 64, + TARGET_DEST_TARGET_BACK = 65, // uses in teleport behind spells + TARGET_DEST_TARGET_RIGHT = 66, + TARGET_DEST_TARGET_LEFT = 67, + TARGET_DEST_TARGET_ENEMY_UNKNOWN2 = 70, + TARGET_DEST_CASTER_RANDOM = 72, + TARGET_DEST_CASTER_RADIUS = 73, + TARGET_DEST_TARGET_RANDOM = 74, + TARGET_DEST_TARGET_RADIUS = 75, + TARGET_DEST_CHANNEL = 76, TARGET_SINGLE_ENEMY = 77, + //TARGET_UNIT_CHANNEL + TARGET_DEST_CASTER_FRONT_UNKNOWN = 78, + TARGET_DEST_TABLE_UNKNOWN2 = 80, + TARGET_DEST_DEST_RANDOM = 86, TARGET_SELF2 = 87, + //TARGET_DEST_DEST + TARGET_UNIT_AREA_ALL_CHANNEL = 88, TARGET_NONCOMBAT_PET = 90, + //TARGET_UNIT_MINIPET }; enum SpellMissInfo diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 5dbe5c7c9ea..1b4dbd20894 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1183,16 +1183,114 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets; switch(cur) { - case TARGET_TOTEM_EARTH: - case TARGET_TOTEM_WATER: - case TARGET_TOTEM_AIR: - case TARGET_TOTEM_FIRE: - case TARGET_SELF: + // destination around caster + case TARGET_DEST_CASTER_FRONT_LEFT: + case TARGET_DEST_CASTER_BACK_LEFT: + case TARGET_DEST_CASTER_BACK_RIGHT: + case TARGET_DEST_CASTER_FRONT_RIGHT: + case TARGET_DEST_CASTER_FRONT: + case TARGET_DEST_CASTER_BACK: + case TARGET_DEST_CASTER_RIGHT: + case TARGET_DEST_CASTER_LEFT: + case TARGET_DEST_CASTER_RANDOM: + case TARGET_DEST_CASTER_RADIUS: + { + float x, y, z, angle, dist; + + if (m_spellInfo->EffectRadiusIndex[i]) + dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); + else + dist = 3.0f;//do we need this? + if (cur == TARGET_DEST_CASTER_RANDOM) + dist *= rand_norm(); // This case we need to consider caster size + else + dist -= m_caster->GetObjectSize(); // Size is calculated in GetNearPoint(), but we do not need it + //need a new function to remove this repeated work + + switch(cur) + { + case TARGET_DEST_CASTER_FRONT_LEFT: angle = -M_PI/4; break; + case TARGET_DEST_CASTER_BACK_LEFT: angle = -3*M_PI/4; break; + case TARGET_DEST_CASTER_BACK_RIGHT: angle = 3*M_PI/4; break; + case TARGET_DEST_CASTER_FRONT_RIGHT:angle = M_PI/4; break; + case TARGET_DEST_CASTER_FRONT: angle = 0.0f; break; + case TARGET_DEST_CASTER_BACK: angle = M_PI; break; + case TARGET_DEST_CASTER_RIGHT: angle = M_PI/2; break; + case TARGET_DEST_CASTER_LEFT: angle = -M_PI/2; break; + default: angle = rand_norm()*2*M_PI; break; + } + + m_caster->GetClosePoint(x, y, z, 0, dist, angle); + m_targets.setDestination(x, y, z); // do not know if has ground visual + TagUnitMap.push_back(m_caster); // may remove this in the future, if unitmap is empty, push m_caster + }break; + + // destination around target + case TARGET_DEST_TARGET_FRONT: + case TARGET_DEST_TARGET_BACK: + case TARGET_DEST_TARGET_RIGHT: + case TARGET_DEST_TARGET_LEFT: + case TARGET_DEST_TARGET_RANDOM: + case TARGET_DEST_TARGET_RADIUS: + { + Unit *target = m_targets.getUnitTarget(); + if(!target) + { + sLog.outError("SPELL: no unit target for spell ID %u\n", m_spellInfo->Id); + break; + } + + float x, y, z, angle, dist; + + if (m_spellInfo->EffectRadiusIndex[i]) + dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); + else + dist = 3.0f;//do we need this? + if (cur == TARGET_DEST_TARGET_RANDOM) + dist *= rand_norm(); // This case we need to consider caster size + else + dist -= target->GetObjectSize(); // Size is calculated in GetNearPoint(), but we do not need it + //need a new function to remove this repeated work + + switch(cur) + { + case TARGET_DEST_TARGET_FRONT: angle = 0.0f; break; + case TARGET_DEST_TARGET_BACK: angle = M_PI; break; + case TARGET_DEST_TARGET_RIGHT: angle = M_PI/2; break; + case TARGET_DEST_TARGET_LEFT: angle = -M_PI/2; break; + default: angle = rand_norm()*2*M_PI; break; + } + + target->GetClosePoint(x, y, z, 0, dist, angle); + m_targets.setDestination(x, y, z); // do not know if has ground visual + TagUnitMap.push_back(m_caster); // may remove this in the future, if unitmap is empty, push m_caster + }break; + + // destination around destination + case TARGET_DEST_DEST_RANDOM: + { + if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)) + { + sLog.outError("SPELL: no destination for spell ID %u\n", m_spellInfo->Id); + break; + } + float x, y, z, dist, px, py, pz; + dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); + x = m_targets.m_destX; + y = m_targets.m_destY; + z = m_targets.m_destZ; + m_caster->GetRandomPoint(x, y, z, dist, px, py, pz); + m_targets.setDestination(px, py, pz); + TagUnitMap.push_back(m_caster); + }break; case TARGET_SELF2: - case TARGET_DYNAMIC_OBJECT: + { + TagUnitMap.push_back(m_caster); + }break; + + case TARGET_SELF: case TARGET_AREAEFFECT_CUSTOM: case TARGET_AREAEFFECT_CUSTOM_2: - case TARGET_SUMMON: { TagUnitMap.push_back(m_caster); break; @@ -1865,20 +1963,6 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) else sLog.outError( "SPELL: unknown target coordinates for spell ID %u\n", m_spellInfo->Id ); }break; - case TARGET_BEHIND_VICTIM: - { - Unit *pTarget = m_caster->getVictim(); - if(!pTarget && m_caster->GetTypeId() == TYPEID_PLAYER) - pTarget = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection()); - - if(pTarget) - { - float _target_x, _target_y, _target_z; - pTarget->GetClosePoint(_target_x, _target_y, _target_z, m_caster->GetObjectSize(), CONTACT_DISTANCE, M_PI); - if(pTarget->IsWithinLOS(_target_x,_target_y,_target_z)) - m_targets.setDestination(_target_x, _target_y, _target_z); - } - }break; default: break; } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index c8f5c91156a..bf9d1b9f9bf 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -1919,35 +1919,6 @@ void Spell::EffectTeleportUnits(uint32 i) ((Player*)unitTarget)->TeleportTo(st->target_mapId,st->target_X,st->target_Y,st->target_Z,st->target_Orientation,unitTarget==m_caster ? TELE_TO_SPELL : 0); break; } - case TARGET_BEHIND_VICTIM: - { - // Get selected target for player (or victim for units) - Unit *pTarget = NULL; - if(m_caster->GetTypeId() == TYPEID_PLAYER) - pTarget = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection()); - else - pTarget = m_caster->getVictim(); - // No target present - return - if (!pTarget) - return; - // Init dest coordinates - uint32 mapid = m_caster->GetMapId(); - float x = m_targets.m_destX; - float y = m_targets.m_destY; - float z = m_targets.m_destZ; - float orientation = pTarget->GetOrientation(); - // Teleport - if(unitTarget->GetTypeId() == TYPEID_PLAYER) - ((Player*)unitTarget)->TeleportTo(mapid, x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget==m_caster ? TELE_TO_SPELL : 0)); - else - { - MapManager::Instance().GetMap(mapid, m_caster)->CreatureRelocation((Creature*)unitTarget, x, y, z, orientation); - WorldPacket data; - unitTarget->BuildTeleportAckMsg(&data, x, y, z, orientation); - unitTarget->SendMessageToSet(&data, false); - } - return; - } default: { // If not exist data for dest location - return |