Scripts/ElwynnForest: Implemented quest "An Unlikely Informant" (#29113)

* human heritage questline
This commit is contained in:
Naddley
2023-07-04 07:19:01 +02:00
committed by GitHub
parent ee2577dde6
commit 96f2a97e10
2 changed files with 346 additions and 1 deletions

View File

@@ -0,0 +1,60 @@
SET @ATID := 23;
SET @ATIDSPAWN := 24;
-- Creature
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement' WHERE `entry` = 198896;
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement' WHERE `entry` = 198883;
DELETE FROM `creature_template_addon` WHERE `entry` IN (198883 /*198883 (Vanessa VanCleef) - Stealth*/);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(198883, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '228928'); -- 198883 (Vanessa VanCleef) - Stealth
-- Delete SAI Script
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = 198896;
-- ScriptNames
DELETE FROM `spell_script_names` WHERE `spell_id` = 228928;
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(228928, 'spell_stealth_vanessa_human_heritage');
-- Quest objective completion effect
DELETE FROM `quest_objectives_completion_effect` WHERE `ObjectiveID` = 431933;
INSERT INTO `quest_objectives_completion_effect` (`ObjectiveID`, `GameEventID`, `SpellID`, `ConversationID`, `UpdatePhaseShift`, `UpdateZoneAuras`) VALUES
(431933, NULL, NULL, NULL, 1, 0);
-- Serverside AT
DELETE FROM `areatrigger_template` WHERE `Id` = @ATID+0 AND `IsServerSide` = 1;
INSERT INTO `areatrigger_template` (`Id`, `IsServerSide`, `Type`, `Flags`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `VerifiedBuild`) VALUES
(@ATID+0, 1, 1, 0, 18, 18, 12, 18, 18, 12, 0, 0, 0);
DELETE FROM `areatrigger` WHERE `SpawnId` = @ATIDSPAWN AND `IsServerSide` = 1;
INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerId`, `IsServerSide`, `MapId`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `Comment`) VALUES
(@ATIDSPAWN, @ATID, 1, 0, -9470.4521, -2.2114, 49.7938, 1.438999, 0, 19932, 0, 1, 18, 18, 12, 18, 18, 12, 0, 0, 'at_human_heritage_lions_pride_inn_basement_enter', 'Lions Pride Inn Basement Human Heritage');
-- Conversation
DELETE FROM `conversation_template` WHERE `Id` IN (20342, 20340);
INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
(20342, 52461, 0, 49801),
(20340, 52459, 0, 49801);
UPDATE `conversation_template` SET `ScriptName` = 'conversation_an_unlikely_informant' WHERE `ID` = 20342;
DELETE FROM `conversation_actors` WHERE (`ConversationId`=20342 AND `Idx` IN (1,0)) OR (`ConversationId`=20340 AND `Idx` IN (1,0));
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(20342, 89180, 0, 1, 0, 0, 0, 0, 49801), -- Full: 0x2042400000C238C00078CF00007923CF Creature/0 R4240/S30927 Map: 0 (Eastern Kingdoms) Entry: 198883 (Vanessa VanCleef) Low: 7939023
(20342, 89175, 0, 0, 0, 0, 0, 0, 49801), -- Full: 0x2042400000C23C000078CF00007B66EE Creature/0 R4240/S30927 Map: 0 (Eastern Kingdoms) Entry: 198896 (Master Mathias Shaw) Low: 8087278
(20340, 89175, 9003909, 1, 0, 0, 0, 0, 49801), -- Full: 0x2042400000C23C000078CF00007923CF Creature/0 R4240/S30927 Map: 0 (Eastern Kingdoms) Entry: 198896 (Master Mathias Shaw) Low: 7939023
(20340, 0, 0, 0, 0, 0, 0, 1, 49801); -- Full: 0x0800040000000000FFFFFFFFFFFFFFFF Player/0 R1/S16777215 Map: 0 (Eastern Kingdoms) Low: 1099511627775
DELETE FROM `conversation_line_template` WHERE `Id` IN (52469, 52468, 52466, 52465, 52464, 53702, 52462, 52461, 52458, 52459);
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
(52469, 0, 1, 0, 0, 49801),
(52468, 0, 0, 0, 0, 49801),
(52466, 0, 0, 0, 0, 49801),
(52465, 0, 1, 0, 0, 49801),
(52464, 0, 0, 0, 0, 49801),
(53702, 0, 1, 0, 0, 49801),
(52462, 0, 0, 0, 0, 49801),
(52461, 0, 0, 0, 2, 49801),
(52458, 0, 1, 0, 0, 49801),
(52459, 0, 0, 0, 0, 49801);

View File

@@ -15,13 +15,21 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ScriptMgr.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "Containers.h"
#include "Conversation.h"
#include "CreatureAIImpl.h"
#include "CreatureGroups.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "WorldSession.h"
enum COG_Paths
{
@@ -273,7 +281,284 @@ private:
GuidVector _childrenGUIDs;
};
enum AnUnlikelyInformantData
{
QUEST_AN_UNLIKELY_INFORMANT = 72405,
GOSSIP_MENU_SIGNAL_INFORMANT = 30224,
GOSSIP_OPTION_SIGNAL_INFORMANT = 0,
CONVO_AN_UNLIKELY_INFORMANT_HELLO = 20340,
CONVO_AN_UNLIKELY_INFORMANT = 20342,
CONVO_LINE_VANESSA_TELEPORT = 53702,
CONVO_LINE_VANESSA_MOVEMENT = 52465,
CONVO_LINE_MATHIAS_QUEST_CREDIT = 52466,
CONVO_ACTOR_IDX_MATHIAS = 0,
CONVO_ACTOR_IDX_VANESSA = 1,
NPC_MATHIAS_SHAW = 198896,
NPC_VANESSA_VANCLEEF = 198883,
POINT_VANESSA_FINISH = 1,
DISPLAY_VANESSA_INVISIBLE = 71887,
DISPLAY_VANESSA_VISIBLE = 110980,
SPELL_VANESSA_STEALTH = 228928,
SPELL_VANESSA_TELEPORT_BEHIND = 396357,
SPELL_VANESSA_CHEAP_SHOT = 396359,
};
enum AnUnlikelyInformantEvents
{
EVENT_VANESSA_TELEPORT = 1,
EVENT_VANESSA_MOVE,
EVENT_VANESSA_CLONE_LEAN,
EVENT_MATHIAS_QUEST_CREDIT,
EVENT_MATHIAS_CLONE_DESPAWN
};
enum WindowToThePastData
{
GOSSIP_MENU_WINDOW_TO_THE_PAST = 30224,
GOSSIP_OPTION_WINDOW_TO_THE_PAST = 2,
SPELL_PLAY_ONYXIA_SCENE = 402962
};
Position const VanessaClonePosition = { -9462.44f, -11.7101f, 50.161f, 2.99500f };
Position const VanessaStaticPosition = { -9468.16f, -3.6128f, 49.876f, 4.47226f };
// 198896 - Master Mathias Shaw
struct npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement : public ScriptedAI
{
npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement(Creature* creature) : ScriptedAI(creature) { }
bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
// Quest 72408 - A Window to the Past
if (menuId == GOSSIP_MENU_WINDOW_TO_THE_PAST && gossipListId == GOSSIP_OPTION_WINDOW_TO_THE_PAST)
{
CloseGossipMenuFor(player);
player->CastSpell(nullptr, SPELL_PLAY_ONYXIA_SCENE, true);
}
// Quest 72405 - An Unlikely Informant
else if (menuId == GOSSIP_MENU_SIGNAL_INFORMANT && gossipListId == GOSSIP_OPTION_SIGNAL_INFORMANT)
{
CloseGossipMenuFor(player);
Conversation::CreateConversation(CONVO_AN_UNLIKELY_INFORMANT, player, *player, player->GetGUID(), nullptr, false);
}
return true;
}
};
// 198883 - Vanessa VanCleef
struct npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement : public ScriptedAI
{
npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement(Creature* creature) : ScriptedAI(creature) { }
void MovementInform(uint32 /*type*/, uint32 pointId) override
{
if (pointId == POINT_VANESSA_FINISH)
_events.ScheduleEvent(EVENT_VANESSA_CLONE_LEAN, 1s);
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_VANESSA_CLONE_LEAN:
me->SetVirtualItem(1, 0);
me->SetNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
me->SetFacingTo(4.47226f);
me->HandleEmoteCommand(EMOTE_STATE_WALEAN02);
break;
default:
break;
}
}
}
private:
EventMap _events;
};
struct at_human_heritage_lions_pride_inn_basement_enter : AreaTriggerAI
{
at_human_heritage_lions_pride_inn_basement_enter(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
void OnUnitEnter(Unit* unit) override
{
Player* player = unit->ToPlayer();
if (!player || player->GetQuestStatus(QUEST_AN_UNLIKELY_INFORMANT) != QUEST_STATUS_INCOMPLETE)
return;
Conversation::CreateConversation(CONVO_AN_UNLIKELY_INFORMANT_HELLO, unit, unit->GetPosition(), unit->GetGUID());
}
};
// 20342 - Conversation
class conversation_an_unlikely_informant : public ConversationScript
{
public:
conversation_an_unlikely_informant() : ConversationScript("conversation_an_unlikely_informant") { }
void OnConversationCreate(Conversation* conversation, Unit* creator) override
{
Creature* mathiasObject = GetClosestCreatureWithOptions(creator, 15.0f, FindCreatureOptions().SetIgnorePhases(true).SetCreatureId(NPC_MATHIAS_SHAW));
Creature* vanessaObject = GetClosestCreatureWithOptions(creator, 15.0f, FindCreatureOptions().SetIgnorePhases(true).SetCreatureId(NPC_VANESSA_VANCLEEF));
if (!mathiasObject || !vanessaObject)
return;
TempSummon* mathiasClone = mathiasObject->SummonPersonalClone(mathiasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
TempSummon* vanessaClone = vanessaObject->SummonPersonalClone(VanessaClonePosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
if (!mathiasClone || !vanessaClone)
return;
_vanessaGUID = vanessaClone->GetGUID();
_mathiasGUID = mathiasClone->GetGUID();
mathiasClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
vanessaClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
vanessaClone->SetVirtualItem(1, vanessaClone->GetVirtualItemId(0)); // add 2nd dagger to hands
conversation->AddActor(CONVO_AN_UNLIKELY_INFORMANT, CONVO_ACTOR_IDX_MATHIAS, mathiasClone->GetGUID());
conversation->AddActor(CONVO_AN_UNLIKELY_INFORMANT, CONVO_ACTOR_IDX_VANESSA, vanessaClone->GetGUID());
conversation->Start();
}
void OnConversationStart(Conversation* conversation) override
{
LocaleConstant privateOwnerLocale = LOCALE_enUS;
if (Player* owner = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner()))
privateOwnerLocale = owner->GetSession()->GetSessionDbLocaleIndex();
if (Milliseconds const* teleportLineStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_TELEPORT))
_events.ScheduleEvent(EVENT_VANESSA_TELEPORT, *teleportLineStartTime);
if (Milliseconds const* movementStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_MOVEMENT))
_events.ScheduleEvent(EVENT_VANESSA_MOVE, *movementStartTime);
if (Milliseconds const* questCreditStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_MATHIAS_QUEST_CREDIT))
_events.ScheduleEvent(EVENT_MATHIAS_QUEST_CREDIT, *questCreditStartTime);
_events.ScheduleEvent(EVENT_MATHIAS_CLONE_DESPAWN, conversation->GetLastLineEndTime(privateOwnerLocale));
}
void OnConversationUpdate(Conversation* conversation, uint32 diff) override
{
_events.Update(diff);
switch (_events.ExecuteEvent())
{
case EVENT_VANESSA_TELEPORT:
{
Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner());
if (!privateObjectOwner)
break;
Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID);
if (!vanessaClone)
break;
vanessaClone->CastSpell(privateObjectOwner, SPELL_VANESSA_TELEPORT_BEHIND, true);
vanessaClone->CastSpell(privateObjectOwner, SPELL_VANESSA_CHEAP_SHOT, true);
vanessaClone->RemoveAurasDueToSpell(SPELL_VANESSA_STEALTH);
vanessaClone->SetEmoteState(EMOTE_STATE_READY1H);
break;
}
case EVENT_VANESSA_MOVE:
{
Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID);
if (!vanessaClone)
break;
vanessaClone->SetWalk(true);
vanessaClone->SetEmoteState(EMOTE_STATE_NONE);
vanessaClone->GetMotionMaster()->MovePoint(POINT_VANESSA_FINISH, VanessaStaticPosition);
break;
}
case EVENT_MATHIAS_QUEST_CREDIT:
{
Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner());
if (!privateObjectOwner)
break;
Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID);
if (!vanessaClone)
break;
Creature* mathiasClone = ObjectAccessor::GetCreature(*conversation, _mathiasGUID);
if (!mathiasClone)
break;
privateObjectOwner->ToPlayer()->KilledMonsterCredit(NPC_MATHIAS_SHAW);
vanessaClone->DespawnOrUnsummon();
mathiasClone->SetNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
break;
}
case EVENT_MATHIAS_CLONE_DESPAWN:
{
Creature* mathiasClone = ObjectAccessor::GetCreature(*conversation, _mathiasGUID);
if (!mathiasClone)
break;
mathiasClone->DespawnOrUnsummon();
break;
}
default:
break;
}
}
private:
ObjectGuid _vanessaGUID;
ObjectGuid _mathiasGUID;
EventMap _events;
};
// 228928 - Stealth
class spell_stealth_vanessa_human_heritage : public AuraScript
{
PrepareAuraScript(spell_stealth_vanessa_human_heritage);
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->SetDisplayId(DISPLAY_VANESSA_INVISIBLE);
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->SetDisplayId(DISPLAY_VANESSA_VISIBLE);
}
void Register() override
{
AfterEffectApply += AuraEffectRemoveFn(spell_stealth_vanessa_human_heritage::OnApply, EFFECT_1, SPELL_AURA_ANIM_REPLACEMENT_SET, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_stealth_vanessa_human_heritage::OnRemove, EFFECT_1, SPELL_AURA_ANIM_REPLACEMENT_SET, AURA_EFFECT_HANDLE_REAL);
}
};
void AddSC_elwynn_forest()
{
// Creature
RegisterCreatureAI(npc_cameron);
RegisterCreatureAI(npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement);
RegisterCreatureAI(npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement);
// Spells
RegisterSpellScript(spell_stealth_vanessa_human_heritage);
// Conversation
new conversation_an_unlikely_informant();
// AreaTrigger
RegisterAreaTriggerAI(at_human_heritage_lions_pride_inn_basement_enter);
}