diff options
Diffstat (limited to 'src')
3 files changed, 374 insertions, 2 deletions
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp index 0a440fb8c10..24e0c488825 100644 --- a/src/bindings/scripts/ScriptMgr.cpp +++ b/src/bindings/scripts/ScriptMgr.cpp @@ -247,6 +247,8 @@ extern void AddSC_boss_hungarfen(); extern void AddSC_boss_the_black_stalker(); //Darkshore +extern void AddSC_darkshore(); + //Darnassus //Deadmines extern void AddSC_instance_deadmines(); @@ -1139,6 +1141,8 @@ void ScriptsInit(char const* cfg_file = "trinitycore.conf") AddSC_boss_the_black_stalker(); //Darkshore + AddSC_darkshore(); + //Darnassus //Deadmines AddSC_instance_deadmines(); diff --git a/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp b/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp index fcb13e9f479..bb4009956f9 100644 --- a/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp +++ b/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp @@ -16,10 +16,330 @@ /* ScriptData SDName: Darkshore -SD%Complete: 0 -SDComment: Placeholder +SD%Complete: 100 +SDComment: Quest support: 731, 2078 SDCategory: Darkshore EndScriptData */ +/* ContentData +npc_prospector_remtravel +npc_threshwackonator +EndContentData */ + #include "precompiled.h" +#include "../../npc/npc_escortAI.h" + +/*#### +# npc_prospector_remtravel +####*/ + +enum +{ + SAY_REM_START = -1000415, + SAY_REM_AGGRO = -1000427, + SAY_REM_RAMP1_1 = -1000416, + SAY_REM_RAMP1_2 = -1000417, + SAY_REM_BOOK = -1000418, + SAY_REM_TENT1_1 = -1000419, + SAY_REM_TENT1_2 = -1000420, + SAY_REM_MOSS = -1000421, + EMOTE_REM_MOSS = -1000422, + SAY_REM_MOSS_PROGRESS = -1000423, + SAY_REM_PROGRESS = -1000424, + SAY_REM_REMEMBER = -1000425, + EMOTE_REM_END = -1000426, + + FACTION_ESCORTEE = 10, + QUEST_ABSENT_MINDED_PT2 = 731, + NPC_GRAVEL_SCOUT = 2158, + NPC_GRAVEL_BONE = 2159, + NPC_GRAVEL_GEO = 2160 +}; + +struct TRINITY_DLL_DECL npc_prospector_remtravelAI : public npc_escortAI +{ + npc_prospector_remtravelAI(Creature* pCreature) : npc_escortAI(pCreature) {} + + void WaypointReached(uint32 i) + { + Player* pPlayer = Unit::GetPlayer(PlayerGUID); + + if(!pPlayer) + return; + + switch(i) + { + case 0: + DoScriptText(SAY_REM_START, me, pPlayer); + break; + case 5: + DoScriptText(SAY_REM_RAMP1_1, me, pPlayer); + break; + case 6: + DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 9: + DoScriptText(SAY_REM_RAMP1_2, me, pPlayer); + break; + case 14: + //depend quest rewarded? + DoScriptText(SAY_REM_BOOK, me, pPlayer); + break; + case 15: + DoScriptText(SAY_REM_TENT1_1, me, pPlayer); + break; + case 16: + DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 17: + DoScriptText(SAY_REM_TENT1_2, me, pPlayer); + break; + case 26: + DoScriptText(SAY_REM_MOSS, me, pPlayer); + break; + case 27: + DoScriptText(EMOTE_REM_MOSS, me, pPlayer); + break; + case 28: + DoScriptText(SAY_REM_MOSS_PROGRESS, me, pPlayer); + break; + case 29: + DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 31: + DoScriptText(SAY_REM_PROGRESS, me, pPlayer); + break; + case 41: + DoScriptText(SAY_REM_REMEMBER, me, pPlayer); + break; + case 42: + DoScriptText(EMOTE_REM_END, me, pPlayer); + pPlayer->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); + break; + } + } + + void Reset() {} + + void EnterCombat(Unit* who) + { + if(rand()%2) + DoScriptText(SAY_REM_AGGRO, me, who); + } + + void JustSummoned(Creature* pSummoned) + { + //unsure if it should be any + //pSummoned->AI()->AttackStart(m_creature); + } + + void UpdateAI(const uint32 diff) + { + npc_escortAI::UpdateAI(diff); + } +}; + +CreatureAI* GetAI_npc_prospector_remtravel(Creature* pCreature) +{ + npc_prospector_remtravelAI* tempAI = new npc_prospector_remtravelAI(pCreature); + + tempAI->FillPointMovementListForCreature(); + + return tempAI; +} + +bool QuestAccept_npc_prospector_remtravel(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if(pQuest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) + { + CAST_AI(npc_escortAI, pCreature->AI())->Start(false, true, false, pPlayer->GetGUID()); + pCreature->setFaction(FACTION_ESCORTEE); + } + + return true; +} + +/*#### +# npc_threshwackonator +####*/ + +enum +{ + EMOTE_START = -1000413, + SAY_AT_CLOSE = -1000414, + QUEST_GYROMAST_REV = 2078, + NPC_GELKAK = 6667, + FACTION_HOSTILE = 14 +}; + +#define GOSSIP_ITEM_INSERT_KEY "[PH] Insert key" + +struct TRINITY_DLL_DECL npc_threshwackonatorAI : public ScriptedAI +{ + npc_threshwackonatorAI(Creature* pCreature) : ScriptedAI(pCreature) + { + Faction = pCreature->getFaction(); + NpcFlags = pCreature->GetUInt32Value(UNIT_NPC_FLAGS); + PlayerGUID = 0; + } + + uint64 PlayerGUID; + uint32 Faction; + uint32 NpcFlags; + uint32 CheckPlayerTimer; + + void Reset() + { + CheckPlayerTimer = 2500; + + if(!PlayerGUID) + { + me->setFaction(Faction); + me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags); + } + } + + void MoveInLineOfSight(Unit* who) + { + if(who->GetEntry() == NPC_GELKAK) + { + if(PlayerGUID && me->IsWithinDistInMap(who, 10.0f)) + { + DoScriptText(SAY_AT_CLOSE, who); + DoAtEnd(); + } + } + + ScriptedAI::MoveInLineOfSight(who); + } + + void EnterEvadeMode() + { + me->RemoveAllAuras(); + me->DeleteThreatList(); + me->CombatStop(true); + me->LoadCreaturesAddon(); + + if(me->isAlive()) + { + if(Player* pPlayer = Unit::GetPlayer(PlayerGUID)) + me->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + else + { + me->GetMotionMaster()->MovementExpired(); + me->GetMotionMaster()->MoveTargetedHome(); + } + } + + me->SetLootRecipient(NULL); + + Reset(); + } + + void DoStart(uint64 Starter) + { + PlayerGUID = Starter; + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + + if(Player* pPlayer = Unit::GetPlayer(PlayerGUID)) + me->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + DoScriptText(EMOTE_START, me); + } + + void DoAtEnd() + { + me->setFaction(FACTION_HOSTILE); + + if(Player* pHolder = Unit::GetPlayer(PlayerGUID)) + me->AI()->AttackStart(pHolder); + + PlayerGUID = 0; + } + + void JustDied(Unit* pKiller) + { + if(PlayerGUID) + { + PlayerGUID = 0; + me->GetMotionMaster()->MovementExpired(); + } + } + + void UpdateAI(const uint32 diff) + { + if(PlayerGUID) + { + if(!me->isInCombat()) + { + if(CheckPlayerTimer < diff) + { + CheckPlayerTimer = 5000; + + Player* pPlayer = Unit::GetPlayer(PlayerGUID); + + if(pPlayer && !pPlayer->isAlive()) + { + PlayerGUID = 0; + EnterEvadeMode(); + return; + } + }else CheckPlayerTimer -= diff; + } + } + + if(!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_npc_threshwackonator(Creature* pCreature) +{ + return new npc_threshwackonatorAI(pCreature); +} + +bool GossipHello_npc_threshwackonator(Player* pPlayer, Creature* pCreature) +{ + if(pPlayer->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE) + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + + pPlayer->SEND_GOSSIP_MENU(pCreature->GetNpcTextId(), pCreature->GetGUID()); + return true; +} + +bool GossipSelect_npc_threshwackonator(Player* pPlayer, Creature* pCreature, uint32 sender, uint32 action) +{ + if(action == GOSSIP_ACTION_INFO_DEF+1) + { + CAST_AI(npc_threshwackonatorAI, pCreature->AI())->DoStart(pPlayer->GetGUID()); + pPlayer->CLOSE_GOSSIP_MENU(); + } + + return true; +} + +void AddSC_darkshore() +{ + Script *newscript; + + newscript = new Script; + newscript->Name = "npc_prospector_remtravel"; + newscript->GetAI = &GetAI_npc_prospector_remtravel; + newscript->pQuestAccept = &QuestAccept_npc_prospector_remtravel; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "npc_threshwackonator"; + newscript->GetAI = &GetAI_npc_threshwackonator; + newscript->pGossipHello = &GossipHello_npc_threshwackonator; + newscript->pGossipSelect = &GossipSelect_npc_threshwackonator; + newscript->pGossipSelect = &GossipSelect_npc_threshwackonator; + newscript->RegisterSelf(); +} diff --git a/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp b/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp index ce0d76e643d..4978524cc83 100644 --- a/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp +++ b/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp @@ -23,6 +23,7 @@ EndScriptData */ /* ContentData npcs_dithers_and_arbington +npc_myranda_the_hag npc_the_scourge_cauldron EndContentData */ @@ -91,6 +92,47 @@ bool GossipSelect_npcs_dithers_and_arbington(Player *player, Creature *_Creature } /*###### +## npc_myranda_the_hag +######*/ + +enum +{ + QUEST_SUBTERFUGE = 5862, + QUEST_IN_DREAMS = 5944, + SPELL_SCARLET_ILLUSION = 17961 +}; + +#define GOSSIP_ITEM_ILLUSION "I am ready for the illusion, Myranda." + +bool GossipHello_npc_myranda_the_hag(Player* pPlayer, Creature* pCreature) +{ + if(pCreature->isQuestGiver()) + pPlayer->PrepareQuestMenu(pCreature->GetGUID()); + + if(pPlayer->GetQuestStatus(QUEST_SUBTERFUGE) == QUEST_STATUS_COMPLETE && + !pPlayer->GetQuestRewardStatus(QUEST_IN_DREAMS) && !pPlayer->HasAura(SPELL_SCARLET_ILLUSION)) + { + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ILLUSION, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + pPlayer->SEND_GOSSIP_MENU(4773, pCreature->GetGUID()); + return true; + } + else + pPlayer->SEND_GOSSIP_MENU(pCreature->GetNpcTextId(), pCreature->GetGUID()); + + return true; +} + +bool GossipSelect_npc_myranda_the_hag(Player* pPlayer, Creature* pCreature, uint32 Sender, uint32 Action) +{ + if(Action == GOSSIP_ACTION_INFO_DEF + 1) + { + pPlayer->CLOSE_GOSSIP_MENU(); + pCreature->CastSpell(pPlayer, SPELL_SCARLET_ILLUSION, false); + } + return true; +} + +/*###### ## npc_the_scourge_cauldron ######*/ @@ -177,6 +219,12 @@ void AddSC_western_plaguelands() newscript->RegisterSelf(); newscript = new Script; + newscript->Name = "npc_myranda_the_hag"; + newscript->pGossipHello = &GossipHello_npc_myranda_the_hag; + newscript->pGossipSelect = &GossipSelect_npc_myranda_the_hag; + newscript->RegisterSelf(); + + newscript = new Script; newscript->Name="npc_the_scourge_cauldron"; newscript->GetAI = &GetAI_npc_the_scourge_cauldron; newscript->RegisterSelf(); |