fix(Core/Script) Quest 11794: "The Hunt is on" (#8650)

Move Gossip to database and cleanup code.
This commit is contained in:
Malcrom
2021-10-24 00:08:15 -03:00
committed by GitHub
parent efd26854e0
commit 3f729f3c48
2 changed files with 95 additions and 125 deletions
@@ -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.');
@@ -44,6 +44,7 @@ EndContentData */
#include "SpellInfo.h" #include "SpellInfo.h"
#include "SpellScript.h" #include "SpellScript.h"
#include "WorldSession.h" #include "WorldSession.h"
#include "ScriptedGossip.h"
// Ours // Ours
enum eDrakeHunt 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 enum HiddenCultist
{ {
SPELL_SHROUD_OF_THE_DEATH_CULTIST = 46077, //not working SPELL_SHROUD_OF_THE_DEATH_CULTIST = 46077,
SPELL_RIGHTEOUS_VISION = 46078, //player aura SPELL_RIGHTEOUS_VISION = 46078,
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_TOM_HEGGER = 25827,
NPC_SALTY_JOHN_THORPE = 25248, NPC_SALTY_JOHN_THORPE = 25248,
NPC_GUARD_MITCHELLS = 25828, NPC_GUARD_MITCHELLS = 25828,
SAY_HIDDEN_CULTIST_1 = 0, SAY_HIDDEN_CULTIST_1 = 0,
SAY_HIDDEN_CULTIST_2 = 1, SAY_HIDDEN_CULTIST_2 = 1,
SAY_HIDDEN_CULTIST_3 = 2, SAY_HIDDEN_CULTIST_3 = 2,
SAY_HIDDEN_CULTIST_4 = 3 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 class npc_hidden_cultist : public CreatureScript
{ {
public: public:
@@ -1063,179 +1057,144 @@ public:
{ {
npc_hidden_cultistAI(Creature* creature) : ScriptedAI(creature) npc_hidden_cultistAI(Creature* creature) : ScriptedAI(creature)
{ {
uiEmoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE); Initialize();
uiNpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); _emoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE);
_npcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS);
} }
uint32 uiEmoteState; void Initialize()
uint32 uiNpcFlags; {
_playerGUID.Clear();
uint32 uiEventTimer; }
uint8 uiEventPhase;
ObjectGuid uiPlayerGUID;
void Reset() override void Reset() override
{ {
if (uiEmoteState) if (_emoteState)
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, uiEmoteState); {
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, _emoteState);
}
if (uiNpcFlags) if (_npcFlags)
me->SetUInt32Value(UNIT_NPC_FLAGS, uiNpcFlags); {
me->SetUInt32Value(UNIT_NPC_FLAGS, _npcFlags);
uiEventTimer = 0; }
uiEventPhase = 0;
uiPlayerGUID.Clear();
Initialize();
DoCast(SPELL_SHROUD_OF_THE_DEATH_CULTIST); DoCast(SPELL_SHROUD_OF_THE_DEATH_CULTIST);
me->RestoreFaction(); me->RestoreFaction();
} }
void DoAction(int32 /*iParam*/) override void PreScript()
{ {
me->StopMoving(); me->StopMoving();
me->SetUInt32Value(UNIT_NPC_FLAGS, 0); me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->SetFacingToObject(player); if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
uiEventTimer = 3000;
uiEventPhase = 1;
}
void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override
{ {
uiPlayerGUID = uiGuid; me->SetFacingToObject(player);
}
_events.ScheduleEvent(EVENT_CULTIST_SCRIPT_1, 3000);
} }
void AttackPlayer() void AttackPlayer()
{ {
me->setFaction(14); me->setFaction(FACTION_MONSTER);
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
{
AttackStart(player); 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 EVENT_CULTIST_SCRIPT_1:
{ {
case 1:
switch (me->GetEntry()) switch (me->GetEntry())
{ {
case NPC_SALTY_JOHN_THORPE: case NPC_SALTY_JOHN_THORPE:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
Talk(SAY_HIDDEN_CULTIST_1); Talk(SAY_HIDDEN_CULTIST_1);
uiEventTimer = 5000; _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_2, 5000);
uiEventPhase = 2;
break; break;
case NPC_GUARD_MITCHELLS: case NPC_GUARD_MITCHELLS:
Talk(SAY_HIDDEN_CULTIST_2); Talk(SAY_HIDDEN_CULTIST_2);
uiEventTimer = 5000; _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_2, 5000);
uiEventPhase = 2;
break; break;
case NPC_TOM_HEGGER: case NPC_TOM_HEGGER:
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
{ {
Talk(SAY_HIDDEN_CULTIST_3, player); Talk(SAY_HIDDEN_CULTIST_3, player);
} }
uiEventTimer = 5000; _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_2, 5000);
uiEventPhase = 2;
break; break;
} }
break; break;
case 2: }
case EVENT_CULTIST_SCRIPT_2:
{
switch (me->GetEntry()) switch (me->GetEntry())
{ {
case NPC_SALTY_JOHN_THORPE: case NPC_SALTY_JOHN_THORPE:
Talk(SAY_HIDDEN_CULTIST_4); Talk(SAY_HIDDEN_CULTIST_4);
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
{
me->SetFacingToObject(player); me->SetFacingToObject(player);
uiEventTimer = 3000; }
uiEventPhase = 3; _events.ScheduleEvent(EVENT_CULTIST_SCRIPT_3, 3000);
break; break;
case NPC_GUARD_MITCHELLS: case NPC_GUARD_MITCHELLS:
case NPC_TOM_HEGGER: case NPC_TOM_HEGGER:
AttackPlayer(); AttackPlayer();
uiEventPhase = 0;
break; break;
} }
break; break;
case 3: }
case EVENT_CULTIST_SCRIPT_3:
{
if (me->GetEntry() == NPC_SALTY_JOHN_THORPE) if (me->GetEntry() == NPC_SALTY_JOHN_THORPE)
{ {
AttackPlayer(); AttackPlayer();
uiEventPhase = 0;
} }
break; break;
} }
default:
break;
}
} }
else uiEventTimer -= uiDiff;
if (!UpdateVictim()) if (!UpdateVictim())
{
return; return;
}
DoMeleeAttackIfReady(); 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 CreatureAI* GetAI(Creature* creature) const override
{ {
return new npc_hidden_cultistAI(creature); 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 enum BloodsporeRuination