Advertisement
EmuDevs

Simon Says EmuDevs

Jun 6th, 2016
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.77 KB | None | 0 0
  1. /*
  2.    Simon Says
  3.    By Tommy
  4.    EmuDevs <http://emudevs.com>
  5. */
  6. enum NpcIds
  7. {
  8.     NPC_SPOTLIGHT_ONE               = 79900,
  9.     NPC_SPOTLIGHT_TWO               = 79901,
  10.     NPC_SPOTLIGHT_THREE             = 79902,
  11.     NPC_TURTLE_ONE                  = 79903,
  12.     NPC_FIRE_HAWK                   = 53245,
  13. };
  14.  
  15. enum SpellIds
  16. {
  17.     /* Spells */
  18.     SPELL_SPOTLIGHT                 = 50236,
  19. };
  20.  
  21. enum EventIds
  22. {
  23.     EVENT_NONE,
  24.     EVENT_EXPLAIN_1,
  25.     EVENT_EXPLAIN_2,
  26.     EVENT_EXPLAIN_SPOTLIGHT,
  27.     EVENT_SPOTLIGHT_1,
  28.     EVENT_SPOTLIGHT_2,
  29.     EVENT_CHECK_SPOTLIGHT,
  30.     EVENT_CHECK_SPOTLIGHT_2,
  31.     EVENT_EXPLAIN_KILL_CREATURE,
  32.     EVENT_EXPLAIN_KILL_CREATURE_START,
  33.     EVENT_CHECK_KILL_CREATURE
  34. };
  35.  
  36. static bool isEventActive = false;
  37.  
  38. class simon_himself : public CreatureScript
  39. {
  40. public:
  41.     simon_himself() : CreatureScript("simon_himself") { }
  42.  
  43.     bool OnGossipHello(Player* player, Creature* creature) override
  44.     {
  45.         if (isEventActive)
  46.         {
  47.             player->GetSession()->SendNotification("Event is already active!");
  48.             return false;
  49.         }
  50.  
  51.         player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Play Simon Says", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
  52.         player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Nevermind..", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
  53.         player->SEND_GOSSIP_MENU(1, creature->GetGUID());
  54.  
  55.         return true;
  56.     }
  57.  
  58.     bool OnGossipSelect(Player* player, Creature* creature, uint32 /* sender */, uint32 actions) override
  59.     {
  60.         player->PlayerTalkClass->ClearMenus();
  61.         simon_himselfAI* simonAI = CAST_AI(simon_himselfAI, creature->GetAI());
  62.  
  63.         if (actions == GOSSIP_ACTION_INFO_DEF)
  64.         {
  65.             simonAI->Start(player->GetGUID());
  66.             player->CLOSE_GOSSIP_MENU();
  67.         }
  68.         else
  69.             player->CLOSE_GOSSIP_MENU();
  70.  
  71.         return true;
  72.     }
  73.  
  74.     struct simon_himselfAI : public ScriptedAI
  75.     {
  76.         simon_himselfAI(Creature* creature) : ScriptedAI(creature) { }
  77.  
  78.         EventMap events;
  79.         ObjectGuid playerGUID;
  80.         int killTimer;
  81.         int eventCheck;
  82.         float x, y, z;
  83.  
  84.         void Reset() override
  85.         {
  86.             events.Reset();
  87.             eventCheck = 0;
  88.             killTimer = 0;
  89.         }
  90.  
  91.         void UpdateAI(uint32 diff) override
  92.         {
  93.             events.Update(diff);
  94.             while (uint32 eventId = events.ExecuteEvent())
  95.             {
  96.                 switch (eventId)
  97.                 {
  98.                     case EVENT_EXPLAIN_1:
  99.                         Explain("Waz up!? Today, we're going to play Simon Says! What's Simon says? Well, you do as I say and you will win! Else, you will BE A LOSER!");
  100.                         events.ScheduleEvent(EVENT_EXPLAIN_2, 7000);
  101.                         break;
  102.                     case EVENT_EXPLAIN_2:
  103.                         Explain("Let's play.");
  104.                         events.ScheduleEvent(EVENT_SPOTLIGHT_1, 3000);
  105.                         break;
  106.                     case EVENT_SPOTLIGHT_1:
  107.                         me->GetPosition(x, y, z);
  108.                         spotLight = me->SummonCreature(NPC_SPOTLIGHT_ONE, x, y - 7, z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
  109.                         AddLight(spotLight);
  110.                         Explain("We're going to play a game called spotlight! Alright, Simon Says jump into the spotlight!");
  111.                         events.ScheduleEvent(EVENT_CHECK_SPOTLIGHT, 1000);
  112.                         break;
  113.                     case EVENT_CHECK_SPOTLIGHT:
  114.                         if (spotLight)
  115.                         {
  116.                             if (CheckPlayerDistance(spotLight) <= 2.0f && eventCheck == 0)
  117.                             {
  118.                                 events.CancelEvent(EVENT_CHECK_SPOTLIGHT);
  119.                                 spotLight->DespawnOrUnsummon(100);
  120.                                 Explain("Ha! Okay, that much was obvious!");
  121.                                 events.ScheduleEvent(EVENT_EXPLAIN_SPOTLIGHT, 2000);
  122.                                 eventCheck++;
  123.                             }
  124.                         }
  125.                         if (eventCheck == 0)
  126.                             events.ScheduleEvent(EVENT_CHECK_SPOTLIGHT, 1000);
  127.                         break;
  128.                     case EVENT_EXPLAIN_SPOTLIGHT:
  129.                         Explain("Now I want you to beg for mercy! Wait.. that was harsh.. Simon says GET INTO THE SPOTLIGHT YOU WERE PREVIOUSLY IN!");
  130.                         events.ScheduleEvent(EVENT_SPOTLIGHT_2, 8000);
  131.                         break;
  132.                     case EVENT_SPOTLIGHT_2:
  133.                         spotLight = me->SummonCreature(NPC_SPOTLIGHT_ONE, x - 10, y - 7, z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
  134.                         spotLightTwo = me->SummonCreature(NPC_SPOTLIGHT_TWO, x + 10, y - 7, z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
  135.                         spotLightThree = me->SummonCreature(NPC_SPOTLIGHT_THREE, x + 25, y, z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
  136.                         AddLight(spotLight);
  137.                         AddLight(spotLightTwo);
  138.                         AddLight(spotLightThree);
  139.                         events.ScheduleEvent(EVENT_CHECK_SPOTLIGHT_2, 1000);
  140.                         break;
  141.                     case EVENT_CHECK_SPOTLIGHT_2:
  142.                         if (spotLight && spotLightTwo && spotLightThree)
  143.                         {
  144.                             if (CheckPlayerDistance(spotLightTwo) <= 2.0f || CheckPlayerDistance(spotLightThree) <= 2.0f)
  145.                             {
  146.                                 spotLight->DespawnOrUnsummon(100);
  147.                                 spotLightTwo->DespawnOrUnsummon(100);
  148.                                 spotLightThree->DespawnOrUnsummon(100);
  149.                                 _Reset();
  150.                                 Explain("HAHA, you lost! No rewards for you!");
  151.                                 return;
  152.                             }
  153.  
  154.                             if (CheckPlayerDistance(spotLight) <= 2.0f && eventCheck == 1)
  155.                             {
  156.                                 events.CancelEvent(EVENT_CHECK_SPOTLIGHT_2);
  157.                                 spotLight->DespawnOrUnsummon(100);
  158.                                 spotLightTwo->DespawnOrUnsummon(100);
  159.                                 spotLightThree->DespawnOrUnsummon(100);
  160.                                 Explain("Darn! You actually did it... Simon is getting MAD!");
  161.                                 eventCheck++;
  162.                                 events.ScheduleEvent(EVENT_EXPLAIN_KILL_CREATURE, 5000);
  163.                             }
  164.                         }
  165.                         if (eventCheck == 1)
  166.                             events.ScheduleEvent(EVENT_CHECK_SPOTLIGHT_2, 1000);
  167.                         break;
  168.                     case EVENT_EXPLAIN_KILL_CREATURE:
  169.                         Explain("Simon says kill this Fire Hawk in 6 seconds!");
  170.                         events.ScheduleEvent(EVENT_EXPLAIN_KILL_CREATURE_START, 5000);
  171.                         break;
  172.                     case EVENT_EXPLAIN_KILL_CREATURE_START:
  173.                         Explain("GO!");
  174.                         fireHawk = me->SummonCreature(NPC_FIRE_HAWK, x, y - 5, z, 1.0, TEMPSUMMON_MANUAL_DESPAWN, 0);
  175.                         events.ScheduleEvent(EVENT_CHECK_KILL_CREATURE, 1000);
  176.                         break;
  177.                     case EVENT_CHECK_KILL_CREATURE:
  178.                         if (fireHawk)
  179.                         {
  180.                             if (killTimer >= 6 && eventCheck == 2)
  181.                             {
  182.                                 if (!fireHawk->IsAlive())
  183.                                 {
  184.                                      events.CancelEvent(EVENT_CHECK_KILL_CREATURE);
  185.                                      fireHawk->DespawnOrUnsummon(100);
  186.                                      Explain("Wow, you win! Congratulations!");
  187.                                      WinOrLose(true);
  188.                                      eventCheck++;
  189.                                      _Reset();
  190.                                 }
  191.                                 else
  192.                                 {
  193.                                     fireHawk->DespawnOrUnsummon(100);
  194.                                     _Reset();
  195.                                     Explain("HA, you lose!");
  196.                                 }
  197.                             }
  198.                             killTimer++;
  199.                         }
  200.                         if (eventCheck == 2)
  201.                             events.ScheduleEvent(EVENT_CHECK_KILL_CREATURE, 1000);
  202.                         break;
  203.                 }
  204.             }
  205.         }
  206.  
  207.         float CheckPlayerDistance(Creature* target)
  208.         {
  209.             if (!target)
  210.                 return 0;
  211.  
  212.             if (Player* player = ObjectAccessor::GetPlayer(*target, playerGUID))
  213.                 return target->GetDistance2d(player);
  214.             return NULL;
  215.         }
  216.  
  217.         void Explain(const char* msg)
  218.         {
  219.             me->Say(msg, LANG_UNIVERSAL, 0);
  220.             me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
  221.         }
  222.  
  223.         void WinOrLose(bool won) // Call this if the player wins or loses
  224.         {
  225.             Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
  226.             if (player)
  227.             {
  228.                 if (player->GetGUID() == playerGUID)
  229.                 {
  230.                     if (won) // If the player won
  231.                     {
  232.                     }
  233.                     else // If the player lost
  234.                     {
  235.                     }
  236.                 }
  237.             }
  238.         }
  239.  
  240.         void Start(ObjectGuid guid) // Starts the event
  241.         {
  242.             playerGUID = guid;
  243.             me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
  244.             events.ScheduleEvent(EVENT_EXPLAIN_1, 1000);
  245.         }
  246.  
  247.         void AddLight(Creature* creature) // Adds spotlight to the specified creature
  248.         {
  249.             if (!creature)
  250.                 return;
  251.  
  252.             creature->AddAura(SPELL_SPOTLIGHT, creature);
  253.         }
  254.  
  255.         void _Reset()
  256.         {
  257.             spotLight = NULL;
  258.             spotLightTwo = NULL;
  259.             spotLightThree = NULL;
  260.             fireHawk = NULL;
  261.             eventCheck = 0;
  262.             killTimer = 0;
  263.             isEventActive = false;
  264.             me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  265.             events.Reset();
  266.         }
  267.  
  268.         private:
  269.             Creature* spotLight;
  270.             Creature* spotLightTwo;
  271.             Creature* spotLightThree;
  272.             Creature* fireHawk;
  273.     };
  274.  
  275.     CreatureAI* GetAI(Creature* creature) const override
  276.     {
  277.         return new simon_himselfAI(creature);
  278.     }
  279. };
  280.  
  281. void AddSC_simon_says()
  282. {
  283.     new simon_himself();
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement