diff options
Diffstat (limited to 'src/server/scripts/EasternKingdoms')
-rw-r--r-- | src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/zone_ghostlands.cpp | 197 |
2 files changed, 199 insertions, 2 deletions
diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index 8316eec13f4..d7251e164f9 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -191,7 +191,7 @@ void AddSC_duskwood(); void AddSC_eastern_plaguelands(); void AddSC_elwynn_forest(); void AddSC_eversong_woods(); -//void AddSC_ghostlands(); +void AddSC_ghostlands(); void AddSC_hinterlands(); void AddSC_isle_of_queldanas(); void AddSC_redridge_mountains(); @@ -383,7 +383,7 @@ void AddEasternKingdomsScripts() AddSC_eastern_plaguelands(); AddSC_elwynn_forest(); AddSC_eversong_woods(); - //AddSC_ghostlands(); + AddSC_ghostlands(); AddSC_hinterlands(); AddSC_isle_of_queldanas(); AddSC_redridge_mountains(); diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp new file mode 100644 index 00000000000..e8da42e9db4 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -0,0 +1,197 @@ +/* + * 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 "AreaTrigger.h" +#include "AreaTriggerAI.h" +#include "Containers.h" +#include "Conversation.h" +#include "ConversationAI.h" +#include "CreatureAIImpl.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "Player.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "TemporarySummon.h" + +enum ToGhostlandsData +{ + NPC_SUMMONED_HIGH_ELF_RANGER = 130919, + + QUEST_TO_GHOSTLANDS = 49787, + + CONVO_SANCTUM_OF_THE_MOON = 6467, + CONVO_SANCTUM_OF_THE_MOON_FOLLOWUP = 6634, + CONVO_ANDILIEN_ESTATE = 6469, + CONVO_ANDILIEN_ESTATE_FOLLOWUP = 6479, + CONVO_DAWNSPAIR_SPIRE = 6470, + CONVO_DAWNSPAIR_SPIRE_UP = 6637, + CONVO_DAWNSPAIR_SPIRE_FOLLOWUP = 6471, + + CONVO_ACTOR_HIGH_ELF_RANGER = 61831 +}; + +// 6468 - Conversation +class conversation_high_elf_ranger_to_ghostlands : public ConversationAI +{ +public: + using ConversationAI::ConversationAI; + + void OnCreate(Unit* creator) override + { + Creature* highElfRanger = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_SUMMONED_HIGH_ELF_RANGER, .IgnorePhases = true, .OwnerGuid = creator->GetGUID() }); + if (!highElfRanger) + return; + + conversation->AddActor(CONVO_ACTOR_HIGH_ELF_RANGER, 0, highElfRanger->GetGUID()); + conversation->Start(); + } +}; + +// 6478 - Conversation +// 6635 - Conversation +template<uint32 ConversationId> +class conversation_ghostlands_start_convo_on_end : public ConversationAI +{ +public: + using ConversationAI::ConversationAI; + + void OnStart() override + { + conversation->m_Events.AddEvent([conversation = conversation]() + { + Player* player = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner()); + if (!player) + return; + + Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID(), nullptr, true); + }, conversation->GetLastLineEndTime(conversation->GetPrivateObjectOwnerLocale())); + } +}; + +// 6636 - Conversation +class conversation_dawnspair_spire_to_ghostlands : public ConversationAI +{ +public: + using ConversationAI::ConversationAI; + + static constexpr Position AlleriaMoveToBookPosition = { 7835.05f, -7913.11f, 308.2204f }; + + enum DawnspairSpireConvoData + { + POINT_ALLERIA_MOVE_TO_BOOK = 1 + }; + + void OnCreate(Unit* creator) override + { + Creature* highElfRanger = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_SUMMONED_HIGH_ELF_RANGER, .IgnorePhases = true, .OwnerGuid = creator->GetGUID() }); + if (!highElfRanger) + return; + + TempSummon* alleriaClone = highElfRanger->SummonPersonalClone(highElfRanger->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); // despawn on map change, quest remove, logout + if (!alleriaClone) + return; + + alleriaClone->GetMotionMaster()->MovePoint(POINT_ALLERIA_MOVE_TO_BOOK, AlleriaMoveToBookPosition, true, {}, {}, MovementWalkRunSpeedSelectionMode::ForceWalk); + } + + void OnStart() override + { + conversation->m_Events.AddEvent([conversation = conversation]() + { + Player* player = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner()); + if (!player) + return; + + Conversation::CreateConversation(CONVO_DAWNSPAIR_SPIRE_FOLLOWUP, player, *player, player->GetGUID(), nullptr, true); + }, conversation->GetLastLineEndTime(conversation->GetPrivateObjectOwnerLocale())); + } +}; + +// 6471 - Conversation +class conversation_dawnspair_spire_followup_to_ghostlands : public ConversationAI +{ +public: + using ConversationAI::ConversationAI; + + static constexpr Position AlleriaOpenRiftPosition = { 7832.54f, -7913.34f, 308.2204f }; + + enum DawnspairSpireFollowupConvoData + { + POINT_ALLERIA_OPEN_PORTAL = 2 + }; + + void OnCreate(Unit* creator) override + { + Creature* alleriaClone = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_SUMMONED_HIGH_ELF_RANGER, .IgnorePhases = true, .PrivateObjectOwnerGuid = creator->GetGUID() }); + if (!alleriaClone) + return; + + conversation->AddActor(CONVO_ACTOR_HIGH_ELF_RANGER, 0, alleriaClone->GetGUID()); + conversation->Start(); + } + + void OnStart() override + { + conversation->m_Events.AddEvent([conversation = conversation]() + { + Creature* alleriaClone = conversation->GetActorCreature(0); + if (!alleriaClone) + return; + + alleriaClone->GetMotionMaster()->MovePoint(POINT_ALLERIA_OPEN_PORTAL, AlleriaOpenRiftPosition, true, {}, {}, MovementWalkRunSpeedSelectionMode::ForceWalk); + + }, conversation->GetLastLineEndTime(conversation->GetPrivateObjectOwnerLocale())); + } +}; + +// 100 - Ghostlands - Sanctum of the Moon +// 101 - Ghostlands - Andilien Estate +// 102 - Ghostlands - Dawnspair Spire +// 103 - Ghostlands - Dawnspair Spire second floor +template<uint32 QuestId, uint32 ConversationId> +struct at_ghostlands_conversation_to_ghostlands : AreaTriggerAI +{ + at_ghostlands_conversation_to_ghostlands(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) {} + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player || player->GetQuestStatus(QuestId) != QUEST_STATUS_INCOMPLETE) + return; + + Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID(), nullptr, true); + } +}; + +void AddSC_ghostlands() +{ + // Conversation + RegisterConversationAI(conversation_high_elf_ranger_to_ghostlands); + RegisterConversationAI(conversation_dawnspair_spire_to_ghostlands); + RegisterConversationAI(conversation_dawnspair_spire_followup_to_ghostlands); + + // Conversation Template + new GenericConversationScript<conversation_ghostlands_start_convo_on_end<CONVO_SANCTUM_OF_THE_MOON_FOLLOWUP>>("conversation_sanctum_of_the_moon_to_ghostlands"); + new GenericConversationScript<conversation_ghostlands_start_convo_on_end<CONVO_ANDILIEN_ESTATE_FOLLOWUP>>("conversation_andilien_estate_to_ghostlands"); + + // Areatrigger Template + new GenericAreaTriggerEntityScript<at_ghostlands_conversation_to_ghostlands<QUEST_TO_GHOSTLANDS, CONVO_SANCTUM_OF_THE_MOON>>("at_ghostlands_sanctum_of_the_moon_conversation"); + new GenericAreaTriggerEntityScript<at_ghostlands_conversation_to_ghostlands<QUEST_TO_GHOSTLANDS, CONVO_ANDILIEN_ESTATE>>("at_ghostlands_andilien_estate_conversation"); + new GenericAreaTriggerEntityScript<at_ghostlands_conversation_to_ghostlands<QUEST_TO_GHOSTLANDS, CONVO_DAWNSPAIR_SPIRE>>("at_ghostlands_dawnspair_spire_conversation"); + new GenericAreaTriggerEntityScript<at_ghostlands_conversation_to_ghostlands<QUEST_TO_GHOSTLANDS, CONVO_DAWNSPAIR_SPIRE_UP>>("at_ghostlands_dawnspair_spire_second_floor_conversation"); +} |