/* * Copyright (C) 2009 Trinity * * 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 */ #include "ScriptedPch.h" #include "ScriptedEscortAI.h" /*#### ## npc_drakuru_shackles ####*/ enum eDrakuruShackles { SPELL_LEFT_CHAIN = 59951, SPELL_RIGHT_CHAIN = 59952, SPELL_UNLOCK_SHACKLE = 55083, SPELL_FREE_RAGECLAW = 55223, NPC_RAGECLAW = 29686 }; struct npc_drakuru_shacklesAI : public ScriptedAI { npc_drakuru_shacklesAI(Creature* pCreature) : ScriptedAI(pCreature) {} uint64 RageclawGUID; void Reset() { RageclawGUID = 0; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); float x, y, z; m_creature->GetClosePoint(x, y, z, m_creature->GetObjectSize() / 3, 0.1f); if (Unit* summon = m_creature->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000)) { RageclawGUID = summon->GetGUID(); LockRageclaw(); } } void LockRageclaw() { Unit *Rageclaw = Unit::GetCreature(*m_creature, RageclawGUID); // pointer check not needed m_creature->SetInFront(Rageclaw); Rageclaw->SetInFront(m_creature); DoCast(Rageclaw, SPELL_LEFT_CHAIN, true); DoCast(Rageclaw, SPELL_RIGHT_CHAIN, true); } void UnlockRageclaw(Unit* pWho) { if (!pWho) return; Creature *Rageclaw = Unit::GetCreature(*m_creature, RageclawGUID); // pointer check not needed DoCast(Rageclaw, SPELL_FREE_RAGECLAW, true); m_creature->setDeathState(DEAD); } void SpellHit(Unit* pCaster, const SpellEntry* pSpell) { if (pSpell->Id == SPELL_UNLOCK_SHACKLE) { if (Creature *Rageclaw = Unit::GetCreature(*m_creature, RageclawGUID)) UnlockRageclaw(pCaster); else m_creature->setDeathState(JUST_DIED); } } }; CreatureAI* GetAI_npc_drakuru_shackles(Creature* pCreature) { return new npc_drakuru_shacklesAI (pCreature); } /*#### ## npc_captured_rageclaw ####*/ enum eRageclaw { SPELL_UNSHACKLED = 55085, SPELL_KNEEL = 39656 }; const char * SAY_RAGECLAW_1 = "I poop on you, trollses!"; const char * SAY_RAGECLAW_2 = "ARRRROOOOGGGGAAAA!"; const char * SAY_RAGECLAW_3 = "No more mister nice wolvar!"; #define SAY_RAGECLAW RAND(SAY_RAGECLAW_1,SAY_RAGECLAW_2,SAY_RAGECLAW_3) struct npc_captured_rageclawAI : public ScriptedAI { npc_captured_rageclawAI(Creature* pCreature) : ScriptedAI(pCreature) {} uint32 DespawnTimer; bool Despawn; void Reset() { Despawn = false; DespawnTimer = 0; m_creature->setFaction(35); DoCast(m_creature, SPELL_KNEEL, true); // Little Hack for kneel - Thanks Illy :P } void MoveInLineOfSight(Unit *who){} void SpellHit(Unit* pCaster, const SpellEntry* pSpell) { if (pSpell->Id == SPELL_FREE_RAGECLAW) { m_creature->RemoveAurasDueToSpell(SPELL_LEFT_CHAIN); m_creature->RemoveAurasDueToSpell(SPELL_RIGHT_CHAIN); m_creature->RemoveAurasDueToSpell(SPELL_KNEEL); m_creature->setFaction(m_creature->GetCreatureInfo()->faction_H); DoCast(m_creature, SPELL_UNSHACKLED, true); m_creature->MonsterSay(SAY_RAGECLAW, LANG_UNIVERSAL, NULL); m_creature->GetMotionMaster()->MoveRandom(10); DespawnTimer = 10000; Despawn = true; } } void UpdateAI(const uint32 uiDiff) { if (UpdateVictim()) { DoMeleeAttackIfReady(); return; } if (!Despawn) return; if (DespawnTimer <= uiDiff) m_creature->DisappearAndDie(); else DespawnTimer -= uiDiff; } }; CreatureAI* GetAI_npc_captured_rageclaw(Creature* pCreature) { return new npc_captured_rageclawAI (pCreature); } /*#### ## npc_gymer ####*/ #define GOSSIP_ITEM_G "I'm ready, Gymer. Let's go!" enum eGymer { QUEST_STORM_KING_VENGEANCE = 12919, SPELL_GYMER = 55568 }; bool GossipHello_npc_gymer(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) pPlayer->PrepareQuestMenu(pCreature->GetGUID()); pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID()); if (pPlayer->GetQuestStatus(QUEST_STORM_KING_VENGEANCE) == QUEST_STATUS_INCOMPLETE) { pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_G, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); pPlayer->SEND_GOSSIP_MENU(13640, pCreature->GetGUID()); } return true; } bool GossipSelect_npc_gymer(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { if (uiAction == GOSSIP_ACTION_INFO_DEF+1) { pPlayer->CLOSE_GOSSIP_MENU(); pPlayer->CastSpell(pPlayer, SPELL_GYMER, true); } return true; } /*#### ## npc_gurgthock ####*/ enum eGurgthock { QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON = 12935, QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER = 12936, QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2 = 12954, QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1 = 12932, QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR = 12933, NPC_ORINOKO_TUSKBREAKER = 30020, NPC_KORRAK_BLOODRAGER = 30023, NPC_YGGDRAS = 30014, NPC_STINKBEARD = 30017, SAY_QUEST_ACCEPT_TUSKARRMAGEDON = -1571031, SAY_QUEST_ACCEPT_KORRAK_1 = -1571033, SAY_QUEST_ACCEPT_KORRAK_2 = -1571034, SAY_QUEST_ACCEPT_MAGNATAUR = -1571035 }; const Position SpawnPosition[] = { {5757.765137, -2945.161133, 286.276672, 5.156380}, {5762.054199, -2954.385010, 273.826955, 5.108289} //yggdras }; struct npc_gurgthockAI : public ScriptedAI { npc_gurgthockAI(Creature* pCreature) : ScriptedAI(pCreature) { } uint64 SummonGUID; std::list SummonList; uint32 uiTimer; uint32 uiPhase; uint32 uiRemoveFlagTimer; uint32 uiQuest; bool bEventInProgress; bool bRemoveFlag; void Reset() { SummonGUID = 0; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); uiTimer = 0; uiPhase = 0; uiQuest = 0; uiRemoveFlagTimer = 5000; bEventInProgress = false; bRemoveFlag = false; } void RemoveSummons() { if (SummonList.empty()) return; bEventInProgress = false; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); for (std::list::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr) { if (Creature* pTemp = Unit::GetCreature(*m_creature, *itr)) if (pTemp) pTemp->RemoveFromWorld(); } SummonList.clear(); } void SetData(uint32 uiId, uint32 uiValue) { if (!bEventInProgress) { bEventInProgress = true; bRemoveFlag = true; switch(uiId) { case 1: switch(uiValue) { case QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON: DoScriptText(SAY_QUEST_ACCEPT_TUSKARRMAGEDON, m_creature); uiPhase = 1; uiTimer = 4000; break; case QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER: DoScriptText(SAY_QUEST_ACCEPT_KORRAK_1, m_creature); uiPhase = 3; uiTimer = 3000; break; case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2: case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1: uiPhase = 6; uiTimer = 3000; break; case QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR: uiTimer = 5000; uiPhase = 7; break; } break; } } } void UpdateAI(const uint32 uiDiff) { if (!bEventInProgress) return; ScriptedAI::UpdateAI(uiDiff); if (bRemoveFlag) { if (uiRemoveFlagTimer <= uiDiff) { m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); bRemoveFlag = false; uiRemoveFlagTimer = 5000; } else uiRemoveFlagTimer -= uiDiff; } if (uiPhase) { if (uiTimer <= uiDiff) { switch(uiPhase) { case 1: if (Creature *pSummon = m_creature->SummonCreature(NPC_ORINOKO_TUSKBREAKER, SpawnPosition[0], TEMPSUMMON_CORPSE_DESPAWN, 1000)) SummonGUID = pSummon->GetGUID(); uiPhase = 2; uiTimer = 4000; break; case 2: if (Creature *pSummon = Unit::GetCreature(*m_creature, SummonGUID)) pSummon->GetMotionMaster()->MoveJump(5776.319824, -2981.005371, 273.100037, 10.0f, 20.0f); uiPhase = 0; SummonGUID = 0; break; case 3: DoScriptText(SAY_QUEST_ACCEPT_KORRAK_2, m_creature); uiTimer = 3000; uiPhase = 4; break; case 4: if (Creature *pSummon = m_creature->SummonCreature(NPC_KORRAK_BLOODRAGER, SpawnPosition[0], TEMPSUMMON_CORPSE_DESPAWN, 1000)) SummonGUID = pSummon->GetGUID(); uiTimer = 3000; uiPhase = 0; break; case 6: m_creature->SummonCreature(NPC_YGGDRAS, SpawnPosition[1], TEMPSUMMON_CORPSE_DESPAWN, 1000); uiPhase = 0; break; case 7: DoScriptText(SAY_QUEST_ACCEPT_MAGNATAUR, m_creature); uiTimer = 3000; uiPhase = 8; break; case 8: m_creature->SummonCreature(NPC_STINKBEARD, SpawnPosition[0], TEMPSUMMON_CORPSE_DESPAWN, 1000); uiPhase = 0; break; } } else uiTimer -= uiDiff; } } void JustSummoned(Creature* pSummon) { SummonList.push_back(pSummon->GetGUID()); } void SummonedCreatureDespawn(Creature* pSummon) { if (bEventInProgress) bEventInProgress = false; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); } }; bool QuestAccept_npc_gurgthock(Player* pPlayer, Creature* pCreature, Quest const* pQuest) { switch (pQuest->GetQuestId()) { case QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON: pCreature->AI()->SetData(1, pQuest->GetQuestId()); break; case QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER: pCreature->AI()->SetData(1, pQuest->GetQuestId()); break; case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2: case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1: pCreature->AI()->SetData(1, pQuest->GetQuestId()); break; case QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR: pCreature->AI()->SetData(1, pQuest->GetQuestId()); break; } return false; } CreatureAI* GetAI_npc_gurgthock(Creature* pCreature) { return new npc_gurgthockAI(pCreature); } /*#### ## npc_orinoko_tuskbreaker ####*/ enum eOrinokoTuskbreaker { SPELL_BATTLE_SHOUT = 32064, SPELL_FISHY_SCENT = 55937, SPELL_IMPALE = 55929, SPELL_SUMMON_WHISKER = 55946, NPC_WHISKER = 30113, NPC_HUNGRY_PENGUIN = 30110, SAY_CALL_FOR_HELP = -1571032 }; struct npc_orinoko_tuskbreakerAI : public ScriptedAI { npc_orinoko_tuskbreakerAI(Creature* pCreature) : ScriptedAI(pCreature) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->SetReactState(REACT_PASSIVE); } bool bSummoned; bool bBattleShout; bool bFishyScent; uint32 uiBattleShoutTimer; uint32 uiFishyScentTimer; uint64 AffectedGUID; uint64 uiWhisker; void Reset() { bSummoned = false; bBattleShout = false; bFishyScent = false; uiBattleShoutTimer = 0; uiFishyScentTimer = 20000; uiWhisker = 0; AffectedGUID = 0; } void EnterEvadeMode() { if (uiWhisker) if (Creature *pWhisker = m_creature->GetCreature(*m_creature, uiWhisker)) pWhisker->RemoveFromWorld(); if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->RemoveSummons(); } void MovementInform(uint32 uiType, uint32 uiId) { if (uiType != POINT_MOTION_TYPE) return; m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->SetReactState(REACT_AGGRESSIVE); m_creature->SetHomePosition(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(), 0); uiBattleShoutTimer = 7000; } void EnterCombat(Unit* pWho) { DoCast(pWho, SPELL_IMPALE); } void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; if (!bBattleShout && uiBattleShoutTimer <= uiDiff) { DoCast(m_creature, SPELL_BATTLE_SHOUT); bBattleShout = true; } else uiBattleShoutTimer -= uiDiff; if (uiFishyScentTimer <= uiDiff) { if (Unit *pAffected = SelectUnit(SELECT_TARGET_RANDOM,0)) { DoCast(pAffected, SPELL_FISHY_SCENT); AffectedGUID = pAffected->GetGUID(); } uiFishyScentTimer = 20000; } else uiFishyScentTimer -= uiDiff; if (!bSummoned && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50) { DoScriptText(SAY_CALL_FOR_HELP ,m_creature); //DoCast(m_creature->getVictim(), SPELL_SUMMON_WHISKER); petai is not working correctly??? if (Creature *pWhisker = m_creature->SummonCreature(NPC_WHISKER, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0)) uiWhisker = pWhisker->GetGUID(); bSummoned = true; } DoMeleeAttackIfReady(); } void JustSummoned(Creature* pSummon) { switch(pSummon->GetEntry()) { case NPC_WHISKER: pSummon->AI()->AttackStart(m_creature->getVictim()); break; case NPC_HUNGRY_PENGUIN: if (Unit *pAffected = Unit::GetUnit(*m_creature, AffectedGUID)) { if (pAffected->isAlive()) pSummon->AI()->AttackStart(pAffected); } break; } } void JustDied(Unit* pKiller) { if (uiWhisker) if (Creature *pWhisker = m_creature->GetCreature(*m_creature, uiWhisker)) pWhisker->RemoveFromWorld(); if (pKiller->GetTypeId() == TYPEID_PLAYER) CAST_PLR(pKiller)->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON, CAST_PLR(pKiller)); if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->bEventInProgress = false; } }; CreatureAI* GetAI_npc_orinoko_tuskbreaker(Creature* pCreature) { return new npc_orinoko_tuskbreakerAI(pCreature); } /*#### ## npc_korrak_bloodrager ####*/ enum eKorrakBloodrager { SPELL_GROW = 55948, SPELL_CHARGE = 24193, SPELL_UPPERCUT = 30471, SPELL_ENRAGE = 42745 }; struct npc_korrak_bloodragerAI : public npc_escortAI { npc_korrak_bloodragerAI(Creature* pCreature) : npc_escortAI(pCreature) { Start(true,true, 0, NULL); SetDespawnAtEnd(false); } uint32 uiChargeTimer; uint32 uiUppercutTimer; bool bEnrage; void Reset() { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->SetReactState(REACT_PASSIVE); uiChargeTimer = 15000; uiUppercutTimer = 12000; bEnrage = false; } void EnterEvadeMode() { if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->RemoveSummons(); } void WaypointReached(uint32 uiI) { switch(uiI) { case 6: m_creature->SetHomePosition(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(), 0); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->SetReactState(REACT_AGGRESSIVE); break; } } void EnterCombat(Unit* pWho) { DoCast(m_creature, SPELL_GROW); } void UpdateAI(const uint32 uiDiff) { npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) return; if (uiUppercutTimer <= uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_NEAREST, 0)) DoCast(pTarget, SPELL_UPPERCUT); uiUppercutTimer = 12000; } else uiUppercutTimer -= uiDiff; if (uiChargeTimer <= uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_FARTHEST, 0)) DoCast(pTarget, SPELL_CHARGE); uiChargeTimer = 15000; } else uiChargeTimer -= uiDiff; if (!bEnrage && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 20) { DoCast(m_creature, SPELL_ENRAGE); bEnrage = true; } DoMeleeAttackIfReady(); } void JustDied(Unit* pKiller) { if (pKiller->GetTypeId() == TYPEID_PLAYER) CAST_PLR(pKiller)->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER, CAST_PLR(pKiller)); if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->bEventInProgress = false; } }; CreatureAI* GetAI_npc_korrak_bloodrager(Creature* pCreature) { return new npc_korrak_bloodragerAI(pCreature); } /*#### ## npc_yggdras ####*/ enum eYggdras { SPELL_CLEAVE = 40504, SPELL_CORRODE_FLESH = 57076, SPELL_JORMUNGAR_SPAWN = 55859 }; struct npc_yggdrasAI : public ScriptedAI { npc_yggdrasAI(Creature* pCreature) : ScriptedAI(pCreature) {} uint32 uiCleaveTimer; uint32 uiCorrodeFleshTimer; void Reset() { uiCleaveTimer = 12000; uiCorrodeFleshTimer = 18000; } void EnterEvadeMode() //If you lose the combat, then the npc go away { if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->RemoveSummons(); } void EnterCombat(Unit* pWho) { DoCast(m_creature, SPELL_GROW); } void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; if (uiCleaveTimer <= uiDiff) { DoCast(m_creature->getVictim(), SPELL_CLEAVE); uiCleaveTimer = 12000; } else uiCleaveTimer -= uiDiff; if (uiCorrodeFleshTimer <= uiDiff) { DoCast(m_creature->getVictim(), SPELL_CHARGE); uiCorrodeFleshTimer = 18000; } else uiCorrodeFleshTimer -= uiDiff; DoMeleeAttackIfReady(); } void JustDied(Unit* pKiller) { if (pKiller->GetTypeId() == TYPEID_PLAYER) { CAST_PLR(pKiller)->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1, CAST_PLR(pKiller)); CAST_PLR(pKiller)->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2, CAST_PLR(pKiller)); } for (uint8 i = 0; i < 2; ++i) DoCast(pKiller, SPELL_JORMUNGAR_SPAWN, true); if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->bEventInProgress = false; } }; CreatureAI* GetAI_npc_yggdras(Creature* pCreature) { return new npc_yggdrasAI(pCreature); } enum eStinkbeard { SPELL_ENRAGE_STINKBEARD = 50420, SPELL_KNOCK_AWAY = 31389, SPELL_STINKY_BEARD = 55867, SPELL_THUNDERBLADE = 55866, SPELL_THUNDERCLAP = 15588 }; /*#### ## npc_stinkbeard ####*/ struct npc_stinkbeardAI : public npc_escortAI { npc_stinkbeardAI(Creature* pCreature) : npc_escortAI(pCreature) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->SetReactState(REACT_PASSIVE); Start(true,true, 0, NULL); SetDespawnAtEnd(false); } uint32 uiThunderclapTimer; uint32 uiKnockAwayTimer; uint32 uiStinkyBeardTimer; bool bEnrage; void Reset() { DoCast(m_creature, SPELL_THUNDERBLADE); uiThunderclapTimer = 5000; uiKnockAwayTimer = 10000; uiStinkyBeardTimer = 15000; bEnrage = false; } void EnterEvadeMode() { if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->RemoveSummons(); } void WaypointReached(uint32 uiI) { switch(uiI) { case 7: m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->SetReactState(REACT_AGGRESSIVE); m_creature->SetHomePosition(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), m_creature->GetOrientation()); break; } } void UpdateAI(const uint32 uiDiff) { npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) return; if (uiThunderclapTimer <= uiDiff) { DoCastAOE(SPELL_THUNDERCLAP); uiThunderclapTimer = 5000; } else uiThunderclapTimer -= uiDiff; if (uiKnockAwayTimer <= uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { if (pTarget && pTarget->isAlive()) DoCast(pTarget, SPELL_KNOCK_AWAY); } uiKnockAwayTimer = 10000; } else uiKnockAwayTimer -= uiDiff; if (uiStinkyBeardTimer <= uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { if (pTarget && pTarget->isAlive()) DoCast(pTarget, SPELL_STINKY_BEARD); } uiStinkyBeardTimer = 15000; } else uiStinkyBeardTimer -= uiDiff; if (!bEnrage && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 20) { DoCast(m_creature, SPELL_ENRAGE_STINKBEARD); bEnrage = true; } DoMeleeAttackIfReady(); } void JustDied(Unit* pKiller) { if (m_creature->isSummon()) if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner())) if (npc_gurgthockAI* pAI = CAST_AI(npc_gurgthockAI,pSummoner->AI())) pAI->bEventInProgress = false; if (pKiller->GetTypeId() == TYPEID_PLAYER) CAST_PLR(pKiller)->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR, CAST_PLR(pKiller)); } }; CreatureAI* GetAI_npc_stinkbeard(Creature* pCreature) { return new npc_stinkbeardAI(pCreature); } /*#### ## npc_released_offspring_harkoa ####*/ struct npc_released_offspring_harkoaAI : public ScriptedAI { npc_released_offspring_harkoaAI(Creature* pCreature) : ScriptedAI(pCreature) {} void Reset() { float x, y, z; m_creature->GetClosePoint(x, y, z, m_creature->GetObjectSize() / 3, 25.0f); m_creature->GetMotionMaster()->MovePoint(0, x, y, z); } void MovementInform(uint32 uiType, uint32 uiId) { if (uiType != POINT_MOTION_TYPE) return; m_creature->DisappearAndDie(); } }; CreatureAI* GetAI_npc_released_offspring_harkoa(Creature* pCreature) { return new npc_released_offspring_harkoaAI(pCreature); } /*###### ## npc_crusade_recruit ######*/ enum eCrusade_recruit { SPELL_QUEST_CREDIT = 50633, QUEST_TROLL_PATROL_INTESTINAL_FORTITUDE = 12509, GOSSIP_CRUSADE_TEXT = 13069, SAY_RECRUIT_1 = -1571036, SAY_RECRUIT_2 = -1571037, SAY_RECRUIT_3 = -1571038 }; #define GOSSIP_ITEM_1 "Get out there and make those Scourge wish they were never reborn!" struct npc_crusade_recruitAI : public ScriptedAI { npc_crusade_recruitAI(Creature* pCreature) : ScriptedAI(pCreature) {} uint8 m_uiPhase; //The current phase we are in uint32 m_uiTimer; //Timer until phase transition float m_heading; //Store creature heading void Reset() { m_uiTimer = 0; m_uiPhase = 0; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); m_heading = m_creature->GetOrientation(); } void UpdateAI(const uint32 uiDiff) { if (m_uiPhase) { if (m_uiTimer <= uiDiff) { switch(m_uiPhase) { case 1: // say random text m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); DoScriptText(RAND(SAY_RECRUIT_1,SAY_RECRUIT_2,SAY_RECRUIT_3), m_creature); m_uiTimer = 3000; m_uiPhase = 2; break; case 2: // walk forward m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); m_creature->GetMotionMaster()->MovePoint(0,m_creature->GetPositionX() + (cos(m_heading) * 10), m_creature->GetPositionY() + (sin(m_heading) * 10), m_creature->GetPositionZ()); m_uiTimer = 5000; m_uiPhase = 3; break; case 3: // despawn m_creature->DisappearAndDie(); m_uiTimer = 0; m_uiPhase = 0; break; } } else m_uiTimer -= uiDiff; } ScriptedAI::UpdateAI(uiDiff); if (!UpdateVictim()) return; } }; CreatureAI* GetAI_npc_crusade_recruit(Creature* pCreature) { return new npc_crusade_recruitAI (pCreature); } bool GossipHello_npc_crusade_recruit(Player* pPlayer, Creature* pCreature) { if (pPlayer->GetQuestStatus(QUEST_TROLL_PATROL_INTESTINAL_FORTITUDE) == QUEST_STATUS_INCOMPLETE) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); pPlayer->SEND_GOSSIP_MENU(GOSSIP_CRUSADE_TEXT, pCreature->GetGUID()); return true; } bool GossipSelect_npc_crusade_recruit(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { if (uiAction == GOSSIP_ACTION_INFO_DEF +1) { pPlayer->CLOSE_GOSSIP_MENU(); pCreature->CastSpell(pPlayer, SPELL_QUEST_CREDIT, true); CAST_AI(npc_crusade_recruitAI, (pCreature->AI()))->m_uiPhase = 1; pCreature->SetInFront(pPlayer); pCreature->SendMovementFlagUpdate(); } return true; } void AddSC_zuldrak() { Script *newscript; newscript = new Script; newscript->Name = "npc_drakuru_shackles"; newscript->GetAI = &GetAI_npc_drakuru_shackles; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_captured_rageclaw"; newscript->GetAI = &GetAI_npc_captured_rageclaw; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_gymer"; newscript->pGossipHello = &GossipHello_npc_gymer; newscript->pGossipSelect = &GossipSelect_npc_gymer; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_gurgthock"; newscript->GetAI = &GetAI_npc_gurgthock; newscript->pQuestAccept = &QuestAccept_npc_gurgthock; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_orinoko_tuskbreaker"; newscript->GetAI = &GetAI_npc_orinoko_tuskbreaker; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_korrak_bloodrager"; newscript->GetAI = &GetAI_npc_korrak_bloodrager; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_yggdras"; newscript->GetAI = &GetAI_npc_yggdras; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_stinkbeard"; newscript->GetAI = &GetAI_npc_stinkbeard; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_released_offspring_harkoa"; newscript->GetAI = &GetAI_npc_released_offspring_harkoa; newscript->RegisterSelf(); newscript->Name = "npc_crusade_recruit"; newscript->GetAI = &GetAI_npc_crusade_recruit; newscript->pGossipHello = &GossipHello_npc_crusade_recruit; newscript->pGossipSelect = &GossipSelect_npc_crusade_recruit; newscript->RegisterSelf(); }