diff --git a/data/sql/updates/pending_db_world/rev_1634747614685560600.sql b/data/sql/updates/pending_db_world/rev_1634747614685560600.sql new file mode 100644 index 000000000..49ee0a191 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1634747614685560600.sql @@ -0,0 +1,11 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1634747614685560600'); + +-- *** Quest "The Hunt is on" *** +-- Gossip is in place options just need to be enabled and conditions added +UPDATE `gossip_menu_option` SET `OptionType`=1,`OptionNpcFlag`=1 WHERE `MenuID` IN (9217,9218,9219) AND `OptionType`=0; +-- Condition for source Gossip menu option condition type Aura +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (9217,9218,9219) AND `SourceEntry`=0 AND `SourceId`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 9217, 0, 0, 0, 1, 0, 46078, 0, 0, 0, 0, 0, '', 'Show gossip menu 9217 option id 0 if target has aura Righteous Vision.'), +(15, 9218, 0, 0, 0, 1, 0, 46078, 0, 0, 0, 0, 0, '', 'Show gossip menu 9218 option id 0 if target has aura Righteous Vision.'), +(15, 9219, 0, 0, 0, 1, 0, 46078, 0, 0, 0, 0, 0, '', 'Show gossip menu 9219 option id 0 if target has aura Righteous Vision.'); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index d05233e14..5e07adf93 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -44,6 +44,7 @@ EndContentData */ #include "SpellInfo.h" #include "SpellScript.h" #include "WorldSession.h" +#include "ScriptedGossip.h" // Ours enum eDrakeHunt @@ -1026,34 +1027,27 @@ public: }; /*###### -## npc_hidden_cultist +## Quest 11794: The hunt is on ######*/ +// NPCs 25827: Tom Hegger, 25248: Salty John Thorpe, 25828: Guard Mitchells enum HiddenCultist { - SPELL_SHROUD_OF_THE_DEATH_CULTIST = 46077, //not working - SPELL_RIGHTEOUS_VISION = 46078, //player aura - - QUEST_THE_HUNT_IS_ON = 11794, - - GOSSIP_TEXT_SALTY_JOHN_THORPE = 12529, - GOSSIP_TEXT_GUARD_MITCHELSS = 12530, - GOSSIP_TEXT_TOM_HEGGER = 12528, - - NPC_TOM_HEGGER = 25827, - NPC_SALTY_JOHN_THORPE = 25248, - NPC_GUARD_MITCHELLS = 25828, - - SAY_HIDDEN_CULTIST_1 = 0, - SAY_HIDDEN_CULTIST_2 = 1, - SAY_HIDDEN_CULTIST_3 = 2, - SAY_HIDDEN_CULTIST_4 = 3 + SPELL_SHROUD_OF_THE_DEATH_CULTIST = 46077, + SPELL_RIGHTEOUS_VISION = 46078, + NPC_TOM_HEGGER = 25827, + NPC_SALTY_JOHN_THORPE = 25248, + NPC_GUARD_MITCHELLS = 25828, + SAY_HIDDEN_CULTIST_1 = 0, + SAY_HIDDEN_CULTIST_2 = 1, + SAY_HIDDEN_CULTIST_3 = 2, + SAY_HIDDEN_CULTIST_4 = 3, + EVENT_CULTIST_SCRIPT_1 = 1, + EVENT_CULTIST_SCRIPT_2 = 2, + EVENT_CULTIST_SCRIPT_3 = 3, + FACTION_MONSTER = 14 }; -const char* GOSSIP_ITEM_TOM_HEGGER = "What do you know about the Cult of the Damned?"; -const char* GOSSIP_ITEM_GUARD_MITCHELLS = "How long have you worked for the Cult of the Damned?"; -const char* GOSSIP_ITEM_SALTY_JOHN_THORPE = "I have a reason to believe you're involved in the cultist activity"; - class npc_hidden_cultist : public CreatureScript { public: @@ -1063,179 +1057,144 @@ public: { npc_hidden_cultistAI(Creature* creature) : ScriptedAI(creature) { - uiEmoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE); - uiNpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); + Initialize(); + _emoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE); + _npcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); } - uint32 uiEmoteState; - uint32 uiNpcFlags; - - uint32 uiEventTimer; - uint8 uiEventPhase; - - ObjectGuid uiPlayerGUID; + void Initialize() + { + _playerGUID.Clear(); + } void Reset() override { - if (uiEmoteState) - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, uiEmoteState); + if (_emoteState) + { + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, _emoteState); + } - if (uiNpcFlags) - me->SetUInt32Value(UNIT_NPC_FLAGS, uiNpcFlags); - - uiEventTimer = 0; - uiEventPhase = 0; - - uiPlayerGUID.Clear(); + if (_npcFlags) + { + me->SetUInt32Value(UNIT_NPC_FLAGS, _npcFlags); + } + Initialize(); DoCast(SPELL_SHROUD_OF_THE_DEATH_CULTIST); - me->RestoreFaction(); } - void DoAction(int32 /*iParam*/) override + void PreScript() { me->StopMoving(); - me->SetUInt32Value(UNIT_NPC_FLAGS, 0); - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { me->SetFacingToObject(player); - uiEventTimer = 3000; - uiEventPhase = 1; - } - - void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override - { - uiPlayerGUID = uiGuid; + } + _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_1, 3000); } void AttackPlayer() { - me->setFaction(14); - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + me->setFaction(FACTION_MONSTER); + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { AttackStart(player); + } } - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 diff) override { - if (uiEventTimer && uiEventTimer <= uiDiff) + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) { - switch (uiEventPhase) + switch (eventId) { - case 1: + case EVENT_CULTIST_SCRIPT_1: + { switch (me->GetEntry()) { case NPC_SALTY_JOHN_THORPE: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); Talk(SAY_HIDDEN_CULTIST_1); - uiEventTimer = 5000; - uiEventPhase = 2; + _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_2, 5000); break; case NPC_GUARD_MITCHELLS: Talk(SAY_HIDDEN_CULTIST_2); - uiEventTimer = 5000; - uiEventPhase = 2; + _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_2, 5000); break; case NPC_TOM_HEGGER: - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) { Talk(SAY_HIDDEN_CULTIST_3, player); } - uiEventTimer = 5000; - uiEventPhase = 2; + _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_2, 5000); break; } break; - case 2: + } + case EVENT_CULTIST_SCRIPT_2: + { switch (me->GetEntry()) { case NPC_SALTY_JOHN_THORPE: Talk(SAY_HIDDEN_CULTIST_4); - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { me->SetFacingToObject(player); - uiEventTimer = 3000; - uiEventPhase = 3; + } + _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_3, 3000); break; case NPC_GUARD_MITCHELLS: case NPC_TOM_HEGGER: AttackPlayer(); - uiEventPhase = 0; break; } break; - case 3: + } + case EVENT_CULTIST_SCRIPT_3: + { if (me->GetEntry() == NPC_SALTY_JOHN_THORPE) { AttackPlayer(); - uiEventPhase = 0; } break; + } + default: + break; } } - else uiEventTimer -= uiDiff; if (!UpdateVictim()) + { return; + } DoMeleeAttackIfReady(); } + + void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + if (gossipListId == 0) + { + CloseGossipMenuFor(player); + _playerGUID = player->GetGUID(); + PreScript(); + } + } + private: + EventMap _events; + uint32 _emoteState; + uint32 _npcFlags; + ObjectGuid _playerGUID; }; CreatureAI* GetAI(Creature* creature) const override { return new npc_hidden_cultistAI(creature); } - - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 uiGossipText = 0; - const char* charGossipItem; - - switch (creature->GetEntry()) - { - case NPC_TOM_HEGGER: - uiGossipText = GOSSIP_TEXT_TOM_HEGGER; - charGossipItem = GOSSIP_ITEM_TOM_HEGGER; - break; - case NPC_SALTY_JOHN_THORPE: - uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; - charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; - break; - case NPC_GUARD_MITCHELLS: - uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; - charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; - break; - default: - charGossipItem = ""; - return false; - } - - if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - SendGossipMenuFor(player, uiGossipText, creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - creature->AI()->SetGUID(player->GetGUID()); - creature->AI()->DoAction(1); - } - - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } }; enum BloodsporeRuination