fix(Core/Script) Quest 11794: "The Hunt is on" (#8650)
Move Gossip to database and cleanup code.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user