diff options
author | Kittnz <Kittnz@users.noreply.github.com> | 2018-01-13 12:22:36 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-06-13 22:30:10 +0200 |
commit | 267aeddc05eddad47c9a621fc64bdddeceb3a7ec (patch) | |
tree | f66cb1e75821b1c7e31f96a00251f968fd69934c /src | |
parent | cc94c3eb5062ac2609f3cda0a8760b324d17415d (diff) |
Scripts/EasternKingdoms: implement Children of Goldshire event (#20745)
* Script: Implement Childeren of Goldshire
Notes: Need to update waypoints and default location of the childeren
http://wowwiki.wikia.com/wiki/Children_of_Goldshire
(cherry picked from commit a9c853ee3fc13d1aa59bde14df8f1f0a5b035ff3)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/zone_goldshire.cpp | 280 |
2 files changed, 282 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 b4a130982d7..f09413dc16f 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_ghostlands(); +void AddSC_goldshire(); void AddSC_hinterlands(); void AddSC_redridge_mountains(); void AddSC_silverpine_forest(); @@ -382,6 +383,7 @@ void AddEasternKingdomsScripts() AddSC_duskwood(); //AddSC_eastern_plaguelands(); AddSC_ghostlands(); + AddSC_goldshire(); AddSC_hinterlands(); AddSC_redridge_mountains(); AddSC_silverpine_forest(); diff --git a/src/server/scripts/EasternKingdoms/zone_goldshire.cpp b/src/server/scripts/EasternKingdoms/zone_goldshire.cpp new file mode 100644 index 00000000000..3ba89e98f1f --- /dev/null +++ b/src/server/scripts/EasternKingdoms/zone_goldshire.cpp @@ -0,0 +1,280 @@ +/* + * Copyright (C) 2008-2018 TrinityCore <http://www.trinitycore.org/> + * + * 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 "CreatureAIImpl.h" +#include "CreatureGroups.h" +#include "GameEventMgr.h" +#include "GameTime.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "ScriptedCreature.h" + +enum COG_Paths +{ + STORMWIND_PATH = 80500, + GOLDSHIRE_PATH = 80501, + WOODS_PATH = 80502, + HOUSE_PATH = 80503, + LISA_PATH = 80700 +}; + +enum COG_Waypoints +{ + STORMWIND_WAYPOINT = 57, + GOLDSHIRE_WAYPOINT = 32, + WOODS_WAYPOINT = 22, + HOUSE_WAYPOINT = 35, + LISA_WAYPOINT = 4 +}; + +enum COG_Sounds +{ + BANSHEE_DEATH = 1171, + BANSHEEPREAGGRO = 1172, + CTHUN_YOU_WILL_DIE = 8585, + CTHUN_DEATH_IS_CLOSE = 8580, + HUMAN_FEMALE_EMOTE_CRY = 6916, + GHOSTDEATH = 3416 +}; + +enum COG_Creatures +{ + NPC_DANA = 804, + NPC_CAMERON = 805, + NPC_JOHN = 806, + NPC_LISA = 807, + NPC_AARON = 810, + NPC_JOSE = 811 +}; + +enum COG_Events +{ + EVENT_WP_START_GOLDSHIRE = 1, + EVENT_WP_START_WOODS = 2, + EVENT_WP_START_HOUSE = 3, + EVENT_WP_START_LISA = 4, + EVENT_PLAY_SOUNDS = 5, + EVENT_BEGIN_EVENT = 6 +}; + +enum COG_GameEvent +{ + GAME_EVENT_CHILDEREN_OF_GOLDSHIRE = 76 +}; + +struct npc_cameron : public ScriptedAI +{ + npc_cameron(Creature* creature) : ScriptedAI(creature) + { + _started = false; + } + + static uint32 SoundPicker() + { + return RAND( + BANSHEE_DEATH, + BANSHEEPREAGGRO, + CTHUN_YOU_WILL_DIE, + CTHUN_DEATH_IS_CLOSE, + HUMAN_FEMALE_EMOTE_CRY, + GHOSTDEATH + ); + } + + void MoveTheChildren() + { + std::vector<Position> MovePosPositions = + { + { -9373.521f, -67.71767f, 69.201965f, 1.117011f }, + { -9374.94f, -62.51654f, 69.201965f, 5.201081f }, + { -9371.013f, -71.20811f, 69.201965f, 1.937315f }, + { -9368.419f, -66.47543f, 69.201965f, 3.141593f }, + { -9372.376f, -65.49946f, 69.201965f, 4.206244f }, + { -9377.477f, -67.8297f, 69.201965f, 0.296706f } + }; + + Trinity::Containers::RandomShuffle(MovePosPositions); + + // first we break formation because children will need to move on their own now + for (ObjectGuid guid : _childrenGUIDs) + if (Creature* child = ObjectAccessor::GetCreature(*me, guid)) + if (child->GetFormation()) + child->GetFormation()->RemoveMember(child); + + // Move each child to an random position + for (uint32 i = 0; i < _childrenGUIDs.size(); ++i) + { + if (Creature* children = ObjectAccessor::GetCreature(*me, _childrenGUIDs[i])) + { + children->SetWalk(true); + children->GetMotionMaster()->MovePoint(0, MovePosPositions[i], true, MovePosPositions[i].GetOrientation()); + } + } + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, MovePosPositions.back(), true, MovePosPositions.back().GetOrientation()); + } + + void WaypointReached(uint32 waypointId, uint32 pathId) override + { + switch (pathId) + { + case STORMWIND_PATH: + { + if (waypointId == STORMWIND_WAYPOINT) + { + me->GetMotionMaster()->MoveRandom(10.f); + _events.ScheduleEvent(EVENT_WP_START_GOLDSHIRE, 11min); + } + + break; + } + case GOLDSHIRE_PATH: + { + if (waypointId == GOLDSHIRE_WAYPOINT) + { + me->GetMotionMaster()->MoveRandom(10.f); + _events.ScheduleEvent(EVENT_WP_START_WOODS, 15min); + } + break; + } + case WOODS_PATH: + { + if (waypointId == WOODS_WAYPOINT) + { + me->GetMotionMaster()->MoveRandom(10.f); + _events.ScheduleEvent(EVENT_WP_START_HOUSE, 6min); + _events.ScheduleEvent(EVENT_WP_START_LISA, 2s); + } + + break; + } + case HOUSE_PATH: + { + if (waypointId == HOUSE_WAYPOINT) + { + // Move childeren at last point + MoveTheChildren(); + + // After 30 seconds a random sound should play + _events.ScheduleEvent(EVENT_PLAY_SOUNDS, 30s); + } + break; + } + } + } + + void OnGameEvent(bool start, uint16 eventId) override + { + if (start && eventId == GAME_EVENT_CHILDEREN_OF_GOLDSHIRE) + { + // Start event at 7 am + // Begin pathing + _events.ScheduleEvent(EVENT_BEGIN_EVENT, 2s); + _started = true; + } + else if (!start && eventId == GAME_EVENT_CHILDEREN_OF_GOLDSHIRE) + { + // Reset event at 8 am + _started = false; + _events.Reset(); + } + } + + void UpdateAI(uint32 diff) override + { + if (!_started) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_WP_START_GOLDSHIRE: + me->GetMotionMaster()->MovePath(GOLDSHIRE_PATH, false); + break; + case EVENT_WP_START_WOODS: + me->GetMotionMaster()->MovePath(WOODS_PATH, false); + break; + case EVENT_WP_START_HOUSE: + me->GetMotionMaster()->MovePath(HOUSE_PATH, false); + break; + case EVENT_WP_START_LISA: + for (ObjectGuid guid : _childrenGUIDs) + { + if (Creature* child = ObjectAccessor::GetCreature(*me, guid)) + { + if (child->GetEntry() == NPC_LISA) + { + child->GetMotionMaster()->MovePath(LISA_PATH, false); + break; + } + } + } + break; + case EVENT_PLAY_SOUNDS: + me->PlayDistanceSound(SoundPicker()); + break; + case EVENT_BEGIN_EVENT: + { + _childrenGUIDs.clear(); + + // Get all childeren's guid's. + if (Creature* dana = me->FindNearestCreature(NPC_DANA, 25.0f)) + _childrenGUIDs.push_back(dana->GetGUID()); + + if (Creature* john = me->FindNearestCreature(NPC_JOHN, 25.0f)) + _childrenGUIDs.push_back(john->GetGUID()); + + if (Creature* lisa = me->FindNearestCreature(NPC_LISA, 25.0f)) + _childrenGUIDs.push_back(lisa->GetGUID()); + + if (Creature* aaron = me->FindNearestCreature(NPC_AARON, 25.0f)) + _childrenGUIDs.push_back(aaron->GetGUID()); + + if (Creature* jose = me->FindNearestCreature(NPC_JOSE, 25.0f)) + _childrenGUIDs.push_back(jose->GetGUID()); + + // If Formation was disbanded, remake. + if (!me->GetFormation()->isFormed()) + for (ObjectGuid guid : _childrenGUIDs) + if (Creature* child = ObjectAccessor::GetCreature(*me, guid)) + child->SearchFormation(); + + // Start movement + me->GetMotionMaster()->MovePath(STORMWIND_PATH, false); + + break; + } + default: + break; + } + } + } + +private: + EventMap _events; + bool _started; + GuidVector _childrenGUIDs; +}; + +void AddSC_goldshire() +{ + RegisterCreatureAI(npc_cameron); +} |