mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-17 10:55:43 +00:00
fix(Core/Script) Quest 11794: "The Hunt is on" (#8650)
Move Gossip to database and cleanup code.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user