aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/World
diff options
context:
space:
mode:
authorMalcrom <malcromdev@gmail.com>2021-10-08 13:32:31 -0300
committerShauren <shauren.trinity@gmail.com>2022-03-19 23:47:01 +0100
commit64933d033e82c4ca5cafae9ff5621e14737dc62d (patch)
tree83082c38e29e54f37c7a7d66ea2146adb8f37ba8 /src/server/scripts/World
parent5b9686de23e04e5282f6a50fe63c76caadfc47b8 (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.cpp110
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();