Advertisement
Ayiko

Ayiko's Molten Fifth Anniversary Script

Jul 12th, 2015
897
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.03 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2008-2013 MoltenCore <http://www.molten-wow.com/>
  3.  * Make sure to +REP Ayiko on Ac-web if using this! For freely sharing!#FreetheNipple
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License as published by the
  7.  * Free Software Foundation; either version 2 of the License, or (at your
  8.  * option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT
  11.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12.  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13.  * more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program. If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18.  
  19. #include "Spell.h"
  20. #include "ScriptedCreature.h"
  21. #include "ScriptMgr.h"
  22. #include "SpellScript.h"
  23. #include "SpellAuras.h"
  24. #include "GridNotifiers.h"
  25.  
  26. /*
  27. *************************************
  28. ********* Anniversary 2014 **********
  29. *************************************
  30. */
  31.  
  32.  
  33. class npc_new_year_event_teleporter : public CreatureScript
  34. {
  35.     enum
  36.     {
  37.         OPTION_TELE_TO_MAZE = GOSSIP_ACTION_INFO_DEF + 30,
  38.         OPTION_TELE_TO_STAIRS,
  39.         OPTION_TELE_TO_BOB,
  40.         OPTION_MORPH
  41.     };
  42.  
  43. public:
  44.     npc_new_year_event_teleporter() : CreatureScript("npc_new_year_event_teleporter") {}
  45.  
  46.     bool OnGossipHello(Player* player, Creature* creature)
  47.     {
  48.         player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TAXI, "Teleport to |cFF9482C9Maze Event|r.", GOSSIP_SENDER_MAIN, OPTION_TELE_TO_MAZE);
  49.         player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TAXI, "Teleport to |cFF9482C9Stairs Event|r.", GOSSIP_SENDER_MAIN, OPTION_TELE_TO_STAIRS);
  50.         //player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, "Teleport to |cFF9482C9Bob's Place|r.", GOSSIP_SENDER_MAIN, OPTION_TELE_TO_BOB);
  51.         //player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Morph me!", GOSSIP_SENDER_MAIN, OPTION_MORPH);
  52.         player->SEND_GOSSIP_MENU(800001, creature->GetGUID());
  53.  
  54.         return true;
  55.     }
  56.  
  57.     bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action)
  58.     {
  59.         static uint32 const morphs[20] =
  60.         {
  61.             8669,
  62.             13342,
  63.             13344,
  64.             13346,
  65.             13345,
  66.             13348,
  67.             13347,
  68.             13349,
  69.             13350,
  70.             13356,
  71.             13730,
  72.             15094,
  73.             15095,
  74.             15096,
  75.             15097,
  76.             15660,
  77.             15904,
  78.             15698,
  79.             15698,
  80.             15750,
  81.         };
  82.  
  83.         player->PlayerTalkClass->ClearMenus();
  84.  
  85.         switch (action)
  86.         {
  87.             case OPTION_TELE_TO_MAZE:
  88.                 player->TeleportTo(0, 4199.866699f, -4286.674316f, 277.070160f, 1.578420f);
  89.                 break;
  90.             case OPTION_TELE_TO_STAIRS:
  91.                 player->TeleportTo(530, -3470.788574f, -14100.294922f, 16.186245f, 2.761339f);
  92.                 break;
  93.             case OPTION_TELE_TO_BOB:
  94.                 player->TeleportTo(37, -210.602325f, 335.650421f, 303.182831f, 6.195761f);
  95.                 break;
  96.             case OPTION_MORPH:
  97.                 player->SetDisplayId(morphs[urand(0, 19)]);
  98.                 break;
  99.         }
  100.  
  101.         return true;
  102.     }
  103. };
  104.  
  105. class npc_winter_snowman : public CreatureScript
  106. {
  107.     enum
  108.     {
  109.         NPC_ANGRY_SNOWMAN = 500002,
  110.         NPC_PALACE_GUARD
  111.     };
  112.  
  113. public:
  114.     npc_winter_snowman() : CreatureScript("npc_winter_snowman") {}
  115.  
  116.     struct npc_winter_snowmanAI : public ScriptedAI
  117.     {
  118.         npc_winter_snowmanAI(Creature* c) : ScriptedAI(c) {}
  119.  
  120.         uint32 castTimer;
  121.  
  122.         void Reset()
  123.         {
  124.             castTimer = urand(5000, 10000);
  125.         }
  126.  
  127.         void JustDied(Unit * killer)
  128.         {
  129.             if (me->GetEntry() == NPC_ANGRY_SNOWMAN) // Points only from Angry Snowman
  130.                 if (Player * player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
  131.                 {
  132.                 // Justice Points
  133.                 if (roll_chance_i(20))
  134.                     player->ModifyCurrency(395, 3 * CURRENCY_PRECISION);
  135.                 // Valor Points
  136.                 else if (roll_chance_i(50))
  137.                     player->ModifyCurrency(396, 1 * CURRENCY_PRECISION);
  138.                 }
  139.         }
  140.  
  141.         void UpdateAI(uint32 const diff)
  142.         {
  143.             if (!UpdateVictim())
  144.                 return;
  145.  
  146.             if (castTimer <= diff)
  147.             {
  148.                 me->CastSpell(me->GetVictim(), (me->GetEntry() == NPC_ANGRY_SNOWMAN) ? 65807 : 72905, true);
  149.                 castTimer = urand(10000, 20000);
  150.             } else castTimer -= diff;
  151.  
  152.             DoMeleeAttackIfReady();
  153.         }
  154.     };
  155.  
  156.     CreatureAI* GetAI(Creature* creature) const
  157.     {
  158.         return new npc_winter_snowmanAI(creature);
  159.     }
  160. };
  161.  
  162. enum Spells
  163. {
  164.         SPELL_DEFILING_HORROR           = 72435,
  165.         SPELL_WELL_OF_CORRUPTION        = 72362,
  166.         SPELL_SHARED_SUFFERING          = 72368,
  167.         // P2
  168.         SPELL_FORCEFUL_SMASH            = 69155,
  169.         SPELL_FLAME_BREATH              = 74525,
  170.         SPELL_BLAST_NOVA                = 30613,
  171.         // P3
  172.         SPELL_CLEAVE                    = 68868,
  173.         SPELL_BELLOWING_ROAR            = 18431,
  174.         SPELL_FIREBALL                  = 18392,
  175.         SPELL_TAIL_SWEEP                = 68867,
  176.         SPELL_WING_BUFFET               = 18500,
  177.         // P4
  178.         SPELL_ELEMENTAL_FIRE_DOT        = 20564,
  179.         SPELL_ELEMENTAL_FIRE_INSTAKILL  = 19773,
  180.         SPELL_MAGMA_BLAST               = 20565,
  181.         SPELL_WRATH_OF_RAGNAROS         = 20566,
  182.         SPELL_HAND_OF_RAGNAROS          = 19780,
  183.         SPELL_LAVA_BURST                = 21158
  184.  
  185. };
  186.  
  187. struct DamageRange
  188. {
  189.     uint32 minDamage;
  190.     uint32 maxDamage;
  191.  
  192.     uint32 CalcRandom() const { return minDamage ? urand(minDamage, maxDamage) : maxDamage; };
  193. };
  194.  
  195. struct SpellCustomDamage
  196. {
  197.     uint32 spellId;
  198.     DamageRange damage10;
  199.     DamageRange damage25;
  200.     DamageEffectType damageType;
  201. };
  202.  
  203.  
  204. // We partially use spells from Vanilla Wow here,
  205. // so the damage needs to be adjusted for the encounter to be challenging
  206. // This container holds damage values for each spell
  207. static const std::vector<SpellCustomDamage> WOTLK_DMG_RANGE =
  208. {
  209.     //P1
  210.     { SPELL_DEFILING_HORROR,            {0, 39000},         {0, 16250},              DOT },
  211.     { SPELL_SHARED_SUFFERING,           {0, 93600},         {0, 36000},              DOT },
  212.     //P2
  213.     { SPELL_FORCEFUL_SMASH,             {336941, 378059},   {73514, 82486},         SPELL_DIRECT_DAMAGE },
  214.     { SPELL_FLAME_BREATH,               {138600, 178200},     {18900, 24300},         SPELL_DIRECT_DAMAGE },
  215.     { SPELL_BLAST_NOVA,                 {36758, 47242},     {3282, 3937},           SPELL_DIRECT_DAMAGE },
  216.     //P3
  217.     //{ SPELL_CLEAVE,                     {0, 0},             {0,0},                  SPELL_DIRECT_DAMAGE }, // ?
  218.     { SPELL_FIREBALL,                   {61854, 69396},      {8483, 9517},           SPELL_DIRECT_DAMAGE },
  219.     { SPELL_TAIL_SWEEP,                 {168350, 195650},     {14430, 16770},         SPELL_DIRECT_DAMAGE },
  220.     { SPELL_WING_BUFFET,                {225451, 252949},     {27098, 30403},         SPELL_DIRECT_DAMAGE },
  221.     //P4
  222.     { SPELL_ELEMENTAL_FIRE_DOT,         {125000, 175000},     {15000, 21000},         SPELL_DIRECT_DAMAGE },
  223.     { SPELL_ELEMENTAL_FIRE_DOT,         {0, 61600},         {0, 9200},              DOT },
  224.     { SPELL_MAGMA_BLAST,                {0, 300000},         {0, 22000},             SPELL_DIRECT_DAMAGE },
  225.     { SPELL_WRATH_OF_RAGNAROS,          {1008000, 1008000},   {0, 82500},             SPELL_DIRECT_DAMAGE },
  226.     { SPELL_HAND_OF_RAGNAROS,           {60000, 90000},     {0, 82500},             SPELL_DIRECT_DAMAGE },
  227.     { SPELL_LAVA_BURST,                 {40000, 80000},     {0, 82500},             SPELL_DIRECT_DAMAGE },
  228. };
  229.  
  230. // Raggy - 500020
  231. class npc_boss_raggy : public CreatureScript
  232. {
  233.  
  234.  
  235.  
  236.     enum Events
  237.     {
  238.         EVENT_DEFILING_HORROR = 1,
  239.         EVENT_WELL_OF_CORRUPTION,
  240.         EVENT_SHARED_SUFFERING,
  241.         EVENT_SPEECH,
  242.         // P2
  243.         EVENT_FORCEFUL_SMASH,
  244.         EVENT_FLAME_BREATH,
  245.         EVENT_BLAST_NOVA,
  246.         // P3
  247.         EVENT_CLEAVE,
  248.         EVENT_BELLOWING_ROAR,
  249.         EVENT_FIREBALL,
  250.         EVENT_TAIL_SWEEP,
  251.         EVENT_WING_BUFFET,
  252.         // P4
  253.         EVENT_ELEMENTAL_FIRE,
  254.         EVENT_ELEMENTAL_FIRE_INSTAKILL,
  255.         EVENT_HAND_OF_RAGNAROS,
  256.         EVENT_WRATH_OF_RAGNAROS,
  257.         EVENT_MAGMA_BLAST,
  258.         EVENT_RANDOM_CAST_P4,
  259.         EVENT_LAVA_BURST
  260.     };
  261.  
  262.     enum Misc
  263.     {
  264.         PHASE_ONE = 1,
  265.         PHASE_TWO,
  266.         PHASE_THREE,
  267.         PHASE_FOUR,
  268.         NPC_KAER = 500019,
  269.     };
  270.  
  271.     enum Texts
  272.     {
  273.         SAY_RANDOM = 0,
  274.         SAY_WRATH = 10
  275.     };
  276.  
  277.     struct npc_boss_raggyAI : public ScriptedAI
  278.     {
  279.         npc_boss_raggyAI(Creature * creature) : ScriptedAI(creature) {}
  280.  
  281.         void Reset() override
  282.         {
  283.             me->SetReactState(REACT_DEFENSIVE);
  284.             events.Reset();
  285.             phase = PHASE_ONE;
  286.             speechCounter = 0;
  287.             wrathCasted = false;
  288.         }
  289.  
  290.         void DamageDealt(Unit*, uint32& damage, DamageEffectType damageType, const SpellInfo * spell)
  291.         {
  292.             // Damage adjustments (varying for each expansion / mode)
  293.             if (!spell)
  294.                 return;
  295.             for (auto itr : WOTLK_DMG_RANGE)
  296.             {
  297.                 if (itr.spellId == spell->Id && itr.damageType == damageType)
  298.                 {
  299.                     damage = itr.damage10.CalcRandom();
  300.                     break;
  301.                 }
  302.             }
  303.         }
  304.  
  305.         void EnterCombat(Unit*)
  306.         {
  307.             SetPhase(PHASE_ONE);
  308.         }
  309.  
  310.         void DamageTaken(Unit*, uint32& damage)
  311.         {
  312.             static const uint32 phaseThresholds[5] = { 100, 90, 80, 40, 0 };
  313.  
  314.             if (phaseThresholds[phase] && me->HealthBelowPctDamaged(phaseThresholds[phase], damage))
  315.             {
  316.                 SetPhase(++phase);
  317.             }
  318.  
  319.             if (!wrathCasted && me->HealthBelowPctDamaged(3, damage))
  320.             {
  321.                 wrathCasted = true;
  322.                 DoCast(me, SPELL_WRATH_OF_RAGNAROS, true);
  323.                 Talk(SAY_WRATH);
  324.             }
  325.  
  326.             if (damage > me->GetHealth())
  327.                 me->SummonCreature(NPC_KAER, 754.77f, 1336.87f, 267.235f, 3.81367f, TEMPSUMMON_TIMED_DESPAWN, 30 * MINUTE * IN_MILLISECONDS);
  328.         }
  329.  
  330.         void JustDied(Unit*)
  331.         {
  332.         }
  333.  
  334.         void SetPhase(uint8 newPhase)
  335.         {
  336.             events.SetPhase(newPhase);
  337.             phase = newPhase;
  338.  
  339.             switch (newPhase)
  340.             {
  341.                 case PHASE_ONE:
  342.                     speechCounter = 0;
  343.                     events.ScheduleEvent(EVENT_SPEECH, 5000, 0, PHASE_ONE);
  344.                     events.ScheduleEvent(EVENT_SPEECH, 25000, 0, PHASE_ONE);
  345.                     events.ScheduleEvent(EVENT_SPEECH, 46000, 0, PHASE_ONE);
  346.                     events.ScheduleEvent(EVENT_SPEECH, 65000, 0, PHASE_ONE);
  347.                     events.ScheduleEvent(EVENT_DEFILING_HORROR, 10000, 0, PHASE_ONE);
  348.                     events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 16000, 0, PHASE_ONE);
  349.                     events.ScheduleEvent(EVENT_SHARED_SUFFERING, 5000, 0, PHASE_ONE);
  350.                     break;
  351.                 case PHASE_TWO:
  352.                     speechCounter = 4;
  353.                     events.ScheduleEvent(EVENT_SPEECH, 0, 0, PHASE_TWO);
  354.                     events.ScheduleEvent(EVENT_SPEECH, 20000, 0, PHASE_TWO);
  355.                     events.ScheduleEvent(EVENT_SPEECH, 32000, 0, PHASE_TWO);
  356.                     events.ScheduleEvent(EVENT_SPEECH, 50000, 0, PHASE_TWO);
  357.                     events.ScheduleEvent(EVENT_SPEECH, 74000, 0, PHASE_TWO);
  358.                     events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 6000, 0, PHASE_TWO);
  359.                     events.ScheduleEvent(EVENT_FLAME_BREATH, 0, 0, PHASE_TWO);
  360.                     events.ScheduleEvent(EVENT_BLAST_NOVA, 4000, 0, PHASE_TWO);
  361.                     break;
  362.                 case PHASE_THREE:
  363.                     speechCounter = 9;
  364.                     events.ScheduleEvent(EVENT_SPEECH, 0, 0, PHASE_THREE);
  365.                     events.ScheduleEvent(EVENT_CLEAVE, 3000, 0, PHASE_THREE);
  366.                     events.ScheduleEvent(EVENT_BELLOWING_ROAR, 0, 0, PHASE_THREE);
  367.                     events.ScheduleEvent(EVENT_FIREBALL, 5000, 0, PHASE_THREE);
  368.                     events.ScheduleEvent(EVENT_TAIL_SWEEP, 8000, 0, PHASE_THREE);
  369.                     events.ScheduleEvent(EVENT_WING_BUFFET, 13000, 0, PHASE_THREE);
  370.                     break;
  371.                 case PHASE_FOUR:
  372.                     events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, 8000, 0, PHASE_FOUR);
  373.                     events.ScheduleEvent(EVENT_MAGMA_BLAST, 10000, 0, PHASE_FOUR);
  374.                     events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 25000, 0, PHASE_FOUR);
  375.                     events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 30000, 0, PHASE_FOUR);
  376.                     events.ScheduleEvent(EVENT_LAVA_BURST, 10000, 0, PHASE_FOUR);
  377.                     //events.ScheduleEvent(EVENT_RANDOM_CAST_P4, 10000, 0, PHASE_FOUR);
  378.                     break;
  379.                 default:
  380.                     break;
  381.             }
  382.         }
  383.  
  384.         // This is a hack method for casting single-target spells as if they were an AoE spell
  385.         void DoCastFakeAoE(uint32 spellId, uint32 targetsCnt, SelectAggroTarget targetType)
  386.         {
  387.             UnitList targets;
  388.             targets = SelectTargetList(targetsCnt, targetType, 0.0f, true);
  389.  
  390.             if (targets.empty())
  391.                 return;
  392.  
  393.             for (auto itr : targets)
  394.             {
  395.                 DoCast(itr, spellId, true);
  396.                 if (!--targetsCnt)
  397.                     break;
  398.             }
  399.         }
  400.  
  401.         void UpdateAI(uint32 const diff) override
  402.         {
  403.             if (!UpdateVictim())
  404.                 return;
  405.  
  406.             events.Update(diff);
  407.  
  408.             if (me->HasUnitState(UNIT_STATE_CASTING))
  409.                 return;
  410.  
  411.             if (uint32 eventId = events.ExecuteEvent())
  412.             {
  413.                 switch (eventId)
  414.                 {
  415.                     case EVENT_SPEECH:
  416.                         Talk(SAY_RANDOM + speechCounter++);
  417.                         break;
  418.                         // P1
  419.                     case EVENT_DEFILING_HORROR:
  420.                         DoCast(me, SPELL_DEFILING_HORROR, false);
  421.                         events.ScheduleEvent(EVENT_DEFILING_HORROR, 15000, 0, PHASE_ONE);
  422.                         break;
  423.                     case EVENT_WELL_OF_CORRUPTION:
  424.                         DoCastFakeAoE(SPELL_WELL_OF_CORRUPTION, RAID_MODE(3, 6), SELECT_TARGET_RANDOM);
  425.                         events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 10000, 0, PHASE_ONE);
  426.                         break;
  427.                     case EVENT_SHARED_SUFFERING:
  428.                         DoCastFakeAoE(SPELL_SHARED_SUFFERING, RAID_MODE(2, 5), SELECT_TARGET_RANDOM);
  429.                         events.ScheduleEvent(EVENT_SHARED_SUFFERING, 15000, 0, PHASE_ONE);
  430.                         break;
  431.                         // P2
  432.                     case EVENT_FORCEFUL_SMASH:
  433.                         DoCastVictim(SPELL_FORCEFUL_SMASH, false);
  434.                         events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 16000, 0, PHASE_TWO);
  435.                         break;
  436.                     case EVENT_FLAME_BREATH:
  437.                         DoCast(me, SPELL_FLAME_BREATH);
  438.                         events.ScheduleEvent(EVENT_FLAME_BREATH, 8000, 0, PHASE_TWO);
  439.                         break;
  440.                     case EVENT_BLAST_NOVA:
  441.                         DoCast(me, SPELL_BLAST_NOVA);
  442.                         events.ScheduleEvent(EVENT_BLAST_NOVA, 5000, 0, PHASE_TWO);
  443.                         break;
  444.                         // P3
  445.                     case EVENT_CLEAVE:
  446.                         DoCastVictim(SPELL_CLEAVE);
  447.                         events.ScheduleEvent(EVENT_CLEAVE, 10000, 0, PHASE_THREE);
  448.                         break;
  449.                     case EVENT_BELLOWING_ROAR:
  450.                         DoCast(me, SPELL_BELLOWING_ROAR);
  451.                         events.ScheduleEvent(EVENT_BELLOWING_ROAR, 17500, 0, PHASE_THREE);
  452.                         break;
  453.                     case EVENT_FIREBALL:
  454.                         if (Unit * target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
  455.                             DoCast(target, SPELL_FIREBALL, false);
  456.                         events.ScheduleEvent(EVENT_FIREBALL, 8000, 0, PHASE_THREE);
  457.                         break;
  458.                     case EVENT_TAIL_SWEEP:
  459.                         DoCast(me, SPELL_TAIL_SWEEP);
  460.                         events.ScheduleEvent(EVENT_TAIL_SWEEP, 10000, 0, PHASE_THREE);
  461.                         break;
  462.                     case EVENT_WING_BUFFET:
  463.                         DoCast(me, SPELL_WING_BUFFET);
  464.                         events.ScheduleEvent(EVENT_WING_BUFFET, 15000, 0, PHASE_THREE);
  465.                         break;
  466.                         // P4
  467.                     case EVENT_ELEMENTAL_FIRE_INSTAKILL:
  468.                         if (Unit * target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
  469.                             DoCast(target, SPELL_ELEMENTAL_FIRE_INSTAKILL);
  470.                         break;
  471.                     case EVENT_ELEMENTAL_FIRE:
  472.                         DoCastVictim(SPELL_ELEMENTAL_FIRE_DOT);
  473.                         events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, 10000, 0, PHASE_FOUR);
  474.                         break;
  475.                     case EVENT_MAGMA_BLAST:
  476.                         if (Unit * target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
  477.                             DoCast(target, SPELL_MAGMA_BLAST, false);
  478.                         events.ScheduleEvent(EVENT_MAGMA_BLAST, 10000, 0, PHASE_FOUR);
  479.                         break;
  480.                     case EVENT_HAND_OF_RAGNAROS:
  481.                         DoCast(me, SPELL_HAND_OF_RAGNAROS);
  482.                         events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 20000, 0, PHASE_FOUR);
  483.                         break;
  484.                     case EVENT_WRATH_OF_RAGNAROS:
  485.                         DoCastVictim(SPELL_WRATH_OF_RAGNAROS);
  486.                         events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 25000, 0, PHASE_FOUR);
  487.                         break;
  488.                     case EVENT_LAVA_BURST:
  489.                         DoCast(me, SPELL_LAVA_BURST);
  490.                         events.ScheduleEvent(EVENT_LAVA_BURST, 10000, 0, PHASE_FOUR);
  491.                         break;
  492.                     default:
  493.                         break;
  494.                 }
  495.             }
  496.  
  497.             DoMeleeAttackIfReady();
  498.         }
  499.  
  500.     private:
  501.         EventMap events;
  502.         uint32 phase;
  503.         uint8 speechCounter;
  504.         bool wrathCasted;
  505.     };
  506.  
  507. public:
  508.     npc_boss_raggy() : CreatureScript("npc_boss_raggy") {}
  509.  
  510.     CreatureAI * GetAI(Creature * creature) const
  511.     {
  512.         return new npc_boss_raggyAI(creature);
  513.     }
  514. };
  515.  
  516.  
  517. static const std::vector<uint32> morphPool =
  518. {
  519.     25580, 25573, 25549, 25546, 25525, 25517, 25500, 25069, 25037, 25038,
  520.     25039, 25040, 25041, 25042, 25043, 25044, 25045, 25046, 25047, 25048,
  521.     25049, 25050, 25051, 25052, 25053, 25054, 25055, 25002, 24130, 24391,
  522.     24789, 24949, 24978, 23773, 25286, 27538, 25329, 23362, 23321, 23348,
  523.     25381, 21987, 21986, 26787, 25756, 1536, 397, 143, 8249, 8310, 16024,
  524.     4956, 1120, 2075, 5488, 487, 13949, 24926, 23684, 24127, 25033, 25034,
  525.     25035, 25036, 24992, 28213, 27744, 23749, 28127
  526. };
  527.  
  528. class npc_reward_dude : public CreatureScript
  529. {
  530.     enum
  531.     {
  532.         GOSSIP_MORPH = GOSSIP_ACTION_INFO_DEF + 1,
  533.         GOSSIP_DEMORPH,
  534.         GOSSIP_TELE_SW,
  535.         GOSSIP_TELE_ORG,
  536.     };
  537.  
  538. public:
  539.     npc_reward_dude() : CreatureScript("npc_reward_dude") {}
  540.  
  541.     bool OnGossipHello(Player* player, Creature* creature)
  542.     {
  543.         if (creature->IsQuestGiver())
  544.             player->PrepareQuestMenu(creature->GetGUID());
  545.  
  546.         player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Morph me please!", GOSSIP_SENDER_MAIN, GOSSIP_MORPH);
  547.         if (player->GetNativeDisplayId() != player->GetDisplayId())
  548.             player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Remove my morph please!", GOSSIP_SENDER_MAIN, GOSSIP_DEMORPH);
  549.  
  550.         if (player->GetTeam() == ALLIANCE)
  551.             player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TAXI, "Teleport to Stormwind", GOSSIP_SENDER_MAIN, GOSSIP_TELE_SW);
  552.         else
  553.             player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TAXI, "Teleport to Orgrimmar", GOSSIP_SENDER_MAIN, GOSSIP_TELE_ORG);
  554.  
  555.         player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
  556.         return true;
  557.     }
  558.  
  559.     bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction)
  560.     {
  561.         player->PlayerTalkClass->ClearMenus();
  562.  
  563.         switch (uiAction)
  564.         {
  565.             case GOSSIP_MORPH:
  566.             {
  567.                 uint32 morphId = Trinity::Containers::SelectRandomContainerElement(morphPool);
  568.                 player->SetDisplayId(morphId);
  569.                 player->CLOSE_GOSSIP_MENU();
  570.                 break;
  571.             }
  572.             case GOSSIP_DEMORPH:
  573.                 player->DeMorph();
  574.                 player->CLOSE_GOSSIP_MENU();
  575.                 break;
  576.             case GOSSIP_TELE_SW:
  577.                 player->CLOSE_GOSSIP_MENU();
  578.                 player->TeleportTo(WorldLocation(0, -9065.756836f, 432.428864f, 93.056526f, 0.67f));
  579.                 break;
  580.             case GOSSIP_TELE_ORG:
  581.                 player->CLOSE_GOSSIP_MENU();
  582.                 player->TeleportTo(WorldLocation(1, 1485.483521f, -4418.357422f, 25.340143f, 0.177814f));
  583.                 break;
  584.             default:
  585.                 break;
  586.         }
  587.  
  588.         return true;
  589.     }
  590. };
  591.  
  592. void AddSC_molten_anniversary()
  593. {
  594.     // 2014
  595.     new npc_new_year_event_teleporter();
  596.     new npc_winter_snowman();
  597.     new npc_boss_raggy();
  598.     new npc_reward_dude();
  599. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement