aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMalcrom <malcromdev@gmail.com>2022-10-04 05:24:54 -0300
committerShauren <shauren.trinity@gmail.com>2022-10-13 11:44:15 +0200
commitfee5160fe5f2762b2e739564c68632caf0efc94c (patch)
treec7257cdc53ecffa656fa34541088bce88a8d677d /src
parentf9699a3fca8a4bc84f2161edb1f03f62513a8692 (diff)
Scripts/Eversong Woords: Add cosmetic script for a party (#28308)
(cherry picked from commit 0174e6ba809172e29a0fc87962e1b88cd42d572a)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp216
2 files changed, 218 insertions, 0 deletions
diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
index 7ae0ad9a165..d300c894b33 100644
--- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
+++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
@@ -191,6 +191,7 @@ void AddSC_dun_morogh_area_coldridge_valley();
void AddSC_duskwood();
void AddSC_eastern_plaguelands();
void AddSC_elwynn_forest();
+void AddSC_eversong_woods();
//void AddSC_ghostlands();
void AddSC_hinterlands();
void AddSC_isle_of_queldanas();
@@ -383,6 +384,7 @@ void AddEasternKingdomsScripts()
AddSC_duskwood();
AddSC_eastern_plaguelands();
AddSC_elwynn_forest();
+ AddSC_eversong_woods();
//AddSC_ghostlands();
AddSC_hinterlands();
AddSC_isle_of_queldanas();
diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
new file mode 100644
index 00000000000..ac982ea88b5
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
@@ -0,0 +1,216 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * 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/>.
+ */
+
+#include "ScriptMgr.h"
+#include "GameObject.h"
+#include "MotionMaster.h"
+#include "ScriptedCreature.h"
+
+enum Partygoer_Pather
+{
+ EVENT_PATH = 1,
+ EVENT_RANDOM_ACTION_PATHER,
+ EVENT_REMOVE_EQUIPMENT_PATHER,
+ EVENT_STOP_DANCING_PATHER,
+
+ PATH_FIRST_PATH = 594440,
+ PATH_LAST_PATH = 594444,
+};
+
+struct npc_partygoer_pather : public ScriptedAI
+{
+ npc_partygoer_pather(Creature* creature) : ScriptedAI(creature), _path(PATH_FIRST_PATH) { }
+
+ void JustAppeared() override
+ {
+ _path = PATH_FIRST_PATH;
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION_PATHER, 11s, 14s);
+ }
+
+ void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
+ {
+ ++_path;
+ if (_path > PATH_LAST_PATH)
+ _path = PATH_FIRST_PATH;
+
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION_PATHER, 11s, 14s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_PATH:
+ me->GetMotionMaster()->MovePath(_path, false);
+ break;
+ case EVENT_RANDOM_ACTION_PATHER:
+ {
+ int8 action = urand(1, 5);
+
+ switch (action)
+ {
+ case 1:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ _events.ScheduleEvent(EVENT_PATH, 11s);
+ break;
+ case 2:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
+ _events.ScheduleEvent(EVENT_PATH, 11s);
+ break;
+ case 3:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
+ _events.ScheduleEvent(EVENT_PATH, 11s);
+ break;
+ case 4:
+ me->LoadEquipment(urand(1, 2));
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EAT_NO_SHEATHE);
+ _events.ScheduleEvent(EVENT_REMOVE_EQUIPMENT_PATHER, 4s);
+ break;
+ case 5:
+ me->SetEmoteState(EMOTE_STATE_DANCE);
+ _events.ScheduleEvent(EVENT_STOP_DANCING_PATHER, 6s);
+ break;
+ }
+ break;
+ }
+ case EVENT_REMOVE_EQUIPMENT_PATHER:
+ me->LoadEquipment(0, true);
+ _events.ScheduleEvent(EVENT_PATH, 8s);
+ break;
+ case EVENT_STOP_DANCING_PATHER:
+ me->SetEmoteState(EMOTE_ONESHOT_NONE);
+ _events.ScheduleEvent(EVENT_PATH, 5s);
+ break;
+ }
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ EventMap _events;
+ uint32 _path;
+};
+
+enum Partygoer
+{
+ EVENT_RANDOM_ACTION = 1,
+ EVENT_REMOVE_EQUIPMENT,
+ EVENT_STOP_DANCING,
+ EVENT_THROW_FIREWORKS,
+ EVENT_RESET_FACING,
+
+ GO_FIREWORKS_LAUNCHER = 180771,
+
+ SPELL_SMALL_YELLOW_ROCKET = 26295
+};
+
+struct npc_partygoer : public ScriptedAI
+{
+ npc_partygoer(Creature* creature) : ScriptedAI(creature), _facing(0.0f) { }
+
+ void JustAppeared() override
+ {
+ _facing = me->GetOrientation();
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 1s, 20s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RANDOM_ACTION:
+ {
+ int8 action = urand(1, 6);
+
+ switch (action)
+ {
+ case 1:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 13s, 20s);
+ break;
+ case 2:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 13s, 20s);
+ break;
+ case 3:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 13s, 20s);
+ break;
+ case 4:
+ me->LoadEquipment(urand(1, 2));
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EAT_NO_SHEATHE);
+ _events.ScheduleEvent(EVENT_REMOVE_EQUIPMENT, 4s);
+ break;
+ case 5:
+ me->SetEmoteState(EMOTE_STATE_DANCE);
+ _events.ScheduleEvent(EVENT_STOP_DANCING, 8s, 16s);
+ break;
+ case 6:
+ if (GameObject* launcher = me->FindNearestGameObject(GO_FIREWORKS_LAUNCHER, 20.0f))
+ me->SetFacingToObject(launcher);
+ _events.ScheduleEvent(EVENT_THROW_FIREWORKS, 1s);
+ break;
+ }
+ break;
+ }
+ case EVENT_REMOVE_EQUIPMENT:
+ me->LoadEquipment(0, true);
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 10s, 20s);
+ break;
+ case EVENT_STOP_DANCING:
+ me->SetEmoteState(EMOTE_ONESHOT_NONE);
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 10s, 20s);
+ break;
+ case EVENT_THROW_FIREWORKS:
+ me->CastSpell(me, SPELL_SMALL_YELLOW_ROCKET);
+ _events.ScheduleEvent(EVENT_RESET_FACING, 3s);
+ break;
+ case EVENT_RESET_FACING:
+ me->SetFacingTo(_facing);
+ _events.ScheduleEvent(EVENT_RANDOM_ACTION, 12s, 20s);
+ break;
+ }
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ EventMap _events;
+ float _facing;
+};
+
+void AddSC_eversong_woods()
+{
+ RegisterCreatureAI(npc_partygoer_pather);
+ RegisterCreatureAI(npc_partygoer);
+}