Page 2 of 7 FirstFirst 123456 ... LastLast
Results 16 to 30 of 91

Thread: Bugs Fixing

http://idgs.in/581078
  1. #16
    Mindbender's Avatar
    Join Date
    Oct 2012
    Posts
    190
    Points
    479.27
    Thanks: 13 / 97 / 31

    Default

    Terima kasih utk saudara Achernar_Altair, sedang kami review malam ini..

    Sekedar info kami menerima masukan apapun itu dari manapun demi kelancaran server ini karena minimnya jumlah SDM scripting kami. Jadi bagi siapapun yang merasa mampu utk ikut berperan serta dalam hal scripting, saya mengajak anda untuk ikut membantu kami untuk server ini demi kenyamanan kita bersama, kami akan sangat hargai itu. Fokus utama kami saat ini adalah menstabilkan server terlebih dahulu karena masih ada beberapa penyebab server crash yg belum kami ketahui.

    Silakan post di thread ini seperti saudara Achernar_Altair telah lakukan dan kami akan mereviewny kemudian.
    Cheating and Fair Play? Actions speak louder than words.

  2. Hot Ad
  3. #17
    Achernar_Altair's Avatar
    Join Date
    Mar 2007
    Location
    Kamar, Masjid, Kantor n Warnet, g jauh2 dah dari situ
    Posts
    877
    Points
    1,872.78
    Thanks: 15 / 131 / 30

    Default [SQL n C++]Fix For Heroic Strike - Warrior

    Description :

    SQL and CPP Fix for Heroic Strike damage at level 85 character


    Reference : Here


    saya punya 2 cara, silahkan pilih mana yang better


    Code :

    First
    Spoiler untuk Simple SQL :
    Code:
    DELETE FROM `spell_bonus_data` WHERE `entry`=78;
    INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`, `ap_bonus`, `ap_dot_bonus`, `comments`) VALUES 
    (78, 0, 0, 0.6, 0, 'Warrior - Heroic Strike');
    
    INSERT INTO `spell_script_names` VALUES ('78', 'spell_warr_heroic_strike');


    Second

    should edit with Notepad++, C++ script ke src/server/scripts/Spells/spell_warrior.cpp

    Spoiler untuk CPP :
    Code:
                     }
    };
    
    +// 78 Heroic Strike
    +class spell_warr_heroic_strike : public SpellScriptLoader
    +{
    + public:
    +        spell_warr_heroic_strike() : SpellScriptLoader("spell_warr_heroic_strike") { }
    +
    +        class spell_warr_heroic_strike_SpellScript : public SpellScript
    +        {
    +                PrepareSpellScript(spell_warr_heroic_strike_SpellScript);
    +
    +        void CalculateDamage(SpellEffIndex /*effect*/)
    +        {
    +        // Formula: 8 + AttackPower * 60 / 100
    +                if (Unit* caster = GetCaster())
    +                        SetHitDamage(int32(8 + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 60 / 100));
    +        }
    +
    +        void Register()
    +        {
    +                OnEffectHitTarget += SpellEffectFn(spell_warr_heroic_strike::spell_warr_heroic_strike_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
    +        }
    +};
    +
    +        SpellScript* GetSpellScript() const
    +        {
    +                return new spell_warr_heroic_strike_SpellScript();
    +        }
    +};
    +
    void AddSC_warrior_spell_scripts()
    {
             new spell_warr_bloodthirst();
             new spell_warr_sweeping_strikes();
             new spell_warr_vigilance();
             new spell_warr_vigilance_trigger();
    + new spell_warr_heroic_strike();
    }



    lagu script SQL ke Database under Table : spell_script_names

    Spoiler untuk SQL :
    Code:
    DELETE FROM `spell_script_names` WHERE `ScriptName` LIKE 'spell_warr_heroic_strike';
    INSERT INTO `spell_script_names` VALUES
    (78,'spell_warr_heroic_strike'),



    STATUS : First way sudah tested by me, tapi menurut referensi terkadang core g mempedulikan segala bentuk spellbonus data, untuk second way g bisa ane tes, secara ane g compile server ini jadi g punya sourcenya @_@



    jadi tinggal pilih mau yang tinggal execute batch file atau yang agak ribet (menurut saya) tapi "mungkin" lebih baik dalam segi hasil

    moga kepake >.<
    Quote Originally Posted by Aluna Sagita
    Having Crush On Me Isn't Categorized As Pedophilia
    Spoiler untuk Warcraft Books :

  4. The Following 3 Users Say Thank You to Achernar_Altair For This Useful Post:
  5. #18
    cocobe's Avatar
    Join Date
    Nov 2008
    Posts
    3
    Points
    0.41
    Thanks: 0 / 1 / 1

    Default Arcane Missile

    Description :
    Arcane Missile proc tapi skillnya ga bisa d pake

    Reference : disini

    Code : ada empat bagian
    https://bitbucket.org/oneb1t/skyfire...d122ea65ffa168
    https://bitbucket.org/oneb1t/skyfire...20155148400ec3
    https://bitbucket.org/oneb1t/skyfire...d2f34f5e7f4b82
    https://bitbucket.org/oneb1t/skyfire...d2f34f5e7f4b82

    Status : blom d coba, masih blajar cara tesnya sma Achernar_Altair ^^

  6. The Following User Says Thank You to cocobe For This Useful Post:
  7. #19
    ScreamOutLoud's Avatar
    Join Date
    Jan 2013
    Posts
    56
    Points
    15.89
    Thanks: 14 / 2 / 2

    Default

    Nama : Tiger's fury

    Referensi : Here

    Error : Gak nambah energy

    Code :
    Spoiler untuk Script CPP :
    Code:
    // -5217 - Tiger's Fury
    class spell_dru_tiger_s_fury : public SpellScriptLoader
    {
        public:
            spell_dru_tiger_s_fury() : SpellScriptLoader("spell_dru_tiger_s_fury") { }
    
            class spell_dru_tiger_s_fury_SpellScript : public SpellScript
            {
                PrepareSpellScript(spell_dru_tiger_s_fury_SpellScript);
    
                void OnHit()
                {
                    if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_1))
                        GetHitUnit()->CastCustomSpell(SPELL_DRUID_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true);
                }
    
                void Register()
                {
                    AfterHit += SpellHitFn(spell_dru_tiger_s_fury_SpellScript::OnHit);
                }
            };
    
            SpellScript* GetSpellScript() const
            {
                return new spell_dru_tiger_s_fury_SpellScript();
            }


    saya nambahin kk GM moga membantu

  8. The Following User Says Thank You to ScreamOutLoud For This Useful Post:
  9. #20
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Prospecting & Milling Cataclysm Ores & Herbs

    Referensi : wowhead.com

    Error : Ga bisa prospect & milling ore2 dan herb2 cataclysm (such as obsidium, elementium, pyrite, cinderbloom, whiptail)

    Code :

    Prospecting fix
    http://pastebin.com/nFyVfJv5

    Milling fix without reference
    http://pastebin.com/5nJxJtSD

    Applied.
    Last edited by heaven1st; 25-06-13 at 00:45. Reason: uda di update pastebinnya
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  10. The Following 4 Users Say Thank You to heaven1st For This Useful Post:
  11. #21
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Cataclysm Zones Fishing

    Referensi : wowhead.com, elsanglin.com, AreaTable.dbc

    Error : Bisa mancing tapi ga ada lootan di Hyjal, Uldum, Twilight, Vashjir, Tolbarad, Deepholm

    Code :

    Fishing fix -> ngefix lootan
    http://pastebin.com/jFUapCLJ

    Skill_fishing_base_level fix -> ngefix warning yg muncul kalo ga diisi tablenya menggunakan sql di atas.
    http://pastebin.com/kNaYpk5D

    Applied.
    Last edited by heaven1st; 25-06-13 at 00:46.
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  12. The Following 2 Users Say Thank You to heaven1st For This Useful Post:
  13. #22
    finzero1's Avatar
    Join Date
    Sep 2012
    Location
    Bandung
    Posts
    175
    Points
    80.16
    Thanks: 15 / 4 / 4

    Default SQL Fix empty loot on Twilight Jasmine (Herb)

    Deskripsi : Loot Twilight Jasmine
    Referensi :
    Error : Loot Twilight Jasmine kosong
    Code :
    SQL insert loot ke Twilight Jasmine
    Spoiler untuk Loot Twilight Jasmine :
    Code:
    DELETE FROM `gameobject_loot_template` WHERE (`entry`=202751);  
    INSERT INTO `gameobject_loot_template` VALUES  
    (202751, 52329, 39, 1, 0, 1, 3),
    (202751, 52987, 100, 1, 0, 2, 9),
    (202751, 63122, 10, 1, 0, 1, 1);

    SQL insert spawn Twilight Jasmine (sebetulnya di DB sekarang udah ada, tapi ane posting aja deh)
    SQL Spawn Twilight Jasmine

    blon di test, masih bingung cara test nya.. ntar blajar dulu sama kk2 di atas.

    Hihihi cuman dapet segitu, mudah2an bener SQL-nya & bisa di apply ke DB. lagi butuh nih rumput, buat alchemy. ^^
    Referensi 1 | Referensi 2
    Last edited by finzero1; 21-05-13 at 01:50.

  14. The Following User Says Thank You to finzero1 For This Useful Post:
  15. #23
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Escargot A Go Go - Undercity Daily Cooking Quest(www.wowhead.com/quest=29333)

    Referensi : wowhead.com, archive.trinitycore.info/Smart_scripts_tc2‎

    Error : Brightwater Snail (http://www.wowhead.com/npc=53526/)-nya ga bisa di klik.

    Code :

    Applied.
    Last edited by heaven1st; 25-06-13 at 00:47.
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  16. The Following User Says Thank You to heaven1st For This Useful Post:
  17. #24
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Fishing Daily Quests - BOTH sides

    Referensi : wowhead.com, archive.trinitycore.info/Smart_scripts_tc2‎, AreaTable.dbc

    Error : Beberapa daily fishing error.

    Code :

    Fishing daily quests (Both-sides)
    http://pastebin.com/HhJsRaYs

    Moat Monster quest
    http://pastebin.com/KbaYDWqk

    Applied.
    Last edited by heaven1st; 25-06-13 at 00:47.
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  18. The Following 2 Users Say Thank You to heaven1st For This Useful Post:
  19. #25
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Fire Prism (http://www.wowhead.com/item=52304), Imported Supplies (http://www.wowhead.com/item=68689), Bag of Shiny Things (http://www.wowhead.com/item=67414), Crate of Tasty Meat (http://www.wowhead.com/item=65513), Tiny Treasure Chest (http://www.wowhead.com/item=67539)

    Referensi : wowhead.com

    Error : No loot, empty data on item_loot_template

    Code :

    Crate,Treasure,Supplies fix
    http://pastebin.com/zyppisL7

    Applied.
    Last edited by heaven1st; 25-06-13 at 00:48.
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  20. The Following 2 Users Say Thank You to heaven1st For This Useful Post:
  21. #26
    Anz69's Avatar
    Join Date
    May 2010
    Location
    Grizzly Hills
    Posts
    326
    Points
    372.64
    Thanks: 78 / 136 / 22

    Default

    Spoiler untuk mantap :
    Quote Originally Posted by Achernar_Altair View Post
    Description :

    SQL and CPP Fix for Heroic Strike damage at level 85 character


    Reference : Here


    saya punya 2 cara, silahkan pilih mana yang better


    Code :

    First
    Spoiler untuk Simple SQL :
    Code:
    DELETE FROM `spell_bonus_data` WHERE `entry`=78;
    INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`, `ap_bonus`, `ap_dot_bonus`, `comments`) VALUES 
    (78, 0, 0, 0.6, 0, 'Warrior - Heroic Strike');
    
    INSERT INTO `spell_script_names` VALUES ('78', 'spell_warr_heroic_strike');


    Second

    should edit with Notepad++, C++ script ke src/server/scripts/Spells/spell_warrior.cpp

    Spoiler untuk CPP :
    Code:
                     }
    };
    
    +// 78 Heroic Strike
    +class spell_warr_heroic_strike : public SpellScriptLoader
    +{
    + public:
    +        spell_warr_heroic_strike() : SpellScriptLoader("spell_warr_heroic_strike") { }
    +
    +        class spell_warr_heroic_strike_SpellScript : public SpellScript
    +        {
    +                PrepareSpellScript(spell_warr_heroic_strike_SpellScript);
    +
    +        void CalculateDamage(SpellEffIndex /*effect*/)
    +        {
    +        // Formula: 8 + AttackPower * 60 / 100
    +                if (Unit* caster = GetCaster())
    +                        SetHitDamage(int32(8 + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 60 / 100));
    +        }
    +
    +        void Register()
    +        {
    +                OnEffectHitTarget += SpellEffectFn(spell_warr_heroic_strike::spell_warr_heroic_strike_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
    +        }
    +};
    +
    +        SpellScript* GetSpellScript() const
    +        {
    +                return new spell_warr_heroic_strike_SpellScript();
    +        }
    +};
    +
    void AddSC_warrior_spell_scripts()
    {
             new spell_warr_bloodthirst();
             new spell_warr_sweeping_strikes();
             new spell_warr_vigilance();
             new spell_warr_vigilance_trigger();
    + new spell_warr_heroic_strike();
    }



    lagu script SQL ke Database under Table : spell_script_names

    Spoiler untuk SQL :
    Code:
    DELETE FROM `spell_script_names` WHERE `ScriptName` LIKE 'spell_warr_heroic_strike';
    INSERT INTO `spell_script_names` VALUES
    (78,'spell_warr_heroic_strike'),



    STATUS : First way sudah tested by me, tapi menurut referensi terkadang core g mempedulikan segala bentuk spellbonus data, untuk second way g bisa ane tes, secara ane g compile server ini jadi g punya sourcenya @_@



    jadi tinggal pilih mau yang tinggal execute batch file atau yang agak ribet (menurut saya) tapi "mungkin" lebih baik dalam segi hasil

    moga kepake >.<
    Quote Originally Posted by heaven1st View Post
    Description : Prospecting & Milling Cataclysm Ores & Herbs

    Referensi : wowhead.com

    Error : Ga bisa prospect & milling ore2 dan herb2 cataclysm (such as obsidium, elementium, pyrite, cinderbloom, whiptail)

    Code :

    Ini sql queries nya saya buat sendiri dan sudah saya test sendiri, di bawah di sertakan juga screenshot hasil test.
    Untuk prospecting saya menggunakan reference_loot_template.
    Tapi untuk milling saya tidak menggunakan reference, soalnya hasil milling cuma 2 dan sepertinya tidak perlu menggunakan reference.
    (kalo GM cenderung ingin menggunakan reference, ntar saya buat versi referencenya).
    Karena aga panjang queries nya jadi saya pastebin aja.

    Prospecting fix
    http://pastebin.com/nFyVfJv5

    Milling fix without reference
    http://pastebin.com/5nJxJtSD

    Screenshot :

    Before fixing,
    Spoiler untuk before :




    After fixed,
    Spoiler untuk after :

    Prospecting





    Milling










    Ada koreksi sedikit di bagian pyrite,

    0 nya harusnya 1 (biar beda groupid lootannya soalnya volatile 100%).
    Quote Originally Posted by heaven1st View Post
    Description : Cataclysm Zones Fishing

    Referensi : wowhead.com, elsanglin.com, AreaTable.dbc

    Error : Bisa mancing tapi ga ada lootan di Hyjal, Uldum, Twilight, Vashjir, Tolbarad, Deepholm

    Code :
    Ketikan tangan lagi, dan sudah pasti di tes terlebih dahulu.
    SS ada dibawah, untuk penjelasan fix ada di dalem sql nya.

    Fishing fix -> ngefix lootan
    http://pastebin.com/jFUapCLJ

    Skill_fishing_base_level fix -> ngefix warning yg muncul kalo ga diisi tablenya menggunakan sql di atas.
    http://pastebin.com/kNaYpk5D

    Screenshot :
    After fixed,
    Spoiler untuk after :

    Hyjal, beda lootan di throne ama open water.




    Deepholm



    Tol'barad



    Vash'jir



    Uldum



    Twilight Highlands, beda lootan sama kek hyjal.




    Oh iya hampir lupa..
    Ini fix belum termasuk yang school2 fishing nya maaf blm sempet.
    Quote Originally Posted by finzero1 View Post
    Deskripsi : Loot Twilight Jasmine
    Referensi :
    Error : Loot Twilight Jasmine kosong
    Code :
    SQL insert loot ke Twilight Jasmine
    Spoiler untuk Loot Twilight Jasmine :
    Code:
    DELETE FROM `gameobject_loot_template` WHERE (`entry`=202751);  
    INSERT INTO `gameobject_loot_template` VALUES  
    (202751, 52329, 39, 1, 0, 1, 3),
    (202751, 52987, 100, 1, 0, 2, 9),
    (202751, 63122, 10, 1, 0, 1, 1);

    SQL insert spawn Twilight Jasmine (sebetulnya di DB sekarang udah ada, tapi ane posting aja deh)
    SQL Spawn Twilight Jasmine

    blon di test, masih bingung cara test nya.. ntar blajar dulu sama kk2 di atas.

    Hihihi cuman dapet segitu, mudah2an bener SQL-nya & bisa di apply ke DB. lagi butuh nih rumput, buat alchemy. ^^
    Referensi 1 | Referensi 2
    Quote Originally Posted by heaven1st View Post
    Description : Escargot A Go Go - Undercity Daily Cooking Quest(www.wowhead.com/quest=29333)

    Referensi : wowhead.com, archive.trinitycore.info/Smart_scripts_tc2‎

    Error : Brightwater Snail (http://www.wowhead.com/npc=53526/)-nya ga bisa di klik.

    Code :
    Pake smart_scripts biar spell Escargot A Go-Go: Create Snail-nya yg ngetrigger item quest.
    Code:
    -- Escargot A Go Go (http://www.wowhead.com/quest=29333/)
    -- smartscripts for Brightwater Snail (http://www.wowhead.com/npc=53526/)
    DELETE FROM smart_scripts WHERE entryorguid=53526;
    INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES('53526','0','0','1','64','0','100','0','0','0','0','0','85','99357','2','0','0','0','0','7','0','0','0','0','0','0','0','Brightwater Snail - On Gossip Hello - Cast Escargot A Go-Go: Create Snail');
    INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES('53526','0','1','2','61','0','100','0','0','0','0','0','72','0','0','0','0','0','0','7','0','0','0','0','0','0','0','Brightwater Snail - On Gossip Hello - Close Gossip');
    INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES('53526','0','2','3','61','0','100','0','0','0','0','0','81','0','0','0','0','0','0','1','0','0','0','0','0','0','0','Brightwater Snail - On Gossip Hello - Set Npcflag None');
    INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES('53526','0','3','0','61','0','100','0','0','0','0','0','41','120','0','0','0','0','0','1','0','0','0','0','0','0','0','Brightwater Snail - On Gossip Hello - Forced Despawn');
    
    UPDATE creature_template SET IconName='LootAll', npcflag=1, unit_flags=768, dynamicflags=8, AIName='SmartAI' WHERE entry=53526;
    Screenshot:
    Spoiler untuk pic :


    Quote Originally Posted by heaven1st View Post
    Description : Fishing Daily Quests - horde side

    Referensi : wowhead.com, archive.trinitycore.info/Smart_scripts_tc2‎, AreaTable.dbc

    Error : Semua daily fishing error kecuali Shiny Baubles

    Code :
    Query nya di bagi 2, fishing query tanpa Moat Monster quest dan Moat monster quest query.
    Screenshot ntar di sertain, beberapa dari daily fishing biasa dan khususnya quest Moat Monster.
    Sudah di tes terlebih dahulu.

    Fishing daily quests (Horde side)
    http://pastebin.com/HhJsRaYs

    Moat Monster quest
    http://pastebin.com/k659KJXD

    Untuk quest Moat Monster ini di pisahin, karena fixnya saya blm yakin bagus untuk dipakai. Tapi nanti di bwh ada screenshot penjelasan fix nya kaya gimana.

    Screenshot :
    Spoiler untuk pic :








    Dan ini untuk Moat Monster.
    Spoiler untuk moat steps :

    Jadi bentuk object nya gini,


    Alliance Decoy Kitnya dipencet keluar Moat Monsternya dari object,


    Kill creditnya masuk ke objective,

    Quote Originally Posted by heaven1st View Post
    Description : Fire Prism (http://www.wowhead.com/item=52304), Imported Supplies (http://www.wowhead.com/item=68689), Bag of Shiny Things (http://www.wowhead.com/item=67414), Crate of Tasty Meat (http://www.wowhead.com/item=65513), Tiny Treasure Chest (http://www.wowhead.com/item=67539)

    Referensi : wowhead.com

    Error : No loot, empty data on item_loot_template

    Code :

    Crate,Treasure,Supplies fix
    http://pastebin.com/zyppisL7

    Screenshot :
    Spoiler untuk pic :




    Nice One, Semoga segera dianalisis & dites oleh tim GM serta dapat diimplementasikan

  22. #27
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Goblin & Worgen mini fix quest

    Referensi : http://archive.trinitycore.info/ChrRaces.dbc_tc2

    Error :
    690 (2 + 16 + 32 + 128 + 512) = Horde Quest -> without goblin
    1101 (1 + 4 + 8 + 64 + 1024) = Alliance Quest -> without worgen


    Applied.
    Last edited by heaven1st; 25-06-13 at 00:49.
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  23. The Following User Says Thank You to heaven1st For This Useful Post:
  24. #28
    heaven1st's Avatar
    Join Date
    Aug 2007
    Location
    Bandung
    Posts
    635
    Points
    795.13
    Thanks: 31 / 139 / 54

    Default

    Description : Deepholm quests

    Referensi : wowhead.com, all *.dbc, http://archive.trinitycore.info/, http://collab.kpsn.org/display/tc/, youtube.com/CataQuests

    Error : Only one quest.

    Code :

    DEEPHOLM quests
    http://pastebin.com/8Kyip0sb

    Applied.
    Last edited by heaven1st; 25-06-13 at 00:49. Reason: 100% deepholm quests
    If mood>0 Then open=notepad+,sqlyog,chrome,dbceditor Else sleep EndIf

  25. The Following User Says Thank You to heaven1st For This Useful Post:
  26. #29
    Achernar_Altair's Avatar
    Join Date
    Mar 2007
    Location
    Kamar, Masjid, Kantor n Warnet, g jauh2 dah dari situ
    Posts
    877
    Points
    1,872.78
    Thanks: 15 / 131 / 30

    Default [C++] Sunwell Plateau Script

    berhubung saya Transmog Lover dan kecewa sama SWP yang rusak total booo hoooo T_T, jadi nyari2 SWP Fix biar sperti dulu


    Description : Benerin Script SWP yang kacau balau (bisa terbang2, damage gila, HP Entrop 1 Hit doank, KaJe GaJe, Kalec no portal, Felmyst immune2, dsb)

    Referensi : ngambil dari Script jaman Wotlk

    Code : Script goes to TrinityCore / src / server / scripts / EasternKingdoms / SunwellPlateau /

    Spoiler untuk boss_brutallus.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     * Copyright (C) 2006-2009 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Boss_Brutallus
    SD%Complete: 80
    SDComment: Find a way to start the intro, best code for the intro
    EndScriptData */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    enum Quotes
    {
     YELL_INTRO                 =   -1580017,
     YELL_INTRO_BREAK_ICE       =   -1580018,
     YELL_INTRO_CHARGE          =   -1580019,
     YELL_INTRO_KILL_MADRIGOSA  =   -1580020,
     YELL_INTRO_TAUNT           =   -1580021,
    
     YELL_MADR_ICE_BARRIER      =   -1580031,
     YELL_MADR_INTRO            =   -1580032,
     YELL_MADR_ICE_BLOCK        =   -1580033,
     YELL_MADR_TRAP             =   -1580034,
     YELL_MADR_DEATH            =   -1580035,
    
     YELL_AGGRO                 =   -1580022,
     YELL_KILL1                 =   -1580023,
     YELL_KILL2                 =   -1580024,
     YELL_KILL3                 =   -1580025,
     YELL_LOVE1                 =   -1580026,
     YELL_LOVE2                 =   -1580027,
     YELL_LOVE3                 =   -1580028,
     YELL_BERSERK               =   -1580029,
     YELL_DEATH                 =   -1580030
    };
    
    enum Spells
    {
        SPELL_METEOR_SLASH                 =   45150,
        SPELL_BURN                         =   46394,
        SPELL_STOMP                        =   45185,
        SPELL_BERSERK                      =   26662,
        SPELL_DUAL_WIELD                   =   42459,
    
        SPELL_INTRO_FROST_BLAST            =   45203,
        SPELL_INTRO_FROSTBOLT              =   44843,
        SPELL_INTRO_ENCAPSULATE            =   45665,
        SPELL_INTRO_ENCAPSULATE_CHANELLING =   45661
    };
    
    #define FELMYST 25038
    
    class boss_brutallus : public CreatureScript
    {
    public:
        boss_brutallus() : CreatureScript("boss_brutallus") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_brutallusAI (creature);
        }
    
        struct boss_brutallusAI : public ScriptedAI
        {
            boss_brutallusAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
                Intro = true;
            }
    
            InstanceScript* instance;
    
            uint32 SlashTimer;
            uint32 BurnTimer;
            uint32 StompTimer;
            uint32 BerserkTimer;
    
            uint32 IntroPhase;
            uint32 IntroPhaseTimer;
            uint32 IntroFrostBoltTimer;
    
            bool Intro;
            bool IsIntro;
            bool Enraged;
    
            void Reset()
            {
                SlashTimer = 11000;
                StompTimer = 30000;
                BurnTimer = 60000;
                BerserkTimer = 360000;
    
                IntroPhase = 0;
                IntroPhaseTimer = 0;
                IntroFrostBoltTimer = 0;
    
                IsIntro = false;
                Enraged = false;
    
                DoCast(me, SPELL_DUAL_WIELD, true);
    
                if (instance)
                    instance->SetData(DATA_BRUTALLUS_EVENT, NOT_STARTED);
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                DoScriptText(YELL_AGGRO, me);
    
                if (instance)
                    instance->SetData(DATA_BRUTALLUS_EVENT, IN_PROGRESS);
            }
    
            void KilledUnit(Unit* /*victim*/)
            {
                DoScriptText(RAND(YELL_KILL1, YELL_KILL2, YELL_KILL3), me);
            }
    
            void JustDied(Unit* /*Killer*/)
            {
                DoScriptText(YELL_DEATH, me);
    
                if (instance)
                {
                    instance->SetData(DATA_BRUTALLUS_EVENT, DONE);
                    float x, y, z;
                    me->GetPosition(x, y, z);
                    me->SummonCreature(FELMYST, x, y, z+30, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
                }
            }
    
            void EnterEvadeMode()
            {
                if (!Intro)
                    ScriptedAI::EnterEvadeMode();
            }
    
            void StartIntro()
            {
                if (!Intro || IsIntro)
                    return;
                Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
                if (Madrigosa)
                {
                    Madrigosa->Respawn();
                    Madrigosa->setActive(true);
                    IsIntro = true;
                    Madrigosa->SetMaxHealth(me->GetMaxHealth());
                    Madrigosa->SetHealth(me->GetMaxHealth());
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    me->Attack(Madrigosa, true);
                    Madrigosa->Attack(me, true);
                }
                else
                {
                    //Madrigosa not found, end intro
                    sLog->outError("Madrigosa was not found");
                    EndIntro();
                }
            }
    
            void EndIntro()
            {
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                Intro = false;
                IsIntro = false;
            }
    
            void AttackStart(Unit* who)
            {
                if (!who || Intro || IsIntro)
                    return;
                ScriptedAI::AttackStart(who);
            }
    
            void DoIntro()
            {
                Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
                if (!Madrigosa)
                    return;
    
                switch (IntroPhase)
                {
                    case 0:
                        DoScriptText(YELL_MADR_ICE_BARRIER, Madrigosa);
                        IntroPhaseTimer = 7000;
                        ++IntroPhase;
                        break;
                    case 1:
                        me->SetInFront(Madrigosa);
                        Madrigosa->SetInFront(me);
                        DoScriptText(YELL_MADR_INTRO, Madrigosa, me);
                        IntroPhaseTimer = 9000;
                        ++IntroPhase;
                        break;
                    case 2:
                        DoScriptText(YELL_INTRO, me, Madrigosa);
                        IntroPhaseTimer = 13000;
                        ++IntroPhase;
                        break;
                    case 3:
                        DoCast(me, SPELL_INTRO_FROST_BLAST);
                        Madrigosa->SetLevitate(true);
                        me->AttackStop();
                        Madrigosa->AttackStop();
                        IntroFrostBoltTimer = 3000;
                        IntroPhaseTimer = 28000;
                        ++IntroPhase;
                        break;
                    case 4:
                        DoScriptText(YELL_INTRO_BREAK_ICE, me);
                        IntroPhaseTimer = 6000;
                        ++IntroPhase;
                        break;
                    case 5:
                        Madrigosa->CastSpell(me, SPELL_INTRO_ENCAPSULATE_CHANELLING, false);
                        DoScriptText(YELL_MADR_TRAP, Madrigosa);
                        DoCast(me, SPELL_INTRO_ENCAPSULATE);
                        IntroPhaseTimer = 11000;
                        ++IntroPhase;
                        break;
                    case 6:
                        DoScriptText(YELL_INTRO_CHARGE, me);
                        IntroPhaseTimer = 5000;
                        ++IntroPhase;
                        break;
                    case 7:
                        me->Kill(Madrigosa);
                        DoScriptText(YELL_MADR_DEATH, Madrigosa);
                        me->SetFullHealth();
                        me->AttackStop();
                        IntroPhaseTimer = 4000;
                        ++IntroPhase;
                        break;
                    case 8:
                        DoScriptText(YELL_INTRO_KILL_MADRIGOSA, me);
                        me->SetOrientation(0.14f);
                        me->StopMoving();
                        Madrigosa->setDeathState(CORPSE);
                        IntroPhaseTimer = 8000;
                        ++IntroPhase;
                        break;
                    case 9:
                        DoScriptText(YELL_INTRO_TAUNT, me);
                        IntroPhaseTimer = 5000;
                        ++IntroPhase;
                        break;
                    case 10:
                        EndIntro();
                        break;
                }
            }
    
            void MoveInLineOfSight(Unit* who)
            {
                if (!me->IsValidAttackTarget(who))
                    return;
                if (instance && Intro)
                    instance->SetData(DATA_BRUTALLUS_EVENT, SPECIAL);
    
                if (Intro && !IsIntro)
                    StartIntro();
                if (!Intro)
                    ScriptedAI::MoveInLineOfSight(who);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (IsIntro)
                {
                    if (IntroPhaseTimer <= diff)
                        DoIntro();
                    else IntroPhaseTimer -= diff;
    
                    if (IntroPhase == 3 + 1)
                    {
                        if (IntroFrostBoltTimer <= diff)
                        {
                            if (Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0))
                            {
                                Madrigosa->CastSpell(me, SPELL_INTRO_FROSTBOLT, true);
                                IntroFrostBoltTimer = 2000;
                            }
                        } else IntroFrostBoltTimer -= diff;
                    }
                    if (!UpdateVictim())
                        return;
                    DoMeleeAttackIfReady();
                }
    
                if (!UpdateVictim() || IsIntro)
                    return;
    
                if (SlashTimer <= diff)
                {
                    DoCast(me->getVictim(), SPELL_METEOR_SLASH);
                    SlashTimer = 11000;
                } else SlashTimer -= diff;
    
                if (StompTimer <= diff)
                {
                    DoScriptText(RAND(YELL_LOVE1, YELL_LOVE2, YELL_LOVE3), me);
                    DoCast(me->getVictim(), SPELL_STOMP);
                    StompTimer = 30000;
                } else StompTimer -= diff;
    
                if (BurnTimer <= diff)
                {
                    std::list<Unit*> targets;
                    SelectTargetList(targets, 10, SELECT_TARGET_RANDOM, 100, true);
                    for (std::list<Unit*>::const_iterator i = targets.begin(); i != targets.end(); ++i)
                        if (!(*i)->HasAura(SPELL_BURN))
                        {
                            (*i)->CastSpell((*i), SPELL_BURN, true);
                            break;
                        }
                    BurnTimer = urand(60000, 180000);
                } else BurnTimer -= diff;
    
                if (BerserkTimer < diff && !Enraged)
                {
                    DoScriptText(YELL_BERSERK, me);
                    DoCast(me, SPELL_BERSERK);
                    Enraged = true;
                } else BerserkTimer -= diff;
    
                DoMeleeAttackIfReady();
            }
        };
    
    };
    
    void AddSC_boss_brutallus()
    {
        new boss_brutallus();
    }


    Spoiler untuk boss_eredar_twins.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     *
     * 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Boss_Eredar_Twins
    SD%Complete: 100
    SDComment:
    EndScriptData */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    enum Quotes
    {
        //Alytesh
        YELL_CANFLAGRATION          =   -1580044,
        YELL_SISTER_SACROLASH_DEAD  =   -1580045,
        YELL_ALY_KILL_1             =   -1580046,
        YELL_ALY_KILL_2             =   -1580047,
        YELL_ALY_DEAD               =   -1580048,
        YELL_BERSERK                =   -1580049,
    
        //Sacrolash
        YELL_SHADOW_NOVA            =   -1580050,
        YELL_SISTER_ALYTHESS_DEAD   =   -1580051,
        YELL_SAC_KILL_1             =   -1580052,
        YELL_SAC_KILL_2             =   -1580053,
        SAY_SAC_DEAD                =   -1580054,
        YELL_ENRAGE                 =   -1580055,
    
        //Intro
        YELL_INTRO_SAC_1            =   -1580056,
        YELL_INTRO_ALY_2            =   -1580057,
        YELL_INTRO_SAC_3            =   -1580058,
        YELL_INTRO_ALY_4            =   -1580059,
        YELL_INTRO_SAC_5            =   -1580060,
        YELL_INTRO_ALY_6            =   -1580061,
        YELL_INTRO_SAC_7            =   -1580062,
        YELL_INTRO_ALY_8            =   -1580063,
    
        //Emote
        EMOTE_SHADOW_NOVA           =   -1580064,
        EMOTE_CONFLAGRATION         =   -1580065
    };
    
    enum Spells
    {
        //Lady Sacrolash spells
        SPELL_DARK_TOUCHED      =   45347,
        SPELL_SHADOW_BLADES     =   45248, //10 secs
        SPELL_DARK_STRIKE       =   45271,
        SPELL_SHADOW_NOVA       =   45329, //30-35 secs
        SPELL_CONFOUNDING_BLOW  =   45256, //25 secs
    
        //Shadow Image spells
        SPELL_SHADOW_FURY       =   45270,
        SPELL_IMAGE_VISUAL      =   45263,
    
        //Misc spells
        SPELL_ENRAGE            =   46587,
        SPELL_EMPOWER           =   45366,
        SPELL_DARK_FLAME        =   45345,
    
        //Grand Warlock Alythess spells
        SPELL_PYROGENICS        =   45230, //15secs
        SPELL_FLAME_TOUCHED     =   45348,
        SPELL_CONFLAGRATION     =   45342, //30-35 secs
        SPELL_BLAZE             =   45235, //on main target every 3 secs
        SPELL_FLAME_SEAR        =   46771,
        SPELL_BLAZE_SUMMON      =   45236, //187366 GO
        SPELL_BLAZE_BURN        =   45246
    };
    
    class boss_sacrolash : public CreatureScript
    {
    public:
        boss_sacrolash() : CreatureScript("boss_sacrolash") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_sacrolashAI (creature);
        };
    
        struct boss_sacrolashAI : public ScriptedAI
        {
            boss_sacrolashAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
    
            bool SisterDeath;
            bool Enraged;
    
            uint32 ShadowbladesTimer;
            uint32 ShadownovaTimer;
            uint32 ConfoundingblowTimer;
            uint32 ShadowimageTimer;
            uint32 ConflagrationTimer;
            uint32 EnrageTimer;
    
            void Reset()
            {
                Enraged = false;
    
                if (instance)
                {
                    Unit* Temp =  Unit::GetUnit((*me), instance->GetData64(DATA_ALYTHESS));
                    if (Temp)
                    {
                        if (Temp->isDead())
                            CAST_CRE(Temp)->Respawn();
                        else if (Temp->getVictim())
                            me->getThreatManager().addThreat(Temp->getVictim(), 0.0f);
                    }
                }
    
                if (!me->isInCombat())
                {
                    ShadowbladesTimer = 10000;
                    ShadownovaTimer = 30000;
                    ConfoundingblowTimer = 25000;
                    ShadowimageTimer = 20000;
                    ConflagrationTimer = 30000;
                    EnrageTimer = 360000;
    
                    SisterDeath = false;
                }
    
                if (instance)
                    instance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
            }
    
            void EnterCombat(Unit* who)
            {
                DoZoneInCombat();
    
                if (instance)
                {
                    Unit* Temp =  Unit::GetUnit((*me), instance->GetData64(DATA_ALYTHESS));
                    if (Temp && Temp->isAlive() && !(Temp->getVictim()))
                        CAST_CRE(Temp)->AI()->AttackStart(who);
                }
    
                if (instance)
                    instance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
            }
    
            void KilledUnit(Unit* /*victim*/)
            {
                if (rand()%4 == 0)
                    DoScriptText(RAND(YELL_SAC_KILL_1, YELL_SAC_KILL_2), me);
            }
    
            void JustDied(Unit* /*Killer*/)
            {
                // only if ALY death
                if (SisterDeath)
                {
                    DoScriptText(SAY_SAC_DEAD, me);
    
                    if (instance)
                        instance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
                }
                else
                    me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
            }
    
            void SpellHitTarget(Unit* target, const SpellInfo* spell)
            {
                switch (spell->Id)
                {
                case SPELL_SHADOW_BLADES:
                case SPELL_SHADOW_NOVA:
                case SPELL_CONFOUNDING_BLOW:
                case SPELL_SHADOW_FURY:
                    HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
                    break;
                case SPELL_CONFLAGRATION:
                    HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
                    break;
                }
            }
    
            void HandleTouchedSpells(Unit* target, uint32 TouchedType)
            {
                switch (TouchedType)
                {
                case SPELL_FLAME_TOUCHED:
                    if (!target->HasAura(SPELL_DARK_FLAME))
                    {
                        if (target->HasAura(SPELL_DARK_TOUCHED))
                        {
                            target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
                            target->CastSpell(target, SPELL_DARK_FLAME, true);
                        } else target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
                    }
                    break;
                case SPELL_DARK_TOUCHED:
                    if (!target->HasAura(SPELL_DARK_FLAME))
                    {
                        if (target->HasAura(SPELL_FLAME_TOUCHED))
                        {
                            target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
                            target->CastSpell(target, SPELL_DARK_FLAME, true);
                        } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
                    }
                    break;
                }
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!SisterDeath)
                {
                    if (instance)
                    {
                        Unit* Temp = NULL;
                        Temp = Unit::GetUnit((*me), instance->GetData64(DATA_ALYTHESS));
                        if (Temp && Temp->isDead())
                        {
                            DoScriptText(YELL_SISTER_ALYTHESS_DEAD, me);
                            DoCast(me, SPELL_EMPOWER);
                            me->InterruptSpell(CURRENT_GENERIC_SPELL);
                            SisterDeath = true;
                        }
                    }
                }
    
                if (!UpdateVictim())
                    return;
    
                if (SisterDeath)
                {
                    if (ConflagrationTimer <= diff)
                    {
                        if (!me->IsNonMeleeSpellCasted(false))
                        {
                            me->InterruptSpell(CURRENT_GENERIC_SPELL);
                            Unit* target = NULL;
                            target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                            if (target)
                                DoCast(target, SPELL_CONFLAGRATION);
                            ConflagrationTimer = 30000+(rand()%5000);
                        }
                    } else ConflagrationTimer -= diff;
                }
                else
                {
                    if (ShadownovaTimer <= diff)
                    {
                        if (!me->IsNonMeleeSpellCasted(false))
                        {
                            Unit* target = NULL;
                            target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                            if (target)
                                DoCast(target, SPELL_SHADOW_NOVA);
    
                            if (!SisterDeath)
                            {
                                if (target)
                                    DoScriptText(EMOTE_SHADOW_NOVA, me, target);
                                DoScriptText(YELL_SHADOW_NOVA, me);
                            }
                            ShadownovaTimer = 30000+(rand()%5000);
                        }
                    } else ShadownovaTimer -=diff;
                }
    
                if (ConfoundingblowTimer <= diff)
                {
                    if (!me->IsNonMeleeSpellCasted(false))
                    {
                        Unit* target = NULL;
                        target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                        if (target)
                            DoCast(target, SPELL_CONFOUNDING_BLOW);
                        ConfoundingblowTimer = 20000 + (rand()%5000);
                    }
                } else ConfoundingblowTimer -=diff;
    
                if (ShadowimageTimer <= diff)
                {
                    Unit* target = NULL;
                    Creature* temp = NULL;
                    for (uint8 i = 0; i<3; ++i)
                    {
                        target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                        temp = DoSpawnCreature(MOB_SHADOW_IMAGE, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 10000);
                        if (temp && target)
                        {
                            temp->AddThreat(target, 1000000);//don't change target(healers)
                            temp->AI()->AttackStart(target);
                        }
                    }
                    ShadowimageTimer = 20000;
                } else ShadowimageTimer -=diff;
    
                if (ShadowbladesTimer <= diff)
                {
                    if (!me->IsNonMeleeSpellCasted(false))
                    {
                        DoCast(me, SPELL_SHADOW_BLADES);
                        ShadowbladesTimer = 10000;
                    }
                } else ShadowbladesTimer -=diff;
    
                if (EnrageTimer < diff && !Enraged)
                {
                    me->InterruptSpell(CURRENT_GENERIC_SPELL);
                    DoScriptText(YELL_ENRAGE, me);
                    DoCast(me, SPELL_ENRAGE);
                    Enraged = true;
                } else EnrageTimer -= diff;
    
                if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false))
                {
                    //If we are within range melee the target
                    if (me->IsWithinMeleeRange(me->getVictim()))
                    {
                        HandleTouchedSpells(me->getVictim(), SPELL_DARK_TOUCHED);
                        me->AttackerStateUpdate(me->getVictim());
                        me->resetAttackTimer();
                    }
                }
            }
        };
    
    };
    
    class boss_alythess : public CreatureScript
    {
    public:
        boss_alythess() : CreatureScript("boss_alythess") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_alythessAI (creature);
        };
    
        struct boss_alythessAI : public Scripted_NoMovementAI
        {
            boss_alythessAI(Creature* c) : Scripted_NoMovementAI(c)
            {
                instance = c->GetInstanceScript();
                IntroStepCounter = 10;
            }
    
            InstanceScript* instance;
    
            bool SisterDeath;
            bool Enraged;
    
            uint32 IntroStepCounter;
            uint32 IntroYellTimer;
    
            uint32 ConflagrationTimer;
            uint32 BlazeTimer;
            uint32 PyrogenicsTimer;
            uint32 ShadownovaTimer;
            uint32 FlamesearTimer;
            uint32 EnrageTimer;
    
            void Reset()
            {
                Enraged = false;
    
                if (instance)
                {
                    Unit* Temp =  Unit::GetUnit((*me), instance->GetData64(DATA_SACROLASH));
                    if (Temp)
                    {
                        if (Temp->isDead())
                            CAST_CRE(Temp)->Respawn();
                        else if (Temp->getVictim())
                            me->getThreatManager().addThreat(Temp->getVictim(), 0.0f);
                    }
                }
    
                if (!me->isInCombat())
                {
                    ConflagrationTimer = 45000;
                    BlazeTimer = 100;
                    PyrogenicsTimer = 15000;
                    ShadownovaTimer = 40000;
                    EnrageTimer = 360000;
                    FlamesearTimer = 15000;
                    IntroYellTimer = 10000;
    
                    SisterDeath = false;
                }
    
                if (instance)
                    instance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
            }
    
            void EnterCombat(Unit* who)
            {
                DoZoneInCombat();
    
                if (instance)
                {
                    Unit* Temp =  Unit::GetUnit((*me), instance->GetData64(DATA_SACROLASH));
                    if (Temp && Temp->isAlive() && !(Temp->getVictim()))
                        CAST_CRE(Temp)->AI()->AttackStart(who);
                }
    
                if (instance)
                    instance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
            }
    
            void AttackStart(Unit* who)
            {
                if (!me->isInCombat())
                {
                    Scripted_NoMovementAI::AttackStart(who);
                }
            }
    
            void MoveInLineOfSight(Unit* who)
            {
                if (!who || me->getVictim())
                    return;
    
                if (me->canCreatureAttack(who))
                {
                    float attackRadius = me->GetAttackDistance(who);
                    if (me->IsWithinDistInMap(who, attackRadius) && me->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && me->IsWithinLOSInMap(who))
                    {
                        if (!me->isInCombat())
                        {
                            DoStartNoMovement(who);
                        }
                    }
                }
                else if (IntroStepCounter == 10 && me->IsWithinLOSInMap(who)&& me->IsWithinDistInMap(who, 30))
                {
                    IntroStepCounter = 0;
                }
            }
    
            void KilledUnit(Unit* /*victim*/)
            {
                if (rand()%4 == 0)
                {
                    DoScriptText(RAND(YELL_ALY_KILL_1, YELL_ALY_KILL_2), me);
                }
            }
    
            void JustDied(Unit* /*Killer*/)
            {
                if (SisterDeath)
                {
                    DoScriptText(YELL_ALY_DEAD, me);
    
                    if (instance)
                        instance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
                }
                else
                    me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
            }
    
            void SpellHitTarget(Unit* target, const SpellInfo* spell)
            {
                switch (spell->Id)
                {
    
                case SPELL_BLAZE:
                    target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
                case SPELL_CONFLAGRATION:
                case SPELL_FLAME_SEAR:
                    HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
                    break;
                case SPELL_SHADOW_NOVA:
                    HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
                    break;
                }
            }
    
            void HandleTouchedSpells(Unit* target, uint32 TouchedType)
            {
                switch (TouchedType)
                {
                case SPELL_FLAME_TOUCHED:
                    if (!target->HasAura(SPELL_DARK_FLAME))
                    {
                        if (target->HasAura(SPELL_DARK_TOUCHED))
                        {
                            target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
                            target->CastSpell(target, SPELL_DARK_FLAME, true);
                        }else
                        {
                            target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
                        }
                    }
                    break;
                case SPELL_DARK_TOUCHED:
                    if (!target->HasAura(SPELL_DARK_FLAME))
                    {
                        if (target->HasAura(SPELL_FLAME_TOUCHED))
                        {
                            target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
                            target->CastSpell(target, SPELL_DARK_FLAME, true);
                        } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
                    }
                    break;
                }
            }
    
            uint32 IntroStep(uint32 step)
            {
                Creature* Sacrolash = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_SACROLASH) : 0);
                switch (step)
                {
                case 0: return 0;
                case 1:
                    if (Sacrolash)
                        DoScriptText(YELL_INTRO_SAC_1, Sacrolash);
                    return 1000;
                case 2: DoScriptText(YELL_INTRO_ALY_2, me); return 1000;
                case 3:
                    if (Sacrolash)
                        DoScriptText(YELL_INTRO_SAC_3, Sacrolash);
                    return 2000;
                case 4: DoScriptText(YELL_INTRO_ALY_4, me); return 1000;
                case 5:
                    if (Sacrolash)
                        DoScriptText(YELL_INTRO_SAC_5, Sacrolash);
                    return 2000;
                case 6: DoScriptText(YELL_INTRO_ALY_6, me); return 1000;
                case 7:
                    if (Sacrolash)
                        DoScriptText(YELL_INTRO_SAC_7, Sacrolash);
                    return 3000;
                case 8: DoScriptText(YELL_INTRO_ALY_8, me); return 900000;
                }
                return 10000;
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (IntroStepCounter < 9)
                {
                    if (IntroYellTimer <= diff)
                    {
                        IntroYellTimer = IntroStep(++IntroStepCounter);
                    } else IntroYellTimer -= diff;
                }
    
                if (!SisterDeath)
                {
                    if (instance)
                    {
                        Unit* Temp = NULL;
                        Temp = Unit::GetUnit((*me), instance->GetData64(DATA_SACROLASH));
                        if (Temp && Temp->isDead())
                        {
                            DoScriptText(YELL_SISTER_SACROLASH_DEAD, me);
                            DoCast(me, SPELL_EMPOWER);
                            me->InterruptSpell(CURRENT_GENERIC_SPELL);
                            SisterDeath = true;
                        }
                    }
                }
                if (!me->getVictim())
                {
                    if (instance)
                    {
                        Creature* sisiter = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH));
                        if (sisiter && !sisiter->isDead() && sisiter->getVictim())
                        {
                            me->AddThreat(sisiter->getVictim(), 0.0f);
                            DoStartNoMovement(sisiter->getVictim());
                            me->Attack(sisiter->getVictim(), false);
                        }
                    }
                }
    
                if (!UpdateVictim())
                    return;
    
                if (SisterDeath)
                {
                    if (ShadownovaTimer <= diff)
                    {
                        if (!me->IsNonMeleeSpellCasted(false))
                        {
                            Unit* target = NULL;
                            target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                            if (target)
                                DoCast(target, SPELL_SHADOW_NOVA);
                            ShadownovaTimer= 30000+(rand()%5000);
                        }
                    } else ShadownovaTimer -=diff;
                }
                else
                {
                    if (ConflagrationTimer <= diff)
                    {
                        if (!me->IsNonMeleeSpellCasted(false))
                        {
                            me->InterruptSpell(CURRENT_GENERIC_SPELL);
                            Unit* target = NULL;
                            target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                            if (target)
                                DoCast(target, SPELL_CONFLAGRATION);
                            ConflagrationTimer = 30000+(rand()%5000);
    
                            if (!SisterDeath)
                            {
                                if (target)
                                    DoScriptText(EMOTE_CONFLAGRATION, me, target);
                                DoScriptText(YELL_CANFLAGRATION, me);
                            }
    
                            BlazeTimer = 4000;
                        }
                    } else ConflagrationTimer -= diff;
                }
    
                if (FlamesearTimer <= diff)
                {
                    if (!me->IsNonMeleeSpellCasted(false))
                    {
                        DoCast(me, SPELL_FLAME_SEAR);
                        FlamesearTimer = 15000;
                    }
                } else FlamesearTimer -=diff;
    
                if (PyrogenicsTimer <= diff)
                {
                    if (!me->IsNonMeleeSpellCasted(false))
                    {
                        DoCast(me, SPELL_PYROGENICS, true);
                        PyrogenicsTimer = 15000;
                    }
                } else PyrogenicsTimer -= diff;
    
                if (BlazeTimer <= diff)
                {
                    if (!me->IsNonMeleeSpellCasted(false))
                    {
                        DoCast(me->getVictim(), SPELL_BLAZE);
                        BlazeTimer = 3800;
                    }
                } else BlazeTimer -= diff;
    
                if (EnrageTimer < diff && !Enraged)
                {
                    me->InterruptSpell(CURRENT_GENERIC_SPELL);
                    DoScriptText(YELL_BERSERK, me);
                    DoCast(me, SPELL_ENRAGE);
                    Enraged = true;
                } else EnrageTimer -= diff;
            }
        };
    
    };
    
    class mob_shadow_image : public CreatureScript
    {
    public:
        mob_shadow_image() : CreatureScript("mob_shadow_image") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_shadow_imageAI (creature);
        };
    
        struct mob_shadow_imageAI : public ScriptedAI
        {
            mob_shadow_imageAI(Creature* c) : ScriptedAI(c) {}
    
            uint32 ShadowfuryTimer;
            uint32 KillTimer;
            uint32 DarkstrikeTimer;
    
            void Reset()
            {
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                ShadowfuryTimer = 5000 + (rand()%15000);
                DarkstrikeTimer = 3000;
                KillTimer = 15000;
            }
    
            void EnterCombat(Unit* /*who*/){}
    
            void SpellHitTarget(Unit* target, const SpellInfo* spell)
            {
                switch (spell->Id)
                {
    
                case SPELL_SHADOW_FURY:
                case SPELL_DARK_STRIKE:
                    if (!target->HasAura(SPELL_DARK_FLAME))
                    {
                        if (target->HasAura(SPELL_FLAME_TOUCHED))
                        {
                            target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
                            target->CastSpell(target, SPELL_DARK_FLAME, true);
                        } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
                    }
                    break;
                }
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!me->HasAura(SPELL_IMAGE_VISUAL))
                    DoCast(me, SPELL_IMAGE_VISUAL);
    
                if (KillTimer <= diff)
                {
                    me->Kill(me);
                    KillTimer = 9999999;
                } else KillTimer -= diff;
    
                if (!UpdateVictim())
                    return;
    
                if (ShadowfuryTimer <= diff)
                {
                    DoCast(me, SPELL_SHADOW_FURY);
                    ShadowfuryTimer = 10000;
                } else ShadowfuryTimer -=diff;
    
                if (DarkstrikeTimer <= diff)
                {
                    if (!me->IsNonMeleeSpellCasted(false))
                    {
                        //If we are within range melee the target
                        if (me->IsWithinMeleeRange(me->getVictim()))
                            DoCast(me->getVictim(), SPELL_DARK_STRIKE);
                    }
                    DarkstrikeTimer = 3000;
                } else DarkstrikeTimer -= diff;
            }
        };
    
    };
    
    void AddSC_boss_eredar_twins()
    {
        new boss_sacrolash();
        new boss_alythess();
        new mob_shadow_image();
    }


    Spoiler untuk boss_felmyst.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     *
     * 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Boss_Felmyst
    SD%Complete: 0
    SDComment:
    EndScriptData */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    enum Yells
    {
        YELL_BIRTH                                    = -1580036,
        YELL_KILL1                                    = -1580037,
        YELL_KILL2                                    = -1580038,
        YELL_BREATH                                   = -1580039,
        YELL_TAKEOFF                                  = -1580040,
        YELL_BERSERK                                  = -1580041,
        YELL_DEATH                                    = -1580042,
        YELL_KALECGOS                                 = -1580043, // after felmyst's death spawned and say this
    };
    
    enum Spells
    {
        //Aura
        AURA_SUNWELL_RADIANCE                         = 45769,
        AURA_NOXIOUS_FUMES                            = 47002,
    
        //Land phase
        SPELL_CLEAVE                                  = 19983,
        SPELL_CORROSION                               = 45866,
        SPELL_GAS_NOVA                                = 45855,
        SPELL_ENCAPSULATE_CHANNEL                     = 45661,
        // SPELL_ENCAPSULATE_EFFECT                      = 45665,
        // SPELL_ENCAPSULATE_AOE                         = 45662,
    
        //Flight phase
        SPELL_VAPOR_SELECT                            = 45391,   // fel to player, force cast 45392, 50000y selete target
        SPELL_VAPOR_SUMMON                            = 45392,   // player summon vapor, radius around caster, 5y,
        SPELL_VAPOR_FORCE                             = 45388,   // vapor to fel, force cast 45389
        SPELL_VAPOR_CHANNEL                           = 45389,   // fel to vapor, green beam channel
        SPELL_VAPOR_TRIGGER                           = 45411,   // linked to 45389, vapor to self, trigger 45410 and 46931
        SPELL_VAPOR_DAMAGE                            = 46931,   // vapor damage, 4000
        SPELL_TRAIL_SUMMON                            = 45410,   // vapor summon trail
        SPELL_TRAIL_TRIGGER                           = 45399,   // trail to self, trigger 45402
        SPELL_TRAIL_DAMAGE                            = 45402,   // trail damage, 2000 + 2000 dot
        SPELL_DEAD_SUMMON                             = 45400,   // summon blazing dead, 5min
        SPELL_DEAD_PASSIVE                            = 45415,
        SPELL_FOG_BREATH                              = 45495,   // fel to self, speed burst
        SPELL_FOG_TRIGGER                             = 45582,   // fog to self, trigger 45782
        SPELL_FOG_FORCE                               = 45782,   // fog to player, force cast 45714
        SPELL_FOG_INFORM                              = 45714,   // player let fel cast 45717, script effect
        SPELL_FOG_CHARM                               = 45717,   // fel to player
        SPELL_FOG_CHARM2                              = 45726,   // link to 45717
    
        SPELL_TRANSFORM_TRIGGER                       = 44885,   // madrigosa to self, trigger 46350
        SPELL_TRANSFORM_VISUAL                        = 46350,   // 46411stun?
        SPELL_TRANSFORM_FELMYST                       = 45068,   // become fel
        SPELL_FELMYST_SUMMON                          = 45069,
    
        //Other
        SPELL_BERSERK                                 = 45078,
        SPELL_CLOUD_VISUAL                            = 45212,
        SPELL_CLOUD_SUMMON                            = 45884,
    };
    
    enum PhaseFelmyst
    {
        PHASE_NONE,
        PHASE_GROUND,
        PHASE_FLIGHT,
    };
    
    enum EventFelmyst
    {
        EVENT_NONE,
        EVENT_BERSERK,
    
        EVENT_CLEAVE,
        EVENT_CORROSION,
        EVENT_GAS_NOVA,
        EVENT_ENCAPSULATE,
        EVENT_FLIGHT,
    
        EVENT_FLIGHT_SEQUENCE,
        EVENT_SUMMON_DEAD,
        EVENT_SUMMON_FOG,
    };
    
    class boss_felmyst : public CreatureScript
    {
    public:
        boss_felmyst() : CreatureScript("boss_felmyst") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_felmystAI(creature);
        }
    
        struct boss_felmystAI : public ScriptedAI
        {
            boss_felmystAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
            PhaseFelmyst phase;
            EventMap events;
    
            uint32 uiFlightCount;
            uint32 uiBreathCount;
    
            float breathX, breathY;
    
            void Reset()
            {
                phase = PHASE_NONE;
    
                events.Reset();
    
                uiFlightCount = 0;
    
                me->SetLevitate(true);
                me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
                me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
    
                DespawnSummons(MOB_VAPOR_TRAIL);
                me->setActive(false);
    
                if (instance)
                    instance->SetData(DATA_FELMYST_EVENT, NOT_STARTED);
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                events.ScheduleEvent(EVENT_BERSERK, 600000);
    
                me->setActive(true);
                DoZoneInCombat();
                DoCast(me, AURA_SUNWELL_RADIANCE, true);
                DoCast(me, AURA_NOXIOUS_FUMES, true);
                EnterPhase(PHASE_GROUND);
    
                if (instance)
                    instance->SetData(DATA_FELMYST_EVENT, IN_PROGRESS);
            }
    
            void AttackStart(Unit* who)
            {
                if (phase != PHASE_FLIGHT)
                    ScriptedAI::AttackStart(who);
            }
    
            void MoveInLineOfSight(Unit* who)
            {
                if (phase != PHASE_FLIGHT)
                    ScriptedAI::MoveInLineOfSight(who);
            }
    
            void KilledUnit(Unit* /*victim*/)
            {
                DoScriptText(RAND(YELL_KILL1, YELL_KILL2), me);
            }
    
            void JustRespawned()
            {
                DoScriptText(YELL_BIRTH, me);
            }
    
            void JustDied(Unit* /*Killer*/)
            {
                DoScriptText(YELL_DEATH, me);
    
                if (instance)
                    instance->SetData(DATA_FELMYST_EVENT, DONE);
            }
    
            void SpellHit(Unit* caster, const SpellInfo* spell)
            {
                // workaround for linked aura
                /*if (spell->Id == SPELL_VAPOR_FORCE)
                {
                    caster->CastSpell(caster, SPELL_VAPOR_TRIGGER, true);
                }*/
                // workaround for mind control
                if (spell->Id == SPELL_FOG_INFORM)
                {
                    float x, y, z;
                    caster->GetPosition(x, y, z);
                    if (Unit* summon = me->SummonCreature(MOB_DEAD, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000))
                    {
                        summon->SetMaxHealth(caster->GetMaxHealth());
                        summon->SetHealth(caster->GetMaxHealth());
                        summon->CastSpell(summon, SPELL_FOG_CHARM, true);
                        summon->CastSpell(summon, SPELL_FOG_CHARM2, true);
                    }
                    me->DealDamage(caster, caster->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                }
            }
    
            void JustSummoned(Creature* summon)
            {
                if (summon->GetEntry() == MOB_DEAD)
                {
                    summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
                    DoZoneInCombat(summon);
                    summon->CastSpell(summon, SPELL_DEAD_PASSIVE, true);
                }
            }
    
            void MovementInform(uint32, uint32)
            {
                if (phase == PHASE_FLIGHT)
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
            }
    
            void DamageTaken(Unit*, uint32 &damage)
            {
                if (phase != PHASE_GROUND && damage >= me->GetHealth())
                    damage = 0;
            }
    
            void EnterPhase(PhaseFelmyst NextPhase)
            {
                switch (NextPhase)
                {
                case PHASE_GROUND:
                    me->CastStop(SPELL_FOG_BREATH);
                    me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
                    me->SetUnitMovementFlags(MOVEMENTFLAG_NONE);
                    me->SetSpeed(MOVE_RUN, 2.0f);
    
                    events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
                    events.ScheduleEvent(EVENT_CORROSION, urand(10000, 20000));
                    events.ScheduleEvent(EVENT_GAS_NOVA, urand(15000, 20000));
                    events.ScheduleEvent(EVENT_ENCAPSULATE, urand(20000, 25000));
                    events.ScheduleEvent(EVENT_FLIGHT, 60000);
                    break;
                case PHASE_FLIGHT:
                    me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
                    uiFlightCount = 0;
                    uiBreathCount = 0;
                    break;
                default:
                    break;
                }
                phase = NextPhase;
            }
    
            void HandleFlightSequence()
            {
                switch (uiFlightCount)
                {
                case 0:
                    //me->AttackStop();
                    me->GetMotionMaster()->Clear(false);
                    me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
                    me->StopMoving();
                    DoScriptText(YELL_TAKEOFF, me);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
                    break;
                case 1:
                    me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
                    break;
                case 2:
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                    if (!target)
                        target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
    
                    if (!target)
                    {
                        EnterEvadeMode();
                        return;
                    }
    
                    Creature* Vapor = me->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
                    if (Vapor)
                    {
                        Vapor->AI()->AttackStart(target);
                        me->InterruptNonMeleeSpells(false);
                        DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
                        Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
                    }
    
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                    break;
                }
                case 3:
                {
                    DespawnSummons(MOB_VAPOR_TRAIL);
                    //DoCast(me, SPELL_VAPOR_SELECT); need core support
    
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                    if (!target)
                        target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
    
                    if (!target)
                    {
                        EnterEvadeMode();
                        return;
                    }
    
                    //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
                    Creature* pVapor = me->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
                    if (pVapor)
                    {
                        if (pVapor->AI())
                            pVapor->AI()->AttackStart(target);
                        me->InterruptNonMeleeSpells(false);
                        DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
                        pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
                    }
    
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                    break;
                }
                case 4:
                    DespawnSummons(MOB_VAPOR_TRAIL);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
                    break;
                case 5:
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                    if (!target)
                        target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
    
                    if (!target)
                    {
                        EnterEvadeMode();
                        return;
                    }
    
                    breathX = target->GetPositionX();
                    breathY = target->GetPositionY();
                    float x, y, z;
                    target->GetContactPoint(me, x, y, z, 70);
                    me->GetMotionMaster()->MovePoint(0, x, y, z+10);
                    break;
                }
                case 6:
                    me->SetOrientation(me->GetAngle(breathX, breathY));
                    me->StopMoving();
                    //DoTextEmote("takes a deep breath.", NULL);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                    break;
                case 7:
                {
                    DoCast(me, SPELL_FOG_BREATH, true);
                    float x, y, z;
                    me->GetPosition(x, y, z);
                    x = 2 * breathX - x;
                    y = 2 * breathY - y;
                    me->GetMotionMaster()->MovePoint(0, x, y, z);
                    events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
                    break;
                }
                case 8:
                    me->CastStop(SPELL_FOG_BREATH);
                    me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
                    ++uiBreathCount;
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
                    if (uiBreathCount < 3)
                        uiFlightCount = 4;
                    break;
                case 9:
                    if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
                        DoStartMovement(target);
                    else
                    {
                        EnterEvadeMode();
                        return;
                    }
                    break;
                case 10:
                    me->SetLevitate(false);
                    me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
                    EnterPhase(PHASE_GROUND);
                    AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
                    break;
                }
                ++uiFlightCount;
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                {
                    if (phase == PHASE_FLIGHT && !me->IsInEvadeMode())
                        EnterEvadeMode();
                    return;
                }
    
                events.Update(diff);
    
                if (me->IsNonMeleeSpellCasted(false))
                    return;
    
                if (phase == PHASE_GROUND)
                {
                    switch (events.ExecuteEvent())
                    {
                        case EVENT_BERSERK:
                            DoScriptText(YELL_BERSERK, me);
                            DoCast(me, SPELL_BERSERK, true);
                            events.ScheduleEvent(EVENT_BERSERK, 10000);
                            break;
                        case EVENT_CLEAVE:
                            DoCast(me->getVictim(), SPELL_CLEAVE, false);
                            events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
                            break;
                        case EVENT_CORROSION:
                            DoCast(me->getVictim(), SPELL_CORROSION, false);
                            events.ScheduleEvent(EVENT_CORROSION, urand(20000, 30000));
                            break;
                        case EVENT_GAS_NOVA:
                            DoCast(me, SPELL_GAS_NOVA, false);
                            events.ScheduleEvent(EVENT_GAS_NOVA, urand(20000, 25000));
                            break;
                        case EVENT_ENCAPSULATE:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true))
                                DoCast(target, SPELL_ENCAPSULATE_CHANNEL, false);
                            events.ScheduleEvent(EVENT_ENCAPSULATE, urand(25000, 30000));
                            break;
                        case EVENT_FLIGHT:
                            EnterPhase(PHASE_FLIGHT);
                            break;
                        default:
                            DoMeleeAttackIfReady();
                            break;
                    }
                }
    
                if (phase == PHASE_FLIGHT)
                {
                    switch (events.ExecuteEvent())
                    {
                        case EVENT_BERSERK:
                            DoScriptText(YELL_BERSERK, me);
                            DoCast(me, SPELL_BERSERK, true);
                            break;
                        case EVENT_FLIGHT_SEQUENCE:
                            HandleFlightSequence();
                            break;
                        case EVENT_SUMMON_FOG:
                            {
                                float x, y, z;
                                me->GetPosition(x, y, z);
                                me->UpdateGroundPositionZ(x, y, z);
                                if (Creature* Fog = me->SummonCreature(MOB_VAPOR_TRAIL, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 10000))
                                {
                                    Fog->RemoveAurasDueToSpell(SPELL_TRAIL_TRIGGER);
                                    Fog->CastSpell(Fog, SPELL_FOG_TRIGGER, true);
                                    me->CastSpell(Fog, SPELL_FOG_FORCE, true);
                                }
                            }
                            events.ScheduleEvent(EVENT_SUMMON_FOG, 1000);
                            break;
                    }
                }
            }
    
            void DespawnSummons(uint32 entry)
            {
                std::list<Creature*> templist;
                float x, y, z;
                me->GetPosition(x, y, z);
    
                CellCoord pair(Trinity::ComputeCellCoord(x, y));
                Cell cell(pair);
                cell.SetNoCreate();
    
                Trinity::AllCreaturesOfEntryInRange check(me, entry, 100);
                Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check);
                TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
                cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange());
    
                for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i)
                {
                    if (entry == MOB_VAPOR_TRAIL && phase == PHASE_FLIGHT)
                    {
                        (*i)->GetPosition(x, y, z);
                        me->SummonCreature(MOB_DEAD, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
                    }
                    (*i)->SetVisible(false);
                    (*i)->setDeathState(JUST_DIED);
                    if ((*i)->getDeathState() == CORPSE)
                        (*i)->RemoveCorpse();
                }
            }
        };
    
    };
    
    class mob_felmyst_vapor : public CreatureScript
    {
    public:
        mob_felmyst_vapor() : CreatureScript("mob_felmyst_vapor") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_felmyst_vaporAI(creature);
        }
    
        struct mob_felmyst_vaporAI : public ScriptedAI
        {
            mob_felmyst_vaporAI(Creature* c) : ScriptedAI(c)
            {
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->SetSpeed(MOVE_RUN, 0.8f);
            }
            void Reset() {}
            void EnterCombat(Unit* /*who*/)
            {
                DoZoneInCombat();
                //DoCast(me, SPELL_VAPOR_FORCE, true); core bug
            }
            void UpdateAI(const uint32 /*diff*/)
            {
                if (!me->getVictim())
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        AttackStart(target);
            }
        };
    
    };
    
    class mob_felmyst_trail : public CreatureScript
    {
    public:
        mob_felmyst_trail() : CreatureScript("mob_felmyst_trail") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_felmyst_trailAI(creature);
        }
    
        struct mob_felmyst_trailAI : public ScriptedAI
        {
            mob_felmyst_trailAI(Creature* c) : ScriptedAI(c)
            {
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                DoCast(me, SPELL_TRAIL_TRIGGER, true);
                me->SetTarget(me->GetGUID());
                me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 0.01f); // core bug
            }
            void Reset() {}
            void EnterCombat(Unit* /*who*/) {}
            void AttackStart(Unit* /*who*/) {}
            void MoveInLineOfSight(Unit* /*who*/) {}
            void UpdateAI(const uint32 /*diff*/) {}
        };
    
    };
    
    void AddSC_boss_felmyst()
    {
        new boss_felmyst();
        new mob_felmyst_vapor();
        new mob_felmyst_trail();
    }


    Spoiler untuk boss_kalecgos.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     * Copyright (C) 2006-2009 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Boss_Kalecgos
    SD%Complete: 95
    SDComment:
    SDCategory: Sunwell_Plateau
    EndScriptData */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    enum Yells
    {
        //Kalecgos dragon form
        SAY_EVIL_AGGRO                               = -1580000,
        SAY_EVIL_SPELL1                              = -1580001,
        SAY_EVIL_SPELL2                              = -1580002,
        SAY_EVIL_SLAY1                               = -1580003,
        SAY_EVIL_SLAY2                               = -1580004,
        SAY_EVIL_ENRAGE                              = -1580005,
    
        //Kalecgos humanoid form
        SAY_GOOD_AGGRO                               = -1580006,
        SAY_GOOD_NEAR_DEATH                          = -1580007,
        SAY_GOOD_NEAR_DEATH2                         = -1580008,
        SAY_GOOD_PLRWIN                              = -1580009,
    
        //Sathrovarr
        SAY_SATH_AGGRO                               = -1580010,
        SAY_SATH_DEATH                               = -1580011,
        SAY_SATH_SPELL1                              = -1580012,
        SAY_SATH_SPELL2                              = -1580013,
        SAY_SATH_SLAY1                               = -1580014,
        SAY_SATH_SLAY2                               = -1580015,
        SAY_SATH_ENRAGE                              = -1580016,
    };
    
    enum Spells
    {
        AURA_SUNWELL_RADIANCE                        = 45769,
        AURA_SPECTRAL_EXHAUSTION                     = 44867,
        AURA_SPECTRAL_REALM                          = 46021,
        AURA_SPECTRAL_INVISIBILITY                   = 44801,
        AURA_DEMONIC_VISUAL                          = 44800,
    
        SPELL_SPECTRAL_BLAST                         = 44869,
        SPELL_TELEPORT_SPECTRAL                      = 46019,
        SPELL_ARCANE_BUFFET                          = 45018,
        SPELL_FROST_BREATH                           = 44799,
        SPELL_TAIL_LASH                              = 45122,
    
        SPELL_BANISH                                 = 44836,
        SPELL_TRANSFORM_KALEC                        = 44670,
        SPELL_ENRAGE                                 = 44807,
    
        SPELL_CORRUPTION_STRIKE                      = 45029,
        SPELL_AGONY_CURSE                            = 45032,
        SPELL_SHADOW_BOLT                            = 45031,
    
        SPELL_HEROIC_STRIKE                          = 45026,
        SPELL_REVITALIZE                             = 45027
    };
    
    enum SWPActions
    {
        DO_ENRAGE                                    =  1,
        DO_BANISH                                    =  2,
    };
    
    #define GO_FAILED   "You are unable to use this currently."
    
    #define EMOTE_UNABLE_TO_FIND    "is unable to find Kalecgos"
    
    #define FLY_X   1679
    #define FLY_Y   900
    #define FLY_Z   82
    
    #define CENTER_X    1705
    #define CENTER_Y    930
    #define RADIUS      30
    
    #define DRAGON_REALM_Z  53.079f
    #define DEMON_REALM_Z   -74.558f
    
    #define MAX_PLAYERS_IN_SPECTRAL_REALM 0 //over this, teleport object won't work, 0 disables check
    
    uint32 WildMagic[] = { 44978, 45001, 45002, 45004, 45006, 45010 };
    
    class boss_kalecgos : public CreatureScript
    {
    public:
        boss_kalecgos() : CreatureScript("boss_kalecgos") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_kalecgosAI (creature);
        }
    
        struct boss_kalecgosAI : public ScriptedAI
        {
            boss_kalecgosAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
                SathGUID = 0;
                DoorGUID = 0;
                bJustReset = false;
                me->setActive(true);
            }
    
            InstanceScript* instance;
    
            uint32 ArcaneBuffetTimer;
            uint32 FrostBreathTimer;
            uint32 WildMagicTimer;
            uint32 SpectralBlastTimer;
            uint32 TailLashTimer;
            uint32 CheckTimer;
            uint32 TalkTimer;
            uint32 TalkSequence;
            uint32 ResetTimer;
    
            bool isFriendly;
            bool isEnraged;
            bool isBanished;
            bool bJustReset;
    
            uint64 SathGUID;
            uint64 DoorGUID;
    
            void Reset()
            {
                if (instance)
                {
                    SathGUID = instance->GetData64(DATA_SATHROVARR);
                    instance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
                }
    
                if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
                    Sath->AI()->EnterEvadeMode();
    
                me->setFaction(14);
                if (!bJustReset) //first reset at create
                {
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
                    me->SetLevitate(false);
                    me->SetVisible(true);
                    me->SetStandState(UNIT_STAND_STATE_SLEEP);
                }
                me->SetFullHealth();//dunno why it does not resets health at evade..
                ArcaneBuffetTimer = 8000;
                FrostBreathTimer = 15000;
                WildMagicTimer = 10000;
                TailLashTimer = 25000;
                SpectralBlastTimer = urand(20000, 25000);
                CheckTimer = 1000;
                ResetTimer = 30000;
    
                TalkTimer = 0;
                TalkSequence = 0;
                isFriendly = false;
                isEnraged = false;
                isBanished = false;
            }
    
            void EnterEvadeMode()
            {
                bJustReset = true;
                me->SetVisible(false);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
                ScriptedAI::EnterEvadeMode();
            }
    
            void DoAction(const int32 param)
            {
                switch (param)
                {
                    case DO_ENRAGE:
                        isEnraged = true;
                        me->CastSpell(me, SPELL_ENRAGE, true);
                        break;
                    case DO_BANISH:
                        isBanished = true;
                        me->CastSpell(me, SPELL_BANISH, true);
                        break;
                }
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (TalkTimer)
                {
                    if (!TalkSequence)
                    {
                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
                        me->InterruptNonMeleeSpells(true);
                        me->RemoveAllAuras();
                        me->DeleteThreatList();
                        me->CombatStop();
                        ++TalkSequence;
                    }
                    if (TalkTimer <= diff)
                    {
                        if (isFriendly)
                            GoodEnding();
                        else
                            BadEnding();
                        ++TalkSequence;
                    } else TalkTimer -= diff;
                }
                else
                {
                    if (bJustReset)
                    {
                        if (ResetTimer <= diff)
                        {
                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
                            me->SetLevitate(false);
                            me->SetVisible(true);
                            me->SetStandState(UNIT_STAND_STATE_SLEEP);
                            ResetTimer = 10000;
                            bJustReset = false;
                        } else ResetTimer -= diff;
                        return;
                    }
                    if (!UpdateVictim())
                        return;
    
                    if (CheckTimer <= diff)
                    {
                        if (me->GetDistance(CENTER_X, CENTER_Y, DRAGON_REALM_Z) >= 75)
                        {
                            me->AI()->EnterEvadeMode();
                            return;
                        }
                        if (HealthBelowPct(10) && !isEnraged)
                        {
                            if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
                                Sath->AI()->DoAction(DO_ENRAGE);
                            DoAction(DO_ENRAGE);
                        }
                        if (!isBanished && HealthBelowPct(1))
                        {
                            if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
                            {
                                if (Sath->HasAura(SPELL_BANISH))
                                {
                                    Sath->DealDamage(Sath, Sath->GetHealth());
                                    return;
                                }
                                else
                                    DoAction(DO_BANISH);
                            }
                            else
                            {
                                sLog->outError("TSCR: Didn't find Shathrowar. Kalecgos event reseted.");
                                EnterEvadeMode();
                                return;
                            }
                        }
                        CheckTimer = 1000;
                    } else CheckTimer -= diff;
    
                    if (ArcaneBuffetTimer <= diff)
                    {
                        DoCastAOE(SPELL_ARCANE_BUFFET);
                        ArcaneBuffetTimer = 8000;
                    } else ArcaneBuffetTimer -= diff;
    
                    if (FrostBreathTimer <= diff)
                    {
                        DoCastAOE(SPELL_FROST_BREATH);
                        FrostBreathTimer = 15000;
                    } else FrostBreathTimer -= diff;
    
                    if (TailLashTimer <= diff)
                    {
                        DoCastAOE(SPELL_TAIL_LASH);
                        TailLashTimer = 15000;
                    } else TailLashTimer -= diff;
    
                    if (WildMagicTimer <= diff)
                    {
                        DoCastAOE(WildMagic[rand()%6]);
                        WildMagicTimer = 20000;
                    } else WildMagicTimer -= diff;
    
                    if (SpectralBlastTimer <= diff)
                    {
                        std::list<HostileReference*> &m_threatlist = me->getThreatManager().getThreatList();
                        std::list<Unit*> targetList;
                        for (std::list<HostileReference*>::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
                            if ((*itr)->getTarget() && (*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->GetGUID() != me->getVictim()->GetGUID() && !(*itr)->getTarget()->HasAura(AURA_SPECTRAL_EXHAUSTION) && (*itr)->getTarget()->GetPositionZ() > me->GetPositionZ()-5)
                                targetList.push_back((*itr)->getTarget());
                        if (targetList.empty())
                        {
                            SpectralBlastTimer = 1000;
                            return;
                        }
                        std::list<Unit*>::const_iterator i = targetList.begin();
                        advance(i, rand()%targetList.size());
                        if ((*i))
                        {
                            (*i)->CastSpell((*i), SPELL_SPECTRAL_BLAST, true);
                            SpectralBlastTimer = 20000+rand()%5000;
                        } else SpectralBlastTimer = 1000;
                    } else SpectralBlastTimer -= diff;
    
                    DoMeleeAttackIfReady();
                }
            }
    
            void MoveInLineOfSight(Unit* who)
            {
                if (bJustReset)//boss is invisible, don't attack
                    return;
    
                if (!me->getVictim() && me->IsValidAttackTarget(who))
                {
                    float attackRadius = me->GetAttackDistance(who);
                    if (me->IsWithinDistInMap(who, attackRadius))
                        AttackStart(who);
                }
            }
    
            void DamageTaken(Unit* done_by, uint32 &damage)
            {
                if (damage >= me->GetHealth() && done_by != me)
                    damage = 0;
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                me->SetStandState(UNIT_STAND_STATE_STAND);
                DoScriptText(SAY_EVIL_AGGRO, me);
                DoZoneInCombat();
    
                if (instance)
                    instance->SetData(DATA_KALECGOS_EVENT, IN_PROGRESS);
            }
    
            void KilledUnit(Unit* /*victim*/)
            {
                DoScriptText(RAND(SAY_EVIL_SLAY1, SAY_EVIL_SLAY2), me);
            }
    
            void MovementInform(uint32 type, uint32 /*id*/)
            {
                if (type != POINT_MOTION_TYPE)
                    return;
                me->SetVisible(false);
                if (isFriendly)
                {
                    me->setDeathState(JUST_DIED);
    
                    Map::PlayerList const& players = me->GetMap()->GetPlayers();
                    if (!players.isEmpty())
                    {
                        for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
                        {
                            Player* player = itr->getSource();
                            if (player)
                                me->GetMap()->ToInstanceMap()->PermBindAllPlayers(player);
                        }
                    }
                }
                else
                {
                    me->GetMotionMaster()->MoveTargetedHome();
                    TalkTimer = 1000;
                }
            }
    
            void GoodEnding()
            {
                switch (TalkSequence)
                {
                case 1:
                    me->setFaction(35);
                    TalkTimer = 1000;
                    break;
                case 2:
                    DoScriptText(SAY_GOOD_PLRWIN, me);
                    TalkTimer = 10000;
                    break;
                case 3:
                    me->SetLevitate(true);
                    me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
                    TalkTimer = 600000;
                    break;
                default:
                    break;
                }
            }
    
            void BadEnding()
            {
                switch (TalkSequence)
                {
                case 1:
                    DoScriptText(SAY_EVIL_ENRAGE, me);
                    TalkTimer = 3000;
                    break;
                case 2:
                    me->SetLevitate(true);
                    me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
                    TalkTimer = 15000;
                    break;
                case 3:
                    EnterEvadeMode();
                    break;
                default:
                    break;
                }
            }
        };
    
    };
    
    class boss_kalec : public CreatureScript
    {
    public:
        boss_kalec() : CreatureScript("boss_kalec") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_kalecAI (creature);
        }
    
        struct boss_kalecAI : public ScriptedAI
        {
            InstanceScript* instance;
    
            uint32 RevitalizeTimer;
            uint32 HeroicStrikeTimer;
            uint32 YellTimer;
            uint32 YellSequence;
    
            uint64 SathGUID;
    
            bool isEnraged; // if demon is enraged
    
            boss_kalecAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            void Reset()
            {
                if (instance)
                    SathGUID = instance->GetData64(DATA_SATHROVARR);
    
                RevitalizeTimer = 5000;
                HeroicStrikeTimer = 3000;
                YellTimer = 5000;
                YellSequence = 0;
    
                isEnraged = false;
            }
    
            void DamageTaken(Unit* done_by, uint32 &damage)
            {
                if (done_by->GetGUID() != SathGUID)
                    damage = 0;
                else if (isEnraged)
                    damage *= 3;
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
                    me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
                if (!UpdateVictim())
                    return;
    
                if (YellTimer <= diff)
                {
                    switch (YellSequence)
                    {
                    case 0:
                        DoScriptText(SAY_GOOD_AGGRO, me);
                        ++YellSequence;
                        break;
                    case 1:
                        if (HealthBelowPct(50))
                        {
                            DoScriptText(SAY_GOOD_NEAR_DEATH, me);
                            ++YellSequence;
                        }
                        break;
                    case 2:
                        if (HealthBelowPct(10))
                        {
                            DoScriptText(SAY_GOOD_NEAR_DEATH2, me);
                            ++YellSequence;
                        }
                        break;
                    default:
                        break;
                    }
                    YellTimer = 5000;
                }
    
                if (RevitalizeTimer <= diff)
                {
                    DoCast(me, SPELL_REVITALIZE);
                    RevitalizeTimer = 5000;
                } else RevitalizeTimer -= diff;
    
                if (HeroicStrikeTimer <= diff)
                {
                    DoCast(me->getVictim(), SPELL_HEROIC_STRIKE);
                    HeroicStrikeTimer = 2000;
                } else HeroicStrikeTimer -= diff;
    
                DoMeleeAttackIfReady();
            }
        };
    
    };
    
    class kalecgos_teleporter : public GameObjectScript
    {
    public:
        kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { }
    
        bool OnGossipHello(Player* player, GameObject* go)
        {
            uint8 SpectralPlayers = 0;
            Map* map = go->GetMap();
            if (!map->IsDungeon())
                return true;
    
            Map::PlayerList const &PlayerList = map->GetPlayers();
            for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
            {
                if (i->getSource() && i->getSource()->GetPositionZ() < DEMON_REALM_Z + 5)
                    ++SpectralPlayers;
            }
            uint8 MaxSpectralPlayers =  MAX_PLAYERS_IN_SPECTRAL_REALM;
            if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || (MaxSpectralPlayers && SpectralPlayers >= MaxSpectralPlayers))
                player->GetSession()->SendNotification(GO_FAILED);
            else
                player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true);
            return true;
        }
    
    };
    
    class boss_sathrovarr : public CreatureScript
    {
    public:
        boss_sathrovarr() : CreatureScript("boss_sathrovarr") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_sathrovarrAI (creature);
        }
    
        struct boss_sathrovarrAI : public ScriptedAI
        {
            boss_sathrovarrAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
                KalecGUID = 0;
                KalecgosGUID = 0;
            }
    
            InstanceScript* instance;
    
            uint32 CorruptionStrikeTimer;
            uint32 AgonyCurseTimer;
            uint32 ShadowBoltTimer;
            uint32 CheckTimer;
            uint32 ResetThreat;
    
            uint64 KalecGUID;
            uint64 KalecgosGUID;
    
            bool isEnraged;
            bool isBanished;
    
            void Reset()
            {
                me->SetFullHealth();//dunno why it does not resets health at evade..
                me->setActive(true);
                if (instance)
                {
                    KalecgosGUID = instance->GetData64(DATA_KALECGOS_DRAGON);
                    instance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
                }
                if (KalecGUID)
                {
                    if (Creature* Kalec = Unit::GetCreature(*me, KalecGUID))
                        Kalec->setDeathState(JUST_DIED);
                    KalecGUID = 0;
                }
    
                ShadowBoltTimer = urand(7, 10) * 1000;
                AgonyCurseTimer = 20000;
                CorruptionStrikeTimer = 13000;
                CheckTimer = 1000;
                ResetThreat = 1000;
                isEnraged = false;
                isBanished = false;
    
                me->CastSpell(me, AURA_DEMONIC_VISUAL, true);
                TeleportAllPlayersBack();
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                if (Creature* Kalec = me->SummonCreature(MOB_KALEC, me->GetPositionX() + 10, me->GetPositionY() + 5, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0))
                {
                    KalecGUID = Kalec->GetGUID();
                    me->CombatStart(Kalec);
                    me->AddThreat(Kalec, 100.0f);
                    Kalec->setActive(true);
                }
                DoScriptText(SAY_SATH_AGGRO, me);
            }
    
            void DamageTaken(Unit* done_by, uint32 &damage)
            {
                if (damage >= me->GetHealth() && done_by != me)
                    damage = 0;
            }
    
            void KilledUnit(Unit* target)
            {
                if (target->GetGUID() == KalecGUID)
                {
                    TeleportAllPlayersBack();
                    if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
                    {
                        CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
                        CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = false;
                    }
                    EnterEvadeMode();
                    return;
                }
                DoScriptText(RAND(SAY_SATH_SLAY1, SAY_SATH_SLAY2), me);
            }
    
            void JustDied(Unit* /*killer*/)
            {
                DoScriptText(SAY_SATH_DEATH, me);
                me->SetPosition(me->GetPositionX(), me->GetPositionY(), DRAGON_REALM_Z, me->GetOrientation());
                TeleportAllPlayersBack();
                if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
                {
                    CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
                    CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true;
                }
    
                if (instance)
                    instance->SetData(DATA_KALECGOS_EVENT, DONE);
            }
    
            void TeleportAllPlayersBack()
            {
                Map* map = me->GetMap();
                if (!map->IsDungeon()) return;
                Map::PlayerList const &PlayerList = map->GetPlayers();
                for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
                {
                    if (i->getSource()->GetPositionZ() <= DRAGON_REALM_Z-5)
                    {
                        i->getSource()->RemoveAura(AURA_SPECTRAL_REALM);
                        i->getSource()->TeleportTo(me->GetMap()->GetId(), i->getSource()->GetPositionX(), i->getSource()->GetPositionY(), DRAGON_REALM_Z+5, i->getSource()->GetOrientation());
                    }
                }
            }
    
            void DoAction(const int32 param)
            {
                switch (param)
                {
                    case DO_ENRAGE:
                        isEnraged = true;
                        me->CastSpell(me, SPELL_ENRAGE, true);
                        break;
                    case DO_BANISH:
                        isBanished = true;
                        me->CastSpell(me, SPELL_BANISH, true);
                        break;
                }
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
                    me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
                if (!UpdateVictim())
                    return;
    
                if (CheckTimer <= diff)
                {
                    Creature* Kalec = Unit::GetCreature(*me, KalecGUID);
                    if (!Kalec || (Kalec && !Kalec->isAlive()))
                    {
                        if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
                            Kalecgos->AI()->EnterEvadeMode();
                            return;
                    }
                    if (HealthBelowPct(10) && !isEnraged)
                    {
                        if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
                            Kalecgos->AI()->DoAction(DO_ENRAGE);
                        DoAction(DO_ENRAGE);
                    }
                    Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID);
                    if (Kalecgos)
                    {
                        if (!Kalecgos->isInCombat())
                        {
                            me->AI()->EnterEvadeMode();
                            return;
                        }
                    }
                    if (!isBanished && HealthBelowPct(1))
                    {
                        if (Kalecgos)
                        {
                            if (Kalecgos->HasAura(SPELL_BANISH))
                            {
                                me->DealDamage(me, me->GetHealth());
                                return;
                            }
                            else
                                DoAction(DO_BANISH);
                        }
                        else
                        {
                            me->MonsterTextEmote(EMOTE_UNABLE_TO_FIND, 0);
                            EnterEvadeMode();
                            return;
                        }
                    }
                    CheckTimer = 1000;
                } else CheckTimer -= diff;
    
                if (ResetThreat <= diff)
                {
                    for (std::list<HostileReference*>::const_iterator itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr)
                    {
                        if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
                        {
                            if (unit->GetPositionZ() > me->GetPositionZ()+5)
                            {
                                me->getThreatManager().modifyThreatPercent(unit, -100);
                            }
                        }
                    }
                    ResetThreat = 1000;
                } else ResetThreat -= diff;
    
                if (ShadowBoltTimer <= diff)
                {
                    if (!(rand()%5))DoScriptText(SAY_SATH_SPELL1, me);
                    DoCast(me, SPELL_SHADOW_BOLT);
                    ShadowBoltTimer = 7000+(rand()%3000);
                } else ShadowBoltTimer -= diff;
    
                if (AgonyCurseTimer <= diff)
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
                    if (!target) target = me->getVictim();
                    DoCast(target, SPELL_AGONY_CURSE);
                    AgonyCurseTimer = 20000;
                } else AgonyCurseTimer -= diff;
    
                if (CorruptionStrikeTimer <= diff)
                {
                    if (!(rand()%5))DoScriptText(SAY_SATH_SPELL2, me);
                    DoCast(me->getVictim(), SPELL_CORRUPTION_STRIKE);
                    CorruptionStrikeTimer = 13000;
                } else CorruptionStrikeTimer -= diff;
    
                DoMeleeAttackIfReady();
            }
        };
    
    };
    
    void AddSC_boss_kalecgos()
    {
        new boss_kalecgos();
        new boss_sathrovarr();
        new boss_kalec();
        new kalecgos_teleporter();
    }
    Last edited by Achernar_Altair; 30-05-13 at 17:15.
    Quote Originally Posted by Aluna Sagita
    Having Crush On Me Isn't Categorized As Pedophilia
    Spoiler untuk Warcraft Books :

  27. #30
    Achernar_Altair's Avatar
    Join Date
    Mar 2007
    Location
    Kamar, Masjid, Kantor n Warnet, g jauh2 dah dari situ
    Posts
    877
    Points
    1,872.78
    Thanks: 15 / 131 / 30

    Default [C++] Sunwell Plateau Script Part 2

    Spoiler untuk boss_kiljaeden.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     *
     * 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Boss_Kiljaeden
    SD%Complete: 80
    SDComment: Sinister Reflection Model, Armageddon Visual, SAY_KJ_SHADOWSPIKE3, Emote, End Sequence
    SDCategory: Sunwell_Plateau
    EndScriptData */
    
    //TODO rewrite Armageddon
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    #include <math.h>
    
    /*** Speech and sounds***/
    enum Yells
    {
        // These are used throughout Sunwell and Magisters(?). Players can hear this while running through the instances.
        SAY_KJ_OFFCOMBAT1                           = -1580066,
        SAY_KJ_OFFCOMBAT2                           = -1580067,
        SAY_KJ_OFFCOMBAT3                           = -1580068,
        SAY_KJ_OFFCOMBAT4                           = -1580069,
        SAY_KJ_OFFCOMBAT5                           = -1580070,
    
        // Encounter speech and sounds
        SAY_KJ_EMERGE                               = -1580071,
        SAY_KJ_SLAY1                                = -1580072,
        SAY_KJ_SLAY2                                = -1580073,
        SAY_KJ_REFLECTION1                          = -1580074,
        SAY_KJ_REFLECTION2                          = -1580075,
        SAY_KJ_DARKNESS1                            = -1580076,
        SAY_KJ_DARKNESS2                            = -1580077,
        SAY_KJ_DARKNESS3                            = -1580078,
        SAY_KJ_PHASE3                               = -1580079,
        SAY_KJ_PHASE4                               = -1580080,
        SAY_KJ_PHASE5                               = -1580081,
        SAY_KJ_DEATH                                = -1580093,
        EMOTE_KJ_DARKNESS                           = -1580094,
    
        /*** Kalecgos - Anveena speech at the beginning of Phase 5; Anveena's sacrifice ***/
        SAY_KALECGOS_AWAKEN                         = -1580082,
        SAY_ANVEENA_IMPRISONED                      = -1580083,
        SAY_KALECGOS_LETGO                          = -1580084,
        SAY_ANVEENA_LOST                            = -1580085,
        SAY_KALECGOS_FOCUS                          = -1580086,
        SAY_ANVEENA_KALEC                           = -1580087,
        SAY_KALECGOS_FATE                           = -1580088,
        SAY_ANVEENA_GOODBYE                         = -1580089,
        SAY_KALECGOS_GOODBYE                        = -1580090,
        SAY_KALECGOS_ENCOURAGE                      = -1580091,
    
        /*** Kalecgos says throughout the fight ***/
        SAY_KALECGOS_JOIN                           = -1580092,
        SAY_KALEC_ORB_READY1                        = -1580095,
        SAY_KALEC_ORB_READY2                        = -1580096,
        SAY_KALEC_ORB_READY3                        = -1580097,
        SAY_KALEC_ORB_READY4                        = -1580098
    };
    
    /*** Spells used during the encounter ***/
    enum Spells
    {
        /* Hand of the Deceiver's spells and cosmetics */
        SPELL_SHADOW_BOLT_VOLLEY                    = 45770, // ~30 yard range Shadow Bolt Volley for ~2k(?) damage
        SPELL_SHADOW_INFUSION                       = 45772, // They gain this at 20% - Immunity to Stun/Silence and makes them look angry!
        SPELL_FELFIRE_PORTAL                        = 46875, // Creates a portal that spawns Felfire Fiends (LIVE FOR THE SWARM!1 FOR THE OVERMIND!)
        SPELL_SHADOW_CHANNELING                     = 46757, // Channeling animation out of combat
    
        /* Volatile Felfire Fiend's spells */
        SPELL_FELFIRE_FISSION                       = 45779, // Felfire Fiends explode when they die or get close to target.
    
        /* Kil'Jaeden's spells and cosmetics */
        SPELL_TRANS                                 = 23188, // Surprisingly, this seems to be the right spell.. (Where is it used?)
        SPELL_REBIRTH                               = 44200, // Emerge from the Sunwell
        SPELL_SOUL_FLAY                             = 45442, // 9k Shadow damage over 3 seconds. Spammed throughout all the fight.
        SPELL_SOUL_FLAY_SLOW                        = 47106,
        SPELL_LEGION_LIGHTNING                      = 45664, // Chain Lightning, 4 targets, ~3k Shadow damage, 1.5fk mana burn
        SPELL_FIRE_BLOOM                            = 45641, // Places a debuff on 5 raid members, which causes them to deal 2k Fire damage to nearby allies and selves. MIGHT NOT WORK
        SPELL_DESTROY_ALL_DRAKES                    = 46707, // when he use it?
    
        SPELL_SINISTER_REFLECTION                   = 45785, // Summon shadow copies of 5 raid members that fight against KJ's enemies//dont work
                                                    //  45892  // right one for SPELL_SINISTER_REFLECTION but no EffectScriptEffect
        SPELL_COPY_WEAPON                           = 41055, // }
        SPELL_COPY_WEAPON2                          = 41054, // }
        SPELL_COPY_OFFHAND                          = 45206, // }- Spells used in Sinister Reflection creation
        SPELL_COPY_OFFHAND_WEAPON                   = 45205, // }
    
        SPELL_SHADOW_SPIKE                          = 46680, // Bombard random raid members with Shadow Spikes (Very similar to Void Reaver orbs)
        SPELL_FLAME_DART                            = 45737, // Bombards the raid with flames every 3(?) seconds
        SPELL_DARKNESS_OF_A_THOUSAND_SOULS          = 46605, // Begins a 8-second channeling, after which he will deal 50'000 damage to the raid
        SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE   = 45657,
    
        /* Armageddon spells wrong visual */
        SPELL_ARMAGEDDON_TRIGGER                    = 45909, // Meteor spell trigger missile should cast Creature on himself
        SPELL_ARMAGEDDON_VISUAL                     = 45911, // Does the hellfire visual to indicate where the meteor missle lands
        SPELL_ARMAGEDDON_VISUAL2                    = 45914, // Does the light visual to indicate where the meteor missle lands
        SPELL_ARMAGEDDON_VISUAL3                    = 24207, // This shouldn't correct but same as seen on the movie
        SPELL_ARMAGEDDON_SUMMON_TRIGGER             = 45921, // Summons the triggers that cast the spells on himself need random target select
        SPELL_ARMAGEDDON_DAMAGE                     = 45915, // This does the area damage
    
        /* Shield Orb Spells*/
        SPELL_SHADOW_BOLT                           = 45680, //45679 would be correct but triggers to often //TODO fix console error
    
        /* Anveena's spells and cosmetics (Or, generally, everything that has "Anveena" in name) */
        SPELL_ANVEENA_PRISON                        = 46367, // She hovers locked within a bubble
        SPELL_ANVEENA_ENERGY_DRAIN                  = 46410, // Sunwell energy glow animation (Control mob uses this)
        SPELL_SACRIFICE_OF_ANVEENA                  = 46474, // This is cast on Kil'Jaeden when Anveena sacrifices herself into the Sunwell
    
        /* Sinister Reflection Spells */
        SPELL_SR_CURSE_OF_AGONY                     = 46190,
        SPELL_SR_SHADOW_BOLT                        = 47076,
    
        SPELL_SR_EARTH_SHOCK                        = 47071,
    
        SPELL_SR_FIREBALL                           = 47074,
    
        SPELL_SR_HEMORRHAGE                         = 45897,
    
        SPELL_SR_HOLY_SHOCK                         = 38921,
        SPELL_SR_HAMMER_OF_JUSTICE                  = 37369,
    
        SPELL_SR_HOLY_SMITE                         = 47077,
        SPELL_SR_RENEW                              = 47079,
    
        SPELL_SR_SHOOT                              = 16496,
        SPELL_SR_MULTI_SHOT                         = 48098,
        SPELL_SR_WING_CLIP                          = 40652,
    
        SPELL_SR_WHIRLWIND                          = 17207,
    
        SPELL_SR_MOONFIRE                           = 47072,
        //SPELL_SR_PLAGU STRIKE                       = 58843, Dk Spell!
    
        /*** Other Spells (used by players, etc) ***/
        SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT          = 45839, // Possess the blue dragon from the orb to help the raid.
        SPELL_ENTROPIUS_BODY                        = 46819, // Visual for Entropius at the Epilogue
        SPELL_RING_OF_BLUE_FLAMES                   = 45825  //Cast this spell when the go is activated
    };
    
    /*** Error messages ***/
    #define ERROR_KJ_NOT_SUMMONED "TSCR ERROR: Unable to summon Kil'Jaeden for some reason"
    
    /*** Others ***/
    #define FLOOR_Z         28.050388f
    #define SHIELD_ORB_Z    45.000f
    
    enum Phase
    {
        PHASE_DECEIVERS     = 1, // Fight 3 adds
        PHASE_NORMAL        = 2, // Kil'Jaeden emerges from the sunwell
        PHASE_DARKNESS      = 3, // At 85%, he gains few abilities; Kalecgos joins the fight
        PHASE_ARMAGEDDON    = 4, // At 55%, he gains even more abilities
        PHASE_SACRIFICE     = 5, // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns.
    };
    
    //Timers
    enum KilJaedenTimers
    {
        TIMER_SPEECH           = 0,
    
        //Phase 2 Timer
        TIMER_SOUL_FLAY        = 1,
        TIMER_LEGION_LIGHTNING = 2,
        TIMER_FIRE_BLOOM       = 3,
        TIMER_SUMMON_SHILEDORB = 4,
    
        //Phase 3 Timer
        TIMER_SHADOW_SPIKE     = 5,
        TIMER_FLAME_DART       = 6,
        TIMER_DARKNESS         = 7,
        TIMER_ORBS_EMPOWER     = 8,
    
        //Phase 4 Timer
        TIMER_ARMAGEDDON       = 9
    };
    
    // Locations of the Hand of Deceiver adds
    Position DeceiverLocations[3]=
    {
        {1682.045f, 631.299f, 5.936f, 0.0f},
        {1684.099f, 618.848f, 0.589f, 0.0f},
        {1694.170f, 612.272f, 1.416f, 0.0f},
    };
    
    // Locations, where Shield Orbs will spawn
    float ShieldOrbLocations[4][2]=
    {
        {1698.900f, 627.870f},    // middle pont of Sunwell
        {12, 3.14f},             // First one spawns northeast of KJ
        {12, 3.14f/0.7f},         // Second one spawns southeast
        {12, 3.14f*3.8f}          // Third one spawns (?)
    };
    
    struct Speech
    {
        int32 textid;
        uint32 creature, timer;
    };
    
    // Timers
    static Speech Speeches[]=
    {
        //Kil Phase 1 -> Phase 2
        {SAY_KJ_EMERGE,             DATA_KILJAEDEN,     0},
        {SAY_KALECGOS_JOIN,         DATA_KALECGOS_KJ,   26000},
        //Kil Phase 2 -> Phase 3
        {SAY_KALECGOS_AWAKEN,       DATA_KALECGOS_KJ,   10000},
        {SAY_ANVEENA_IMPRISONED,    DATA_ANVEENA,       5000},
        {SAY_KJ_PHASE3,             DATA_KILJAEDEN,     5000},
        //Kil Phase 3 -> Phase 4
        {SAY_KALECGOS_LETGO,        DATA_KALECGOS_KJ,   10000},
        {SAY_ANVEENA_LOST,          DATA_ANVEENA,       8000},
        {SAY_KJ_PHASE4,             DATA_KILJAEDEN,     7000},
        //Kil Phase 4 -> Phase 5
        {SAY_KALECGOS_FOCUS,        DATA_KALECGOS_KJ,   4000},
        {SAY_ANVEENA_KALEC,         DATA_ANVEENA,       11000},
        {SAY_KALECGOS_FATE,         DATA_KALECGOS_KJ,   2000},
        {SAY_ANVEENA_GOODBYE,       DATA_ANVEENA,       6000},
        {SAY_KJ_PHASE5,             DATA_KILJAEDEN,     5500},
    
        // use in End sequence?
        {SAY_KALECGOS_GOODBYE,      DATA_KALECGOS_KJ,   12000},
    };
    
    //AI for Kalecgos
    class boss_kalecgos_kj : public CreatureScript
    {
    public:
        boss_kalecgos_kj() : CreatureScript("boss_kalecgos_kj") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_kalecgos_kjAI (creature);
        }
    
        struct boss_kalecgos_kjAI : public ScriptedAI
        {
            boss_kalecgos_kjAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
            uint8 OrbsEmpowered;
            uint8 EmpowerCount;
    
            void Reset()
            {
                OrbsEmpowered = 0;
                EmpowerCount = 0;
                me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->setActive(true);
    
                for (uint8 i = 0; i < 4; ++i)
                    if (GameObject* pOrb = GetOrb(i))
                        pOrb->SetGoType(GAMEOBJECT_TYPE_BUTTON);
            }
    
            GameObject* GetOrb(int32 index)
            {
                if (!instance)
                    return NULL;
    
                switch (index)
                {
                    case 0:
                        return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1));
                    case 1:
                        return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2));
                    case 2:
                        return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3));
                    case 3:
                        return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4));
                }
    
                return NULL;
            }
    
            void ResetOrbs()
            {
                me->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
                for (uint8 i = 0; i < 4; ++i)
                    if (GameObject* pOrb = GetOrb(i))
                        pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 0);
            }
    
            void EmpowerOrb(bool all)
            {
                GameObject* pOrbEmpowered = GetOrb(OrbsEmpowered);
                if (!pOrbEmpowered)
                    return;
    
                if (all)
                {
                    me->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
                    for (uint8 i = 0; i < 4; ++i)
                    {
                        if (GameObject* pOrb = GetOrb(i))
                        {
                            pOrb->CastSpell(me, SPELL_RING_OF_BLUE_FLAMES);
                            pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 35);
                            pOrb->setActive(true);
                            pOrb->Refresh();
                        }
                    }
                    DoScriptText(SAY_KALECGOS_ENCOURAGE, me);
                }
                else
                {
                    if (GameObject* pOrb = GetOrb(urand(0, 3)))
                    {
                        pOrb->CastSpell(me, SPELL_RING_OF_BLUE_FLAMES);
                        pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 35);
                        pOrb->setActive(true);
                        pOrb->Refresh();
    
                        OrbsEmpowered = (OrbsEmpowered+1)%4;
    
                        ++EmpowerCount;
                        switch (EmpowerCount)
                        {
                            case 1: DoScriptText(SAY_KALEC_ORB_READY1, me); break;
                            case 2: DoScriptText(SAY_KALEC_ORB_READY2, me); break;
                            case 3: DoScriptText(SAY_KALEC_ORB_READY3, me); break;
                            case 4: DoScriptText(SAY_KALEC_ORB_READY4, me); break;
                        }
                    }
                }
            }
    
            void UpdateAI(const uint32 /*diff*/)
            {
            }
    
            void SetRingOfBlueFlames()
            {
                me->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
                for (uint8 i = 0; i < 4; ++i)
                {
                    if (GameObject* pOrb = GetOrb(i))
                    {
                        if (pOrb->GetUInt32Value(GAMEOBJECT_FACTION) == 35)
                        {
                            pOrb->CastSpell(me, SPELL_RING_OF_BLUE_FLAMES);
                            pOrb->setActive(true);
                            pOrb->Refresh();
                        }
                    }
                }
            }
        };
    
    };
    
    class go_orb_of_the_blue_flight : public GameObjectScript
    {
    public:
        go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { }
    
        bool OnGossipHello(Player* player, GameObject* go)
        {
            if (go->GetUInt32Value(GAMEOBJECT_FACTION) == 35)
            {
                InstanceScript* instance = go->GetInstanceScript();
                player->SummonCreature(CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
                player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
                go->SetUInt32Value(GAMEOBJECT_FACTION, 0);
    
                if (Creature* pKalec = Unit::GetCreature(*player, instance->GetData64(DATA_KALECGOS_KJ)))
                    CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
    
                go->Refresh();
            }
            return true;
        }
    
    };
    
    //AI for Kil'jaeden Event Controller
    class mob_kiljaeden_controller : public CreatureScript
    {
    public:
        mob_kiljaeden_controller() : CreatureScript("mob_kiljaeden_controller") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_kiljaeden_controllerAI (creature);
        }
    
        struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI
        {
            mob_kiljaeden_controllerAI(Creature* c) : Scripted_NoMovementAI(c), summons(me)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
            SummonList summons;
    
            bool bSummonedDeceivers;
            bool bKiljaedenDeath;
    
            uint32 uiRandomSayTimer;
            uint32 phase;
            uint8 deceiverDeathCount;
    
            void InitializeAI()
            {
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                me->AddUnitState(UNIT_STATE_STUNNED);
    
                ScriptedAI::InitializeAI();
            }
    
            void Reset()
            {
                phase = PHASE_DECEIVERS;
    
                if (Creature* pKalecKJ = Unit::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ)))
                    CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs();
                deceiverDeathCount = 0;
                bSummonedDeceivers = false;
                bKiljaedenDeath = false;
                uiRandomSayTimer = 30000;
                summons.DespawnAll();
            }
    
            void JustSummoned(Creature* summoned)
            {
                switch (summoned->GetEntry())
                {
                    case CREATURE_HAND_OF_THE_DECEIVER:
                        summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false);
                        break;
                    case CREATURE_ANVEENA:
                        summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
                        summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true);
                        summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        break;
                    case CREATURE_KILJAEDEN:
                        summoned->CastSpell(summoned, SPELL_REBIRTH, false);
                        summoned->AddThreat(me->getVictim(), 1.0f);
                        break;
                }
                summons.Summon(summoned);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (uiRandomSayTimer < diff)
                {
                    if (instance && instance->GetData(DATA_MURU_EVENT) != DONE && instance->GetData(DATA_KILJAEDEN_EVENT) == NOT_STARTED)
                        DoScriptText(RAND(SAY_KJ_OFFCOMBAT1, SAY_KJ_OFFCOMBAT2, SAY_KJ_OFFCOMBAT3, SAY_KJ_OFFCOMBAT4, SAY_KJ_OFFCOMBAT5), me);
                    uiRandomSayTimer = 30000;
                } else uiRandomSayTimer -= diff;
    
                if (!bSummonedDeceivers)
                {
                    for (uint8 i = 0; i < 3; ++i)
                        me->SummonCreature(CREATURE_HAND_OF_THE_DECEIVER, DeceiverLocations[i], TEMPSUMMON_DEAD_DESPAWN, 0);
    
                    DoSpawnCreature(CREATURE_ANVEENA,  0, 0, 40, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
                    DoCast(me, SPELL_ANVEENA_ENERGY_DRAIN);
                    bSummonedDeceivers = true;
                }
    
                if (deceiverDeathCount > 2 && phase == PHASE_DECEIVERS)
                {
                    me->RemoveAurasDueToSpell(SPELL_ANVEENA_ENERGY_DRAIN);
                    phase = PHASE_NORMAL;
                    DoSpawnCreature(CREATURE_KILJAEDEN, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
                }
            }
        };
    
    };
    
    //AI for Kil'jaeden
    class boss_kiljaeden : public CreatureScript
    {
    public:
        boss_kiljaeden() : CreatureScript("boss_kiljaeden") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_kiljaedenAI (creature);
        }
    
        struct boss_kiljaedenAI : public Scripted_NoMovementAI
        {
            boss_kiljaedenAI(Creature* c) : Scripted_NoMovementAI(c), summons(me)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
            SummonList summons;
    
            uint8 Phase;
            uint8 ActiveTimers;
            uint32 SpeechTimer;
    
            uint32 Timer[10];
            uint32 WaitTimer;
            uint8 speechCount;
            uint8 speechPhaseEnd;
    
            /* Boolean */
            bool IsInDarkness;
            bool TimerIsDeactivated[10];
            bool IsWaiting;
            bool OrbActivated;
            bool SpeechBegins;
    
            void InitializeAI()
            {
                Scripted_NoMovementAI::InitializeAI();
            }
    
            void Reset()
            {
                TimerIsDeactivated[TIMER_SPEECH] = false;
                Timer[TIMER_SPEECH]           = 0;
    
                //Phase 2 Timer
                Timer[TIMER_SOUL_FLAY]        = 11000;
                Timer[TIMER_LEGION_LIGHTNING] = 30000;
                Timer[TIMER_FIRE_BLOOM]       = 20000;
                Timer[TIMER_SUMMON_SHILEDORB] = 35000;
    
                //Phase 3 Timer
                Timer[TIMER_SHADOW_SPIKE]     = 4000;
                Timer[TIMER_FLAME_DART]       = 3000;
                Timer[TIMER_DARKNESS]         = 45000;
                Timer[TIMER_ORBS_EMPOWER]     = 35000;
    
                //Phase 4 Timer
                Timer[TIMER_ARMAGEDDON]       = 2000;
    
                ActiveTimers = 5;
                WaitTimer    = 0;
                speechCount = 0;
                SpeechTimer = 0;
    
                Phase = PHASE_NORMAL;
    
                IsInDarkness  = false;
                IsWaiting     = false;
                OrbActivated  = false;
                SpeechBegins  = true;
    
                if (instance)
                {
                    if (Creature* pKalec = Unit::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
                        pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
                }
                me->SetFloatValue(UNIT_FIELD_COMBATREACH, 12);
                ChangeTimers(false, 0);
                summons.DespawnAll();
            }
    
            void ChangeTimers(bool status, uint32 WTimer)
            {
                for (uint8 i = 1; i < ActiveTimers; ++i)
                    TimerIsDeactivated[i] = status;
    
                if (WTimer > 0)
                {
                    IsWaiting = true;
                    WaitTimer = WTimer;
                }
    
                if (OrbActivated)
                    TimerIsDeactivated[TIMER_ORBS_EMPOWER] = true;
                if (Timer[TIMER_SHADOW_SPIKE] == 0)
                    TimerIsDeactivated[TIMER_SHADOW_SPIKE] = true;
                if (Phase == PHASE_SACRIFICE)
                    TimerIsDeactivated[TIMER_SUMMON_SHILEDORB] = true;
            }
    
            void JustSummoned(Creature* summoned)
            {
                if (summoned->GetEntry() == CREATURE_ARMAGEDDON_TARGET)
                {
                    summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
            //      summoned->SetVisibility(VISIBILITY_OFF);  //with this we cant see the armageddon visuals
                }
                else
                    summoned->SetLevel(me->getLevel());
    
                summoned->setFaction(me->getFaction());
                summons.Summon(summoned);
            }
    
            void JustDied(Unit* /*killer*/)
            {
                DoScriptText(SAY_KJ_DEATH, me);
                summons.DespawnAll();
    
                if (instance)
                    instance->SetData(DATA_KILJAEDEN_EVENT, DONE);
            }
    
            void KilledUnit(Unit* /*victim*/)
            {
                DoScriptText(RAND(SAY_KJ_SLAY1, SAY_KJ_SLAY2), me);
            }
    
            void EnterEvadeMode()
            {
                Scripted_NoMovementAI::EnterEvadeMode();
                summons.DespawnAll();
    
                // Reset the controller
                if (instance)
                {
                    if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
                        CAST_AI(mob_kiljaeden_controller::mob_kiljaeden_controllerAI, pControl->AI())->Reset();
                }
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                DoZoneInCombat();
            }
    
            void EnterNextPhase()
            {
                SpeechBegins  = true;
                OrbActivated  = false;
                ChangeTimers(true, 0);//stop every cast Shadow spike will reactivate em all
                TimerIsDeactivated[TIMER_SHADOW_SPIKE] = false;
                Timer[TIMER_SHADOW_SPIKE]     = 100;
                // empowered orbs before darkness
                Timer[TIMER_DARKNESS] = (Phase == PHASE_SACRIFICE) ? 15000 : urand(10000, 40000);
                Timer[TIMER_ORBS_EMPOWER] = (Phase == PHASE_SACRIFICE) ? 10000 : 5000;
            }
    
            void CastSinisterReflection()
            {
                DoScriptText(RAND(SAY_KJ_REFLECTION1, SAY_KJ_REFLECTION2), me);
                for (uint8 i = 0; i < 4; ++i)
                {
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true, -SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT))
                    {
                        float x, y, z;
                        target->GetPosition(x, y, z);
                        if (Creature* pSinisterReflection = me->SummonCreature(CREATURE_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0))
                        {
                            pSinisterReflection->SetDisplayId(target->GetDisplayId());
                            pSinisterReflection->AI()->AttackStart(target);
                        }
                    }
                }
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim() || Phase < PHASE_NORMAL)
                    return;
    
                if (IsWaiting)
                {
                    if (WaitTimer <= diff)
                    {
                        IsWaiting = false;
                        ChangeTimers(false, 0);
                    } else WaitTimer -= diff;
                }
    
                for (uint8 t = 0; t < ActiveTimers; ++t)
                {
                    if (Timer[t] < diff && !TimerIsDeactivated[t])
                    {
                        switch (t)
                        {
                            case TIMER_SPEECH:
                                if (SpeechBegins)
                                {
                                    SpeechBegins=false;
                                    switch (Phase)
                                    {
                                        case PHASE_NORMAL:
                                            speechPhaseEnd=1;
                                            break;
                                        case PHASE_DARKNESS:
                                            speechPhaseEnd=4;
                                            break;
                                        case PHASE_ARMAGEDDON:
                                            speechPhaseEnd=7;
                                            break;
                                        case PHASE_SACRIFICE:
                                            speechPhaseEnd=12;
                                            break;
                                    }
                                }
                                if (Speeches[speechCount].timer < SpeechTimer)
                                {
                                    SpeechTimer = 0;
                                    if (instance)
                                        if (Creature* pSpeechCreature = Unit::GetCreature(*me, instance->GetData64(Speeches[speechCount].creature)))
                                            DoScriptText(Speeches[speechCount].textid, pSpeechCreature);
                                    if (speechCount == 12)
                                        if (Creature* pAnveena =  Unit::GetCreature(*me, instance->GetData64(DATA_ANVEENA)))
                                            pAnveena->CastSpell(me, SPELL_SACRIFICE_OF_ANVEENA, false);
                                            //   ChangeTimers(true, 10000); // Kil should do an emote while screaming without attacking for 10 seconds
                                    if (speechCount == speechPhaseEnd)
                                        TimerIsDeactivated[TIMER_SPEECH]=true;
                                    speechCount++;
                                }
                                SpeechTimer += diff;
                                break;
                            case TIMER_SOUL_FLAY:
                                if (!me->IsNonMeleeSpellCasted(false))
                                {
                                    DoCast(me->getVictim(), SPELL_SOUL_FLAY_SLOW, false);
                                    DoCast(me->getVictim(), SPELL_SOUL_FLAY, false);
                                    Timer[TIMER_SOUL_FLAY] = 3500;
                                }
                                break;
                            case TIMER_LEGION_LIGHTNING:
                                if (!me->IsNonMeleeSpellCasted(false))
                                {
                                    Unit* pRandomPlayer = NULL;
    
                                    me->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
                                    for (uint8 z = 0; z < 6; ++z)
                                    {
                                        pRandomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
                                        if (!pRandomPlayer || !pRandomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, 0))
                                            break;
                                    }
    
                                    if (pRandomPlayer)
                                        DoCast(pRandomPlayer, SPELL_LEGION_LIGHTNING, false);
                                    else
                                        sLog->outError("try to cast SPELL_LEGION_LIGHTNING on invalid target");
    
                                    Timer[TIMER_LEGION_LIGHTNING] = (Phase == PHASE_SACRIFICE) ? 18000 : 30000; // 18 seconds in PHASE_SACRIFICE
                                    Timer[TIMER_SOUL_FLAY] = 2500;
                                }
                                break;
                            case TIMER_FIRE_BLOOM:
                                if (!me->IsNonMeleeSpellCasted(false))
                                {
                                    me->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
                                    DoCastAOE(SPELL_FIRE_BLOOM, false);
                                    Timer[TIMER_FIRE_BLOOM] = (Phase == PHASE_SACRIFICE) ? 25000 : 40000; // 25 seconds in PHASE_SACRIFICE
                                    Timer[TIMER_SOUL_FLAY] = 1000;
                                }
                                break;
                            case TIMER_SUMMON_SHILEDORB:
                                for (uint8 i = 1; i < Phase; ++i)
                                {
                                    float sx, sy;
                                    sx = ShieldOrbLocations[0][0] + sin(ShieldOrbLocations[i][0]);
                                    sy = ShieldOrbLocations[0][1] + sin(ShieldOrbLocations[i][1]);
                                    me->SummonCreature(CREATURE_SHIELD_ORB, sx, sy, SHIELD_ORB_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
                                }
                                Timer[TIMER_SUMMON_SHILEDORB] = urand(30000, 60000); // 30-60seconds cooldown
                                Timer[TIMER_SOUL_FLAY] = 2000;
                                break;
                            case TIMER_SHADOW_SPIKE: //Phase 3
                                if (!me->IsNonMeleeSpellCasted(false))
                                {
                                    CastSinisterReflection();
                                    DoCastAOE(SPELL_SHADOW_SPIKE, false);
                                    ChangeTimers(true, 30000);
                                    Timer[TIMER_SHADOW_SPIKE] = 0;
                                    TimerIsDeactivated[TIMER_SPEECH] = false;
                                }
                                break;
                            case TIMER_FLAME_DART: //Phase 3
                                DoCastAOE(SPELL_FLAME_DART, false);
                                Timer[TIMER_FLAME_DART] = 3000; //TODO Timer
                                break;
                            case TIMER_DARKNESS: //Phase 3
                                if (!me->IsNonMeleeSpellCasted(false))
                                {
                                    // Begins to channel for 8 seconds, then deals 50'000 damage to all raid members.
                                    if (!IsInDarkness)
                                    {
                                        DoScriptText(EMOTE_KJ_DARKNESS, me);
                                        DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS, false);
                                        ChangeTimers(true, 9000);
                                        Timer[TIMER_DARKNESS] = 8750;
                                        TimerIsDeactivated[TIMER_DARKNESS] = false;
                                        if (Phase == PHASE_SACRIFICE)
                                            TimerIsDeactivated[TIMER_ARMAGEDDON] = false;
                                        IsInDarkness = true;
                                    }
                                    else
                                    {
                                        Timer[TIMER_DARKNESS] = (Phase == PHASE_SACRIFICE) ? 15000 : urand(40000, 70000);
                                        IsInDarkness = false;
                                        DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE);
                                        DoScriptText(RAND(SAY_KJ_DARKNESS1, SAY_KJ_DARKNESS2, SAY_KJ_DARKNESS3), me);
                                    }
                                    Timer[TIMER_SOUL_FLAY] = 9000;
                                }
                                break;
                            case TIMER_ORBS_EMPOWER: //Phase 3
                                if (instance)
                                    if (Creature* pKalec = Unit::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
                                    {
                                        switch (Phase)
                                        {
                                        case PHASE_SACRIFICE:
                                            CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true);
                                            break;
                                        default:
                                            CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false);
                                            break;
                                        }
                                    }
                                OrbActivated = true;
                                TimerIsDeactivated[TIMER_ORBS_EMPOWER] = true;
                                break;
                            case TIMER_ARMAGEDDON: //Phase 4
                                Unit* target = NULL;
                                for (uint8 z = 0; z < 6; ++z)
                                {
                                    target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
                                    if (!target || !target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, 0)) break;
                                }
                                if (target)
                                {
                                    float x, y, z;
                                    target->GetPosition(x, y, z);
                                    me->SummonCreature(CREATURE_ARMAGEDDON_TARGET, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
                                }
                                Timer[TIMER_ARMAGEDDON] = 2000; // No, I'm not kidding
                                break;
                         }
                    }
                }
                DoMeleeAttackIfReady();
                //Time runs over!
                for (uint8 i = 0; i < ActiveTimers; ++i)
                    if (!TimerIsDeactivated[i])
                    {
                        Timer[i] -= diff;
                        if (((int32)Timer[i]) < 0) Timer[i] = 0;
                    }
    
                //Phase 3
                if (Phase <= PHASE_NORMAL && !IsInDarkness)
                {
                    if (Phase == PHASE_NORMAL && HealthBelowPct(85))
                    {
                        Phase = PHASE_DARKNESS;
                        ActiveTimers = 9;
                        EnterNextPhase();
                    }
                    else return;
                }
    
                //Phase 4
                if (Phase <= PHASE_DARKNESS && !IsInDarkness)
                {
                    if (Phase == PHASE_DARKNESS && HealthBelowPct(55))
                    {
                        Phase = PHASE_ARMAGEDDON;
                        ActiveTimers = 10;
                        EnterNextPhase();
                    }
                    else return;
                }
    
                //Phase 5 specific spells all we can
                if (Phase <= PHASE_ARMAGEDDON && !IsInDarkness)
                {
                    if (Phase == PHASE_ARMAGEDDON && HealthBelowPct(25))
                    {
                        Phase = PHASE_SACRIFICE;
                        EnterNextPhase();
                    }
                    else return;
                }
            }
        };
    
    };
    
    //AI for Hand of the Deceiver
    class mob_hand_of_the_deceiver : public CreatureScript
    {
    public:
        mob_hand_of_the_deceiver() : CreatureScript("mob_hand_of_the_deceiver") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_hand_of_the_deceiverAI (creature);
        }
    
        struct mob_hand_of_the_deceiverAI : public ScriptedAI
        {
            mob_hand_of_the_deceiverAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
    
            uint32 ShadowBoltVolleyTimer;
            uint32 FelfirePortalTimer;
    
            void Reset()
            {
                // TODO: Timers!
                ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
                FelfirePortalTimer = 20000;
                if (instance)
                    instance->SetData(DATA_KILJAEDEN_EVENT, NOT_STARTED);
            }
    
            void JustSummoned(Creature* summoned)
            {
                summoned->setFaction(me->getFaction());
                summoned->SetLevel(me->getLevel());
            }
    
            void EnterCombat(Unit* who)
            {
                if (instance)
                {
                    instance->SetData(DATA_KILJAEDEN_EVENT, IN_PROGRESS);
                    if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
                        pControl->AddThreat(who, 1.0f);
                }
                me->InterruptNonMeleeSpells(true);
            }
    
            void JustDied(Unit* /*killer*/)
            {
                if (!instance)
                    return;
    
                if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
                    ++(CAST_AI(mob_kiljaeden_controller::mob_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!me->isInCombat())
                    DoCast(me, SPELL_SHADOW_CHANNELING);
    
                if (!UpdateVictim())
                    return;
    
                // Gain Shadow Infusion at 20% health
                if (HealthBelowPct(20) && !me->HasAura(SPELL_SHADOW_INFUSION, 0))
                    DoCast(me, SPELL_SHADOW_INFUSION, true);
    
                // Shadow Bolt Volley - Shoots Shadow Bolts at all enemies within 30 yards, for ~2k Shadow damage.
                if (ShadowBoltVolleyTimer <= diff)
                {
                    DoCast(me->getVictim(), SPELL_SHADOW_BOLT_VOLLEY);
                    ShadowBoltVolleyTimer = 12000;
                }
                else
                    ShadowBoltVolleyTimer -= diff;
    
                // Felfire Portal - Creatres a portal, that spawns Volatile Felfire Fiends, which do suicide bombing.
                if (FelfirePortalTimer <= diff)
                {
                    if (Creature* pPortal = DoSpawnCreature(CREATURE_FELFIRE_PORTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
                    {
                        std::list<HostileReference*>::iterator itr;
                        for (itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr)
                        {
                            Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid());
                            if (unit)
                                pPortal->AddThreat(unit, 1.0f);
                        }
                    }
                    FelfirePortalTimer = 20000;
                } else FelfirePortalTimer -= diff;
    
                DoMeleeAttackIfReady();
            }
        };
    
    };
    
    //AI for Felfire Portal
    class mob_felfire_portal : public CreatureScript
    {
    public:
        mob_felfire_portal() : CreatureScript("mob_felfire_portal") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_felfire_portalAI (creature);
        }
    
        struct mob_felfire_portalAI : public Scripted_NoMovementAI
        {
            mob_felfire_portalAI(Creature* c) : Scripted_NoMovementAI(c) {}
    
            uint32 uiSpawnFiendTimer;
    
            void Reset()
            {
                uiSpawnFiendTimer = 5000;
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE);
            }
    
            void JustSummoned(Creature* summoned)
            {
                summoned->setFaction(me->getFaction());
                summoned->SetLevel(me->getLevel());
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if (uiSpawnFiendTimer <= diff)
                {
                    if (Creature* pFiend = DoSpawnCreature(CREATURE_VOLATILE_FELFIRE_FIEND, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000))
                        pFiend->AddThreat(SelectTarget(SELECT_TARGET_RANDOM, 0), 100000.0f);
                    uiSpawnFiendTimer = urand(4000, 8000);
                } else uiSpawnFiendTimer -= diff;
            }
        };
    
    };
    
    //AI for Felfire Fiend
    class mob_volatile_felfire_fiend : public CreatureScript
    {
    public:
        mob_volatile_felfire_fiend() : CreatureScript("mob_volatile_felfire_fiend") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_volatile_felfire_fiendAI (creature);
        }
    
        struct mob_volatile_felfire_fiendAI : public ScriptedAI
        {
            mob_volatile_felfire_fiendAI(Creature* c) : ScriptedAI(c) {}
    
            uint32 uiExplodeTimer;
    
            bool bLockedTarget;
    
            void Reset()
            {
                uiExplodeTimer = 2000;
                bLockedTarget = false;
            }
    
            void DamageTaken(Unit* /*done_by*/, uint32 &damage)
            {
                if (damage > me->GetHealth())
                    DoCast(me, SPELL_FELFIRE_FISSION, true);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if (!bLockedTarget)
                {
                    me->AddThreat(me->getVictim(), 10000000.0f);
                    bLockedTarget = true;
                }
    
                if (uiExplodeTimer)
                {
                    if (uiExplodeTimer <= diff)
                        uiExplodeTimer = 0;
                    else uiExplodeTimer -= diff;
                }
                else if (me->IsWithinDistInMap(me->getVictim(), 3)) // Explode if it's close enough to it's target
                {
                    DoCast(me->getVictim(), SPELL_FELFIRE_FISSION);
                    me->Kill(me);
                }
            }
        };
    
    };
    
    //AI for Armageddon target
    class mob_armageddon : public CreatureScript
    {
    public:
        mob_armageddon() : CreatureScript("mob_armageddon") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_armageddonAI (creature);
        }
    
        struct mob_armageddonAI : public Scripted_NoMovementAI
        {
            mob_armageddonAI(Creature* c) : Scripted_NoMovementAI(c) {}
    
            uint8 spell;
            uint32 uiTimer;
    
            void Reset()
            {
                spell = 0;
                uiTimer = 0;
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (uiTimer <= diff)
                {
                    switch (spell)
                    {
                        case 0:
                            DoCast(me, SPELL_ARMAGEDDON_VISUAL, true);
                            ++spell;
                            break;
                        case 1:
                            DoCast(me, SPELL_ARMAGEDDON_VISUAL2, true);
                            uiTimer = 9000;
                            ++spell;
                            break;
                        case 2:
                            DoCast(me, SPELL_ARMAGEDDON_TRIGGER, true);
                            ++spell;
                            uiTimer = 5000;
                            break;
                        case 3:
                            me->Kill(me);
                            me->RemoveCorpse();
                            break;
                    }
                } else uiTimer -=diff;
            }
        };
    
    };
    
    //AI for Shield Orbs
    class mob_shield_orb : public CreatureScript
    {
    public:
        mob_shield_orb() : CreatureScript("mob_shield_orb") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_shield_orbAI (creature);
        }
    
        struct mob_shield_orbAI : public ScriptedAI
        {
            mob_shield_orbAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
    
            bool bPointReached;
            bool bClockwise;
            uint32 uiTimer;
            uint32 uiCheckTimer;
            float x, y, r, c, mx, my;
    
            void Reset()
            {
                me->SetLevitate(true);
                bPointReached = true;
                uiTimer = urand(500, 1000);
                uiCheckTimer = 1000;
                r = 17;
                c = 0;
                mx = ShieldOrbLocations[0][0];
                my = ShieldOrbLocations[0][1];
                bClockwise = urand(0, 1);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (bPointReached)
                {
                    if (bClockwise)
                    {
                        y = my - r * sin(c);
                        x = mx - r * cos(c);
                    }
                    else
                    {
                        y = my + r * sin(c);
                        x = mx + r * cos(c);
                    }
                    bPointReached = false;
                    uiCheckTimer = 1000;
                    me->GetMotionMaster()->MovePoint(1, x, y, SHIELD_ORB_Z);
                    c += M_PI/32;
                    if (c >= 2*M_PI) c = 0;
                }
                else
                {
                    if (uiCheckTimer <= diff)
                    {
                        DoTeleportTo(x, y, SHIELD_ORB_Z);
                        bPointReached = true;
                    }
                    else uiCheckTimer -= diff;
                }
    
                if (uiTimer <= diff)
                {
                    if (Unit* random = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0))
                        DoCast(random, SPELL_SHADOW_BOLT, false);
                    uiTimer = urand(500, 1000);
                } else uiTimer -= diff;
            }
    
            void MovementInform(uint32 type, uint32 /*id*/)
            {
                if (type != POINT_MOTION_TYPE)
                    return;
    
                bPointReached = true;
            }
        };
    
    };
    
    //AI for Sinister Reflection
    class mob_sinster_reflection : public CreatureScript
    {
    public:
        mob_sinster_reflection() : CreatureScript("mob_sinster_reflection") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new mob_sinster_reflectionAI (creature);
        }
    
        struct mob_sinster_reflectionAI : public ScriptedAI
        {
            mob_sinster_reflectionAI(Creature* c) : ScriptedAI(c) {}
    
            uint8 victimClass;
            uint32 uiTimer[3];
    
            void Reset()
            {
                uiTimer[0] = 0;
                uiTimer[1] = 0;
                uiTimer[2] = 0;
                victimClass = 0;
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if ((victimClass == 0) && me->getVictim())
                {
                    victimClass = me->getVictim()->getClass();
                    switch (victimClass)
                    {
                        case CLASS_DRUID:
                            break;
                        case CLASS_HUNTER:
                            break;
                        case CLASS_MAGE:
                            break;
                        case CLASS_WARLOCK:
                            break;
                        case CLASS_WARRIOR:
                            me->SetCanDualWield(true);
                            break;
                        case CLASS_PALADIN:
                            break;
                        case CLASS_PRIEST:
                            break;
                        case CLASS_SHAMAN:
                            me->SetCanDualWield(true);
                            break;
                        case CLASS_ROGUE:
                            me->SetCanDualWield(true);
                            break;
                    }
                }
    
                switch (victimClass) {
                    case CLASS_DRUID:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_MOONFIRE, false);
                            uiTimer[1] = urand(2000, 4000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_HUNTER:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_MULTI_SHOT, false);
                            uiTimer[1] = urand(8000, 10000);
                        }
                        if (uiTimer[2] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_SHOOT, false);
                            uiTimer[2] = urand(4000, 6000);
                        }
                        if (me->IsWithinMeleeRange(me->getVictim(), 6))
                        {
                            if (uiTimer[0] <= diff)
                            {
                                DoCast(me->getVictim(), SPELL_SR_MULTI_SHOT, false);
                                uiTimer[0] = urand(6000, 8000);
                            }
                            DoMeleeAttackIfReady();
                        }
                        break;
                    case CLASS_MAGE:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_FIREBALL, false);
                            uiTimer[1] = urand(2000, 4000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_WARLOCK:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_SHADOW_BOLT, false);
                            uiTimer[1] = urand(3000, 5000);
                        }
                        if (uiTimer[2] <= diff)
                        {
                            DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SR_CURSE_OF_AGONY, true);
                            uiTimer[2] = urand(2000, 4000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_WARRIOR:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_WHIRLWIND, false);
                            uiTimer[1] = urand(9000, 11000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_PALADIN:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_HAMMER_OF_JUSTICE, false);
                            uiTimer[1] = urand(6000, 8000);
                        }
                        if (uiTimer[2] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_HOLY_SHOCK, false);
                            uiTimer[2] = urand(2000, 4000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_PRIEST:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_HOLY_SMITE, false);
                            uiTimer[1] = urand(4000, 6000);
                        }
                        if (uiTimer[2] <= diff)
                        {
                            DoCast(me, SPELL_SR_RENEW, false);
                            uiTimer[2] = urand(6000, 8000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_SHAMAN:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_EARTH_SHOCK, false);
                            uiTimer[1] = urand(4000, 6000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    case CLASS_ROGUE:
                        if (uiTimer[1] <= diff)
                        {
                            DoCast(me->getVictim(), SPELL_SR_HEMORRHAGE, true);
                            uiTimer[1] = urand(4000, 6000);
                        }
                        DoMeleeAttackIfReady();
                        break;
                    }
                    sLog->outDebug(LOG_FILTER_TSCR, "Sinister-Timer");
                    for (uint8 i = 0; i < 3; ++i)
                        uiTimer[i] -= diff;
                }
        };
    
    };
    
    void AddSC_boss_kiljaeden()
    {
        new go_orb_of_the_blue_flight();
        new boss_kalecgos_kj();
        new boss_kiljaeden();
        new mob_kiljaeden_controller();
        new mob_hand_of_the_deceiver();
        new mob_felfire_portal();
        new mob_volatile_felfire_fiend();
        new mob_armageddon();
        new mob_shield_orb();
        new mob_sinster_reflection();
    }


    Spoiler untuk boss_muru.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     *
     * 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Boss_Muru
    SD%Complete: 80
    SDComment: all sounds, black hole effect triggers to often (46228)
    */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    // Muru & Entropius's spells
    enum Spells
    {
        SPELL_ENRAGE                = 26662,
    
        // Muru's spells
        SPELL_NEGATIVE_ENERGY        = 46009, //(this trigger 46008)
        SPELL_DARKNESS                = 45999,
        SPELL_OPEN_ALL_PORTALS        = 46177,
        SPELL_OPEN_PORTAL            = 45977,
        SPELL_OPEN_PORTAL_2            = 45976,
        SPELL_SUMMON_BERSERKER        = 46037,
        SPELL_SUMNON_FURY_MAGE        = 46038,
        SPELL_SUMMON_VOID_SENTINEL    = 45988,
        SPELL_SUMMON_ENTROPIUS        = 46217,
    
        // Entropius's spells
        SPELL_DARKNESS_E            = 46269,
        SPELL_BLACKHOLE             = 46282,
        SPELL_NEGATIVE_ENERGY_E     = 46284,
        SPELL_ENTROPIUS_SPAWN        = 46223,
    
        // Shadowsword Berserker's spells
        SPELL_FLURRY                = 46160,
        SPELL_DUAL_WIELD            = 29651,
    
        // Shadowsword Fury Mage's spells
        SPELL_FEL_FIREBALL          = 46101,
        SPELL_SPELL_FURY            = 46102,
    
        // Void Sentinel's spells
        SPELL_SHADOW_PULSE          = 46087,
        SPELL_VOID_BLAST            = 46161,
    
        // Void Spawn's spells
        SPELL_SHADOW_BOLT_VOLLEY    = 46082,
    
        //Dark Fiend Spells
        SPELL_DARKFIEND_AOE            = 45944,
        SPELL_DARKFIEND_VISUAL        = 45936,
        SPELL_DARKFIEND_SKIN        = 45934,
    
        //Black Hole Spells
        SPELL_BLACKHOLE_SPAWN        = 46242,
        SPELL_BLACKHOLE_GROW        = 46228
    };
    
    enum BossTimers{
        TIMER_DARKNESS                = 0,
        TIMER_HUMANOIDES            = 1,
        TIMER_PHASE                    = 2,
        TIMER_SENTINEL                = 3
    };
    
    float DarkFiends[8][4] =
    {
        {1819.9f,    609.80f,    69.74f,    1.94f},
        {1829.39f,   617.89f,    69.73f,    2.61f},
        {1801.98f,   633.62f,    69.74f,    5.71f},
        {1830.88f,   629.99f,    69.73f,    3.52f},
        {1800.38f,   621.41f,    69.74f,    0.22f},
        {1808.3f,   612.45f,    69.73f,    1.02f},
        {1823.9f,   639.69f,    69.74f,    4.12f},
        {1811.85f,   640.46f,    69.73f,    4.97f}
    };
    
    float Humanoides[6][5] =
    {
        {CREATURE_FURY_MAGE, 1780.16f,    666.83f,    71.19f,    5.21f},
        {CREATURE_FURY_MAGE, 1847.93f,    600.30f,    71.30f,    2.57f},
        {CREATURE_BERSERKER, 1779.97f,    660.64f,    71.19f,    5.28f},
        {CREATURE_BERSERKER, 1786.2f,    661.01f,    71.19f,    4.51f},
        {CREATURE_BERSERKER, 1845.17f,    602.63f,    71.28f,    2.43f},
        {CREATURE_BERSERKER, 1842.91f,    599.93f,    71.23f,    2.44f}
    };
    
    uint32 EnrageTimer = 600000;
    class boss_entropius : public CreatureScript
    {
    public:
        boss_entropius() : CreatureScript("boss_entropius") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_entropiusAI (creature);
        }
    
        struct boss_entropiusAI : public ScriptedAI
        {
            boss_entropiusAI(Creature* c) : ScriptedAI(c), Summons(me)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
            SummonList Summons;
    
            uint32 BlackHoleSummonTimer;
    
            void Reset()
            {
                BlackHoleSummonTimer = 15000;
                DoCastAOE(SPELL_NEGATIVE_ENERGY_E, false);
    
                Summons.DespawnAll();
    
                if (instance)
                    instance->SetData(DATA_MURU_EVENT, NOT_STARTED);
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                DoCastAOE(SPELL_NEGATIVE_ENERGY_E, true);
                DoCast(me, SPELL_ENTROPIUS_SPAWN, false);
    
                if (instance)
                    instance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
            }
    
            void JustSummoned(Creature* summoned)
            {
                switch (summoned->GetEntry())
                {
                    case CREATURE_DARK_FIENDS:
                        summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
                        break;
                    case CREATURE_DARKNESS:
                        summoned->AddUnitState(UNIT_STATE_STUNNED);
                        float x, y, z, o;
                        summoned->GetHomePosition(x, y, z, o);
                        me->SummonCreature(CREATURE_DARK_FIENDS, x, y, z, o, TEMPSUMMON_CORPSE_DESPAWN, 0);
                        break;
                }
                summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
                Summons.Summon(summoned);
            }
    
            void JustDied(Unit* /*killer*/)
            {
                Summons.DespawnAll();
    
                if (instance)
                    instance->SetData(DATA_MURU_EVENT, DONE);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if (EnrageTimer < diff && !me->HasAura(SPELL_ENRAGE, 0))
                {
                    DoCast(me, SPELL_ENRAGE, false);
                } else EnrageTimer -= diff;
    
                if (BlackHoleSummonTimer <= diff)
                {
                    Unit* random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
                    if (!random)
                        return;
    
                    DoCast(random, SPELL_DARKNESS_E, false);
    
                    random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
                    if (!random)
                        return;
    
                    random->CastSpell(random, SPELL_BLACKHOLE, false);
                    BlackHoleSummonTimer = 15000;
                } else BlackHoleSummonTimer -= diff;
    
                DoMeleeAttackIfReady();
            }
        };
    
    };
    
    class boss_muru : public CreatureScript
    {
    public:
        boss_muru() : CreatureScript("boss_muru") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new boss_muruAI (creature);
        }
    
        struct boss_muruAI : public Scripted_NoMovementAI
        {
            boss_muruAI(Creature* c) : Scripted_NoMovementAI(c), Summons(me)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
            SummonList Summons;
    
            uint8 Phase;
            uint32 Timer[4];
    
            bool DarkFiend;
    
            void Reset()
            {
                DarkFiend = false;
                Phase = 1;
    
                EnrageTimer = 600000;
                Timer[TIMER_DARKNESS] = 45000;
                Timer[TIMER_HUMANOIDES] = 10000;
                Timer[TIMER_PHASE] = 2000;
                Timer[TIMER_SENTINEL] = 31500;
    
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->SetVisible(true);
    
                Summons.DespawnAll();
    
                if (instance)
                    instance->SetData(DATA_MURU_EVENT, NOT_STARTED);
            }
    
            void EnterCombat(Unit* /*who*/)
            {
                DoCastAOE(SPELL_NEGATIVE_ENERGY, false);
    
                if (instance)
                    instance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
            }
    
            void DamageTaken(Unit* /*done_by*/, uint32 &damage)
            {
                if (damage > me->GetHealth() && Phase == 1)
                {
                    damage = 0;
                    Phase = 2;
                    me->RemoveAllAuras();
                    DoCast(me, SPELL_OPEN_ALL_PORTALS, false);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                }
                if (Phase > 1 && Phase < 4)
                    damage = 0;
            }
    
            void JustSummoned(Creature* summoned)
            {
                switch (summoned->GetEntry())
                {
                    case BOSS_ENTROPIUS:
                        me->SetVisible(false);
                        break;
                    case CREATURE_DARK_FIENDS:
                        summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
                        break;
                }
                summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
                Summons.Summon(summoned);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if (Phase == 3)
                {
                    if (Timer[TIMER_PHASE] <= diff)
                    {
                        if (!instance)
                            return;
                        switch (instance->GetData(DATA_MURU_EVENT))
                        {
                            case NOT_STARTED:
                                Reset();
                                break;
                            case DONE:
                                Phase = 4;
                                me->DisappearAndDie();
                                break;
                        }
                        Timer[TIMER_PHASE] = 3000;
                    } else Timer[TIMER_PHASE] -= diff;
                    return;
                }
    
                if (EnrageTimer < diff && !me->HasAura(SPELL_ENRAGE, 0))
                {
                    DoCast(me, SPELL_ENRAGE, false);
                } else EnrageTimer -= diff;
    
                for (uint8 i = 0; i < 4; ++i)
                {
                    if (Timer[i] <= diff)
                    {
                        switch (i)
                        {
                            case TIMER_DARKNESS:
                                if (!DarkFiend)
                                {
                                    DoCastAOE(SPELL_DARKNESS, false);
                                    Timer[TIMER_DARKNESS] = 3000;
                                    DarkFiend = true;
                                }
                                else
                                {
                                    DarkFiend = false;
                                    for (uint8 j = 0; j < 8; ++j)
                                        me->SummonCreature(CREATURE_DARK_FIENDS, DarkFiends[j][0], DarkFiends[j][1], DarkFiends[j][2], DarkFiends[j][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
                                    Timer[TIMER_DARKNESS] = 42000;
                                }
                                break;
                            case TIMER_HUMANOIDES:
                                for (uint8 j = 0; j < 6; ++j)
                                    me->SummonCreature(uint32(Humanoides[j][0]), Humanoides[j][1], Humanoides[j][2], Humanoides[j][3], Humanoides[j][4], TEMPSUMMON_CORPSE_DESPAWN, 0);
                                Timer[TIMER_HUMANOIDES] = 60000;
                                break;
                            case TIMER_PHASE:
                                me->RemoveAllAuras();
                                DoCast(me, SPELL_SUMMON_ENTROPIUS, false);
                                Timer[TIMER_PHASE] = 3000;
                                Phase = 3;
                                return;
                            case TIMER_SENTINEL:
                                DoCastAOE(SPELL_OPEN_PORTAL_2, false);
                                Timer[TIMER_SENTINEL] = 30000;
                                break;
                        }
                        break;
                    }
                }
    
                //Timer
                for (uint8 i = 0; i < 4; ++i)
                {
                    if (i != TIMER_PHASE)Timer[i] -= diff;
                    else if (Phase == 2) Timer[i] -= diff;
                }
            }
        };
    
    };
    
    class npc_muru_portal : public CreatureScript
    {
    public:
        npc_muru_portal() : CreatureScript("npc_muru_portal") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new npc_muru_portalAI (creature);
        }
    
        struct npc_muru_portalAI : public Scripted_NoMovementAI
        {
            npc_muru_portalAI(Creature* c) : Scripted_NoMovementAI(c), Summons(me)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
    
            SummonList Summons;
    
            bool SummonSentinel;
            bool InAction;
    
            uint32 SummonTimer;
    
            void Reset()
            {
                SummonTimer = 5000;
    
                InAction = false;
                SummonSentinel = false;
    
                me->AddUnitState(UNIT_STATE_STUNNED);
    
                Summons.DespawnAll();
            }
    
            void JustSummoned(Creature* summoned)
            {
                if (instance)
                    if (Player* Target = Unit::GetPlayer(*me, instance->GetData64(DATA_PLAYER_GUID)))
                        summoned->AI()->AttackStart(Target);
    
                Summons.Summon(summoned);
            }
    
            void SpellHit(Unit* /*caster*/, const SpellInfo* Spell)
            {
                float x, y, z, o;
                me->GetHomePosition(x, y, z, o);
                DoTeleportTo(x, y, z);
                InAction = true;
                switch (Spell->Id)
                {
                    case SPELL_OPEN_ALL_PORTALS:
                        DoCastAOE(SPELL_OPEN_PORTAL, false);
                        break;
                    case SPELL_OPEN_PORTAL_2:
                        DoCastAOE(SPELL_OPEN_PORTAL, false);
                        SummonSentinel = true;
                        break;
                }
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!SummonSentinel)
                {
                    if (InAction && instance && instance->GetData(DATA_MURU_EVENT) == NOT_STARTED)
                        Reset();
                    return;
                }
                if (SummonTimer <= diff)
                {
                    DoCastAOE(SPELL_SUMMON_VOID_SENTINEL, false);
                    SummonTimer = 5000;
                    SummonSentinel = false;
                } else SummonTimer -= diff;
            }
        };
    
    };
    
    class npc_dark_fiend : public CreatureScript
    {
    public:
        npc_dark_fiend() : CreatureScript("npc_dark_fiend") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new npc_dark_fiendAI (creature);
        }
    
        struct npc_dark_fiendAI : public ScriptedAI
        {
            npc_dark_fiendAI(Creature* c) : ScriptedAI(c) {}
    
            uint32 WaitTimer;
            bool InAction;
    
            void Reset()
            {
                WaitTimer = 2000;
                InAction = false;
    
                me->AddUnitState(UNIT_STATE_STUNNED);
            }
    
            void SpellHit(Unit* /*caster*/, const SpellInfo* Spell)
            {
                for (uint8 i = 0; i < 3; ++i)
                    if (Spell->Effects[i].Effect == 38)
                        me->DisappearAndDie();
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if (WaitTimer <= diff)
                {
                    if (!InAction)
                    {
                        me->ClearUnitState(UNIT_STATE_STUNNED);
                        DoCastAOE(SPELL_DARKFIEND_SKIN, false);
                        AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true));
                        InAction = true;
                        WaitTimer = 500;
                    }
                    else
                    {
    
                        if (me->IsWithinDist(me->getVictim(), 5))
                        {
                            DoCastAOE(SPELL_DARKFIEND_AOE, false);
                            me->DisappearAndDie();
                        }
                        WaitTimer = 500;
                    }
                } else WaitTimer -= diff;
            }
        };
    
    };
    
    class npc_void_sentinel : public CreatureScript
    {
    public:
        npc_void_sentinel() : CreatureScript("npc_void_sentinel") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new npc_void_sentinelAI (creature);
        }
    
        struct npc_void_sentinelAI : public ScriptedAI
        {
            npc_void_sentinelAI(Creature* c) : ScriptedAI(c){}
    
            uint32 PulseTimer;
            uint32 VoidBlastTimer;
    
            void Reset()
            {
                PulseTimer = 3000;
                VoidBlastTimer = 45000; //is this a correct timer?
    
                float x, y, z, o;
                me->GetHomePosition(x, y, z, o);
                DoTeleportTo(x, y, 71);
            }
    
            void JustDied(Unit* /*killer*/)
            {
                for (uint8 i = 0; i < 8; ++i)
                    me->SummonCreature(CREATURE_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;
    
                if (PulseTimer <= diff)
                {
                    DoCastAOE(SPELL_SHADOW_PULSE, true);
                    PulseTimer = 3000;
                } else PulseTimer -= diff;
    
                if (VoidBlastTimer <= diff)
                {
                    DoCast(me->getVictim(), SPELL_VOID_BLAST, false);
                    VoidBlastTimer = 45000;
                } else VoidBlastTimer -= diff;
    
                DoMeleeAttackIfReady();
            }
        };
    
    };
    
    class npc_blackhole : public CreatureScript
    {
    public:
        npc_blackhole() : CreatureScript("npc_blackhole") { }
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new npc_blackholeAI (creature);
        }
    
        struct npc_blackholeAI : public ScriptedAI
        {
            npc_blackholeAI(Creature* c) : ScriptedAI(c)
            {
                instance = c->GetInstanceScript();
            }
    
            InstanceScript* instance;
    
            uint32 DespawnTimer;
            uint32 SpellTimer;
            uint8 Phase;
            uint8 NeedForAHack;
    
            void Reset()
            {
                DespawnTimer = 15000;
                SpellTimer = 5000;
                Phase = 0;
    
                me->AddUnitState(UNIT_STATE_STUNNED);
                DoCastAOE(SPELL_BLACKHOLE_SPAWN, true);
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (SpellTimer <= diff)
                {
                    Unit* Victim = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
                    switch (NeedForAHack)
                    {
                        case 0:
                            me->ClearUnitState(UNIT_STATE_STUNNED);
                            DoCastAOE(SPELL_BLACKHOLE_GROW, false);
                            if (Victim)
                                AttackStart(Victim);
                            SpellTimer = 700;
                            NeedForAHack = 2;
                            break;
                        case 1:
                            me->AddAura(SPELL_BLACKHOLE_GROW, me);
                            NeedForAHack = 2;
                            SpellTimer = 600;
                            break;
                        case 2:
                            SpellTimer = 400;
                            NeedForAHack = 3;
                            me->RemoveAura(SPELL_BLACKHOLE_GROW, 1);
                            break;
                        case 3:
                            SpellTimer = urand(400, 900);
                            NeedForAHack = 1;
                            if (Unit* Temp = me->getVictim())
                            {
                                if (Temp->GetPositionZ() > 73 && Victim)
                                    AttackStart(Victim);
                            } else
                                return;
                    }
                } else SpellTimer -= diff;
    
                if (DespawnTimer <= diff)
                    me->DisappearAndDie();
                else DespawnTimer -= diff;
            }
        };
    
    };
    
    void AddSC_boss_muru()
    {
        new boss_muru();
        new boss_entropius();
        new npc_muru_portal();
        new npc_dark_fiend();
        new npc_void_sentinel();
        new npc_blackhole();
    }


    Spoiler untuk instance_sunwell_plateau.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     * Copyright (C) 2006-2009 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Instance_Sunwell_Plateau
    SD%Complete: 25
    SDComment: VERIFY SCRIPT
    SDCategory: Sunwell_Plateau
    EndScriptData */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    #define MAX_ENCOUNTER 6
    
    /* Sunwell Plateau:
    0 - Kalecgos and Sathrovarr
    1 - Brutallus
    2 - Felmyst
    3 - Eredar Twins (Alythess and Sacrolash)
    4 - M'uru
    5 - Kil'Jaeden
    */
    
    class instance_sunwell_plateau : public InstanceMapScript
    {
    public:
        instance_sunwell_plateau() : InstanceMapScript("instance_sunwell_plateau", 580) { }
    
        InstanceScript* GetInstanceScript(InstanceMap* map) const
        {
            return new instance_sunwell_plateau_InstanceMapScript(map);
        }
    
        struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript
        {
            instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map) {}
    
            uint32 m_auiEncounter[MAX_ENCOUNTER];
    
            /** Creatures **/
            uint64 Kalecgos_Dragon;
            uint64 Kalecgos_Human;
            uint64 Sathrovarr;
            uint64 Brutallus;
            uint64 Madrigosa;
            uint64 Felmyst;
            uint64 Alythess;
            uint64 Sacrolash;
            uint64 Muru;
            uint64 KilJaeden;
            uint64 KilJaedenController;
            uint64 Anveena;
            uint64 KalecgosKJ;
            uint32 SpectralPlayers;
    
            /** GameObjects **/
            uint64 ForceField;                                      // Kalecgos Encounter
            uint64 KalecgosWall[2];
            uint64 FireBarrier;                                     // Felmysts Encounter
            uint64 MurusGate[2];                                    // Murus Encounter
    
            /*** Misc ***/
            uint32 SpectralRealmTimer;
            std::vector<uint64> SpectralRealmList;
    
            void Initialize()
            {
                memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
    
                /*** Creatures ***/
                Kalecgos_Dragon         = 0;
                Kalecgos_Human          = 0;
                Sathrovarr              = 0;
                Brutallus               = 0;
                Madrigosa               = 0;
                Felmyst                 = 0;
                Alythess                = 0;
                Sacrolash               = 0;
                Muru                    = 0;
                KilJaeden               = 0;
                KilJaedenController     = 0;
                Anveena                 = 0;
                KalecgosKJ              = 0;
                SpectralPlayers         = 0;
    
                /*** GameObjects ***/
                ForceField  = 0;
                FireBarrier = 0;
                MurusGate[0] = 0;
                MurusGate[1] = 0;
                KalecgosWall[0] = 0;
                KalecgosWall[1] = 0;
    
                /*** Misc ***/
                SpectralRealmTimer = 5000;
            }
    
            bool IsEncounterInProgress() const
            {
                for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
                    if (m_auiEncounter[i] == IN_PROGRESS)
                        return true;
    
                return false;
            }
    
            Player* GetPlayerInMap()
            {
                Map::PlayerList const& players = instance->GetPlayers();
    
                if (!players.isEmpty())
                {
                    for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
                    {
                        Player* player = itr->getSource();
                        if (player && !player->HasAura(45839, 0))
                                return player;
                    }
                }
    
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
                return NULL;
            }
    
            void OnCreatureCreate(Creature* creature)
            {
                switch (creature->GetEntry())
                {
                    case 24850: Kalecgos_Dragon     = creature->GetGUID(); break;
                    case 24891: Kalecgos_Human      = creature->GetGUID(); break;
                    case 24892: Sathrovarr          = creature->GetGUID(); break;
                    case 24882: Brutallus           = creature->GetGUID(); break;
                    case 24895: Madrigosa           = creature->GetGUID(); break;
                    case 25038: Felmyst             = creature->GetGUID(); break;
                    case 25166: Alythess            = creature->GetGUID(); break;
                    case 25165: Sacrolash           = creature->GetGUID(); break;
                    case 25741: Muru                = creature->GetGUID(); break;
                    case 25315: KilJaeden           = creature->GetGUID(); break;
                    case 25608: KilJaedenController = creature->GetGUID(); break;
                    case 26046: Anveena             = creature->GetGUID(); break;
                    case 25319: KalecgosKJ          = creature->GetGUID(); break;
                }
            }
    
            void OnGameObjectCreate(GameObject* go)
            {
                switch (go->GetEntry())
                {
                    case 188421: ForceField     = go->GetGUID(); break;
                    case 188523: KalecgosWall[0] = go->GetGUID(); break;
                    case 188524: KalecgosWall[0] = go->GetGUID(); break;
                    case 188075:
                        if (m_auiEncounter[2] == DONE)
                            HandleGameObject(0, true, go);
                        FireBarrier = go->GetGUID();
                        break;
                    case 187990: MurusGate[0]   = go->GetGUID(); break;
                    case 188118:
                        if (m_auiEncounter[4] == DONE)
                            HandleGameObject(0, true, go);
                        MurusGate[1]= go->GetGUID();
                        break;
                }
            }
    
            uint32 GetData(uint32 id)
            {
                switch (id)
                {
                    case DATA_KALECGOS_EVENT:     return m_auiEncounter[0];
                    case DATA_BRUTALLUS_EVENT:    return m_auiEncounter[1];
                    case DATA_FELMYST_EVENT:      return m_auiEncounter[2];
                    case DATA_EREDAR_TWINS_EVENT: return m_auiEncounter[3];
                    case DATA_MURU_EVENT:         return m_auiEncounter[4];
                    case DATA_KILJAEDEN_EVENT:    return m_auiEncounter[5];
                }
                return 0;
            }
    
            uint64 GetData64(uint32 id)
            {
                switch (id)
                {
                    case DATA_KALECGOS_DRAGON:      return Kalecgos_Dragon;
                    case DATA_KALECGOS_HUMAN:       return Kalecgos_Human;
                    case DATA_SATHROVARR:           return Sathrovarr;
                    case DATA_GO_FORCEFIELD:        return ForceField;
                    case DATA_BRUTALLUS:            return Brutallus;
                    case DATA_MADRIGOSA:            return Madrigosa;
                    case DATA_FELMYST:              return Felmyst;
                    case DATA_ALYTHESS:             return Alythess;
                    case DATA_SACROLASH:            return Sacrolash;
                    case DATA_MURU:                 return Muru;
                    case DATA_KILJAEDEN:            return KilJaeden;
                    case DATA_KILJAEDEN_CONTROLLER: return KilJaedenController;
                    case DATA_ANVEENA:              return Anveena;
                    case DATA_KALECGOS_KJ:          return KalecgosKJ;
                    case DATA_PLAYER_GUID:
                        Player* Target = GetPlayerInMap();
                        return Target->GetGUID();
                }
                return 0;
            }
    
            void SetData(uint32 id, uint32 data)
            {
                switch (id)
                {
                    case DATA_KALECGOS_EVENT:
                        {
                            if (data == NOT_STARTED || data == DONE)
                            {
                                HandleGameObject(ForceField, true);
                                HandleGameObject(KalecgosWall[0], true);
                                HandleGameObject(KalecgosWall[1], true);
                            }
                            else if (data == IN_PROGRESS)
                            {
                                HandleGameObject(ForceField, false);
                                HandleGameObject(KalecgosWall[0], false);
                                HandleGameObject(KalecgosWall[1], false);
                            }
                            m_auiEncounter[0] = data;
                        }
                        break;
                    case DATA_BRUTALLUS_EVENT:     m_auiEncounter[1] = data; break;
                    case DATA_FELMYST_EVENT:
                        if (data == DONE)
                            HandleGameObject(FireBarrier, true);
                        m_auiEncounter[2] = data; break;
                    case DATA_EREDAR_TWINS_EVENT:  m_auiEncounter[3] = data; break;
                    case DATA_MURU_EVENT:
                        switch (data)
                        {
                            case DONE:
                                HandleGameObject(MurusGate[0], true);
                                HandleGameObject(MurusGate[1], true);
                                break;
                            case IN_PROGRESS:
                                HandleGameObject(MurusGate[0], false);
                                HandleGameObject(MurusGate[1], false);
                                break;
                            case NOT_STARTED:
                                HandleGameObject(MurusGate[0], true);
                                HandleGameObject(MurusGate[1], false);
                                break;
                        }
                        m_auiEncounter[4] = data; break;
                    case DATA_KILJAEDEN_EVENT:     m_auiEncounter[5] = data; break;
                }
    
                if (data == DONE)
                    SaveToDB();
            }
    
            std::string GetSaveData()
            {
                OUT_SAVE_INST_DATA;
                std::ostringstream stream;
                stream << m_auiEncounter[0] << ' '  << m_auiEncounter[1] << ' '  << m_auiEncounter[2] << ' '  << m_auiEncounter[3] << ' '
                    << m_auiEncounter[4] << ' '  << m_auiEncounter[5];
                char* out = new char[stream.str().length() + 1];
                strcpy(out, stream.str().c_str());
                if (out)
                {
                    OUT_SAVE_INST_DATA_COMPLETE;
                    return out;
                }
                return NULL;
            }
    
            void Load(const char* in)
            {
                if (!in)
                {
                    OUT_LOAD_INST_DATA_FAIL;
                    return;
                }
    
                OUT_LOAD_INST_DATA(in);
                std::istringstream stream(in);
                stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
                    >> m_auiEncounter[4] >> m_auiEncounter[5];
                for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
                    if (m_auiEncounter[i] == IN_PROGRESS)                // Do not load an encounter as "In Progress" - reset it instead.
                        m_auiEncounter[i] = NOT_STARTED;
                OUT_LOAD_INST_DATA_COMPLETE;
            }
        };
    
    };
    
    void AddSC_instance_sunwell_plateau()
    {
        new instance_sunwell_plateau();
    }


    Spoiler untuk sunwell_plateau.cpp :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     *
     * 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, see <http://www.gnu.org/licenses/>.
     */
    
    /* ScriptData
    SDName: Sunwell_Plateau
    SD%Complete: 0
    SDComment: Placeholder, Epilogue after Kil'jaeden, Captain Selana Gossips
    EndScriptData */
    
    /* ContentData
    npc_prophet_velen
    npc_captain_selana
    EndContentData */
    
    #include "ScriptPCH.h"
    #include "sunwell_plateau.h"
    
    /*######
    ## npc_prophet_velen
    ######*/
    
    enum ProphetSpeeches
    {
        PROPHET_SAY1 = -1580099,
        PROPHET_SAY2 = -1580100,
        PROPHET_SAY3 = -1580101,
        PROPHET_SAY4 = -1580102,
        PROPHET_SAY5 = -1580103,
        PROPHET_SAY6 = -1580104,
        PROPHET_SAY7 = -1580105,
        PROPHET_SAY8 = -1580106
    };
    
    enum LiadrinnSpeeches
    {
        LIADRIN_SAY1 = -1580107,
        LIADRIN_SAY2 = -1580108,
        LIADRIN_SAY3 = -1580109
    };
    
    /*######
    ## npc_captain_selana
    ######*/
    
    #define CS_GOSSIP1 "Give me a situation report, Captain."
    #define CS_GOSSIP2 "What went wrong?"
    #define CS_GOSSIP3 "Why did they stop?"
    #define CS_GOSSIP4 "Your insight is appreciated."
    
    void AddSC_sunwell_plateau()
    {
    }


    Spoiler untuk sunwell_plateau.h :

    Code:
    /*
     * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
     * Copyright (C) 2006-2009 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, see <http://www.gnu.org/licenses/>.
     */
    
    #ifndef DEF_SUNWELLPLATEAU_H
    #define DEF_SUNWELLPLATEAU_H
    
    /*** Encounters ***/
    enum Data
    {
        DATA_KALECGOS_EVENT,
        DATA_BRUTALLUS_EVENT,
        DATA_FELMYST_EVENT,
        DATA_EREDAR_TWINS_EVENT,
        DATA_MURU_EVENT,
        DATA_KILJAEDEN_EVENT,
    };
    
    enum Data64
    {
        /*** Creatures ***/
        DATA_KALECGOS_DRAGON,
        DATA_KALECGOS_HUMAN,
        DATA_SATHROVARR,
        DATA_BRUTALLUS,
        DATA_MADRIGOSA,
        DATA_FELMYST,
        DATA_ALYTHESS,
        DATA_SACROLASH,
        DATA_MURU,
        DATA_KILJAEDEN,
        DATA_KILJAEDEN_CONTROLLER,
        DATA_ANVEENA,
        DATA_KALECGOS_KJ,
    
        /*** GameObjects ***/
        DATA_GO_FORCEFIELD,
        DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1,
        DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2,
        DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3,
        DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4,
    
        /*** Misc ***/
        DATA_PLAYER_GUID,
    };
    
    enum Creatures
    {
        BOSS_MURU                                     = 25741,
        BOSS_ENTROPIUS                                = 25840,
        MOB_KALECGOS                                  = 24850,
        MOB_KALEC                                     = 24891,
        MOB_SATHROVARR                                = 24892,
    
        MOB_DEAD                                      = 25268,
        MOB_FLIGHT_LEFT                               = 25357,
        MOB_FLIGHT_RIGHT                              = 25358,
        MOB_DEATH_CLOUD                               = 25703,
        MOB_VAPOR                                     = 25265,
        MOB_VAPOR_TRAIL                               = 25267,
    
        MOB_GRAND_WARLOCK_ALYTHESS                    = 25166,
        MOB_SHADOW_IMAGE                              = 25214,
        MOB_LADY_SACROLASH                            = 25165,
    
        CREATURE_ANVEENA                              = 26046, // Embodiment of the Sunwell
        CREATURE_KALECGOS                             = 25319, // Helps the raid throughout the fight
        CREATURE_PROPHET                              = 26246, // Outro
        CREATURE_KILJAEDEN                            = 25315, // Give it to 'em KJ!
        CREATURE_HAND_OF_THE_DECEIVER                 = 25588, // Adds found before KJ emerges
        CREATURE_FELFIRE_PORTAL                       = 25603, // Portal spawned be Hand of the Deceivers
        CREATURE_VOLATILE_FELFIRE_FIEND               = 25598, // Fiends spawned by the above portal
        CREATURE_ARMAGEDDON_TARGET                    = 25735, // This mob casts meteor on itself.. I think
        CREATURE_SHIELD_ORB                           = 25502, // Shield orbs circle the room raining shadow bolts on raid
        CREATURE_THE_CORE_OF_ENTROPIUS                = 26262, // Used in the ending cinematic?
        CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT       = 25653, // NPC that players possess when using the Orb of the Blue Dragonflight
        CREATURE_SPIKE_TARGET1                        = 30598, // Should summon these under Shadow Spike Channel on targets place
        CREATURE_SPIKE_TARGET2                        = 30614,
        CREATURE_SINISTER_REFLECTION                  = 25708, // Sinister Relection spawnd on Phase swichtes
    
        CREATURE_DARKNESS                             = 25879,
        CREATURE_DARK_FIENDS                          = 25744,
        CREATURE_BERSERKER                            = 25798,
        CREATURE_FURY_MAGE                            = 25799,
        CREATURE_VOID_SENTINEL                        = 25772,
        CREATURE_VOID_SPAWN                           = 25824,
        CREATURE_BLACK_HOLE                           = 25855,
    };
    
    enum GameObjects
    {
        GAMEOBJECT_ORB_OF_THE_BLUE_DRAGONFLIGHT       = 188415,
    };
    
    #endif



    Status : g bisa ngetes XD

    well fixing instance lama pasti jadi Low Priority buat GM for now, tapi player2 kan macem2 hobbynya, untuk saya sendiri saya hobbynya Transmog >.<

    mudah2an bisa dipake, pingin celana Felmyst sama Head dari KJ, acipmen juga lom sempet dapet >.<
    Quote Originally Posted by Aluna Sagita
    Having Crush On Me Isn't Categorized As Pedophilia
    Spoiler untuk Warcraft Books :

Page 2 of 7 FirstFirst 123456 ... LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •