/* Copyright (C) 2006 - 2009 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* ScriptData SDName: The_Barrens SD%Complete: 90 SDComment: Quest support: 863, 898, 1719, 2458, 4921, 6981, SDCategory: Barrens EndScriptData */ /* ContentData npc_beaten_corpse npc_gilthares npc_sputtervalve npc_taskmaster_fizzule npc_twiggy_flathead npc_wizzlecrank_shredder EndContentData */ #include "ScriptedPch.h" #include "ScriptedEscortAI.h" /*###### ## npc_beaten_corpse ######*/ #define GOSSIP_CORPSE "Examine corpse in detail..." enum eQuests { QUEST_LOST_IN_BATTLE = 4921 }; bool GossipHello_npc_beaten_corpse(Player* pPlayer, Creature* pCreature) { if (pPlayer->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_COMPLETE) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); pPlayer->SEND_GOSSIP_MENU(3557, pCreature->GetGUID()); return true; } bool GossipSelect_npc_beaten_corpse(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { if (uiAction == GOSSIP_ACTION_INFO_DEF +1) { pPlayer->SEND_GOSSIP_MENU(3558, pCreature->GetGUID()); pPlayer->TalkedToCreature(pCreature->GetEntry(), pCreature->GetGUID()); } return true; } /*###### # npc_gilthares ######*/ enum eGilthares { SAY_GIL_START = -1000370, SAY_GIL_AT_LAST = -1000371, SAY_GIL_PROCEED = -1000372, SAY_GIL_FREEBOOTERS = -1000373, SAY_GIL_AGGRO_1 = -1000374, SAY_GIL_AGGRO_2 = -1000375, SAY_GIL_AGGRO_3 = -1000376, SAY_GIL_AGGRO_4 = -1000377, SAY_GIL_ALMOST = -1000378, SAY_GIL_SWEET = -1000379, SAY_GIL_FREED = -1000380, QUEST_FREE_FROM_HOLD = 898, AREA_MERCHANT_COAST = 391, FACTION_ESCORTEE = 232 //guessed, possible not needed for this quest }; struct npc_giltharesAI : public npc_escortAI { npc_giltharesAI(Creature* pCreature) : npc_escortAI(pCreature) { } void Reset() { } void WaypointReached(uint32 uiPointId) { Player* pPlayer = GetPlayerForEscort(); if (!pPlayer) return; switch(uiPointId) { case 16: DoScriptText(SAY_GIL_AT_LAST, me, pPlayer); break; case 17: DoScriptText(SAY_GIL_PROCEED, me, pPlayer); break; case 18: DoScriptText(SAY_GIL_FREEBOOTERS, me, pPlayer); break; case 37: DoScriptText(SAY_GIL_ALMOST, me, pPlayer); break; case 47: DoScriptText(SAY_GIL_SWEET, me, pPlayer); break; case 53: DoScriptText(SAY_GIL_FREED, me, pPlayer); pPlayer->GroupEventHappens(QUEST_FREE_FROM_HOLD, me); break; } } void Aggro(Unit* pWho) { //not always use if (rand()%4) return; //only aggro text if not player and only in this area if (pWho->GetTypeId() != TYPEID_PLAYER && me->GetAreaId() == AREA_MERCHANT_COAST) { //appears to be pretty much random (possible only if escorter not in combat with pWho yet?) DoScriptText(RAND(SAY_GIL_AGGRO_1, SAY_GIL_AGGRO_2, SAY_GIL_AGGRO_3, SAY_GIL_AGGRO_4), me, pWho); } } }; CreatureAI* GetAI_npc_gilthares(Creature* pCreature) { return new npc_giltharesAI(pCreature); } bool QuestAccept_npc_gilthares(Player* pPlayer, Creature* pCreature, const Quest* pQuest) { if (pQuest->GetQuestId() == QUEST_FREE_FROM_HOLD) { pCreature->setFaction(FACTION_ESCORTEE); pCreature->SetStandState(UNIT_STAND_STATE_STAND); DoScriptText(SAY_GIL_START, pCreature, pPlayer); if (npc_giltharesAI* pEscortAI = CAST_AI(npc_giltharesAI, pCreature->AI())) pEscortAI->Start(false, false, pPlayer->GetGUID(), pQuest); } return true; } /*###### ## npc_sputtervalve ######*/ #define GOSSIP_SPUTTERVALVE "Can you tell me about this shard?" bool GossipHello_npc_sputtervalve(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) pPlayer->PrepareQuestMenu(pCreature->GetGUID()); if (pPlayer->GetQuestStatus(6981) == QUEST_STATUS_INCOMPLETE) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SPUTTERVALVE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID()); return true; } bool GossipSelect_npc_sputtervalve(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { if (uiAction == GOSSIP_ACTION_INFO_DEF) { pPlayer->SEND_GOSSIP_MENU(2013, pCreature->GetGUID()); pPlayer->AreaExploredOrEventHappens(6981); } return true; } /*###### ## npc_taskmaster_fizzule ######*/ enum eEnums { FACTION_FRIENDLY_F = 35, SPELL_FLARE = 10113, SPELL_FOLLY = 10137, }; struct npc_taskmaster_fizzuleAI : public ScriptedAI { npc_taskmaster_fizzuleAI(Creature* c) : ScriptedAI(c) { factionNorm = c->getFaction(); } uint32 factionNorm; bool IsFriend; uint32 Reset_Timer; uint8 FlareCount; void Reset() { IsFriend = false; Reset_Timer = 120000; FlareCount = 0; me->setFaction(factionNorm); } void DoFriend() { me->RemoveAllAuras(); me->DeleteThreatList(); me->CombatStop(true); me->StopMoving(); me->GetMotionMaster()->MoveIdle(); me->setFaction(FACTION_FRIENDLY_F); me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); } void SpellHit(Unit *caster, const SpellEntry *spell) { if (spell->Id == SPELL_FLARE || spell->Id == SPELL_FOLLY) { ++FlareCount; if (FlareCount >= 2) IsFriend = true; } } void EnterCombat(Unit* who) { } void UpdateAI(const uint32 diff) { if (IsFriend) { if (Reset_Timer <= diff) { EnterEvadeMode(); return; } else Reset_Timer -= diff; } if (!UpdateVictim()) return; DoMeleeAttackIfReady(); } void ReceiveEmote(Player* pPlayer, uint32 emote) { if (emote == TEXTEMOTE_SALUTE) { if (FlareCount >= 2) { if (me->getFaction() == FACTION_FRIENDLY_F) return; DoFriend(); } } } }; CreatureAI* GetAI_npc_taskmaster_fizzule(Creature* pCreature) { return new npc_taskmaster_fizzuleAI(pCreature); } /*##### ## npc_twiggy_flathead #####*/ enum eTwiggyFlathead { NPC_BIG_WILL = 6238, NPC_AFFRAY_CHALLENGER = 6240, SAY_BIG_WILL_READY = -1000123, SAY_TWIGGY_FLATHEAD_BEGIN = -1000124, SAY_TWIGGY_FLATHEAD_FRAY = -1000125, SAY_TWIGGY_FLATHEAD_DOWN = -1000126, SAY_TWIGGY_FLATHEAD_OVER = -1000127, }; float AffrayChallengerLoc[6][4]= { {-1683, -4326, 2.79, 0}, {-1682, -4329, 2.79, 0}, {-1683, -4330, 2.79, 0}, {-1680, -4334, 2.79, 1.49}, {-1674, -4326, 2.79, 3.49}, {-1677, -4334, 2.79, 1.66} }; struct npc_twiggy_flatheadAI : public ScriptedAI { npc_twiggy_flatheadAI(Creature *c) : ScriptedAI(c) {} bool EventInProgress; bool EventGrate; bool EventBigWill; bool Challenger_down[6]; uint32 Wave; uint32 Wave_Timer; uint32 Challenger_checker; uint64 PlayerGUID; uint64 AffrayChallenger[6]; uint64 BigWill; void Reset() { EventInProgress = false; EventGrate = false; EventBigWill = false; Wave_Timer = 600000; Challenger_checker = 0; Wave = 0; PlayerGUID = 0; for (uint8 i = 0; i < 6; ++i) { AffrayChallenger[i] = 0; Challenger_down[i] = false; } BigWill = 0; } void EnterCombat(Unit *who) { } void MoveInLineOfSight(Unit *who) { if (!who || (!who->isAlive())) return; if (me->IsWithinDistInMap(who, 10.0f) && (who->GetTypeId() == TYPEID_PLAYER) && CAST_PLR(who)->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE && !EventInProgress) { PlayerGUID = who->GetGUID(); EventInProgress = true; } } void KilledUnit(Unit *victim) { } void UpdateAI(const uint32 diff) { if (EventInProgress) { Player* pWarrior = NULL; if (PlayerGUID) pWarrior = Unit::GetPlayer(PlayerGUID); if (!pWarrior) return; if (!pWarrior->isAlive() && pWarrior->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) { EventInProgress = false; DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me); pWarrior->FailQuest(1719); for (uint8 i = 0; i < 6; ++i) { if (AffrayChallenger[i]) { Creature* pCreature = Unit::GetCreature((*me), AffrayChallenger[i]); if (pCreature) { if (pCreature->isAlive()) { pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pCreature->setDeathState(JUST_DIED); } } } AffrayChallenger[i] = 0; Challenger_down[i] = false; } if (BigWill) { Creature* pCreature = Unit::GetCreature((*me), BigWill); if (pCreature) { if (pCreature->isAlive()) { pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pCreature->setDeathState(JUST_DIED); } } } BigWill = 0; } if (!EventGrate && EventInProgress) { float x,y,z; pWarrior->GetPosition(x, y, z); if (x >= -1684 && x <= -1674 && y >= -4334 && y <= -4324) { pWarrior->AreaExploredOrEventHappens(1719); DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, me); for (uint8 i = 0; i < 6; ++i) { Creature* pCreature = me->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i][0], AffrayChallengerLoc[i][1], AffrayChallengerLoc[i][2], AffrayChallengerLoc[i][3], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); if (!pCreature) continue; pCreature->setFaction(35); pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pCreature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); AffrayChallenger[i] = pCreature->GetGUID(); } Wave_Timer = 5000; Challenger_checker = 1000; EventGrate = true; } } else if (EventInProgress) { if (Challenger_checker <= diff) { for (uint8 i = 0; i < 6; ++i) { if (AffrayChallenger[i]) { Creature* pCreature = Unit::GetCreature((*me), AffrayChallenger[i]); if ((!pCreature || (!pCreature->isAlive())) && !Challenger_down[i]) { DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me); Challenger_down[i] = true; } } } Challenger_checker = 1000; } else Challenger_checker -= diff; if (Wave_Timer <= diff) { if (AffrayChallenger[Wave] && Wave < 6 && !EventBigWill) { DoScriptText(SAY_TWIGGY_FLATHEAD_FRAY, me); Creature* pCreature = Unit::GetCreature((*me), AffrayChallenger[Wave]); if (pCreature && (pCreature->isAlive())) { pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pCreature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); pCreature->setFaction(14); pCreature->AI()->AttackStart(pWarrior); ++Wave; Wave_Timer = 20000; } } else if (Wave >= 6 && !EventBigWill) { if (Creature* pCreature = me->SummonCreature(NPC_BIG_WILL, -1722, -4341, 6.12, 6.26, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 480000)) { BigWill = pCreature->GetGUID(); //pCreature->GetMotionMaster()->MovePoint(0, -1693, -4343, 4.32); //pCreature->GetMotionMaster()->MovePoint(1, -1684, -4333, 2.78); pCreature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79); pCreature->HandleEmoteCommand(EMOTE_STATE_READYUNARMED); EventBigWill = true; Wave_Timer = 1000; } } else if (Wave >= 6 && EventBigWill && BigWill) { Creature* pCreature = Unit::GetCreature((*me), BigWill); if (!pCreature || !pCreature->isAlive()) { DoScriptText(SAY_TWIGGY_FLATHEAD_OVER, me); EventInProgress = false; EventBigWill = false; EventGrate = false; PlayerGUID = 0; Wave = 0; } } } else Wave_Timer -= diff; } } } }; CreatureAI* GetAI_npc_twiggy_flathead(Creature* pCreature) { return new npc_twiggy_flatheadAI (pCreature); } /*##### ## npc_wizzlecrank_shredder #####*/ enum eEnums_Wizzlecrank { SAY_START = -1000298, SAY_STARTUP1 = -1000299, SAY_STARTUP2 = -1000300, SAY_MERCENARY = -1000301, SAY_PROGRESS_1 = -1000302, SAY_PROGRESS_2 = -1000303, SAY_PROGRESS_3 = -1000304, SAY_END = -1000305, QUEST_ESCAPE = 863, FACTION_RATCHET = 637, NPC_PILOT_WIZZ = 3451, NPC_MERCENARY = 3282, }; struct npc_wizzlecrank_shredderAI : public npc_escortAI { npc_wizzlecrank_shredderAI(Creature* pCreature) : npc_escortAI(pCreature) { m_bIsPostEvent = false; m_uiPostEventTimer = 1000; m_uiPostEventCount = 0; } bool m_bIsPostEvent; uint32 m_uiPostEventTimer; uint32 m_uiPostEventCount; void Reset() { if (!HasEscortState(STATE_ESCORT_ESCORTING)) { if (me->getStandState() == UNIT_STAND_STATE_DEAD) me->SetStandState(UNIT_STAND_STATE_STAND); m_bIsPostEvent = false; m_uiPostEventTimer = 1000; m_uiPostEventCount = 0; } } void WaypointReached(uint32 uiPointId) { Player* pPlayer = GetPlayerForEscort(); if (!pPlayer) return; switch(uiPointId) { case 0: DoScriptText(SAY_STARTUP1, me); break; case 9: SetRun(false); break; case 17: if (Creature* pTemp = me->SummonCreature(NPC_MERCENARY, 1128.489f, -3037.611f, 92.701f, 1.472f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000)) { DoScriptText(SAY_MERCENARY, pTemp); me->SummonCreature(NPC_MERCENARY, 1160.172f, -2980.168f, 97.313f, 3.690f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); } break; case 24: m_bIsPostEvent = true; break; } } void WaypointStart(uint32 uiPointId) { Player* pPlayer = GetPlayerForEscort(); if (!pPlayer) return; switch(uiPointId) { case 9: DoScriptText(SAY_STARTUP2, me, pPlayer); break; case 18: DoScriptText(SAY_PROGRESS_1, me, pPlayer); SetRun(); break; } } void JustSummoned(Creature* pSummoned) { if (pSummoned->GetEntry() == NPC_PILOT_WIZZ) me->SetStandState(UNIT_STAND_STATE_DEAD); if (pSummoned->GetEntry() == NPC_MERCENARY) pSummoned->AI()->AttackStart(me); } void UpdateEscortAI(const uint32 uiDiff) { if (!UpdateVictim()) { if (m_bIsPostEvent) { if (m_uiPostEventTimer <= uiDiff) { switch(m_uiPostEventCount) { case 0: DoScriptText(SAY_PROGRESS_2, me); break; case 1: DoScriptText(SAY_PROGRESS_3, me); break; case 2: DoScriptText(SAY_END, me); break; case 3: if (Player* pPlayer = GetPlayerForEscort()) { pPlayer->GroupEventHappens(QUEST_ESCAPE, me); me->SummonCreature(NPC_PILOT_WIZZ, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 180000); } break; } ++m_uiPostEventCount; m_uiPostEventTimer = 5000; } else m_uiPostEventTimer -= uiDiff; } return; } DoMeleeAttackIfReady(); } }; bool QuestAccept_npc_wizzlecrank_shredder(Player* pPlayer, Creature* pCreature, Quest const* quest) { if (quest->GetQuestId() == QUEST_ESCAPE) { pCreature->setFaction(FACTION_RATCHET); if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredderAI, pCreature->AI())) pEscortAI->Start(true, false, pPlayer->GetGUID()); } return true; } CreatureAI* GetAI_npc_wizzlecrank_shredderAI(Creature* pCreature) { return new npc_wizzlecrank_shredderAI(pCreature); } void AddSC_the_barrens() { Script *newscript; newscript = new Script; newscript->Name = "npc_beaten_corpse"; newscript->pGossipHello = &GossipHello_npc_beaten_corpse; newscript->pGossipSelect = &GossipSelect_npc_beaten_corpse; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_gilthares"; newscript->GetAI = &GetAI_npc_gilthares; newscript->pQuestAccept = &QuestAccept_npc_gilthares; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_sputtervalve"; newscript->pGossipHello = &GossipHello_npc_sputtervalve; newscript->pGossipSelect = &GossipSelect_npc_sputtervalve; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_taskmaster_fizzule"; newscript->GetAI = &GetAI_npc_taskmaster_fizzule; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_twiggy_flathead"; newscript->GetAI = &GetAI_npc_twiggy_flathead; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_wizzlecrank_shredder"; newscript->GetAI = &GetAI_npc_wizzlecrank_shredderAI; newscript->pQuestAccept = &QuestAccept_npc_wizzlecrank_shredder; newscript->RegisterSelf(); }