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

View File

@@ -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