diff options
-rw-r--r-- | sql/updates/world/master/2023_07_04_00_world.sql | 60 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp | 287 |
2 files changed, 346 insertions, 1 deletions
diff --git a/sql/updates/world/master/2023_07_04_00_world.sql b/sql/updates/world/master/2023_07_04_00_world.sql new file mode 100644 index 00000000000..765b8c0e2f1 --- /dev/null +++ b/sql/updates/world/master/2023_07_04_00_world.sql @@ -0,0 +1,60 @@ +SET @ATID := 23; +SET @ATIDSPAWN := 24; + +-- Creature +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement' WHERE `entry` = 198896; +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement' WHERE `entry` = 198883; + +DELETE FROM `creature_template_addon` WHERE `entry` IN (198883 /*198883 (Vanessa VanCleef) - Stealth*/); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(198883, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '228928'); -- 198883 (Vanessa VanCleef) - Stealth + +-- Delete SAI Script +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = 198896; + +-- ScriptNames +DELETE FROM `spell_script_names` WHERE `spell_id` = 228928; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(228928, 'spell_stealth_vanessa_human_heritage'); + +-- Quest objective completion effect +DELETE FROM `quest_objectives_completion_effect` WHERE `ObjectiveID` = 431933; +INSERT INTO `quest_objectives_completion_effect` (`ObjectiveID`, `GameEventID`, `SpellID`, `ConversationID`, `UpdatePhaseShift`, `UpdateZoneAuras`) VALUES +(431933, NULL, NULL, NULL, 1, 0); + +-- Serverside AT +DELETE FROM `areatrigger_template` WHERE `Id` = @ATID+0 AND `IsServerSide` = 1; +INSERT INTO `areatrigger_template` (`Id`, `IsServerSide`, `Type`, `Flags`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `VerifiedBuild`) VALUES +(@ATID+0, 1, 1, 0, 18, 18, 12, 18, 18, 12, 0, 0, 0); + +DELETE FROM `areatrigger` WHERE `SpawnId` = @ATIDSPAWN AND `IsServerSide` = 1; +INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerId`, `IsServerSide`, `MapId`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `Comment`) VALUES +(@ATIDSPAWN, @ATID, 1, 0, -9470.4521, -2.2114, 49.7938, 1.438999, 0, 19932, 0, 1, 18, 18, 12, 18, 18, 12, 0, 0, 'at_human_heritage_lions_pride_inn_basement_enter', 'Lions Pride Inn Basement Human Heritage'); + +-- Conversation +DELETE FROM `conversation_template` WHERE `Id` IN (20342, 20340); +INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES +(20342, 52461, 0, 49801), +(20340, 52459, 0, 49801); + +UPDATE `conversation_template` SET `ScriptName` = 'conversation_an_unlikely_informant' WHERE `ID` = 20342; + +DELETE FROM `conversation_actors` WHERE (`ConversationId`=20342 AND `Idx` IN (1,0)) OR (`ConversationId`=20340 AND `Idx` IN (1,0)); +INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES +(20342, 89180, 0, 1, 0, 0, 0, 0, 49801), -- Full: 0x2042400000C238C00078CF00007923CF Creature/0 R4240/S30927 Map: 0 (Eastern Kingdoms) Entry: 198883 (Vanessa VanCleef) Low: 7939023 +(20342, 89175, 0, 0, 0, 0, 0, 0, 49801), -- Full: 0x2042400000C23C000078CF00007B66EE Creature/0 R4240/S30927 Map: 0 (Eastern Kingdoms) Entry: 198896 (Master Mathias Shaw) Low: 8087278 +(20340, 89175, 9003909, 1, 0, 0, 0, 0, 49801), -- Full: 0x2042400000C23C000078CF00007923CF Creature/0 R4240/S30927 Map: 0 (Eastern Kingdoms) Entry: 198896 (Master Mathias Shaw) Low: 7939023 +(20340, 0, 0, 0, 0, 0, 0, 1, 49801); -- Full: 0x0800040000000000FFFFFFFFFFFFFFFF Player/0 R1/S16777215 Map: 0 (Eastern Kingdoms) Low: 1099511627775 + +DELETE FROM `conversation_line_template` WHERE `Id` IN (52469, 52468, 52466, 52465, 52464, 53702, 52462, 52461, 52458, 52459); +INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES +(52469, 0, 1, 0, 0, 49801), +(52468, 0, 0, 0, 0, 49801), +(52466, 0, 0, 0, 0, 49801), +(52465, 0, 1, 0, 0, 49801), +(52464, 0, 0, 0, 0, 49801), +(53702, 0, 1, 0, 0, 49801), +(52462, 0, 0, 0, 0, 49801), +(52461, 0, 0, 0, 2, 49801), +(52458, 0, 1, 0, 0, 49801), +(52459, 0, 0, 0, 0, 49801); diff --git a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp index 19650e7f58a..13532c8909c 100644 --- a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp @@ -15,13 +15,21 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "ScriptMgr.h" +#include "AreaTrigger.h" +#include "AreaTriggerAI.h" #include "Containers.h" +#include "Conversation.h" #include "CreatureAIImpl.h" #include "CreatureGroups.h" #include "MotionMaster.h" #include "ObjectAccessor.h" +#include "Player.h" +#include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "ScriptedGossip.h" +#include "SpellScript.h" +#include "TemporarySummon.h" +#include "WorldSession.h" enum COG_Paths { @@ -273,7 +281,284 @@ private: GuidVector _childrenGUIDs; }; +enum AnUnlikelyInformantData +{ + QUEST_AN_UNLIKELY_INFORMANT = 72405, + + GOSSIP_MENU_SIGNAL_INFORMANT = 30224, + GOSSIP_OPTION_SIGNAL_INFORMANT = 0, + + CONVO_AN_UNLIKELY_INFORMANT_HELLO = 20340, + CONVO_AN_UNLIKELY_INFORMANT = 20342, + + CONVO_LINE_VANESSA_TELEPORT = 53702, + CONVO_LINE_VANESSA_MOVEMENT = 52465, + CONVO_LINE_MATHIAS_QUEST_CREDIT = 52466, + + CONVO_ACTOR_IDX_MATHIAS = 0, + CONVO_ACTOR_IDX_VANESSA = 1, + + NPC_MATHIAS_SHAW = 198896, + NPC_VANESSA_VANCLEEF = 198883, + + POINT_VANESSA_FINISH = 1, + + DISPLAY_VANESSA_INVISIBLE = 71887, + DISPLAY_VANESSA_VISIBLE = 110980, + + SPELL_VANESSA_STEALTH = 228928, + SPELL_VANESSA_TELEPORT_BEHIND = 396357, + SPELL_VANESSA_CHEAP_SHOT = 396359, +}; + +enum AnUnlikelyInformantEvents +{ + EVENT_VANESSA_TELEPORT = 1, + EVENT_VANESSA_MOVE, + EVENT_VANESSA_CLONE_LEAN, + EVENT_MATHIAS_QUEST_CREDIT, + EVENT_MATHIAS_CLONE_DESPAWN +}; + +enum WindowToThePastData +{ + GOSSIP_MENU_WINDOW_TO_THE_PAST = 30224, + GOSSIP_OPTION_WINDOW_TO_THE_PAST = 2, + + SPELL_PLAY_ONYXIA_SCENE = 402962 +}; + +Position const VanessaClonePosition = { -9462.44f, -11.7101f, 50.161f, 2.99500f }; +Position const VanessaStaticPosition = { -9468.16f, -3.6128f, 49.876f, 4.47226f }; + +// 198896 - Master Mathias Shaw +struct npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement : public ScriptedAI +{ + npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement(Creature* creature) : ScriptedAI(creature) { } + + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + // Quest 72408 - A Window to the Past + if (menuId == GOSSIP_MENU_WINDOW_TO_THE_PAST && gossipListId == GOSSIP_OPTION_WINDOW_TO_THE_PAST) + { + CloseGossipMenuFor(player); + + player->CastSpell(nullptr, SPELL_PLAY_ONYXIA_SCENE, true); + } + + // Quest 72405 - An Unlikely Informant + else if (menuId == GOSSIP_MENU_SIGNAL_INFORMANT && gossipListId == GOSSIP_OPTION_SIGNAL_INFORMANT) + { + CloseGossipMenuFor(player); + + Conversation::CreateConversation(CONVO_AN_UNLIKELY_INFORMANT, player, *player, player->GetGUID(), nullptr, false); + } + return true; + } +}; + +// 198883 - Vanessa VanCleef +struct npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement : public ScriptedAI +{ + npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement(Creature* creature) : ScriptedAI(creature) { } + + void MovementInform(uint32 /*type*/, uint32 pointId) override + { + if (pointId == POINT_VANESSA_FINISH) + _events.ScheduleEvent(EVENT_VANESSA_CLONE_LEAN, 1s); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_VANESSA_CLONE_LEAN: + me->SetVirtualItem(1, 0); + me->SetNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + me->SetFacingTo(4.47226f); + me->HandleEmoteCommand(EMOTE_STATE_WALEAN02); + break; + default: + break; + } + } + } +private: + EventMap _events; +}; + +struct at_human_heritage_lions_pride_inn_basement_enter : AreaTriggerAI +{ + at_human_heritage_lions_pride_inn_basement_enter(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player || player->GetQuestStatus(QUEST_AN_UNLIKELY_INFORMANT) != QUEST_STATUS_INCOMPLETE) + return; + + Conversation::CreateConversation(CONVO_AN_UNLIKELY_INFORMANT_HELLO, unit, unit->GetPosition(), unit->GetGUID()); + } +}; + +// 20342 - Conversation +class conversation_an_unlikely_informant : public ConversationScript +{ +public: + conversation_an_unlikely_informant() : ConversationScript("conversation_an_unlikely_informant") { } + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* mathiasObject = GetClosestCreatureWithOptions(creator, 15.0f, FindCreatureOptions().SetIgnorePhases(true).SetCreatureId(NPC_MATHIAS_SHAW)); + Creature* vanessaObject = GetClosestCreatureWithOptions(creator, 15.0f, FindCreatureOptions().SetIgnorePhases(true).SetCreatureId(NPC_VANESSA_VANCLEEF)); + if (!mathiasObject || !vanessaObject) + return; + + TempSummon* mathiasClone = mathiasObject->SummonPersonalClone(mathiasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + TempSummon* vanessaClone = vanessaObject->SummonPersonalClone(VanessaClonePosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + if (!mathiasClone || !vanessaClone) + return; + + _vanessaGUID = vanessaClone->GetGUID(); + _mathiasGUID = mathiasClone->GetGUID(); + mathiasClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + vanessaClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + vanessaClone->SetVirtualItem(1, vanessaClone->GetVirtualItemId(0)); // add 2nd dagger to hands + + conversation->AddActor(CONVO_AN_UNLIKELY_INFORMANT, CONVO_ACTOR_IDX_MATHIAS, mathiasClone->GetGUID()); + conversation->AddActor(CONVO_AN_UNLIKELY_INFORMANT, CONVO_ACTOR_IDX_VANESSA, vanessaClone->GetGUID()); + conversation->Start(); + } + + void OnConversationStart(Conversation* conversation) override + { + LocaleConstant privateOwnerLocale = LOCALE_enUS; + if (Player* owner = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner())) + privateOwnerLocale = owner->GetSession()->GetSessionDbLocaleIndex(); + + if (Milliseconds const* teleportLineStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_TELEPORT)) + _events.ScheduleEvent(EVENT_VANESSA_TELEPORT, *teleportLineStartTime); + + if (Milliseconds const* movementStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_MOVEMENT)) + _events.ScheduleEvent(EVENT_VANESSA_MOVE, *movementStartTime); + + if (Milliseconds const* questCreditStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_MATHIAS_QUEST_CREDIT)) + _events.ScheduleEvent(EVENT_MATHIAS_QUEST_CREDIT, *questCreditStartTime); + + _events.ScheduleEvent(EVENT_MATHIAS_CLONE_DESPAWN, conversation->GetLastLineEndTime(privateOwnerLocale)); + } + + void OnConversationUpdate(Conversation* conversation, uint32 diff) override + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_VANESSA_TELEPORT: + { + Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner()); + if (!privateObjectOwner) + break; + + Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID); + if (!vanessaClone) + break; + + vanessaClone->CastSpell(privateObjectOwner, SPELL_VANESSA_TELEPORT_BEHIND, true); + vanessaClone->CastSpell(privateObjectOwner, SPELL_VANESSA_CHEAP_SHOT, true); + vanessaClone->RemoveAurasDueToSpell(SPELL_VANESSA_STEALTH); + vanessaClone->SetEmoteState(EMOTE_STATE_READY1H); + break; + } + case EVENT_VANESSA_MOVE: + { + Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID); + if (!vanessaClone) + break; + + vanessaClone->SetWalk(true); + vanessaClone->SetEmoteState(EMOTE_STATE_NONE); + vanessaClone->GetMotionMaster()->MovePoint(POINT_VANESSA_FINISH, VanessaStaticPosition); + break; + } + case EVENT_MATHIAS_QUEST_CREDIT: + { + Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner()); + if (!privateObjectOwner) + break; + + Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID); + if (!vanessaClone) + break; + + Creature* mathiasClone = ObjectAccessor::GetCreature(*conversation, _mathiasGUID); + if (!mathiasClone) + break; + + privateObjectOwner->ToPlayer()->KilledMonsterCredit(NPC_MATHIAS_SHAW); + vanessaClone->DespawnOrUnsummon(); + mathiasClone->SetNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + break; + } + case EVENT_MATHIAS_CLONE_DESPAWN: + { + Creature* mathiasClone = ObjectAccessor::GetCreature(*conversation, _mathiasGUID); + if (!mathiasClone) + break; + + mathiasClone->DespawnOrUnsummon(); + break; + } + default: + break; + } + } + +private: + ObjectGuid _vanessaGUID; + ObjectGuid _mathiasGUID; + EventMap _events; +}; + +// 228928 - Stealth +class spell_stealth_vanessa_human_heritage : public AuraScript +{ + PrepareAuraScript(spell_stealth_vanessa_human_heritage); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetDisplayId(DISPLAY_VANESSA_INVISIBLE); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetDisplayId(DISPLAY_VANESSA_VISIBLE); + } + + void Register() override + { + AfterEffectApply += AuraEffectRemoveFn(spell_stealth_vanessa_human_heritage::OnApply, EFFECT_1, SPELL_AURA_ANIM_REPLACEMENT_SET, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_stealth_vanessa_human_heritage::OnRemove, EFFECT_1, SPELL_AURA_ANIM_REPLACEMENT_SET, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_elwynn_forest() { + // Creature RegisterCreatureAI(npc_cameron); + RegisterCreatureAI(npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement); + RegisterCreatureAI(npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement); + + // Spells + RegisterSpellScript(spell_stealth_vanessa_human_heritage); + + // Conversation + new conversation_an_unlikely_informant(); + + // AreaTrigger + RegisterAreaTriggerAI(at_human_heritage_lions_pride_inn_basement_enter); } |