diff options
author | Malcrom <malcromdev@gmail.com> | 2021-10-08 13:32:31 -0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-19 23:47:01 +0100 |
commit | 64933d033e82c4ca5cafae9ff5621e14737dc62d (patch) | |
tree | 83082c38e29e54f37c7a7d66ea2146adb8f37ba8 /src/server/scripts/World | |
parent | 5b9686de23e04e5282f6a50fe63c76caadfc47b8 (diff) |
Script/World: Brewfest Reveler Script (#27031)
(cherry picked from commit 83ae8fc5197f90ba97de2e961f7c98e3c567837b)
Diffstat (limited to 'src/server/scripts/World')
-rw-r--r-- | src/server/scripts/World/npcs_special.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 46e0bbdc20c..4ebe7e96499 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1441,6 +1441,115 @@ class npc_brewfest_reveler : public CreatureScript } }; +/*###### +# npc_brewfest_reveler_2 +######*/ + +Emote const BrewfestRandomEmote[] = +{ + EMOTE_ONESHOT_QUESTION, + EMOTE_ONESHOT_APPLAUD, + EMOTE_ONESHOT_SHOUT, + EMOTE_ONESHOT_EAT_NO_SHEATHE, + EMOTE_ONESHOT_LAUGH_NO_SHEATHE +}; + +struct npc_brewfest_reveler_2 : ScriptedAI +{ + enum BrewfestReveler2 + { + NPC_BREWFEST_REVELER = 24484, + + EVENT_FILL_LIST = 1, + EVENT_FACE_TO = 2, + EVENT_EMOTE = 3, + EVENT_NEXT = 4 + }; + + npc_brewfest_reveler_2(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + _events.Reset(); + _events.ScheduleEvent(EVENT_FILL_LIST, 1s, 2s); + } + + // Copied from old script. I don't know if this is 100% correct. + void ReceiveEmote(Player* player, uint32 emote) override + { + if (!IsHolidayActive(HOLIDAY_BREWFEST)) + return; + + if (emote == TEXT_EMOTE_DANCE) + me->CastSpell(player, SPELL_BREWFEST_TOAST, false); + } + + void UpdateAI(uint32 diff) override + { + UpdateVictim(); + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FILL_LIST: + { + std::list<Creature*> creatureList; + GetCreatureListWithEntryInGrid(creatureList, me, NPC_BREWFEST_REVELER, 5.0f); + for (Creature* creature : creatureList) + if (creature != me) + _revelerGuids.push_back(creature->GetGUID()); + + _events.ScheduleEvent(EVENT_FACE_TO, 1s, 2s); + break; + } + case EVENT_FACE_TO: + { + // Turn to random brewfest reveler within set range + if (!_revelerGuids.empty()) + if (Creature* creature = ObjectAccessor::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(_revelerGuids))) + me->SetFacingToObject(creature); + + _events.ScheduleEvent(EVENT_EMOTE, 2s, 6s); + break; + } + case EVENT_EMOTE: + // Play random emote or dance + if (roll_chance_i(50)) + { + me->HandleEmoteCommand(Trinity::Containers::SelectRandomContainerElement(BrewfestRandomEmote)); + _events.ScheduleEvent(EVENT_NEXT, 4s, 6s); + } + else + { + me->SetEmoteState(EMOTE_STATE_DANCE); + _events.ScheduleEvent(EVENT_NEXT, 8s, 12s); + } + break; + case EVENT_NEXT: + // If dancing stop before next random state + if (me->GetEmoteState() == EMOTE_STATE_DANCE) + me->SetEmoteState(EMOTE_ONESHOT_NONE); + + // Random EVENT_EMOTE or EVENT_FACETO + if (roll_chance_i(50)) + _events.ScheduleEvent(EVENT_FACE_TO, 1s); + else + _events.ScheduleEvent(EVENT_EMOTE, 1s); + break; + default: + break; + } + } + } + +private: + EventMap _events; + GuidVector _revelerGuids; +}; + struct npc_training_dummy : NullCreatureAI { npc_training_dummy(Creature* creature) : NullCreatureAI(creature) { } @@ -2503,6 +2612,7 @@ void AddSC_npcs_special() new npc_steam_tonk(); new npc_tournament_mount(); new npc_brewfest_reveler(); + RegisterCreatureAI(npc_brewfest_reveler_2); RegisterCreatureAI(npc_training_dummy); new npc_wormhole(); new npc_experience(); |