diff options
-rw-r--r-- | src/server/scripts/Northrend/zone_borean_tundra.cpp | 1010 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_dalaran.cpp | 311 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_dragonblight.cpp | 631 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_grizzly_hills.cpp | 1287 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_icecrown.cpp | 904 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_sholazar_basin.cpp | 504 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_storm_peaks.cpp | 1486 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_wintergrasp.cpp | 589 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_zuldrak.cpp | 941 |
9 files changed, 3416 insertions, 4247 deletions
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 191502bef00..f255d83261f 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -54,54 +54,43 @@ enum Corastrasza SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC = 61244 }; -class npc_corastrasza : public CreatureScript +struct npc_corastrasza : public ScriptedAI { -public: - npc_corastrasza() : CreatureScript("npc_corastrasza") { } + npc_corastrasza(Creature* creature) : ScriptedAI(creature) { } - struct npc_corastraszaAI : public ScriptedAI + bool OnGossipHello(Player* player) override { - npc_corastraszaAI(Creature* creature) : ScriptedAI(creature) { } + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - bool OnGossipHello(Player* player) override + if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE) { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); - - if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, GOSSIP_MENU_ID_CORASTRASZA, GOSSIP_MENU_ITEM_ID_I_I_THINK_SO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_DO_YOU_POSSESS_THE_COURAGE, me->GetGUID()); - } - else if (player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, GOSSIP_MENU_ID_CORASTRASZA, GOSSIP_MENU_ITEM_ID_I_AM_READY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_EAGERLY_AWAITING_YOUR_RETURN, me->GetGUID()); - } - else - SendGossipMenuFor(player, NPC_TEXT_MOST_DRAGONS_WOULD_FEAR_TO, me->GetGUID()); - - return true; + AddGossipItemFor(player, GOSSIP_MENU_ID_CORASTRASZA, GOSSIP_MENU_ITEM_ID_I_I_THINK_SO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_DO_YOU_POSSESS_THE_COURAGE, me->GetGUID()); } - - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + else if (player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); - player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); - } - - return true; + AddGossipItemFor(player, GOSSIP_MENU_ID_CORASTRASZA, GOSSIP_MENU_ITEM_ID_I_AM_READY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_EAGERLY_AWAITING_YOUR_RETURN, me->GetGUID()); } - }; + else + SendGossipMenuFor(player, NPC_TEXT_MOST_DRAGONS_WOULD_FEAR_TO, me->GetGUID()); - CreatureAI* GetAI(Creature* creature) const override + return true; + } + + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - return new npc_corastraszaAI(creature); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); + player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + } + + return true; } }; @@ -178,120 +167,109 @@ class spell_q11865_place_fake_fur : public SpellScript } }; -class npc_nesingwary_trapper : public CreatureScript +struct npc_nesingwary_trapper : public ScriptedAI { -public: - npc_nesingwary_trapper() : CreatureScript("npc_nesingwary_trapper") { } - - struct npc_nesingwary_trapperAI : public ScriptedAI + npc_nesingwary_trapper(Creature* creature) : ScriptedAI(creature) { - npc_nesingwary_trapperAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + Initialize(); + } - void Initialize() - { - me->SetVisible(false); - phaseTimer = 2500; - phase = 1; - go_caribouGUID.Clear(); - } + void Initialize() + { + me->SetVisible(false); + phaseTimer = 2500; + phase = 1; + go_caribouGUID.Clear(); + } - ObjectGuid go_caribouGUID; - uint8 phase; - uint32 phaseTimer; + ObjectGuid go_caribouGUID; + uint8 phase; + uint32 phaseTimer; - void Reset() override - { - Initialize(); - } + void Reset() override + { + Initialize(); + } - void JustEngagedWith(Unit* /*who*/) override { } - void MoveInLineOfSight(Unit* /*who*/) override { } + void JustEngagedWith(Unit* /*who*/) override { } + void MoveInLineOfSight(Unit* /*who*/) override { } - void JustDied(Unit* /*killer*/) override - { - if (GameObject* go_caribou = ObjectAccessor::GetGameObject(*me, go_caribouGUID)) - go_caribou->SetLootState(GO_JUST_DEACTIVATED); + void JustDied(Unit* /*killer*/) override + { + if (GameObject* go_caribou = ObjectAccessor::GetGameObject(*me, go_caribouGUID)) + go_caribou->SetLootState(GO_JUST_DEACTIVATED); - if (TempSummon* summon = me->ToTempSummon()) - if (summon->IsSummon()) - if (Unit* temp = summon->GetSummonerUnit()) - if (Player* player = temp->ToPlayer()) - player->KilledMonsterCredit(me->GetEntry()); + if (TempSummon* summon = me->ToTempSummon()) + if (summon->IsSummon()) + if (Unit* temp = summon->GetSummonerUnit()) + if (Player* player = temp->ToPlayer()) + player->KilledMonsterCredit(me->GetEntry()); - if (GameObject* go_caribou = ObjectAccessor::GetGameObject(*me, go_caribouGUID)) - go_caribou->SetGoState(GO_STATE_READY); - } + if (GameObject* go_caribou = ObjectAccessor::GetGameObject(*me, go_caribouGUID)) + go_caribou->SetGoState(GO_STATE_READY); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (phaseTimer <= diff) { - if (phaseTimer <= diff) + switch (phase) { - switch (phase) + case 1: + me->SetVisible(true); + phaseTimer = 2000; + phase = 2; + break; + case 2: + if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f)) + me->GetMotionMaster()->MovePoint(0, go_fur->GetPositionX(), go_fur->GetPositionY(), go_fur->GetPositionZ()); + phaseTimer = 1500; + phase = 3; + break; + case 3: + Talk(SAY_NESINGWARY_1); + phaseTimer = 2000; + phase = 4; + break; + case 4: + me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT); + phaseTimer = 1000; + phase = 5; + break; + case 5: + me->HandleEmoteCommand(EMOTE_ONESHOT_NONE); + phaseTimer = 500; + phase = 6; + break; + case 6: + if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f)) + go_fur->Delete(); + phaseTimer = 500; + phase = 7; + break; + case 7: { - case 1: - me->SetVisible(true); - phaseTimer = 2000; - phase = 2; - break; - case 2: - if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f)) - me->GetMotionMaster()->MovePoint(0, go_fur->GetPositionX(), go_fur->GetPositionY(), go_fur->GetPositionZ()); - phaseTimer = 1500; - phase = 3; - break; - case 3: - Talk(SAY_NESINGWARY_1); - phaseTimer = 2000; - phase = 4; - break; - case 4: - me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT); - phaseTimer = 1000; - phase = 5; - break; - case 5: - me->HandleEmoteCommand(EMOTE_ONESHOT_NONE); - phaseTimer = 500; - phase = 6; - break; - case 6: - if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f)) - go_fur->Delete(); - phaseTimer = 500; - phase = 7; - break; - case 7: + GameObject* go_caribou = nullptr; + for (uint8 i = 0; i < CaribouTrapsNum; ++i) { - GameObject* go_caribou = nullptr; - for (uint8 i = 0; i < CaribouTrapsNum; ++i) + go_caribou = me->FindNearestGameObject(CaribouTraps[i], 5.0f); + if (go_caribou) { - go_caribou = me->FindNearestGameObject(CaribouTraps[i], 5.0f); - if (go_caribou) - { - go_caribou->SetGoState(GO_STATE_ACTIVE); - go_caribouGUID = go_caribou->GetGUID(); - break; - } + go_caribou->SetGoState(GO_STATE_ACTIVE); + go_caribouGUID = go_caribou->GetGUID(); + break; } - phase = 8; - phaseTimer = 1000; } - break; - case 8: - DoCast(me, SPELL_TRAPPED, true); - phase = 0; - break; + phase = 8; + phaseTimer = 1000; } - } else phaseTimer -= diff; - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_nesingwary_trapperAI(creature); + break; + case 8: + DoCast(me, SPELL_TRAPPED, true); + phase = 0; + break; + } + } else phaseTimer -= diff; } }; @@ -302,41 +280,30 @@ enum red_dragonblood }; // 46620 - Red Dragonblood -class spell_red_dragonblood : public SpellScriptLoader +class spell_red_dragonblood : public AuraScript { -public: - spell_red_dragonblood() : SpellScriptLoader("spell_red_dragonblood") { } + PrepareAuraScript(spell_red_dragonblood); - class spell_red_dragonblood_AuraScript : public AuraScript + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_red_dragonblood_AuraScript); - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE || !GetCaster()) - return; - - Creature* owner = GetOwner()->ToCreature(); - owner->RemoveAllAurasExceptType(SPELL_AURA_DUMMY); - owner->CombatStop(true); - owner->GetMotionMaster()->Clear(); - owner->GetMotionMaster()->MoveFollow(GetCaster(), 4.0f, 0.0f); - owner->CastSpell(owner, SPELL_SUBDUED, true); - GetCaster()->CastSpell(GetCaster(), SPELL_DRAKE_HATCHLING_SUBDUED, true); - owner->SetFaction(FACTION_FRIENDLY); - owner->SetImmuneToAll(true); - owner->DespawnOrUnsummon(3min); - } + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE || !GetCaster()) + return; - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_red_dragonblood_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + Creature* owner = GetOwner()->ToCreature(); + owner->RemoveAllAurasExceptType(SPELL_AURA_DUMMY); + owner->CombatStop(true); + owner->GetMotionMaster()->Clear(); + owner->GetMotionMaster()->MoveFollow(GetCaster(), 4.0f, 0.0f); + owner->CastSpell(owner, SPELL_SUBDUED, true); + GetCaster()->CastSpell(GetCaster(), SPELL_DRAKE_HATCHLING_SUBDUED, true); + owner->SetFaction(FACTION_FRIENDLY); + owner->SetImmuneToAll(true); + owner->DespawnOrUnsummon(3min); + } - AuraScript* GetAuraScript() const + void Register() { - return new spell_red_dragonblood_AuraScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_red_dragonblood::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; @@ -1034,80 +1001,69 @@ enum BerylSorcerer SPELL_COSMETIC_ENSLAVE_CHAINS_SELF = 45631 }; -class npc_beryl_sorcerer : public CreatureScript +struct npc_beryl_sorcerer : public FollowerAI { -public: - npc_beryl_sorcerer() : CreatureScript("npc_beryl_sorcerer") { } + npc_beryl_sorcerer(Creature* creature) : FollowerAI(creature) + { + Initialize(); + } - struct npc_beryl_sorcererAI : public FollowerAI + void Initialize() { - npc_beryl_sorcererAI(Creature* creature) : FollowerAI(creature) - { - Initialize(); - } + bEnslaved = false; + } - void Initialize() - { - bEnslaved = false; - } + bool bEnslaved; - bool bEnslaved; + void Reset() override + { + me->SetReactState(REACT_AGGRESSIVE); + Initialize(); + } - void Reset() override - { - me->SetReactState(REACT_AGGRESSIVE); - Initialize(); - } + void JustEngagedWith(Unit* who) override + { + if (me->IsValidAttackTarget(who)) + AttackStart(who); + } - void JustEngagedWith(Unit* who) override - { - if (me->IsValidAttackTarget(who)) - AttackStart(who); - } + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Player* playerCaster = caster->ToPlayer(); + if (!playerCaster) + return; - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + if (spellInfo->Id == SPELL_ARCANE_CHAINS && !HealthAbovePct(50) && !bEnslaved) { - Player* playerCaster = caster->ToPlayer(); - if (!playerCaster) - return; - - if (spellInfo->Id == SPELL_ARCANE_CHAINS && !HealthAbovePct(50) && !bEnslaved) - { - EnterEvadeMode(); //We make sure that the npc is not attacking the player! - me->SetReactState(REACT_PASSIVE); - StartFollow(playerCaster); - me->UpdateEntry(NPC_CAPTURED_BERLY_SORCERER); - DoCast(me, SPELL_COSMETIC_ENSLAVE_CHAINS_SELF, true); + EnterEvadeMode(); //We make sure that the npc is not attacking the player! + me->SetReactState(REACT_PASSIVE); + StartFollow(playerCaster); + me->UpdateEntry(NPC_CAPTURED_BERLY_SORCERER); + DoCast(me, SPELL_COSMETIC_ENSLAVE_CHAINS_SELF, true); - playerCaster->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER); + playerCaster->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER); - bEnslaved = true; - } + bEnslaved = true; } + } - void MoveInLineOfSight(Unit* who) override - { - FollowerAI::MoveInLineOfSight(who); - - if (who->GetEntry() == NPC_LIBRARIAN_DONATHAN && me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) - { - SetFollowComplete(); - me->DisappearAndDie(); - } - } + void MoveInLineOfSight(Unit* who) override + { + FollowerAI::MoveInLineOfSight(who); - void UpdateAI(uint32 /*diff*/) override + if (who->GetEntry() == NPC_LIBRARIAN_DONATHAN && me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); + SetFollowComplete(); + me->DisappearAndDie(); } - }; + } - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 /*diff*/) override { - return new npc_beryl_sorcererAI(creature); + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); } }; @@ -1152,86 +1108,75 @@ const uint32 MammothTraps[MammothTrapsNum] = GO_MAMMOTH_TRAP_21, GO_MAMMOTH_TRAP_22 }; -class npc_trapped_mammoth_calf : public CreatureScript +struct npc_trapped_mammoth_calf : public ScriptedAI { -public: - npc_trapped_mammoth_calf() : CreatureScript("npc_trapped_mammoth_calf") { } + npc_trapped_mammoth_calf(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - struct npc_trapped_mammoth_calfAI : public ScriptedAI + void Initialize() { - npc_trapped_mammoth_calfAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + uiTimer = 1500; + bStarted = false; + } - void Initialize() - { - uiTimer = 1500; - bStarted = false; - } + uint32 uiTimer; + bool bStarted; - uint32 uiTimer; - bool bStarted; + void Reset() override + { + Initialize(); - void Reset() override + GameObject* pTrap = nullptr; + for (uint8 i = 0; i < MammothTrapsNum; ++i) { - Initialize(); - - GameObject* pTrap = nullptr; - for (uint8 i = 0; i < MammothTrapsNum; ++i) + pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f); + if (pTrap) { - pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f); - if (pTrap) - { - pTrap->SetGoState(GO_STATE_ACTIVE); - return; - } + pTrap->SetGoState(GO_STATE_ACTIVE); + return; } } + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (bStarted) { - if (bStarted) + if (uiTimer <= diff) { - if (uiTimer <= diff) - { - Position pos = me->GetRandomNearPosition(10.0f); - me->GetMotionMaster()->MovePoint(0, pos); - bStarted = false; - } - else uiTimer -= diff; + Position pos = me->GetRandomNearPosition(10.0f); + me->GetMotionMaster()->MovePoint(0, pos); + bStarted = false; } + else uiTimer -= diff; } + } - void DoAction(int32 param) override - { - if (param == 1) - bStarted = true; - } + void DoAction(int32 param) override + { + if (param == 1) + bStarted = true; + } - void MovementInform(uint32 uiType, uint32 /*uiId*/) override - { - if (uiType != POINT_MOTION_TYPE) - return; + void MovementInform(uint32 uiType, uint32 /*uiId*/) override + { + if (uiType != POINT_MOTION_TYPE) + return; - me->DisappearAndDie(); + me->DisappearAndDie(); - GameObject* pTrap = nullptr; - for (uint8 i = 0; i < MammothTrapsNum; ++i) + GameObject* pTrap = nullptr; + for (uint8 i = 0; i < MammothTrapsNum; ++i) + { + pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f); + if (pTrap) { - pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f); - if (pTrap) - { - pTrap->SetLootState(GO_JUST_DEACTIVATED); - return; - } + pTrap->SetLootState(GO_JUST_DEACTIVATED); + return; } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_trapped_mammoth_calfAI(creature); } }; @@ -1245,52 +1190,41 @@ enum Valiancekeepcannons GO_VALIANCE_KEEP_CANNON_2 = 188692 }; -class npc_valiance_keep_cannoneer : public CreatureScript +struct npc_valiance_keep_cannoneer : public ScriptedAI { -public: - npc_valiance_keep_cannoneer() : CreatureScript("npc_valiance_keep_cannoneer") { } - - struct npc_valiance_keep_cannoneerAI : public ScriptedAI + npc_valiance_keep_cannoneer(Creature* creature) : ScriptedAI(creature) { - npc_valiance_keep_cannoneerAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - uiTimer = urand(13000, 18000); - } + Initialize(); + } - uint32 uiTimer; + void Initialize() + { + uiTimer = urand(13000, 18000); + } - void Reset() override - { - Initialize(); - } + uint32 uiTimer; - void UpdateAI(uint32 diff) override - { - if (uiTimer <= diff) - { - me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); - GameObject* pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_1, 10); - if (!pCannon) - pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_2, 10); - if (pCannon) - pCannon->Use(me); - uiTimer = urand(13000, 18000); - } - else uiTimer -= diff; + void Reset() override + { + Initialize(); + } - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (uiTimer <= diff) + { + me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); + GameObject* pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_1, 10); + if (!pCannon) + pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_2, 10); + if (pCannon) + pCannon->Use(me); + uiTimer = urand(13000, 18000); } - }; + else uiTimer -= diff; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_valiance_keep_cannoneerAI(creature); + if (!UpdateVictim()) + return; } }; @@ -1324,185 +1258,174 @@ enum HiddenCultist GOSSIP_ITEM_HIDDEN_CULTIST_OPTIONID = 0 }; -class npc_hidden_cultist : public CreatureScript +struct npc_hidden_cultist : public ScriptedAI { -public: - npc_hidden_cultist() : CreatureScript("npc_hidden_cultist") { } - - struct npc_hidden_cultistAI : public ScriptedAI + npc_hidden_cultist(Creature* creature) : ScriptedAI(creature) { - npc_hidden_cultistAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - uiEmoteState = creature->GetEmoteState(); - uiNpcFlags = creature->GetNpcFlags(); - } + Initialize(); + uiEmoteState = creature->GetEmoteState(); + uiNpcFlags = creature->GetNpcFlags(); + } - void Initialize() - { - uiEventTimer = 0; - uiEventPhase = 0; + void Initialize() + { + uiEventTimer = 0; + uiEventPhase = 0; - uiPlayerGUID.Clear(); - } + uiPlayerGUID.Clear(); + } - Emote uiEmoteState; - NPCFlags uiNpcFlags; + Emote uiEmoteState; + NPCFlags uiNpcFlags; - uint32 uiEventTimer; - uint8 uiEventPhase; + uint32 uiEventTimer; + uint8 uiEventPhase; - ObjectGuid uiPlayerGUID; + ObjectGuid uiPlayerGUID; - void Reset() override - { - if (uiEmoteState) - me->SetEmoteState(uiEmoteState); + void Reset() override + { + if (uiEmoteState) + me->SetEmoteState(uiEmoteState); - if (uiNpcFlags) - me->ReplaceAllNpcFlags(uiNpcFlags); + if (uiNpcFlags) + me->ReplaceAllNpcFlags(uiNpcFlags); - Initialize(); + Initialize(); - DoCast(SPELL_SHROUD_OF_THE_DEATH_CULTIST); + DoCast(SPELL_SHROUD_OF_THE_DEATH_CULTIST); - me->RestoreFaction(); - } + me->RestoreFaction(); + } - void DoAction(int32 /*iParam*/) override - { - me->StopMoving(); - me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); - me->SetEmoteState(EMOTE_ONESHOT_NONE); - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) - me->SetFacingToObject(player); - uiEventTimer = 3000; - uiEventPhase = 1; - } + void DoAction(int32 /*iParam*/) override + { + me->StopMoving(); + me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); + me->SetEmoteState(EMOTE_ONESHOT_NONE); + if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + me->SetFacingToObject(player); + uiEventTimer = 3000; + uiEventPhase = 1; + } - void AttackPlayer() - { - me->SetFaction(FACTION_MONSTER); - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) - AttackStart(player); - } + void AttackPlayer() + { + me->SetFaction(FACTION_MONSTER); + if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + AttackStart(player); + } - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 uiDiff) override + { + if (uiEventTimer && uiEventTimer <= uiDiff) { - if (uiEventTimer && uiEventTimer <= uiDiff) + switch (uiEventPhase) { - switch (uiEventPhase) - { - case 1: - switch (me->GetEntry()) - { - case NPC_SALTY_JOHN_THORPE: - Talk(SAY_HIDDEN_CULTIST_1); - uiEventTimer = 5000; - uiEventPhase = 2; - break; - case NPC_GUARD_MITCHELLS: - Talk(SAY_HIDDEN_CULTIST_2); - uiEventTimer = 5000; - uiEventPhase = 2; - break; - case NPC_TOM_HEGGER: - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) - Talk(SAY_HIDDEN_CULTIST_3, player); - uiEventTimer = 5000; - uiEventPhase = 2; - break; - } - break; - case 2: - switch (me->GetEntry()) - { - case NPC_SALTY_JOHN_THORPE: - Talk(SAY_HIDDEN_CULTIST_4); - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) - me->SetFacingToObject(player); - uiEventTimer = 3000; - uiEventPhase = 3; - break; - case NPC_GUARD_MITCHELLS: - case NPC_TOM_HEGGER: - AttackPlayer(); - uiEventPhase = 0; - break; - } - break; - case 3: - if (me->GetEntry() == NPC_SALTY_JOHN_THORPE) - { + case 1: + switch (me->GetEntry()) + { + case NPC_SALTY_JOHN_THORPE: + Talk(SAY_HIDDEN_CULTIST_1); + uiEventTimer = 5000; + uiEventPhase = 2; + break; + case NPC_GUARD_MITCHELLS: + Talk(SAY_HIDDEN_CULTIST_2); + uiEventTimer = 5000; + uiEventPhase = 2; + break; + case NPC_TOM_HEGGER: + if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + Talk(SAY_HIDDEN_CULTIST_3, player); + uiEventTimer = 5000; + uiEventPhase = 2; + break; + } + break; + case 2: + switch (me->GetEntry()) + { + case NPC_SALTY_JOHN_THORPE: + Talk(SAY_HIDDEN_CULTIST_4); + if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + me->SetFacingToObject(player); + uiEventTimer = 3000; + uiEventPhase = 3; + break; + case NPC_GUARD_MITCHELLS: + case NPC_TOM_HEGGER: AttackPlayer(); uiEventPhase = 0; - } - break; - } - }else uiEventTimer -= uiDiff; - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - - bool OnGossipHello(Player* player) override - { - uint32 uiGossipText = 0; - uint32 charGossipItem = 0; - - switch (me->GetEntry()) - { - case NPC_TOM_HEGGER: - uiGossipText = GOSSIP_TEXT_TOM_HEGGER; - charGossipItem = GOSSIP_ITEM_TOM_HEGGER_MENUID; - break; - case NPC_SALTY_JOHN_THORPE: - uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; - charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE_MENUID; + break; + } break; - case NPC_GUARD_MITCHELLS: - uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; - charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS_MENUID; + case 3: + if (me->GetEntry() == NPC_SALTY_JOHN_THORPE) + { + AttackPlayer(); + uiEventPhase = 0; + } break; - default: - return false; } + }else uiEventTimer -= uiDiff; - if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, charGossipItem, GOSSIP_ITEM_HIDDEN_CULTIST_OPTIONID, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (!UpdateVictim()) + return; - if (me->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + DoMeleeAttackIfReady(); + } - SendGossipMenuFor(player, uiGossipText, me->GetGUID()); + bool OnGossipHello(Player* player) override + { + uint32 uiGossipText = 0; + uint32 charGossipItem = 0; - return true; + switch (me->GetEntry()) + { + case NPC_TOM_HEGGER: + uiGossipText = GOSSIP_TEXT_TOM_HEGGER; + charGossipItem = GOSSIP_ITEM_TOM_HEGGER_MENUID; + break; + case NPC_SALTY_JOHN_THORPE: + uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; + charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE_MENUID; + break; + case NPC_GUARD_MITCHELLS: + uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; + charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS_MENUID; + break; + default: + return false; } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override - { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - ClearGossipMenuFor(player); + if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, charGossipItem, GOSSIP_ITEM_HIDDEN_CULTIST_OPTIONID, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - uiPlayerGUID = player->GetGUID(); - DoAction(1); - } + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(me->GetGUID()); + SendGossipMenuFor(player, uiGossipText, me->GetGUID()); - return true; - } - }; + return true; + } - CreatureAI* GetAI(Creature* creature) const override + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - return new npc_hidden_cultistAI(creature); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + uiPlayerGUID = player->GetGUID(); + DoAction(1); + } + + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + + return true; } }; @@ -1512,31 +1435,20 @@ enum WindsoulTotemAura }; // 46374 - Windsoul Totem Aura -class spell_windsoul_totem_aura : public SpellScriptLoader +class spell_windsoul_totem_aura : public AuraScript { -public: - spell_windsoul_totem_aura() : SpellScriptLoader("spell_windsoul_totem_aura") { } + PrepareAuraScript(spell_windsoul_totem_aura); - class spell_windsoul_totem_aura_AuraScript : public AuraScript + void OnRemove(AuraEffect const*, AuraEffectHandleModes) { - PrepareAuraScript(spell_windsoul_totem_aura_AuraScript); - - void OnRemove(AuraEffect const*, AuraEffectHandleModes) - { - if (GetTarget()->isDead()) - if (Unit* caster = GetCaster()) - caster->CastSpell(nullptr, SPELL_WINDSOUL_CREDT); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_windsoul_totem_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + if (GetTarget()->isDead()) + if (Unit* caster = GetCaster()) + caster->CastSpell(nullptr, SPELL_WINDSOUL_CREDT); + } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_windsoul_totem_aura_AuraScript(); + OnEffectRemove += AuraEffectRemoveFn(spell_windsoul_totem_aura::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; @@ -1549,98 +1461,76 @@ enum BloodsporeRuination }; // 45997 - Bloodspore Ruination -class spell_q11719_bloodspore_ruination_45997 : public SpellScriptLoader +class spell_q11719_bloodspore_ruination_45997 : public SpellScript { -public: - spell_q11719_bloodspore_ruination_45997() : SpellScriptLoader("spell_q11719_bloodspore_ruination_45997") { } + PrepareSpellScript(spell_q11719_bloodspore_ruination_45997); - class spell_q11719_bloodspore_ruination_45997_SpellScript : public SpellScript + void HandleEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q11719_bloodspore_ruination_45997_SpellScript); - - void HandleEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* caster = GetCaster()) - if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f)) - laurith->AI()->SetGUID(caster->GetGUID()); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_q11719_bloodspore_ruination_45997_SpellScript::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); - } - }; + if (Unit* caster = GetCaster()) + if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f)) + laurith->AI()->SetGUID(caster->GetGUID()); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_q11719_bloodspore_ruination_45997_SpellScript(); + OnEffectHit += SpellEffectFn(spell_q11719_bloodspore_ruination_45997::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; -class npc_bloodmage_laurith : public CreatureScript +struct npc_bloodmage_laurith : public ScriptedAI { -public: - npc_bloodmage_laurith() : CreatureScript("npc_bloodmage_laurith") { } + npc_bloodmage_laurith(Creature* creature) : ScriptedAI(creature) { } - struct npc_bloodmage_laurithAI : public ScriptedAI + void Reset() override { - npc_bloodmage_laurithAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - _events.Reset(); - _playerGUID.Clear(); - } + _events.Reset(); + _playerGUID.Clear(); + } - void SetGUID(ObjectGuid const& guid, int32 /*id*/) override - { - if (!_playerGUID.IsEmpty()) - return; + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override + { + if (!_playerGUID.IsEmpty()) + return; - _playerGUID = guid; + _playerGUID = guid; - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - me->SetFacingToObject(player); + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + me->SetFacingToObject(player); - _events.ScheduleEvent(EVENT_TALK, 1s); - } + _events.ScheduleEvent(EVENT_TALK, 1s); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (UpdateVictim()) { - if (UpdateVictim()) - { - DoMeleeAttackIfReady(); - return; - } + DoMeleeAttackIfReady(); + return; + } - _events.Update(diff); + _events.Update(diff); - if (uint32 eventId = _events.ExecuteEvent()) + if (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_TALK: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - Talk(SAY_BLOODMAGE_LAURITH, player); - _playerGUID.Clear(); - _events.ScheduleEvent(EVENT_RESET_ORIENTATION, 5s); - break; - case EVENT_RESET_ORIENTATION: - me->SetFacingTo(me->GetHomePosition().GetOrientation()); - break; - } + case EVENT_TALK: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + Talk(SAY_BLOODMAGE_LAURITH, player); + _playerGUID.Clear(); + _events.ScheduleEvent(EVENT_RESET_ORIENTATION, 5s); + break; + case EVENT_RESET_ORIENTATION: + me->SetFacingTo(me->GetHomePosition().GetOrientation()); + break; } } - - private: - EventMap _events; - ObjectGuid _playerGUID; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_bloodmage_laurithAI(creature); } + +private: + EventMap _events; + ObjectGuid _playerGUID; }; enum ShorteningBlaster @@ -1995,22 +1885,22 @@ class spell_borean_tundra_prototype_neural_needle : public SpellScript void AddSC_borean_tundra() { - new npc_corastrasza(); + RegisterCreatureAI(npc_corastrasza); RegisterSpellScript(spell_q11865_place_fake_fur); - new npc_nesingwary_trapper(); - new spell_red_dragonblood(); + RegisterCreatureAI(npc_nesingwary_trapper); + RegisterSpellScript(spell_red_dragonblood); new npc_thassarian(); new npc_image_lich_king(); new npc_counselor_talbot(); new npc_leryssa(); new npc_general_arlos(); - new npc_beryl_sorcerer(); - new npc_trapped_mammoth_calf(); - new npc_valiance_keep_cannoneer(); - new npc_hidden_cultist(); - new spell_windsoul_totem_aura(); - new spell_q11719_bloodspore_ruination_45997(); - new npc_bloodmage_laurith(); + RegisterCreatureAI(npc_beryl_sorcerer); + RegisterCreatureAI(npc_trapped_mammoth_calf); + RegisterCreatureAI(npc_valiance_keep_cannoneer); + RegisterCreatureAI(npc_hidden_cultist); + RegisterSpellScript(spell_windsoul_totem_aura); + RegisterSpellScript(spell_q11719_bloodspore_ruination_45997); + RegisterCreatureAI(npc_bloodmage_laurith); RegisterSpellScript(spell_q11653_shortening_blaster); RegisterSpellScript(spell_nerubar_web_random_unit_not_on_quest); RegisterSpellScript(spell_nerubar_web_random_unit_not_on_quest_dummy); diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index 04554dc986e..1dbf0001d92 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -56,76 +56,65 @@ enum NPCs // All outdoor guards are within 35.0f of these NPCs NPC_SUNREAVER_GUARDIAN_MAGE = 29255, }; -class npc_mageguard_dalaran : public CreatureScript +struct npc_mageguard_dalaran : public ScriptedAI { -public: - npc_mageguard_dalaran() : CreatureScript("npc_mageguard_dalaran") { } + npc_mageguard_dalaran(Creature* creature) : ScriptedAI(creature) { } - struct npc_mageguard_dalaranAI : public ScriptedAI - { - npc_mageguard_dalaranAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override { } + void Reset() override { } - void JustEngagedWith(Unit* /*who*/) override { } + void JustEngagedWith(Unit* /*who*/) override { } - void AttackStart(Unit* /*who*/) override { } + void AttackStart(Unit* /*who*/) override { } - void MoveInLineOfSight(Unit* who) override - { - if (!who || !who->IsInWorld() || who->GetZoneId() != 4395) - return; + void MoveInLineOfSight(Unit* who) override + { + if (!who || !who->IsInWorld() || who->GetZoneId() != 4395) + return; - if (!me->IsWithinDist(who, 65.0f, false)) - return; + if (!me->IsWithinDist(who, 65.0f, false)) + return; - Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself(); + Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself(); - if (!player || player->IsGameMaster() || player->IsBeingTeleported() || - // If player has Disguise aura for quest A Meeting With The Magister or An Audience With The Arcanist, do not teleport it away but let it pass - player->HasAura(SPELL_SUNREAVER_DISGUISE_FEMALE) || player->HasAura(SPELL_SUNREAVER_DISGUISE_MALE) || - player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_MALE) || - // If player has already been teleported, don't try to teleport again - player->HasAura(SPELL_TRESPASSER_A) || player->HasAura(SPELL_TRESPASSER_H)) - return; + if (!player || player->IsGameMaster() || player->IsBeingTeleported() || + // If player has Disguise aura for quest A Meeting With The Magister or An Audience With The Arcanist, do not teleport it away but let it pass + player->HasAura(SPELL_SUNREAVER_DISGUISE_FEMALE) || player->HasAura(SPELL_SUNREAVER_DISGUISE_MALE) || + player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_MALE) || + // If player has already been teleported, don't try to teleport again + player->HasAura(SPELL_TRESPASSER_A) || player->HasAura(SPELL_TRESPASSER_H)) + return; - switch (me->GetEntry()) - { - case NPC_SILVER_COVENANT_GUARDIAN_MAGE: - if (player->GetTeam() == HORDE) // Horde unit found in Alliance area + switch (me->GetEntry()) + { + case NPC_SILVER_COVENANT_GUARDIAN_MAGE: + if (player->GetTeam() == HORDE) // Horde unit found in Alliance area + { + if (GetClosestCreatureWithEntry(me, NPC_APPLEBOUGH_A, 32.0f)) { - if (GetClosestCreatureWithEntry(me, NPC_APPLEBOUGH_A, 32.0f)) - { - if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me - DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out - } - else // In my line of sight, and "indoors" - DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out + if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me + DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out } - break; - case NPC_SUNREAVER_GUARDIAN_MAGE: - if (player->GetTeam() == ALLIANCE) // Alliance unit found in Horde area + else // In my line of sight, and "indoors" + DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out + } + break; + case NPC_SUNREAVER_GUARDIAN_MAGE: + if (player->GetTeam() == ALLIANCE) // Alliance unit found in Horde area + { + if (GetClosestCreatureWithEntry(me, NPC_SWEETBERRY_H, 32.0f)) { - if (GetClosestCreatureWithEntry(me, NPC_SWEETBERRY_H, 32.0f)) - { - if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me - DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out - } - else // In my line of sight, and "indoors" - DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out + if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me + DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out } - break; - } - return; + else // In my line of sight, and "indoors" + DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out + } + break; } - - void UpdateAI(uint32 /*diff*/) override { } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_mageguard_dalaranAI(creature); + return; } + + void UpdateAI(uint32 /*diff*/) override { } }; enum MinigobData @@ -150,135 +139,123 @@ enum MinigobData MAIL_DELIVER_DELAY_MAX = 15*MINUTE }; -class npc_minigob_manabonk : public CreatureScript +struct npc_minigob_manabonk : public ScriptedAI { - public: - npc_minigob_manabonk() : CreatureScript("npc_minigob_manabonk") {} + npc_minigob_manabonk(Creature* creature) : ScriptedAI(creature) + { + me->setActive(true); + } - struct npc_minigob_manabonkAI : public ScriptedAI - { - npc_minigob_manabonkAI(Creature* creature) : ScriptedAI(creature) - { - me->setActive(true); - } + void Reset() override + { + playerGuid = ObjectGuid(); + me->SetVisible(false); + events.ScheduleEvent(EVENT_SELECT_TARGET, 1s); + } - void Reset() override - { - playerGuid = ObjectGuid(); - me->SetVisible(false); - events.ScheduleEvent(EVENT_SELECT_TARGET, 1s); - } + void GetPlayersInDalaran(std::vector<Player*>& playerList) const + { + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster()) + playerList.push_back(player); + } - void GetPlayersInDalaran(std::vector<Player*>& playerList) const - { - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()->ToPlayer()) - if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster()) - playerList.push_back(player); - } + static Player* SelectTargetInDalaran(std::vector<Player*>& PlayerInDalaranList) + { + if (PlayerInDalaranList.empty()) + return nullptr; - static Player* SelectTargetInDalaran(std::vector<Player*>& PlayerInDalaranList) - { - if (PlayerInDalaranList.empty()) - return nullptr; + return Trinity::Containers::SelectRandomContainerElement(PlayerInDalaranList); + } - return Trinity::Containers::SelectRandomContainerElement(PlayerInDalaranList); - } + void SendMailToPlayer(Player* player) const + { + CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); + int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX); + MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay); + CharacterDatabase.CommitTransaction(trans); + } - void SendMailToPlayer(Player* player) const - { - CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); - int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX); - MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay); - CharacterDatabase.CommitTransaction(trans); - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + case EVENT_SELECT_TARGET: { - switch (eventId) + std::vector<Player*> PlayerInDalaranList; + GetPlayersInDalaran(PlayerInDalaranList); + + // Increases chance of event based on player count in Dalaran (100 players or more = 100% else player count%) + if (PlayerInDalaranList.empty() || urand(1, 100) > PlayerInDalaranList.size()) + me->AddObjectToRemoveList(); + + me->SetVisible(true); + DoCastSelf(SPELL_TELEPORT_VISUAL); + if (Player* player = SelectTargetInDalaran(PlayerInDalaranList)) { - case EVENT_SELECT_TARGET: - { - std::vector<Player*> PlayerInDalaranList; - GetPlayersInDalaran(PlayerInDalaranList); - - // Increases chance of event based on player count in Dalaran (100 players or more = 100% else player count%) - if (PlayerInDalaranList.empty() || urand(1, 100) > PlayerInDalaranList.size()) - me->AddObjectToRemoveList(); - - me->SetVisible(true); - DoCastSelf(SPELL_TELEPORT_VISUAL); - if (Player* player = SelectTargetInDalaran(PlayerInDalaranList)) - { - playerGuid = player->GetGUID(); - Position pos = player->GetPosition(); - float dist = frand(10.0f, 30.0f); - float angle = frand(0.0f, 1.0f) * M_PI * 2.0f; - player->MovePositionToFirstCollision(pos, dist, angle); - me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); - } - events.ScheduleEvent(EVENT_LAUGH_1, Seconds(2)); - break; - } - case EVENT_LAUGH_1: - me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE); - events.ScheduleEvent(EVENT_WANDER, 3s); - break; - case EVENT_WANDER: - me->GetMotionMaster()->MoveRandom(8); - events.ScheduleEvent(EVENT_PAUSE, 1min); - break; - case EVENT_PAUSE: - me->GetMotionMaster()->MoveIdle(); - events.ScheduleEvent(EVENT_CAST, 2s); - break; - case EVENT_CAST: - if (Player* player = me->GetMap()->GetPlayer(playerGuid)) - { - DoCast(player, SPELL_MANABONKED); - SendMailToPlayer(player); - } - else - me->AddObjectToRemoveList(); - - events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8)); - break; - case EVENT_LAUGH_2: - me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE); - events.ScheduleEvent(EVENT_BLINK, 3s); - break; - case EVENT_BLINK: - DoCastSelf(SPELL_IMPROVED_BLINK); - events.ScheduleEvent(EVENT_DESPAWN, 4s); - break; - case EVENT_DESPAWN: - me->AddObjectToRemoveList(); - break; - default: - break; + playerGuid = player->GetGUID(); + Position pos = player->GetPosition(); + float dist = frand(10.0f, 30.0f); + float angle = frand(0.0f, 1.0f) * M_PI * 2.0f; + player->MovePositionToFirstCollision(pos, dist, angle); + me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } + events.ScheduleEvent(EVENT_LAUGH_1, Seconds(2)); + break; } - } - - private: - - ObjectGuid playerGuid; - EventMap events; - }; + case EVENT_LAUGH_1: + me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE); + events.ScheduleEvent(EVENT_WANDER, 3s); + break; + case EVENT_WANDER: + me->GetMotionMaster()->MoveRandom(8); + events.ScheduleEvent(EVENT_PAUSE, 1min); + break; + case EVENT_PAUSE: + me->GetMotionMaster()->MoveIdle(); + events.ScheduleEvent(EVENT_CAST, 2s); + break; + case EVENT_CAST: + if (Player* player = me->GetMap()->GetPlayer(playerGuid)) + { + DoCast(player, SPELL_MANABONKED); + SendMailToPlayer(player); + } + else + me->AddObjectToRemoveList(); - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_minigob_manabonkAI(creature); + events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8)); + break; + case EVENT_LAUGH_2: + me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE); + events.ScheduleEvent(EVENT_BLINK, 3s); + break; + case EVENT_BLINK: + DoCastSelf(SPELL_IMPROVED_BLINK); + events.ScheduleEvent(EVENT_DESPAWN, 4s); + break; + case EVENT_DESPAWN: + me->AddObjectToRemoveList(); + break; + default: + break; + } + } } + +private: + ObjectGuid playerGuid; + EventMap events; }; void AddSC_dalaran() { - new npc_mageguard_dalaran(); - new npc_minigob_manabonk(); + RegisterCreatureAI(npc_mageguard_dalaran); + RegisterCreatureAI(npc_minigob_manabonk); } diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index ffb3b9b4ece..586836daa50 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -137,226 +137,216 @@ Position const PosTalkLocations[6] = { 3798.05f, -680.611f, 222.9825f, 6.038839f }, // Home }; -class npc_commander_eligor_dawnbringer : public CreatureScript +struct npc_commander_eligor_dawnbringer : public ScriptedAI { - public: npc_commander_eligor_dawnbringer() : CreatureScript("npc_commander_eligor_dawnbringer") {} - - struct npc_commander_eligor_dawnbringerAI : public ScriptedAI - { - npc_commander_eligor_dawnbringerAI(Creature* creature) : ScriptedAI(creature) - { - talkWing = 0; - } + npc_commander_eligor_dawnbringer(Creature* creature) : ScriptedAI(creature) + { + talkWing = 0; + } - void Reset() override - { - talkWing = 0; - for (ObjectGuid& guid : audienceList) - guid.Clear(); + void Reset() override + { + talkWing = 0; + for (ObjectGuid& guid : audienceList) + guid.Clear(); - for (ObjectGuid& guid : imageList) - guid.Clear(); + for (ObjectGuid& guid : imageList) + guid.Clear(); - _events.ScheduleEvent(EVENT_GET_TARGETS, 5s); - _events.ScheduleEvent(EVENT_START_RANDOM, 20s); - } + _events.ScheduleEvent(EVENT_GET_TARGETS, 5s); + _events.ScheduleEvent(EVENT_START_RANDOM, 20s); + } - void MovementInform(uint32 type, uint32 id) override + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE) + { + if (id == 1) { - if (type == POINT_MOTION_TYPE) + me->SetFacingTo(PosTalkLocations[talkWing].GetOrientation()); + TurnAudience(); + + switch (talkWing) { - if (id == 1) + case 0: // Pinnacle of Naxxramas { - me->SetFacingTo(PosTalkLocations[talkWing].GetOrientation()); - TurnAudience(); - - switch (talkWing) + switch (urand (0, 1)) { - case 0: // Pinnacle of Naxxramas - { - switch (urand (0, 1)) - { - case 0: ChangeImage(NPC_IMAGE_OF_KELTHUZAD, MODEL_IMAGE_OF_KELTHUZAD, SAY_KELTHUZAD_1); - _events.ScheduleEvent(EVENT_KELTHUZAD_2, 8s); break; - case 1: ChangeImage(NPC_IMAGE_OF_SAPPHIRON, MODEL_IMAGE_OF_SAPPHIRON, SAY_SAPPHIRON); break; - } - } - break; - case 1: // Death knight wing of Naxxramas - { - switch (urand (0, 2)) - { - case 0: ChangeImage(NPC_IMAGE_OF_RAZUVIOUS, MODEL_IMAGE_OF_RAZUVIOUS, SAY_RAZUVIOUS); break; - case 1: ChangeImage(NPC_IMAGE_OF_GOTHIK, MODEL_IMAGE_OF_GOTHIK, SAY_GOTHIK); break; - case 2: ChangeImage(NPC_IMAGE_OF_THANE, MODEL_IMAGE_OF_THANE, SAY_DEATH_KNIGHTS_1); - _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_2, 10s); break; - } - } - break; - case 2: // Blighted abomination wing of Naxxramas - { - switch (urand (0, 3)) - { - case 0: ChangeImage(NPC_IMAGE_OF_PATCHWERK, MODEL_IMAGE_OF_PATCHWERK, SAY_PATCHWERK); break; - case 1: ChangeImage(NPC_IMAGE_OF_GROBBULUS, MODEL_IMAGE_OF_GROBBULUS, SAY_GROBBULUS); break; - case 2: ChangeImage(NPC_IMAGE_OF_THADDIUS, MODEL_IMAGE_OF_THADDIUS, SAY_THADDIUS); break; - case 3: ChangeImage(NPC_IMAGE_OF_GLUTH, MODEL_IMAGE_OF_GLUTH, SAY_GLUTH); break; - } - } - break; - case 3: // Accursed spider wing of Naxxramas - { - switch (urand (0, 2)) - { - case 0: ChangeImage(NPC_IMAGE_OF_ANUBREKHAN, MODEL_IMAGE_OF_ANUBREKHAN, SAY_ANUBREKHAN); break; - case 1: ChangeImage(NPC_IMAGE_OF_FAERLINA, MODEL_IMAGE_OF_FAERLINA, SAY_FAERLINA); break; - case 2: ChangeImage(NPC_IMAGE_OF_MAEXXNA, MODEL_IMAGE_OF_MAEXXNA, SAY_MAEXXNA); break; - } - } - break; - case 4: // Dread plague wing of Naxxramas - { - switch (urand (0, 2)) - { - case 0: ChangeImage(NPC_IMAGE_OF_NOTH, MODEL_IMAGE_OF_NOTH, SAY_NOTH); break; - case 1: ChangeImage(NPC_IMAGE_OF_HEIGAN, MODEL_IMAGE_OF_HEIGAN, SAY_HEIGAN_1); - _events.ScheduleEvent(EVENT_HEIGAN_2, 8s); break; - case 2: ChangeImage(NPC_IMAGE_OF_LOATHEB, MODEL_IMAGE_OF_LOATHEB, SAY_LOATHEB); break; - } - } - break; - case 5: // Home - _events.ScheduleEvent(EVENT_START_RANDOM, 30s); - break; + case 0: ChangeImage(NPC_IMAGE_OF_KELTHUZAD, MODEL_IMAGE_OF_KELTHUZAD, SAY_KELTHUZAD_1); + _events.ScheduleEvent(EVENT_KELTHUZAD_2, 8s); break; + case 1: ChangeImage(NPC_IMAGE_OF_SAPPHIRON, MODEL_IMAGE_OF_SAPPHIRON, SAY_SAPPHIRON); break; } } - } - } - - void StoreTargets() - { - uint8 creaturecount; - - creaturecount = 0; - - for (uint8 ii = 0; ii < 3; ++ii) - { - std::list<Creature*> creatureList; - GetCreatureListWithEntryInGrid(creatureList, me, AudienceMobs[ii], 15.0f); - for (Creature* creature : creatureList) + break; + case 1: // Death knight wing of Naxxramas + { + switch (urand (0, 2)) + { + case 0: ChangeImage(NPC_IMAGE_OF_RAZUVIOUS, MODEL_IMAGE_OF_RAZUVIOUS, SAY_RAZUVIOUS); break; + case 1: ChangeImage(NPC_IMAGE_OF_GOTHIK, MODEL_IMAGE_OF_GOTHIK, SAY_GOTHIK); break; + case 2: ChangeImage(NPC_IMAGE_OF_THANE, MODEL_IMAGE_OF_THANE, SAY_DEATH_KNIGHTS_1); + _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_2, 10s); break; + } + } + break; + case 2: // Blighted abomination wing of Naxxramas + { + switch (urand (0, 3)) + { + case 0: ChangeImage(NPC_IMAGE_OF_PATCHWERK, MODEL_IMAGE_OF_PATCHWERK, SAY_PATCHWERK); break; + case 1: ChangeImage(NPC_IMAGE_OF_GROBBULUS, MODEL_IMAGE_OF_GROBBULUS, SAY_GROBBULUS); break; + case 2: ChangeImage(NPC_IMAGE_OF_THADDIUS, MODEL_IMAGE_OF_THADDIUS, SAY_THADDIUS); break; + case 3: ChangeImage(NPC_IMAGE_OF_GLUTH, MODEL_IMAGE_OF_GLUTH, SAY_GLUTH); break; + } + } + break; + case 3: // Accursed spider wing of Naxxramas + { + switch (urand (0, 2)) + { + case 0: ChangeImage(NPC_IMAGE_OF_ANUBREKHAN, MODEL_IMAGE_OF_ANUBREKHAN, SAY_ANUBREKHAN); break; + case 1: ChangeImage(NPC_IMAGE_OF_FAERLINA, MODEL_IMAGE_OF_FAERLINA, SAY_FAERLINA); break; + case 2: ChangeImage(NPC_IMAGE_OF_MAEXXNA, MODEL_IMAGE_OF_MAEXXNA, SAY_MAEXXNA); break; + } + } + break; + case 4: // Dread plague wing of Naxxramas { - audienceList[creaturecount] = creature->GetGUID(); - ++creaturecount; + switch (urand (0, 2)) + { + case 0: ChangeImage(NPC_IMAGE_OF_NOTH, MODEL_IMAGE_OF_NOTH, SAY_NOTH); break; + case 1: ChangeImage(NPC_IMAGE_OF_HEIGAN, MODEL_IMAGE_OF_HEIGAN, SAY_HEIGAN_1); + _events.ScheduleEvent(EVENT_HEIGAN_2, 8s); break; + case 2: ChangeImage(NPC_IMAGE_OF_LOATHEB, MODEL_IMAGE_OF_LOATHEB, SAY_LOATHEB); break; + } } + break; + case 5: // Home + _events.ScheduleEvent(EVENT_START_RANDOM, 30s); + break; } - - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_KELTHUZAD, 20.0f, true)) - imageList[0] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_RAZUVIOUS, 20.0f, true)) - imageList[1] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_PATCHWERK, 20.0f, true)) - imageList[2] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_ANUBREKHAN, 20.0f, true)) - imageList[3] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_NOTH, 20.0f, true)) - imageList[4] = creature->GetGUID(); } + } + } - void ChangeImage(uint32 entry, uint32 model, uint8 text) - { - if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) - { - Talk(text); - creature->SetEntry(entry); - creature->SetDisplayId(model); - creature->CastSpell(creature, SPELL_HEROIC_IMAGE_CHANNEL); - _events.ScheduleEvent(EVENT_TALK_COMPLETE, 40s); - } - } + void StoreTargets() + { + uint8 creaturecount; + + creaturecount = 0; - void TurnAudience() + for (uint8 ii = 0; ii < 3; ++ii) + { + std::list<Creature*> creatureList; + GetCreatureListWithEntryInGrid(creatureList, me, AudienceMobs[ii], 15.0f); + for (Creature* creature : creatureList) { - for (uint8 i = 0; i < 10; ++i) - { - if (Creature* creature = ObjectAccessor::GetCreature(*me, audienceList[i])) - creature->SetFacingToObject(me); - } + audienceList[creaturecount] = creature->GetGUID(); + ++creaturecount; } + } - void UpdateAI(uint32 diff) override - { - _events.Update(diff); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_KELTHUZAD, 20.0f, true)) + imageList[0] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_RAZUVIOUS, 20.0f, true)) + imageList[1] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_PATCHWERK, 20.0f, true)) + imageList[2] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_ANUBREKHAN, 20.0f, true)) + imageList[3] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_NOTH, 20.0f, true)) + imageList[4] = creature->GetGUID(); + } - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) + void ChangeImage(uint32 entry, uint32 model, uint8 text) + { + if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) + { + Talk(text); + creature->SetEntry(entry); + creature->SetDisplayId(model); + creature->CastSpell(creature, SPELL_HEROIC_IMAGE_CHANNEL); + _events.ScheduleEvent(EVENT_TALK_COMPLETE, 40s); + } + } + + void TurnAudience() + { + for (uint8 i = 0; i < 10; ++i) + { + if (Creature* creature = ObjectAccessor::GetCreature(*me, audienceList[i])) + creature->SetFacingToObject(me); + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_RANDOM: + talkWing = urand (0, 4); + Talk(talkWing); + _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 8s); + break; + case EVENT_MOVE_TO_POINT: + me->SetWalk(true); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(1, PosTalkLocations[talkWing].m_positionX, PosTalkLocations[talkWing].m_positionY, PosTalkLocations[talkWing].m_positionZ); + break; + case EVENT_TALK_COMPLETE: + talkWing = 5; + Talk(talkWing); + _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 5s); + break; + case EVENT_GET_TARGETS: + StoreTargets(); + break; + case EVENT_KELTHUZAD_2: + Talk(SAY_KELTHUZAD_2); + _events.ScheduleEvent(EVENT_KELTHUZAD_3, 8s); + break; + case EVENT_KELTHUZAD_3: + Talk(SAY_KELTHUZAD_3); + break; + case EVENT_DEATH_KNIGHTS_2: + Talk(SAY_DEATH_KNIGHTS_2); + if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) { - case EVENT_START_RANDOM: - talkWing = urand (0, 4); - Talk(talkWing); - _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 8s); - break; - case EVENT_MOVE_TO_POINT: - me->SetWalk(true); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(1, PosTalkLocations[talkWing].m_positionX, PosTalkLocations[talkWing].m_positionY, PosTalkLocations[talkWing].m_positionZ); - break; - case EVENT_TALK_COMPLETE: - talkWing = 5; - Talk(talkWing); - _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 5s); - break; - case EVENT_GET_TARGETS: - StoreTargets(); - break; - case EVENT_KELTHUZAD_2: - Talk(SAY_KELTHUZAD_2); - _events.ScheduleEvent(EVENT_KELTHUZAD_3, 8s); - break; - case EVENT_KELTHUZAD_3: - Talk(SAY_KELTHUZAD_3); - break; - case EVENT_DEATH_KNIGHTS_2: - Talk(SAY_DEATH_KNIGHTS_2); - if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) - { - creature->SetEntry(NPC_IMAGE_OF_BLAUMEUX); - creature->SetDisplayId(MODEL_IMAGE_OF_BLAUMEUX); - } - _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_3, 10s); - break; - case EVENT_DEATH_KNIGHTS_3: - Talk(SAY_DEATH_KNIGHTS_3); - if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) - { - creature->SetEntry(NPC_IMAGE_OF_ZELIEK); - creature->SetDisplayId(MODEL_IMAGE_OF_ZELIEK); - } - _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_4, 10s); - break; - case EVENT_DEATH_KNIGHTS_4: - Talk(SAY_DEATH_KNIGHTS_4); - break; - case EVENT_HEIGAN_2: - Talk(SAY_HEIGAN_2); - break; - default: - break; + creature->SetEntry(NPC_IMAGE_OF_BLAUMEUX); + creature->SetDisplayId(MODEL_IMAGE_OF_BLAUMEUX); } - } - DoMeleeAttackIfReady(); + _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_3, 10s); + break; + case EVENT_DEATH_KNIGHTS_3: + Talk(SAY_DEATH_KNIGHTS_3); + if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) + { + creature->SetEntry(NPC_IMAGE_OF_ZELIEK); + creature->SetDisplayId(MODEL_IMAGE_OF_ZELIEK); + } + _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_4, 10s); + break; + case EVENT_DEATH_KNIGHTS_4: + Talk(SAY_DEATH_KNIGHTS_4); + break; + case EVENT_HEIGAN_2: + Talk(SAY_HEIGAN_2); + break; + default: + break; } - private: - EventMap _events; - ObjectGuid audienceList[10]; - ObjectGuid imageList[5]; - uint8 talkWing; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_commander_eligor_dawnbringerAI(creature); } + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + ObjectGuid audienceList[10]; + ObjectGuid imageList[5]; + uint8 talkWing; }; /*###### @@ -376,83 +366,61 @@ enum StrengthenAncientsMisc }; // 47575 - Strengthen the Ancients: On Interact Dummy to Woodlands Walker -class spell_q12096_q12092_dummy : public SpellScriptLoader // Strengthen the Ancients: On Interact Dummy to Woodlands Walker +class spell_q12096_q12092_dummy : public SpellScript { -public: - spell_q12096_q12092_dummy() : SpellScriptLoader("spell_q12096_q12092_dummy") { } + PrepareSpellScript(spell_q12096_q12092_dummy); - class spell_q12096_q12092_dummy_SpellScript : public SpellScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12096_q12092_dummy_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 roll = rand32() % 2; + uint32 roll = rand32() % 2; - Creature* tree = GetHitCreature(); - Player* player = GetCaster()->ToPlayer(); + Creature* tree = GetHitCreature(); + Player* player = GetCaster()->ToPlayer(); - if (!tree || !player) - return; + if (!tree || !player) + return; - tree->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK); + tree->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK); - if (roll == 1) // friendly version - { - tree->CastSpell(player, SPELL_CREATE_ITEM_BARK); - tree->AI()->Talk(SAY_WALKER_FRIENDLY, player); - tree->DespawnOrUnsummon(1s); - } - else // enemy version - { - tree->AI()->Talk(SAY_WALKER_ENEMY, player); - tree->SetFaction(FACTION_MONSTER); - tree->Attack(player, true); - } + if (roll == 1) // friendly version + { + tree->CastSpell(player, SPELL_CREATE_ITEM_BARK); + tree->AI()->Talk(SAY_WALKER_FRIENDLY, player); + tree->DespawnOrUnsummon(1s); } - - void Register() override + else // enemy version { - OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + tree->AI()->Talk(SAY_WALKER_ENEMY, player); + tree->SetFaction(FACTION_MONSTER); + tree->Attack(player, true); } - }; + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_q12096_q12092_dummy_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 47530 - Bark of the Walkers -class spell_q12096_q12092_bark : public SpellScriptLoader +class spell_q12096_q12092_bark : public SpellScript { -public: - spell_q12096_q12092_bark() : SpellScriptLoader("spell_q12096_q12092_bark") { } + PrepareSpellScript(spell_q12096_q12092_bark); - class spell_q12096_q12092_bark_SpellScript : public SpellScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12096_q12092_bark_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Creature* lothalor = GetHitCreature(); - if (!lothalor || lothalor->GetEntry() != NPC_LOTHALOR) - return; - - lothalor->AI()->Talk(SAY_LOTHALOR); - lothalor->RemoveAura(SPELL_CONFUSED); - lothalor->DespawnOrUnsummon(4s); - } + Creature* lothalor = GetHitCreature(); + if (!lothalor || lothalor->GetEntry() != NPC_LOTHALOR) + return; - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_bark_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + lothalor->AI()->Talk(SAY_LOTHALOR); + lothalor->RemoveAura(SPELL_CONFUSED); + lothalor->DespawnOrUnsummon(4s); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_q12096_q12092_bark_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_bark::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -478,104 +446,93 @@ enum WyrmDefenderEnum BOSS_EMOTE_ON_LOW_HEALTH = 2 }; -class npc_wyrmrest_defender : public CreatureScript +struct npc_wyrmrest_defender : public VehicleAI { - public: - npc_wyrmrest_defender() : CreatureScript("npc_wyrmrest_defender") { } - - struct npc_wyrmrest_defenderAI : public VehicleAI - { - npc_wyrmrest_defenderAI(Creature* creature) : VehicleAI(creature) - { - Initialize(); - } - - void Initialize() - { - hpWarningReady = true; - renewRecoveryCanCheck = false; - - RenewRecoveryChecker = 0; - } + npc_wyrmrest_defender(Creature* creature) : VehicleAI(creature) + { + Initialize(); + } - bool hpWarningReady; - bool renewRecoveryCanCheck; + void Initialize() + { + hpWarningReady = true; + renewRecoveryCanCheck = false; - uint32 RenewRecoveryChecker; + RenewRecoveryChecker = 0; + } - void Reset() override - { - Initialize(); - } + bool hpWarningReady; + bool renewRecoveryCanCheck; - void UpdateAI(uint32 diff) override - { - VehicleAI::UpdateAI(diff); + uint32 RenewRecoveryChecker; - // Check system for Health Warning should happen first time whenever get under 30%, - // after it should be able to happen only after recovery of last renew is fully done (20 sec), - // next one used won't interfere - if (hpWarningReady && me->GetHealthPct() <= 30.0f) - { - me->CastSpell(me, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE); - hpWarningReady = false; - } + void Reset() override + { + Initialize(); + } - if (renewRecoveryCanCheck) - { - if (RenewRecoveryChecker <= diff) - { - renewRecoveryCanCheck = false; - hpWarningReady = true; - } - else - RenewRecoveryChecker -= diff; - } - } + void UpdateAI(uint32 diff) override + { + VehicleAI::UpdateAI(diff); - void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override - { - switch (spellInfo->Id) - { - case SPELL_WYRMREST_DEFENDER_MOUNT: - Talk(WHISPER_MOUNTED, me->GetCharmerOrOwner()); - me->SetImmuneToAll(false); - me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); - break; - // Both below are for checking low hp warning - case SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE: - Talk(BOSS_EMOTE_ON_LOW_HEALTH, me->GetCharmerOrOwner()); - break; - case SPELL_RENEW: - if (!hpWarningReady && RenewRecoveryChecker <= 100) - RenewRecoveryChecker = 20000; - - renewRecoveryCanCheck = true; - break; - } - } + // Check system for Health Warning should happen first time whenever get under 30%, + // after it should be able to happen only after recovery of last renew is fully done (20 sec), + // next one used won't interfere + if (hpWarningReady && me->GetHealthPct() <= 30.0f) + { + me->CastSpell(me, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE); + hpWarningReady = false; + } - bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + if (renewRecoveryCanCheck) + { + if (RenewRecoveryChecker <= diff) { - if (menuId == MENU_ID && gossipListId == GOSSIP_OPTION_ID) - { - // Makes player cast trigger spell for 49207 on self - player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); - CloseGossipMenuFor(player); - } - return true; + renewRecoveryCanCheck = false; + hpWarningReady = true; } + else + RenewRecoveryChecker -= diff; + } + } - void OnCharmed(bool /*apply*/) override - { - me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - } - }; + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + switch (spellInfo->Id) + { + case SPELL_WYRMREST_DEFENDER_MOUNT: + Talk(WHISPER_MOUNTED, me->GetCharmerOrOwner()); + me->SetImmuneToAll(false); + me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); + break; + // Both below are for checking low hp warning + case SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE: + Talk(BOSS_EMOTE_ON_LOW_HEALTH, me->GetCharmerOrOwner()); + break; + case SPELL_RENEW: + if (!hpWarningReady && RenewRecoveryChecker <= 100) + RenewRecoveryChecker = 20000; + + renewRecoveryCanCheck = true; + break; + } + } - CreatureAI* GetAI(Creature* creature) const override + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == MENU_ID && gossipListId == GOSSIP_OPTION_ID) { - return new npc_wyrmrest_defenderAI(creature); + // Makes player cast trigger spell for 49207 on self + player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); + CloseGossipMenuFor(player); } + return true; + } + + void OnCharmed(bool /*apply*/) override + { + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + } }; /*###### @@ -781,10 +738,10 @@ class spell_high_executor_branding_iron : public SpellScript void AddSC_dragonblight() { - new npc_commander_eligor_dawnbringer(); - new spell_q12096_q12092_dummy(); - new spell_q12096_q12092_bark(); - new npc_wyrmrest_defender(); + RegisterCreatureAI(npc_commander_eligor_dawnbringer); + RegisterSpellScript(spell_q12096_q12092_dummy); + RegisterSpellScript(spell_q12096_q12092_bark); + RegisterCreatureAI(npc_wyrmrest_defender); RegisterSpellScript(spell_warsong_battle_standard); RegisterSpellScript(spell_moti_mirror_image_script_effect); RegisterSpellScript(spell_moti_hourglass_cast_see_invis_on_master); diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 5488dbe6a2f..040dae075e1 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -58,199 +58,177 @@ enum Floppy }; // emily -class npc_emily : public CreatureScript +struct npc_emily : public EscortAI { -public: - npc_emily() : CreatureScript("npc_emily") { } + npc_emily(Creature* creature) : EscortAI(creature) { } - struct npc_emilyAI : public EscortAI + void JustSummoned(Creature* summoned) override { - npc_emilyAI(Creature* creature) : EscortAI(creature) { } - - void JustSummoned(Creature* summoned) override - { - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 50.0f)) - summoned->AI()->AttackStart(Mrfloppy); - else - summoned->AI()->AttackStart(me->GetVictim()); - } - - void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override - { - Player* player = GetPlayerForEscort(); - if (!player) - return; + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 50.0f)) + summoned->AI()->AttackStart(Mrfloppy); + else + summoned->AI()->AttackStart(me->GetVictim()); + } - switch (waypointId) - { - case 9: - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) - _mrfloppyGUID = Mrfloppy->GetGUID(); - break; - case 10: - if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - { - Talk(SAY_WORGHAGGRO1); - me->SummonCreature(NPC_HUNGRY_WORG, me->GetPositionX()+5, me->GetPositionY()+2, me->GetPositionZ()+1, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 2min); - } - break; - case 11: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - break; - case 17: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); - Talk(SAY_WORGRAGGRO3); - if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX()+10, me->GetPositionY()+8, me->GetPositionZ()+2, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 2min)) - { - RWORG->SetFaction(FACTION_FRIENDLY); - _RavenousworgGUID = RWORG->GetGUID(); - } - break; - case 18: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 9: + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) + _mrfloppyGUID = Mrfloppy->GetGUID(); + break; + case 10: + if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + Talk(SAY_WORGHAGGRO1); + me->SummonCreature(NPC_HUNGRY_WORG, me->GetPositionX()+5, me->GetPositionY()+2, me->GetPositionZ()+1, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 2min); + } + break; + case 11: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + break; + case 17: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + Talk(SAY_WORGRAGGRO3); + if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX()+10, me->GetPositionY()+8, me->GetPositionZ()+2, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 2min)) + { + RWORG->SetFaction(FACTION_FRIENDLY); + _RavenousworgGUID = RWORG->GetGUID(); + } + break; + case 18: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) + RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); + DoCast(Mrfloppy, SPELL_MRFLOPPY); + } + break; + case 19: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + if (Mrfloppy->HasAura(SPELL_MRFLOPPY)) { if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); - DoCast(Mrfloppy, SPELL_MRFLOPPY); + Mrfloppy->EnterVehicle(RWORG); } - break; - case 19: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - { - if (Mrfloppy->HasAura(SPELL_MRFLOPPY)) - { - if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - Mrfloppy->EnterVehicle(RWORG); - } - } - break; - case 20: + } + break; + case 20: + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) + RWORG->HandleEmoteCommand(EMOTE_ONESHOT_WOUND_CRITICAL); + break; + case 21: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->HandleEmoteCommand(EMOTE_ONESHOT_WOUND_CRITICAL); - break; - case 21: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { - if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - { - Unit::Kill(RWORG, Mrfloppy); - Mrfloppy->ExitVehicle(); - RWORG->SetFaction(FACTION_MONSTER); - RWORG->GetMotionMaster()->MovePoint(0, RWORG->GetPositionX()+10, RWORG->GetPositionY()+80, RWORG->GetPositionZ()); - Talk(SAY_VICTORY2); - } + Unit::Kill(RWORG, Mrfloppy); + Mrfloppy->ExitVehicle(); + RWORG->SetFaction(FACTION_MONSTER); + RWORG->GetMotionMaster()->MovePoint(0, RWORG->GetPositionX()+10, RWORG->GetPositionY()+80, RWORG->GetPositionZ()); + Talk(SAY_VICTORY2); } - break; - case 22: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + } + break; + case 22: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + if (Mrfloppy->isDead()) { - if (Mrfloppy->isDead()) - { - if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->DisappearAndDie(); - me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); - Mrfloppy->setDeathState(ALIVE); - Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Talk(SAY_VICTORY3); - } + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) + RWORG->DisappearAndDie(); + me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); + Mrfloppy->setDeathState(ALIVE); + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + Talk(SAY_VICTORY3); } - break; - case 24: - player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); - Talk(SAY_QUEST_COMPLETE, player); - me->SetWalk(false); - break; - case 25: - Talk(SAY_VICTORY4); - break; - case 27: - me->DisappearAndDie(); - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - Mrfloppy->DisappearAndDie(); - break; - } + } + break; + case 24: + player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); + Talk(SAY_QUEST_COMPLETE, player); + me->SetWalk(false); + break; + case 25: + Talk(SAY_VICTORY4); + break; + case 27: + me->DisappearAndDie(); + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + Mrfloppy->DisappearAndDie(); + break; } + } - void JustEngagedWith(Unit* /*Who*/) override - { - Talk(SAY_RANDOMAGGRO); - } + void JustEngagedWith(Unit* /*Who*/) override + { + Talk(SAY_RANDOMAGGRO); + } - void Reset() override - { - _mrfloppyGUID.Clear(); - _RavenousworgGUID.Clear(); - } + void Reset() override + { + _mrfloppyGUID.Clear(); + _RavenousworgGUID.Clear(); + } - void OnQuestAccept(Player* player, Quest const* quest) override + void OnQuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) { - if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) - { - Talk(SAY_QUEST_ACCEPT); - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 180.0f)) - Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + Talk(SAY_QUEST_ACCEPT); + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 180.0f)) + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Start(true, false, player->GetGUID()); - } + Start(true, false, player->GetGUID()); } - - private: - ObjectGuid _RavenousworgGUID; - ObjectGuid _mrfloppyGUID; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_emilyAI(creature); } + + private: + ObjectGuid _RavenousworgGUID; + ObjectGuid _mrfloppyGUID; }; // mrfloppy -class npc_mrfloppy : public CreatureScript +struct npc_mrfloppy : public ScriptedAI { -public: - npc_mrfloppy() : CreatureScript("npc_mrfloppy") { } - - struct npc_mrfloppyAI : public ScriptedAI - { - npc_mrfloppyAI(Creature* creature) : ScriptedAI(creature) { } + npc_mrfloppy(Creature* creature) : ScriptedAI(creature) { } - void Reset() override { } + void Reset() override { } - void JustEngagedWith(Unit* Who) override + void JustEngagedWith(Unit* Who) override + { + if (Creature* Emily = GetClosestCreatureWithEntry(me, NPC_EMILY, 50.0f)) { - if (Creature* Emily = GetClosestCreatureWithEntry(me, NPC_EMILY, 50.0f)) + switch (Who->GetEntry()) { - switch (Who->GetEntry()) - { - case NPC_HUNGRY_WORG: - Emily->AI()->Talk(SAY_WORGHAGGRO2); - break; - case NPC_RAVENOUS_WORG: - Emily->AI()->Talk(SAY_WORGRAGGRO4); - break; - default: - Emily->AI()->Talk(SAY_RANDOMAGGRO); - } + case NPC_HUNGRY_WORG: + Emily->AI()->Talk(SAY_WORGHAGGRO2); + break; + case NPC_RAVENOUS_WORG: + Emily->AI()->Talk(SAY_WORGRAGGRO4); + break; + default: + Emily->AI()->Talk(SAY_RANDOMAGGRO); } } + } - void EnterEvadeMode(EvadeReason /*why*/) override { } - - void MoveInLineOfSight(Unit* /*who*/) override { } + void EnterEvadeMode(EvadeReason /*why*/) override { } - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - } - }; + void MoveInLineOfSight(Unit* /*who*/) override { } - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 /*diff*/) override { - return new npc_mrfloppyAI(creature); + if (!UpdateVictim()) + return; } }; @@ -269,70 +247,59 @@ enum Outhouse SPELL_DUST_FIELD = 48329 }; -class npc_outhouse_bunny : public CreatureScript +struct npc_outhouse_bunny : public ScriptedAI { -public: - npc_outhouse_bunny() : CreatureScript("npc_outhouse_bunny") { } + npc_outhouse_bunny(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - struct npc_outhouse_bunnyAI : public ScriptedAI + void Initialize() { - npc_outhouse_bunnyAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + _counter = 0; + _gender = 0; + } - void Initialize() - { - _counter = 0; - _gender = 0; - } + void Reset() override + { + Initialize(); + } - void Reset() override - { - Initialize(); - } + void SetData(uint32 Type, uint32 Data) override + { + if (Type == 1) + _gender = Data; + } - void SetData(uint32 Type, uint32 Data) override - { - if (Type == 1) - _gender = Data; - } + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + if (spellInfo->Id == SPELL_OUTHOUSE_GROANS) { - Unit* unitCaster = caster->ToUnit(); - if (!unitCaster) - return; - - if (spellInfo->Id == SPELL_OUTHOUSE_GROANS) + ++_counter; + if (_counter < 5) + DoCast(unitCaster, SPELL_CAMERA_SHAKE, true); + else + _counter = 0; + DoCast(me, SPELL_DUST_FIELD, true); + switch (_gender) { - ++_counter; - if (_counter < 5) - DoCast(unitCaster, SPELL_CAMERA_SHAKE, true); - else - _counter = 0; - DoCast(me, SPELL_DUST_FIELD, true); - switch (_gender) - { - case GENDER_FEMALE: - DoPlaySoundToSet(me, SOUND_FEMALE); - break; + case GENDER_FEMALE: + DoPlaySoundToSet(me, SOUND_FEMALE); + break; - case GENDER_MALE: - DoPlaySoundToSet(me, SOUND_MALE); - break; - } + case GENDER_MALE: + DoPlaySoundToSet(me, SOUND_MALE); + break; } } - private: - uint8 _counter; - uint8 _gender; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_outhouse_bunnyAI(creature); } + private: + uint8 _counter; + uint8 _gender; }; // Tallhorn Stage @@ -343,52 +310,41 @@ enum TallhornStage OBJECT_HAUNCH = 188665 }; -class npc_tallhorn_stag : public CreatureScript +struct npc_tallhorn_stag : public ScriptedAI { -public: - npc_tallhorn_stag() : CreatureScript("npc_tallhorn_stag") { } - - struct npc_tallhorn_stagAI : public ScriptedAI + npc_tallhorn_stag(Creature* creature) : ScriptedAI(creature) { - npc_tallhorn_stagAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + Initialize(); + } - void Initialize() - { - _phase = 1; - } + void Initialize() + { + _phase = 1; + } - void Reset() override - { - Initialize(); - } + void Reset() override + { + Initialize(); + } - void UpdateAI(uint32 /*diff*/) override + void UpdateAI(uint32 /*diff*/) override + { + if (_phase == 1) { - if (_phase == 1) + if (me->FindNearestGameObject(OBJECT_HAUNCH, 2.0f)) { - if (me->FindNearestGameObject(OBJECT_HAUNCH, 2.0f)) - { - me->SetStandState(UNIT_STAND_STATE_DEAD); - me->SetImmuneToPC(true); - me->SetDynamicFlag(UNIT_DYNFLAG_DEAD); - } - _phase = 0; + me->SetStandState(UNIT_STAND_STATE_DEAD); + me->SetImmuneToPC(true); + me->SetDynamicFlag(UNIT_DYNFLAG_DEAD); } - if (!UpdateVictim()) - return; - DoMeleeAttackIfReady(); + _phase = 0; } - private: - uint8 _phase; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_tallhorn_stagAI(creature); + if (!UpdateVictim()) + return; + DoMeleeAttackIfReady(); } + private: + uint8 _phase; }; // Amberpine Woodsman @@ -405,55 +361,44 @@ enum AmberpineWoodsmanEvents EVENT_WOODSMAN_2 = 2 }; -class npc_amberpine_woodsman : public CreatureScript +struct npc_amberpine_woodsman : public ScriptedAI { -public: - npc_amberpine_woodsman() : CreatureScript("npc_amberpine_woodsman") { } + npc_amberpine_woodsman(Creature* creature) : ScriptedAI(creature) { } - struct npc_amberpine_woodsmanAI : public ScriptedAI + void Reset() override { - npc_amberpine_woodsmanAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override + if (me->FindNearestCreature(NPC_TALLHORN_STAG, 0.2f)) { - if (me->FindNearestCreature(NPC_TALLHORN_STAG, 0.2f)) - { - me->SetEmoteState(EMOTE_STATE_USE_STANDING); - } - else - _events.ScheduleEvent(EVENT_WOODSMAN_1, 0s); + me->SetEmoteState(EMOTE_STATE_USE_STANDING); } + else + _events.ScheduleEvent(EVENT_WOODSMAN_1, 0s); + } - void UpdateAI(uint32 diff) override - { - _events.Update(diff); + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_WOODSMAN_1: - me->SetEmoteState(EMOTE_STATE_LOOT); - _events.ScheduleEvent(EVENT_WOODSMAN_2, 3s); - break; - case EVENT_WOODSMAN_2: - me->SetEmoteState(EMOTE_ONESHOT_ATTACK1H); - _events.ScheduleEvent(EVENT_WOODSMAN_1, 4s); - break; - default: - break; - } + case EVENT_WOODSMAN_1: + me->SetEmoteState(EMOTE_STATE_LOOT); + _events.ScheduleEvent(EVENT_WOODSMAN_2, 3s); + break; + case EVENT_WOODSMAN_2: + me->SetEmoteState(EMOTE_ONESHOT_ATTACK1H); + _events.ScheduleEvent(EVENT_WOODSMAN_1, 4s); + break; + default: + break; } - UpdateVictim(); } - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_amberpine_woodsmanAI(creature); + UpdateVictim(); } + private: + EventMap _events; }; /*###### @@ -471,69 +416,58 @@ enum Skirmisher SAY_RANDOM = 0 }; -class npc_wounded_skirmisher : public CreatureScript +struct npc_wounded_skirmisher : public ScriptedAI { -public: - npc_wounded_skirmisher() : CreatureScript("npc_wounded_skirmisher") { } + npc_wounded_skirmisher(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - struct npc_wounded_skirmisherAI : public ScriptedAI + void Initialize() { - npc_wounded_skirmisherAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + _despawnTimer = 5s; + } - void Initialize() - { - _despawnTimer = 5s; - } + void Reset() override + { + Initialize(); + } - void Reset() override - { - Initialize(); - } + void MovementInform(uint32, uint32 id) override + { + if (id == 1) + me->DespawnOrUnsummon(_despawnTimer); + } - void MovementInform(uint32, uint32 id) override - { - if (id == 1) - me->DespawnOrUnsummon(_despawnTimer); - } + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Player* playerCaster = caster->ToPlayer(); + if (!playerCaster) + return; - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + if (spellInfo->Id == SPELL_RENEW_SKIRMISHER && playerCaster->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) { - Player* playerCaster = caster->ToPlayer(); - if (!playerCaster) - return; - - if (spellInfo->Id == SPELL_RENEW_SKIRMISHER && playerCaster->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) + DoCast(playerCaster, SPELL_KILL_CREDIT); + Talk(SAY_RANDOM, playerCaster); + if (me->IsStandState()) + me->GetMotionMaster()->MovePoint(1, me->GetPositionX()+7, me->GetPositionY()+7, me->GetPositionZ()); + else { - DoCast(playerCaster, SPELL_KILL_CREDIT); - Talk(SAY_RANDOM, playerCaster); - if (me->IsStandState()) - me->GetMotionMaster()->MovePoint(1, me->GetPositionX()+7, me->GetPositionY()+7, me->GetPositionZ()); - else - { - me->SetStandState(UNIT_STAND_STATE_STAND); - me->DespawnOrUnsummon(_despawnTimer); - } + me->SetStandState(UNIT_STAND_STATE_STAND); + me->DespawnOrUnsummon(_despawnTimer); } } + } - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - private: - Milliseconds _despawnTimer; - }; - - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 /*diff*/) override { - return new npc_wounded_skirmisherAI(creature); + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); } + private: + Milliseconds _despawnTimer; }; /*Venture co. Straggler - when you cast Smoke Bomb, he will yell and run away*/ @@ -559,92 +493,81 @@ enum StragglerEvents EVENT_CHOP = 5 }; -class npc_venture_co_straggler : public CreatureScript +struct npc_venture_co_straggler : public ScriptedAI { -public: - npc_venture_co_straggler() : CreatureScript("npc_venture_co_straggler") { } - - struct npc_venture_co_stragglerAI : public ScriptedAI - { - npc_venture_co_stragglerAI(Creature* creature) : ScriptedAI(creature) { } + npc_venture_co_straggler(Creature* creature) : ScriptedAI(creature) { } void JustEngagedWith(Unit* /*who*/) override { _events.ScheduleEvent(EVENT_CHOP, 3s, 6s); } - void Reset() override - { - _playerGUID.Clear(); - - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToPC(false); - me->SetReactState(REACT_AGGRESSIVE); - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); + void Reset() override + { + _playerGUID.Clear(); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_STRAGGLER_1: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - DoCast(player, SPELL_VENTURE_STRAGGLER_CREDIT); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()+7, me->GetPositionZ()); - _events.ScheduleEvent(EVENT_STRAGGLER_2, 2500ms); - break; - case EVENT_STRAGGLER_2: - Talk(SAY_SEO); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()-5, me->GetPositionZ()); - _events.ScheduleEvent(EVENT_STRAGGLER_3, 2500ms); - break; - case EVENT_STRAGGLER_3: - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-5, me->GetPositionY()-5, me->GetPositionZ()); - _events.ScheduleEvent(EVENT_STRAGGLER_4, 2500ms); - break; - case EVENT_STRAGGLER_4: - me->DisappearAndDie(); - break; - case EVENT_CHOP: - if (UpdateVictim()) - DoCastVictim(SPELL_CHOP); - _events.Repeat(Seconds(10), Seconds(12)); - break; - default: - break; - } - } + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->SetImmuneToPC(false); + me->SetReactState(REACT_AGGRESSIVE); + } - if (!UpdateVictim()) - return; - DoMeleeAttackIfReady(); - } + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + while (uint32 eventId = _events.ExecuteEvent()) { - if (spellInfo->Id == SPELL_SMOKE_BOMB && caster->GetTypeId() == TYPEID_PLAYER) + switch (eventId) { - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToPC(true); - me->SetReactState(REACT_PASSIVE); - me->CombatStop(false); - _playerGUID = caster->GetGUID(); - _events.ScheduleEvent(EVENT_STRAGGLER_1, 3500ms); + case EVENT_STRAGGLER_1: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + DoCast(player, SPELL_VENTURE_STRAGGLER_CREDIT); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()+7, me->GetPositionZ()); + _events.ScheduleEvent(EVENT_STRAGGLER_2, 2500ms); + break; + case EVENT_STRAGGLER_2: + Talk(SAY_SEO); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()-5, me->GetPositionZ()); + _events.ScheduleEvent(EVENT_STRAGGLER_3, 2500ms); + break; + case EVENT_STRAGGLER_3: + me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-5, me->GetPositionY()-5, me->GetPositionZ()); + _events.ScheduleEvent(EVENT_STRAGGLER_4, 2500ms); + break; + case EVENT_STRAGGLER_4: + me->DisappearAndDie(); + break; + case EVENT_CHOP: + if (UpdateVictim()) + DoCastVictim(SPELL_CHOP); + _events.Repeat(Seconds(10), Seconds(12)); + break; + default: + break; } } - private: - EventMap _events; - ObjectGuid _playerGUID; - }; + if (!UpdateVictim()) + return; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_SMOKE_BOMB && caster->GetTypeId() == TYPEID_PLAYER) { - return new npc_venture_co_stragglerAI(creature); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->SetImmuneToPC(true); + me->SetReactState(REACT_PASSIVE); + me->CombatStop(false); + _playerGUID = caster->GetGUID(); + _events.ScheduleEvent(EVENT_STRAGGLER_1, 3500ms); } + } + +private: + EventMap _events; + ObjectGuid _playerGUID; }; /*###### @@ -680,116 +603,105 @@ enum LakeFrogEvents EVENT_LAKEFROG_5 = 5 }; -class npc_lake_frog : public CreatureScript +struct npc_lake_frog : public ScriptedAI { -public: - npc_lake_frog() : CreatureScript("npc_lake_frog") { } + npc_lake_frog(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - struct npc_lake_frogAI : public ScriptedAI - { - npc_lake_frogAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + void Initialize() + { + _following = false; + _runningScript = false; + } - void Initialize() - { - _following = false; - _runningScript = false; - } + void Reset() override + { + Initialize(); + if (me->GetEntry() == NPC_LAKE_FROG_QUEST) + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + } - void Reset() override + void UpdateAI(uint32 diff) override + { + if (_following) + if (!me->HasAura(SPELL_FROG_LOVE)) + me->DespawnOrUnsummon(1s); + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - Initialize(); - if (me->GetEntry() == NPC_LAKE_FROG_QUEST) + case EVENT_LAKEFROG_1: + DoCast(me, SPELL_MAIDEN_OF_ASHWOOD_LAKE_TRANSFORM); + me->SetEntry(NPC_MAIDEN_OF_ASHWOOD_LAKE); + _events.ScheduleEvent(EVENT_LAKEFROG_2, 2s); + break; + case EVENT_LAKEFROG_2: + Talk(SAY_MAIDEN_0); + _events.ScheduleEvent(EVENT_LAKEFROG_3, 3s); + break; + case EVENT_LAKEFROG_3: + me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); + _events.ScheduleEvent(EVENT_LAKEFROG_4, 25s); + break; + case EVENT_LAKEFROG_4: me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + _events.ScheduleEvent(EVENT_LAKEFROG_5, 2s); + break; + case EVENT_LAKEFROG_5: + Talk(SAY_MAIDEN_1); + me->DespawnOrUnsummon(4s); + break; + default: + break; } + } + } - void UpdateAI(uint32 diff) override - { - if (_following) - if (!me->HasAura(SPELL_FROG_LOVE)) - me->DespawnOrUnsummon(1s); + void ReceiveEmote(Player* player, uint32 emote) override + { + if (_following || _runningScript) + return; - _events.Update(diff); + if (emote == TEXT_EMOTE_KISS && me->IsWithinDistInMap(player, 30.0f) && player->HasItemCount(ITEM_WARTS_B_GONE_LIP_BALM, 1, false)) + { + if (!player->HasAura(SPELL_WARTSBGONE_LIP_BALM)) + player->AddAura(SPELL_WARTS, player); + else + { + DoCast(player, SPELL_FROG_KISS); // Removes SPELL_WARTSBGONE_LIP_BALM - while (uint32 eventId = _events.ExecuteEvent()) + if (me->GetEntry() == NPC_LAKE_FROG) { - switch (eventId) - { - case EVENT_LAKEFROG_1: - DoCast(me, SPELL_MAIDEN_OF_ASHWOOD_LAKE_TRANSFORM); - me->SetEntry(NPC_MAIDEN_OF_ASHWOOD_LAKE); - _events.ScheduleEvent(EVENT_LAKEFROG_2, 2s); - break; - case EVENT_LAKEFROG_2: - Talk(SAY_MAIDEN_0); - _events.ScheduleEvent(EVENT_LAKEFROG_3, 3s); - break; - case EVENT_LAKEFROG_3: - me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); - _events.ScheduleEvent(EVENT_LAKEFROG_4, 25s); - break; - case EVENT_LAKEFROG_4: - me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - _events.ScheduleEvent(EVENT_LAKEFROG_5, 2s); - break; - case EVENT_LAKEFROG_5: - Talk(SAY_MAIDEN_1); - me->DespawnOrUnsummon(4s); - break; - default: - break; - } + me->AddAura(SPELL_FROG_LOVE, me); + me->GetMotionMaster()->MoveFollow(player, 0.3f, frand(float(M_PI) / 2, float(M_PI) + (float(M_PI) / 2))); + _following = true; } - } - - void ReceiveEmote(Player* player, uint32 emote) override - { - if (_following || _runningScript) - return; - - if (emote == TEXT_EMOTE_KISS && me->IsWithinDistInMap(player, 30.0f) && player->HasItemCount(ITEM_WARTS_B_GONE_LIP_BALM, 1, false)) + else if (me->GetEntry() == NPC_LAKE_FROG_QUEST) { - if (!player->HasAura(SPELL_WARTSBGONE_LIP_BALM)) - player->AddAura(SPELL_WARTS, player); - else - { - DoCast(player, SPELL_FROG_KISS); // Removes SPELL_WARTSBGONE_LIP_BALM - - if (me->GetEntry() == NPC_LAKE_FROG) - { - me->AddAura(SPELL_FROG_LOVE, me); - me->GetMotionMaster()->MoveFollow(player, 0.3f, frand(float(M_PI) / 2, float(M_PI) + (float(M_PI) / 2))); - _following = true; - } - else if (me->GetEntry() == NPC_LAKE_FROG_QUEST) - { - me->GetMotionMaster()->MoveIdle(); - me->SetFacingToObject(player); - _runningScript = true; - _events.ScheduleEvent(EVENT_LAKEFROG_1, 2s); - } - } + me->GetMotionMaster()->MoveIdle(); + me->SetFacingToObject(player); + _runningScript = true; + _events.ScheduleEvent(EVENT_LAKEFROG_1, 2s); } } + } + } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); - return false; - } - - private: - EventMap _events; - bool _following; - bool _runningScript; - }; + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); + return false; + } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_lake_frogAI(creature); - } +private: + EventMap _events; + bool _following; + bool _runningScript; }; enum ShredderDelivery @@ -797,36 +709,25 @@ enum ShredderDelivery NPC_BROKEN_DOWN_SHREDDER = 27354 }; -class spell_shredder_delivery : public SpellScriptLoader +class spell_shredder_delivery : public SpellScript { - public: - spell_shredder_delivery() : SpellScriptLoader("spell_shredder_delivery") { } - - class spell_shredder_delivery_SpellScript : public SpellScript - { - PrepareSpellScript(spell_shredder_delivery_SpellScript); - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } + PrepareSpellScript(spell_shredder_delivery); - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (GetCaster()->ToCreature()->GetEntry() == NPC_BROKEN_DOWN_SHREDDER) - GetCaster()->ToCreature()->DespawnOrUnsummon(); - } + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_shredder_delivery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (GetCaster()->ToCreature()->GetEntry() == NPC_BROKEN_DOWN_SHREDDER) + GetCaster()->ToCreature()->DespawnOrUnsummon(); + } - SpellScript* GetSpellScript() const override - { - return new spell_shredder_delivery_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_shredder_delivery::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; enum InfectedWorgenBite @@ -836,36 +737,25 @@ enum InfectedWorgenBite }; // 53094 - Infected Worgen Bite -class spell_infected_worgen_bite : public SpellScriptLoader +class spell_infected_worgen_bite : public AuraScript { - public: - spell_infected_worgen_bite() : SpellScriptLoader("spell_infected_worgen_bite") { } - - class spell_infected_worgen_bite_AuraScript : public AuraScript - { - PrepareAuraScript(spell_infected_worgen_bite_AuraScript); - - void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - if (GetStackAmount() == GetSpellInfo()->StackAmount) - { - Remove(); - target->CastSpell(target, SPELL_WORGENS_CALL, true); - } - } + PrepareAuraScript(spell_infected_worgen_bite); - void Register() override + void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + if (GetStackAmount() == GetSpellInfo()->StackAmount) { - AfterEffectApply += AuraEffectApplyFn(spell_infected_worgen_bite_AuraScript::HandleAfterEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + Remove(); + target->CastSpell(target, SPELL_WORGENS_CALL, true); } - }; + } - AuraScript* GetAuraScript() const override - { - return new spell_infected_worgen_bite_AuraScript(); - } + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_infected_worgen_bite::HandleAfterEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + } }; /*###### @@ -882,71 +772,60 @@ enum RedRocket SPELL_DETONATE = 49250 }; -class npc_rocket_propelled_warhead : public CreatureScript +struct npc_rocket_propelled_warhead : public VehicleAI { -public: - npc_rocket_propelled_warhead() : CreatureScript("npc_rocket_propelled_warhead") { } - - struct npc_rocket_propelled_warheadAI : public VehicleAI + npc_rocket_propelled_warhead(Creature* creature) : VehicleAI(creature) { - npc_rocket_propelled_warheadAI(Creature* creature) : VehicleAI(creature) - { - _finished = false; - _faction = ALLIANCE; - } - - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override - { - if (apply && who->ToPlayer()) - { - DoCast(me, SPELL_VEHICLE_WARHEAD_FUSE); - _faction = who->ToPlayer()->GetTeam(); - } - } - - void JustReachedHome() override - { - _finished = false; - me->SetVisible(true); - me->GetMotionMaster()->Clear(); - } + _finished = false; + _faction = ALLIANCE; + } - void DoAction(int32 /*action*/) override + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override + { + if (apply && who->ToPlayer()) { - FinishQuest(false, _faction); + DoCast(me, SPELL_VEHICLE_WARHEAD_FUSE); + _faction = who->ToPlayer()->GetTeam(); } + } - void SpellHit(WorldObject* caster, SpellInfo const* /*spellInfo*/) override - { - if (caster->GetEntry() == NPC_HORDE_LUMBERBOAT || caster->GetEntry() == NPC_ALLIANCE_LUMBERBOAT) - FinishQuest(true, _faction); - } + void JustReachedHome() override + { + _finished = false; + me->SetVisible(true); + me->GetMotionMaster()->Clear(); + } - void FinishQuest(bool success, uint32 faction) - { - if (_finished) - return; + void DoAction(int32 /*action*/) override + { + FinishQuest(false, _faction); + } - _finished = true; + void SpellHit(WorldObject* caster, SpellInfo const* /*spellInfo*/) override + { + if (caster->GetEntry() == NPC_HORDE_LUMBERBOAT || caster->GetEntry() == NPC_ALLIANCE_LUMBERBOAT) + FinishQuest(true, _faction); + } - if (success) - DoCast(me, faction == ALLIANCE ? SPELL_ALLIANCE_KILL_CREDIT_TORPEDO : SPELL_HORDE_KILL_CREDIT_TORPEDO); + void FinishQuest(bool success, uint32 faction) + { + if (_finished) + return; - DoCast(me, SPELL_DETONATE); - me->RemoveAllAuras(); - me->SetVisible(false); - me->GetMotionMaster()->MoveTargetedHome(); - } + _finished = true; - private: - uint32 _faction; - bool _finished; - }; + if (success) + DoCast(me, faction == ALLIANCE ? SPELL_ALLIANCE_KILL_CREDIT_TORPEDO : SPELL_HORDE_KILL_CREDIT_TORPEDO); - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_rocket_propelled_warheadAI(creature); + DoCast(me, SPELL_DETONATE); + me->RemoveAllAuras(); + me->SetVisible(false); + me->GetMotionMaster()->MoveTargetedHome(); } + +private: + uint32 _faction; + bool _finished; }; enum WarheadSpells @@ -956,38 +835,27 @@ enum WarheadSpells SPELL_WARHEAD_FUSE = 49181 }; // 49107 - Vehicle: Warhead Fuse -class spell_vehicle_warhead_fuse : public SpellScriptLoader +class spell_vehicle_warhead_fuse : public SpellScript { -public: - spell_vehicle_warhead_fuse() : SpellScriptLoader("spell_vehicle_warhead_fuse") { } + PrepareSpellScript(spell_vehicle_warhead_fuse); - class spell_vehicle_warhead_fuse_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_vehicle_warhead_fuse_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARHEAD_Z_CHECK, SPELL_WARHEAD_SEEKING_LUMBERSHIP, SPELL_WARHEAD_FUSE }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); + return ValidateSpellInfo({ SPELL_WARHEAD_Z_CHECK, SPELL_WARHEAD_SEEKING_LUMBERSHIP, SPELL_WARHEAD_FUSE }); + } - caster->CastSpell(caster, SPELL_WARHEAD_Z_CHECK, true); - caster->CastSpell(caster, SPELL_WARHEAD_SEEKING_LUMBERSHIP, true); - caster->CastSpell(caster, SPELL_WARHEAD_FUSE, true); - } + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_vehicle_warhead_fuse_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + caster->CastSpell(caster, SPELL_WARHEAD_Z_CHECK, true); + caster->CastSpell(caster, SPELL_WARHEAD_SEEKING_LUMBERSHIP, true); + caster->CastSpell(caster, SPELL_WARHEAD_FUSE, true); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_vehicle_warhead_fuse_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_vehicle_warhead_fuse::HandleDummy, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -998,141 +866,108 @@ enum WarheadDenonate NPC_ALLIANCE_LUMBERBOAT_EXPLOSIONS = 27689 }; // 49250 - Detonate -class spell_warhead_detonate : public SpellScriptLoader +class spell_warhead_detonate : public SpellScript { -public: - spell_warhead_detonate() : SpellScriptLoader("spell_warhead_detonate") { } + PrepareSpellScript(spell_warhead_detonate); - class spell_warhead_detonate_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_warhead_detonate_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_PARACHUTE, SPELL_TORPEDO_EXPLOSION }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - Player* player = GetHitPlayer(); - if (!player) - return; - - player->ExitVehicle(); - float horizontalSpeed = 3.0f; - float verticalSpeed = 40.0f; - player->KnockbackFrom(caster->GetPositionX(), caster->GetPositionY(), horizontalSpeed, verticalSpeed); - caster->CastSpell(player, SPELL_PARACHUTE, true); - - std::list<Creature*> explosionBunnys; - caster->GetCreatureListWithEntryInGrid(explosionBunnys, NPC_ALLIANCE_LUMBERBOAT_EXPLOSIONS, 90.0f); - for (std::list<Creature*>::const_iterator itr = explosionBunnys.begin(); itr != explosionBunnys.end(); ++itr) - (*itr)->CastSpell((*itr), SPELL_TORPEDO_EXPLOSION, true); - } + return ValidateSpellInfo({ SPELL_PARACHUTE, SPELL_TORPEDO_EXPLOSION }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warhead_detonate_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + Player* player = GetHitPlayer(); + if (!player) + return; + + player->ExitVehicle(); + float horizontalSpeed = 3.0f; + float verticalSpeed = 40.0f; + player->KnockbackFrom(caster->GetPositionX(), caster->GetPositionY(), horizontalSpeed, verticalSpeed); + caster->CastSpell(player, SPELL_PARACHUTE, true); + + std::list<Creature*> explosionBunnys; + caster->GetCreatureListWithEntryInGrid(explosionBunnys, NPC_ALLIANCE_LUMBERBOAT_EXPLOSIONS, 90.0f); + for (std::list<Creature*>::const_iterator itr = explosionBunnys.begin(); itr != explosionBunnys.end(); ++itr) + (*itr)->CastSpell((*itr), SPELL_TORPEDO_EXPLOSION, true); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_warhead_detonate_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_warhead_detonate::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 61678 - Z Check -class spell_z_check : public SpellScriptLoader +class spell_z_check : public AuraScript { -public: - spell_z_check() : SpellScriptLoader("spell_z_check") { } + PrepareAuraScript(spell_z_check); - class spell_z_check_AuraScript : public AuraScript +public: + spell_z_check() { - PrepareAuraScript(spell_z_check_AuraScript); - - public: - spell_z_check_AuraScript() - { - _posZ = 0.0f; - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - _posZ = GetTarget()->GetPositionZ(); - } + _posZ = 0.0f; + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + _posZ = GetTarget()->GetPositionZ(); + } - if (_posZ != GetTarget()->GetPositionZ()) - if (Creature* target = GetTarget()->ToCreature()) - target->AI()->DoAction(0); - } + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); - private: - float _posZ; + if (_posZ != GetTarget()->GetPositionZ()) + if (Creature* target = GetTarget()->ToCreature()) + target->AI()->DoAction(0); + } - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_z_check_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_z_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; +private: + float _posZ; - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_z_check_AuraScript(); + OnEffectApply += AuraEffectApplyFn(spell_z_check::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_z_check::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; // 49181 - Warhead Fuse -class spell_warhead_fuse : public SpellScriptLoader +class spell_warhead_fuse : public AuraScript { -public: - spell_warhead_fuse() : SpellScriptLoader("spell_warhead_fuse") { } + PrepareAuraScript(spell_warhead_fuse); - class spell_warhead_fuse_AuraScript : public AuraScript + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_warhead_fuse_AuraScript); - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* rocketUnit = GetTarget()->GetVehicleBase()) - if (Creature* rocketCrea = rocketUnit->ToCreature()) - rocketCrea->AI()->DoAction(0); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_warhead_fuse_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + if (Unit* rocketUnit = GetTarget()->GetVehicleBase()) + if (Creature* rocketCrea = rocketUnit->ToCreature()) + rocketCrea->AI()->DoAction(0); + } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_warhead_fuse_AuraScript(); + OnEffectRemove += AuraEffectRemoveFn(spell_warhead_fuse::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; void AddSC_grizzly_hills() { - new npc_emily(); - new npc_mrfloppy(); - new npc_outhouse_bunny(); - new npc_tallhorn_stag(); - new npc_amberpine_woodsman(); - new npc_wounded_skirmisher(); - new npc_venture_co_straggler(); - new npc_lake_frog(); - new spell_shredder_delivery(); - new spell_infected_worgen_bite(); - new npc_rocket_propelled_warhead(); - new spell_z_check(); - new spell_warhead_detonate(); - new spell_vehicle_warhead_fuse(); - new spell_warhead_fuse(); + RegisterCreatureAI(npc_emily); + RegisterCreatureAI(npc_mrfloppy); + RegisterCreatureAI(npc_outhouse_bunny); + RegisterCreatureAI(npc_tallhorn_stag); + RegisterCreatureAI(npc_amberpine_woodsman); + RegisterCreatureAI(npc_wounded_skirmisher); + RegisterCreatureAI(npc_venture_co_straggler); + RegisterCreatureAI(npc_lake_frog); + RegisterSpellScript(spell_shredder_delivery); + RegisterSpellScript(spell_infected_worgen_bite); + RegisterCreatureAI(npc_rocket_propelled_warhead); + RegisterSpellScript(spell_z_check); + RegisterSpellScript(spell_warhead_detonate); + RegisterSpellScript(spell_vehicle_warhead_fuse); + RegisterSpellScript(spell_warhead_fuse); } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index adb5a4cedef..59be4cfab0c 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -38,79 +38,68 @@ enum ArgentValiant SPELL_KILL_CREDIT = 63049 }; -class npc_argent_valiant : public CreatureScript +struct npc_argent_valiant : public ScriptedAI { -public: - npc_argent_valiant() : CreatureScript("npc_argent_valiant") { } - - struct npc_argent_valiantAI : public ScriptedAI + npc_argent_valiant(Creature* creature) : ScriptedAI(creature) { - npc_argent_valiantAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - creature->GetMotionMaster()->MovePoint(0, 8599.258f, 963.951f, 547.553f); - creature->SetFaction(FACTION_FRIENDLY); //wrong faction in db? - } + Initialize(); + creature->GetMotionMaster()->MovePoint(0, 8599.258f, 963.951f, 547.553f); + creature->SetFaction(FACTION_FRIENDLY); //wrong faction in db? + } - void Initialize() - { - uiChargeTimer = 7000; - uiShieldBreakerTimer = 10000; - } + void Initialize() + { + uiChargeTimer = 7000; + uiShieldBreakerTimer = 10000; + } - uint32 uiChargeTimer; - uint32 uiShieldBreakerTimer; + uint32 uiChargeTimer; + uint32 uiShieldBreakerTimer; - void Reset() override - { - Initialize(); - } + void Reset() override + { + Initialize(); + } - void MovementInform(uint32 uiType, uint32 /*uiId*/) override - { - if (uiType != POINT_MOTION_TYPE) - return; + void MovementInform(uint32 uiType, uint32 /*uiId*/) override + { + if (uiType != POINT_MOTION_TYPE) + return; - me->SetFaction(FACTION_MONSTER); - } + me->SetFaction(FACTION_MONSTER); + } - void DamageTaken(Unit* pDoneBy, uint32& uiDamage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + void DamageTaken(Unit* pDoneBy, uint32& uiDamage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (uiDamage > me->GetHealth() && pDoneBy && pDoneBy->GetTypeId() == TYPEID_PLAYER) { - if (uiDamage > me->GetHealth() && pDoneBy && pDoneBy->GetTypeId() == TYPEID_PLAYER) - { - uiDamage = 0; - pDoneBy->CastSpell(pDoneBy, SPELL_KILL_CREDIT, true); - me->SetFaction(FACTION_FRIENDLY); - me->DespawnOrUnsummon(5s); - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - EnterEvadeMode(); - } + uiDamage = 0; + pDoneBy->CastSpell(pDoneBy, SPELL_KILL_CREDIT, true); + me->SetFaction(FACTION_FRIENDLY); + me->DespawnOrUnsummon(5s); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + EnterEvadeMode(); } + } - void UpdateAI(uint32 uiDiff) override - { - if (!UpdateVictim()) - return; - - if (uiChargeTimer <= uiDiff) - { - DoCastVictim(SPELL_CHARGE); - uiChargeTimer = 7000; - } else uiChargeTimer -= uiDiff; + void UpdateAI(uint32 uiDiff) override + { + if (!UpdateVictim()) + return; - if (uiShieldBreakerTimer <= uiDiff) - { - DoCastVictim(SPELL_SHIELD_BREAKER); - uiShieldBreakerTimer = 10000; - } else uiShieldBreakerTimer -= uiDiff; + if (uiChargeTimer <= uiDiff) + { + DoCastVictim(SPELL_CHARGE); + uiChargeTimer = 7000; + } else uiChargeTimer -= uiDiff; - DoMeleeAttackIfReady(); - } - }; + if (uiShieldBreakerTimer <= uiDiff) + { + DoCastVictim(SPELL_SHIELD_BREAKER); + uiShieldBreakerTimer = 10000; + } else uiShieldBreakerTimer -= uiDiff; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_argent_valiantAI(creature); + DoMeleeAttackIfReady(); } }; @@ -127,41 +116,30 @@ enum GuardianPavilion SPELL_TRESPASSER_A = 63986, }; -class npc_guardian_pavilion : public CreatureScript +struct npc_guardian_pavilion : public ScriptedAI { -public: - npc_guardian_pavilion() : CreatureScript("npc_guardian_pavilion") { } - - struct npc_guardian_pavilionAI : public ScriptedAI + npc_guardian_pavilion(Creature* creature) : ScriptedAI(creature) { - npc_guardian_pavilionAI(Creature* creature) : ScriptedAI(creature) - { - SetCombatMovement(false); - } + SetCombatMovement(false); + } - void MoveInLineOfSight(Unit* who) override + void MoveInLineOfSight(Unit* who) override - { - if (me->GetAreaId() != AREA_SUNREAVER_PAVILION && me->GetAreaId() != AREA_SILVER_COVENANT_PAVILION) - return; - - if (!who || who->GetTypeId() != TYPEID_PLAYER || !me->IsHostileTo(who) || !me->isInBackInMap(who, 5.0f)) - return; + { + if (me->GetAreaId() != AREA_SUNREAVER_PAVILION && me->GetAreaId() != AREA_SILVER_COVENANT_PAVILION) + return; - if (who->HasAura(SPELL_TRESPASSER_H) || who->HasAura(SPELL_TRESPASSER_A)) - return; + if (!who || who->GetTypeId() != TYPEID_PLAYER || !me->IsHostileTo(who) || !me->isInBackInMap(who, 5.0f)) + return; - if (who->ToPlayer()->GetTeamId() == TEAM_ALLIANCE) - who->CastSpell(who, SPELL_TRESPASSER_H, true); - else - who->CastSpell(who, SPELL_TRESPASSER_A, true); + if (who->HasAura(SPELL_TRESPASSER_H) || who->HasAura(SPELL_TRESPASSER_A)) + return; - } - }; + if (who->ToPlayer()->GetTeamId() == TEAM_ALLIANCE) + who->CastSpell(who, SPELL_TRESPASSER_H, true); + else + who->CastSpell(who, SPELL_TRESPASSER_A, true); - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_guardian_pavilionAI(creature); } }; @@ -192,134 +170,122 @@ enum TournamentDummy EVENT_DUMMY_RESET = 2, }; -class npc_tournament_training_dummy : public CreatureScript +struct npc_tournament_training_dummy : ScriptedAI { - public: - npc_tournament_training_dummy(): CreatureScript("npc_tournament_training_dummy"){ } - - struct npc_tournament_training_dummyAI : ScriptedAI - { - npc_tournament_training_dummyAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - SetCombatMovement(false); - } + npc_tournament_training_dummy(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + SetCombatMovement(false); + } - void Initialize() - { - isVulnerable = false; - } + void Initialize() + { + isVulnerable = false; + } - EventMap events; - bool isVulnerable; + EventMap events; + bool isVulnerable; - void Reset() override - { - me->SetControlled(true, UNIT_STATE_STUNNED); - Initialize(); + void Reset() override + { + me->SetControlled(true, UNIT_STATE_STUNNED); + Initialize(); - events.Reset(); - events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5s); - } + events.Reset(); + events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5s); + } - void EnterEvadeMode(EvadeReason why) override - { - if (!_EnterEvadeMode(why)) - return; + void EnterEvadeMode(EvadeReason why) override + { + if (!_EnterEvadeMode(why)) + return; - Reset(); - } + Reset(); + } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - damage = 0; - events.RescheduleEvent(EVENT_DUMMY_RESET, 10s); - } + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + damage = 0; + events.RescheduleEvent(EVENT_DUMMY_RESET, 10s); + } - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - Unit* unitCaster = caster->ToUnit(); - if (!unitCaster) - return; + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; - switch (me->GetEntry()) + switch (me->GetEntry()) + { + case NPC_CHARGE_TARGET: + if (spellInfo->Id == SPELL_PLAYER_CHARGE) + if (isVulnerable) + DoCast(unitCaster, SPELL_CHARGE_CREDIT, true); + break; + case NPC_MELEE_TARGET: + if (spellInfo->Id == SPELL_PLAYER_THRUST) { - case NPC_CHARGE_TARGET: - if (spellInfo->Id == SPELL_PLAYER_CHARGE) - if (isVulnerable) - DoCast(unitCaster, SPELL_CHARGE_CREDIT, true); - break; - case NPC_MELEE_TARGET: - if (spellInfo->Id == SPELL_PLAYER_THRUST) - { - DoCast(unitCaster, SPELL_MELEE_CREDIT, true); + DoCast(unitCaster, SPELL_MELEE_CREDIT, true); - if (Unit* target = unitCaster->GetVehicleBase()) - DoCast(target, SPELL_COUNTERATTACK, true); - } - break; - case NPC_RANGED_TARGET: - if (spellInfo->Id == SPELL_PLAYER_BREAK_SHIELD) - if (isVulnerable) - DoCast(unitCaster, SPELL_RANGED_CREDIT, true); - break; + if (Unit* target = unitCaster->GetVehicleBase()) + DoCast(target, SPELL_COUNTERATTACK, true); } - + break; + case NPC_RANGED_TARGET: if (spellInfo->Id == SPELL_PLAYER_BREAK_SHIELD) - if (!me->HasAura(SPELL_CHARGE_DEFEND) && !me->HasAura(SPELL_RANGED_DEFEND)) - isVulnerable = true; - } + if (isVulnerable) + DoCast(unitCaster, SPELL_RANGED_CREDIT, true); + break; + } - void UpdateAI(uint32 diff) override - { - events.Update(diff); + if (spellInfo->Id == SPELL_PLAYER_BREAK_SHIELD) + if (!me->HasAura(SPELL_CHARGE_DEFEND) && !me->HasAura(SPELL_RANGED_DEFEND)) + isVulnerable = true; + } - switch (events.ExecuteEvent()) + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + switch (events.ExecuteEvent()) + { + case EVENT_DUMMY_RECAST_DEFEND: + switch (me->GetEntry()) { - case EVENT_DUMMY_RECAST_DEFEND: - switch (me->GetEntry()) - { - case NPC_CHARGE_TARGET: - { - if (!me->HasAura(SPELL_CHARGE_DEFEND)) - DoCast(me, SPELL_CHARGE_DEFEND, true); - break; - } - case NPC_RANGED_TARGET: - { - Aura* defend = me->GetAura(SPELL_RANGED_DEFEND); - if (!defend || defend->GetStackAmount() < 3 || defend->GetDuration() <= 8000) - DoCast(me, SPELL_RANGED_DEFEND, true); - break; - } - } - isVulnerable = false; - events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5s); + case NPC_CHARGE_TARGET: + { + if (!me->HasAura(SPELL_CHARGE_DEFEND)) + DoCast(me, SPELL_CHARGE_DEFEND, true); break; - case EVENT_DUMMY_RESET: - if (UpdateVictim()) - { - EnterEvadeMode(EVADE_REASON_OTHER); - events.ScheduleEvent(EVENT_DUMMY_RESET, 10s); - } + } + case NPC_RANGED_TARGET: + { + Aura* defend = me->GetAura(SPELL_RANGED_DEFEND); + if (!defend || defend->GetStackAmount() < 3 || defend->GetDuration() <= 8000) + DoCast(me, SPELL_RANGED_DEFEND, true); break; + } } + isVulnerable = false; + events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5s); + break; + case EVENT_DUMMY_RESET: + if (UpdateVictim()) + { + EnterEvadeMode(EVADE_REASON_OTHER); + events.ScheduleEvent(EVENT_DUMMY_RESET, 10s); + } + break; + } - if (!UpdateVictim()) - return; - - if (!me->HasUnitState(UNIT_STATE_STUNNED)) - me->SetControlled(true, UNIT_STATE_STUNNED); - } - - void MoveInLineOfSight(Unit* /*who*/) override { } + if (!UpdateVictim()) + return; - }; + if (!me->HasUnitState(UNIT_STATE_STUNNED)) + me->SetControlled(true, UNIT_STATE_STUNNED); + } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_tournament_training_dummyAI(creature); - } + void MoveInLineOfSight(Unit* /*who*/) override { } }; @@ -408,291 +374,280 @@ Position const Mason3Pos[3] = {6417.070f, 438.824f, 511.395f, 3.6651f}, // mason3 action pos }; -class npc_blessed_banner : public CreatureScript +struct npc_blessed_banner : public ScriptedAI { -public: - npc_blessed_banner() : CreatureScript("npc_blessed_banner") { } - - struct npc_blessed_bannerAI : public ScriptedAI + npc_blessed_banner(Creature* creature) : ScriptedAI(creature), Summons(me) { - npc_blessed_bannerAI(Creature* creature) : ScriptedAI(creature), Summons(me) - { - HalofSpawned = false; - PhaseCount = 0; + HalofSpawned = false; + PhaseCount = 0; - SetCombatMovement(false); - } + SetCombatMovement(false); + } - EventMap events; + EventMap events; - bool HalofSpawned; + bool HalofSpawned; - uint32 PhaseCount; + uint32 PhaseCount; - SummonList Summons; + SummonList Summons; - ObjectGuid guidDalfors; - ObjectGuid guidPriest[3]; - ObjectGuid guidMason[3]; - ObjectGuid guidHalof; + ObjectGuid guidDalfors; + ObjectGuid guidPriest[3]; + ObjectGuid guidMason[3]; + ObjectGuid guidHalof; - void Reset() override - { - me->SetRegenerateHealth(false); - DoCast(SPELL_THREAT_PULSE); - Talk(BANNER_SAY); - events.ScheduleEvent(EVENT_SPAWN, 3s); - } + void Reset() override + { + me->SetRegenerateHealth(false); + DoCast(SPELL_THREAT_PULSE); + Talk(BANNER_SAY); + events.ScheduleEvent(EVENT_SPAWN, 3s); + } - void JustEngagedWith(Unit* /*who*/) override { } + void JustEngagedWith(Unit* /*who*/) override { } - void MoveInLineOfSight(Unit* /*who*/) override { } + void MoveInLineOfSight(Unit* /*who*/) override { } - void JustSummoned(Creature* Summoned) override - { - Summons.Summon(Summoned); - } + void JustSummoned(Creature* Summoned) override + { + Summons.Summon(Summoned); + } - void JustDied(Unit* /*killer*/) override - { - Summons.DespawnAll(); - me->DespawnOrUnsummon(); - } + void JustDied(Unit* /*killer*/) override + { + Summons.DespawnAll(); + me->DespawnOrUnsummon(); + } - void UpdateAI(uint32 diff) override - { - events.Update(diff); + void UpdateAI(uint32 diff) override + { + events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_SPAWN: + switch (events.ExecuteEvent()) + { + case EVENT_SPAWN: + { + if (Creature* Dalfors = DoSummon(NPC_CRUSADER_LORD_DALFORS, DalforsPos[0])) { - if (Creature* Dalfors = DoSummon(NPC_CRUSADER_LORD_DALFORS, DalforsPos[0])) - { - guidDalfors = Dalfors->GetGUID(); - Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[1]); - } - if (Creature* Priest1 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest1Pos[0])) - { - guidPriest[0] = Priest1->GetGUID(); - Priest1->GetMotionMaster()->MovePoint(0, Priest1Pos[1]); - } - if (Creature* Priest2 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest2Pos[0])) - { - guidPriest[1] = Priest2->GetGUID(); - Priest2->GetMotionMaster()->MovePoint(0, Priest2Pos[1]); - } - if (Creature* Priest3 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest3Pos[0])) - { - guidPriest[2] = Priest3->GetGUID(); - Priest3->GetMotionMaster()->MovePoint(0, Priest3Pos[1]); - } - if (Creature* Mason1 = DoSummon(NPC_ARGENT_MASON, Mason1Pos[0])) - { - guidMason[0] = Mason1->GetGUID(); - Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[1]); - } - if (Creature* Mason2 = DoSummon(NPC_ARGENT_MASON, Mason2Pos[0])) - { - guidMason[1] = Mason2->GetGUID(); - Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[1]); - } - if (Creature* Mason3 = DoSummon(NPC_ARGENT_MASON, Mason3Pos[0])) - { - guidMason[2] = Mason3->GetGUID(); - Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[1]); - } - events.ScheduleEvent(EVENT_INTRO_1, 15s); + guidDalfors = Dalfors->GetGUID(); + Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[1]); } - break; - case EVENT_INTRO_1: + if (Creature* Priest1 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest1Pos[0])) { - if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) - Dalfors->AI()->Talk(DALFORS_SAY_PRE_1); - events.ScheduleEvent(EVENT_INTRO_2, 5s); + guidPriest[0] = Priest1->GetGUID(); + Priest1->GetMotionMaster()->MovePoint(0, Priest1Pos[1]); } - break; - case EVENT_INTRO_2: + if (Creature* Priest2 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest2Pos[0])) { - if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) - { - Dalfors->SetFacingTo(6.215f); - Dalfors->AI()->Talk(DALFORS_SAY_PRE_2); - } - events.ScheduleEvent(EVENT_INTRO_3, 5s); + guidPriest[1] = Priest2->GetGUID(); + Priest2->GetMotionMaster()->MovePoint(0, Priest2Pos[1]); } - break; - case EVENT_INTRO_3: + if (Creature* Priest3 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest3Pos[0])) { - if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) - { - Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[2]); - Dalfors->SetHomePosition(DalforsPos[2]); - } - if (Creature* Priest1 = ObjectAccessor::GetCreature(*me, guidPriest[0])) - { - Priest1->SetFacingTo(5.7421f); - Priest1->SetHomePosition(Priest1Pos[1]); - } - if (Creature* Priest2 = ObjectAccessor::GetCreature(*me, guidPriest[1])) - { - Priest2->SetFacingTo(5.7421f); - Priest2->SetHomePosition(Priest2Pos[1]); - } - if (Creature* Priest3 = ObjectAccessor::GetCreature(*me, guidPriest[2])) - { - Priest3->SetFacingTo(5.7421f); - Priest3->SetHomePosition(Priest3Pos[1]); - } - if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) - { - Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[2]); - Mason1->SetHomePosition(Mason1Pos[2]); - } - if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) - { - Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[2]); - Mason2->SetHomePosition(Mason2Pos[2]); - } - if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) - { - Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[2]); - Mason3->SetHomePosition(Mason3Pos[2]); - } - events.ScheduleEvent(EVENT_START_FIGHT, 5s); - events.ScheduleEvent(EVENT_MASON_ACTION, 15s); + guidPriest[2] = Priest3->GetGUID(); + Priest3->GetMotionMaster()->MovePoint(0, Priest3Pos[1]); } - break; - case EVENT_MASON_ACTION: + if (Creature* Mason1 = DoSummon(NPC_ARGENT_MASON, Mason1Pos[0])) { - if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) - { - Mason1->SetFacingTo(2.8972f); - Mason1->AI()->SetData(1, 1); // triggers SAI actions on npc - } - if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) - { - Mason2->SetFacingTo(3.1241f); - Mason2->AI()->SetData(1, 1); // triggers SAI actions on npc - } - if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) - { - Mason3->SetFacingTo(3.6651f); - Mason3->AI()->SetData(1, 1); // triggers SAI actions on npc - } + guidMason[0] = Mason1->GetGUID(); + Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[1]); + } + if (Creature* Mason2 = DoSummon(NPC_ARGENT_MASON, Mason2Pos[0])) + { + guidMason[1] = Mason2->GetGUID(); + Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[1]); + } + if (Creature* Mason3 = DoSummon(NPC_ARGENT_MASON, Mason3Pos[0])) + { + guidMason[2] = Mason3->GetGUID(); + Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[1]); + } + events.ScheduleEvent(EVENT_INTRO_1, 15s); + } + break; + case EVENT_INTRO_1: + { + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) + Dalfors->AI()->Talk(DALFORS_SAY_PRE_1); + events.ScheduleEvent(EVENT_INTRO_2, 5s); + } + break; + case EVENT_INTRO_2: + { + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) + { + Dalfors->SetFacingTo(6.215f); + Dalfors->AI()->Talk(DALFORS_SAY_PRE_2); + } + events.ScheduleEvent(EVENT_INTRO_3, 5s); + } + break; + case EVENT_INTRO_3: + { + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) + { + Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[2]); + Dalfors->SetHomePosition(DalforsPos[2]); + } + if (Creature* Priest1 = ObjectAccessor::GetCreature(*me, guidPriest[0])) + { + Priest1->SetFacingTo(5.7421f); + Priest1->SetHomePosition(Priest1Pos[1]); + } + if (Creature* Priest2 = ObjectAccessor::GetCreature(*me, guidPriest[1])) + { + Priest2->SetFacingTo(5.7421f); + Priest2->SetHomePosition(Priest2Pos[1]); + } + if (Creature* Priest3 = ObjectAccessor::GetCreature(*me, guidPriest[2])) + { + Priest3->SetFacingTo(5.7421f); + Priest3->SetHomePosition(Priest3Pos[1]); + } + if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) + { + Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[2]); + Mason1->SetHomePosition(Mason1Pos[2]); + } + if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) + { + Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[2]); + Mason2->SetHomePosition(Mason2Pos[2]); + } + if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) + { + Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[2]); + Mason3->SetHomePosition(Mason3Pos[2]); + } + events.ScheduleEvent(EVENT_START_FIGHT, 5s); + events.ScheduleEvent(EVENT_MASON_ACTION, 15s); + } + break; + case EVENT_MASON_ACTION: + { + if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) + { + Mason1->SetFacingTo(2.8972f); + Mason1->AI()->SetData(1, 1); // triggers SAI actions on npc + } + if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) + { + Mason2->SetFacingTo(3.1241f); + Mason2->AI()->SetData(1, 1); // triggers SAI actions on npc } - break; - case EVENT_START_FIGHT: + if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) + { + Mason3->SetFacingTo(3.6651f); + Mason3->AI()->SetData(1, 1); // triggers SAI actions on npc + } + } + break; + case EVENT_START_FIGHT: + { + if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) + LK->AI()->Talk(LK_TALK_1); + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) + Dalfors->AI()->Talk(DALFORS_SAY_START); + events.ScheduleEvent(EVENT_WAVE_SPAWN, 1s); + } + break; + case EVENT_WAVE_SPAWN: + { + if (PhaseCount == 3) { if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) - LK->AI()->Talk(LK_TALK_1); - if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) - Dalfors->AI()->Talk(DALFORS_SAY_START); - events.ScheduleEvent(EVENT_WAVE_SPAWN, 1s); + LK->AI()->Talk(LK_TALK_2); } - break; - case EVENT_WAVE_SPAWN: + else if (PhaseCount == 6) { - if (PhaseCount == 3) - { - if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) - LK->AI()->Talk(LK_TALK_2); - } - else if (PhaseCount == 6) + if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) + LK->AI()->Talk(LK_TALK_3); + } + if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason3Pos[0])) { - if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) - LK->AI()->Talk(LK_TALK_3); + tempsum->SetHomePosition(DalforsPos[2]); + tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } - if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason3Pos[0])) - { - tempsum->SetHomePosition(DalforsPos[2]); - tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); - } - if (urand(0, 1) == 0) + if (urand(0, 1) == 0) + { + if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason1Pos[0])) { - if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason1Pos[0])) - { - tempsum->SetHomePosition(DalforsPos[2]); - tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); - } - if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason2Pos[0])) - { - tempsum->SetHomePosition(DalforsPos[2]); - tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); - } + tempsum->SetHomePosition(DalforsPos[2]); + tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } - else - { - if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason1Pos[0])) - { - tempsum->SetHomePosition(DalforsPos[2]); - tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); - } - if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason2Pos[0])) - { - tempsum->SetHomePosition(DalforsPos[2]); - tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); - } - } - - PhaseCount++; - - if (PhaseCount < 8) - events.ScheduleEvent(EVENT_WAVE_SPAWN, 10s, 20s); - else - events.ScheduleEvent(EVENT_HALOF, 10s, 20s); - } - break; - case EVENT_HALOF: - { - if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) - LK->AI()->Talk(LK_TALK_4); - if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason1Pos[0])) + if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason2Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } - if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason2Pos[0])) + } + else + { + if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason1Pos[0])) { tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } - if (Creature* tempsum = DoSummon(NPC_HALOF_THE_DEATHBRINGER, DalforsPos[0])) + if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason2Pos[0])) { - HalofSpawned = true; - guidHalof = tempsum->GetGUID(); tempsum->SetHomePosition(DalforsPos[2]); tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } } - break; - case EVENT_ENDED: + + PhaseCount++; + + if (PhaseCount < 8) + events.ScheduleEvent(EVENT_WAVE_SPAWN, 10s, 20s); + else + events.ScheduleEvent(EVENT_HALOF, 10s, 20s); + } + break; + case EVENT_HALOF: + { + if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) + LK->AI()->Talk(LK_TALK_4); + if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason1Pos[0])) + { + tempsum->SetHomePosition(DalforsPos[2]); + tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); + } + if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason2Pos[0])) { - Summons.DespawnAll(); - me->DespawnOrUnsummon(); + tempsum->SetHomePosition(DalforsPos[2]); + tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } - break; - } - - if (PhaseCount == 8) - if (Creature* Halof = ObjectAccessor::GetCreature(*me, guidHalof)) - if (Halof->isDead()) + if (Creature* tempsum = DoSummon(NPC_HALOF_THE_DEATHBRINGER, DalforsPos[0])) { - DoCast(me, SPELL_CRUSADERS_SPIRE_VICTORY, true); - Summons.DespawnEntry(NPC_HIDEOUS_PLAGEBRINGER); - Summons.DespawnEntry(NPC_REANIMATED_CAPTAIN); - Summons.DespawnEntry(NPC_SCOURGE_DRUDGE); - Summons.DespawnEntry(NPC_HALOF_THE_DEATHBRINGER); - if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) - Dalfors->AI()->Talk(DALFORS_YELL_FINISHED); - events.ScheduleEvent(EVENT_ENDED, 10s); + HalofSpawned = true; + guidHalof = tempsum->GetGUID(); + tempsum->SetHomePosition(DalforsPos[2]); + tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); } + } + break; + case EVENT_ENDED: + { + Summons.DespawnAll(); + me->DespawnOrUnsummon(); + } + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_blessed_bannerAI(creature); + if (PhaseCount == 8) + if (Creature* Halof = ObjectAccessor::GetCreature(*me, guidHalof)) + if (Halof->isDead()) + { + DoCast(me, SPELL_CRUSADERS_SPIRE_VICTORY, true); + Summons.DespawnEntry(NPC_HIDEOUS_PLAGEBRINGER); + Summons.DespawnEntry(NPC_REANIMATED_CAPTAIN); + Summons.DespawnEntry(NPC_SCOURGE_DRUDGE); + Summons.DespawnEntry(NPC_HALOF_THE_DEATHBRINGER); + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) + Dalfors->AI()->Talk(DALFORS_YELL_FINISHED); + events.ScheduleEvent(EVENT_ENDED, 10s); + } } }; @@ -717,69 +672,58 @@ enum BorrowedTechnologyAndVolatility EVENT_FLY_AWAY = 1 }; -class npc_frostbrood_skytalon : public CreatureScript +struct npc_frostbrood_skytalon : public VehicleAI { - public: - npc_frostbrood_skytalon() : CreatureScript("npc_frostbrood_skytalon") { } - - struct npc_frostbrood_skytalonAI : public VehicleAI - { - npc_frostbrood_skytalonAI(Creature* creature) : VehicleAI(creature) { } - - EventMap events; + npc_frostbrood_skytalon(Creature* creature) : VehicleAI(creature) { } - void IsSummonedBy(WorldObject* summoner) override - { - me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); - } + EventMap events; - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE) - return; + void IsSummonedBy(WorldObject* summoner) override + { + me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); + } - if (id == POINT_GRAB_DECOY) - if (TempSummon* summon = me->ToTempSummon()) - if (Unit* summoner = summon->GetSummonerUnit()) - DoCast(summoner, SPELL_GRAB); - } + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE) + return; - void UpdateAI(uint32 diff) override - { - VehicleAI::UpdateAI(diff); - events.Update(diff); + if (id == POINT_GRAB_DECOY) + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* summoner = summon->GetSummonerUnit()) + DoCast(summoner, SPELL_GRAB); + } - while (uint32 eventId = events.ExecuteEvent()) - { - if (eventId == EVENT_FLY_AWAY) - { - Position randomPosOnRadius; - randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f); - me->GetNearPoint2D(nullptr, randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAbsoluteAngle(me)); - me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius); - } - } - } + void UpdateAI(uint32 diff) override + { + VehicleAI::UpdateAI(diff); + events.Update(diff); - void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + while (uint32 eventId = events.ExecuteEvent()) + { + if (eventId == EVENT_FLY_AWAY) { - switch (spellInfo->Id) - { - case SPELL_EXPLOSION: - DoCast(me, SPELL_IMMOLATION); - break; - case SPELL_RIDE: - DoCastAOE(SPELL_PING_BUNNY); - events.ScheduleEvent(EVENT_FLY_AWAY, 100ms); - break; - } + Position randomPosOnRadius; + randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f); + me->GetNearPoint2D(nullptr, randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAbsoluteAngle(me)); + me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius); } - }; + } + } - CreatureAI* GetAI(Creature* creature) const override + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + switch (spellInfo->Id) { - return new npc_frostbrood_skytalonAI(creature); + case SPELL_EXPLOSION: + DoCast(me, SPELL_IMMOLATION); + break; + case SPELL_RIDE: + DoCastAOE(SPELL_PING_BUNNY); + events.ScheduleEvent(EVENT_FLY_AWAY, 100ms); + break; } + } }; /*###### @@ -904,11 +848,11 @@ class spell_q14112_14145_chum_the_water : public SpellScript void AddSC_icecrown() { - new npc_argent_valiant; - new npc_guardian_pavilion; - new npc_tournament_training_dummy; - new npc_blessed_banner(); - new npc_frostbrood_skytalon(); + RegisterCreatureAI(npc_argent_valiant); + RegisterCreatureAI(npc_guardian_pavilion); + RegisterCreatureAI(npc_tournament_training_dummy); + RegisterCreatureAI(npc_blessed_banner); + RegisterCreatureAI(npc_frostbrood_skytalon); RegisterSpellScript(spell_the_ocular_on_death); RegisterSpellScript(spell_summon_tualiq_proxy); RegisterSpellScript(spell_q14076_14092_pound_drum); diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 237c1f733aa..4a41db8db79 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -217,163 +217,152 @@ enum NesingwaryChildrensWeek TEXT_WOLVAR_ORPHAN_9 = 9 }; -class npc_jungle_punch_target : public CreatureScript +struct npc_jungle_punch_target : public ScriptedAI { -public: - npc_jungle_punch_target() : CreatureScript("npc_jungle_punch_target") { } + npc_jungle_punch_target(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - struct npc_jungle_punch_targetAI : public ScriptedAI + void Initialize() { - npc_jungle_punch_targetAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + sayTimer = 3500; + sayStep = 0; + timer = 0; + phase = 0; + playerGUID.Clear(); + orphanGUID.Clear(); + } - void Initialize() - { - sayTimer = 3500; - sayStep = 0; - timer = 0; - phase = 0; - playerGUID.Clear(); - orphanGUID.Clear(); - } + void Reset() override + { + Initialize(); + } - void Reset() override - { - Initialize(); - } + void MoveInLineOfSight(Unit* who) override + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_THE_MIGHTY_HEMET_NESINGWARY) == QUEST_STATUS_INCOMPLETE) + { + playerGUID = player->GetGUID(); + if (Aura* orphanOut = player->GetAura(SPELL_ORPHAN_OUT)) + if (orphanOut->GetCaster() && orphanOut->GetCaster()->GetEntry() == ORPHAN_WOLVAR) + { + orphanGUID = orphanOut->GetCaster()->GetGUID(); + phase = 1; + } + } + } - void MoveInLineOfSight(Unit* who) override + void proceedCwEvent(const uint32 diff) + { + if (timer <= diff) { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_THE_MIGHTY_HEMET_NESINGWARY) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - if (Aura* orphanOut = player->GetAura(SPELL_ORPHAN_OUT)) - if (orphanOut->GetCaster() && orphanOut->GetCaster()->GetEntry() == ORPHAN_WOLVAR) - { - orphanGUID = orphanOut->GetCaster()->GetGUID(); - phase = 1; - } - } - } + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - void proceedCwEvent(const uint32 diff) - { - if (timer <= diff) + if (!orphan || !player) { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + Reset(); + return; + } - if (!orphan || !player) - { + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + std::cos(me->GetOrientation()) * 5, me->GetPositionY() + std::sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_6); + timer = 5000; + break; + case 2: + orphan->SetFacingToObject(me); + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_7); + timer = 5000; + break; + case 3: + Talk(TEXT_NESINGWARY_1); + timer = 5000; + break; + case 4: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_8); + timer = 5000; + break; + case 5: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_9); + timer = 5000; + break; + case 6: + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + player->GroupEventHappens(QUEST_THE_MIGHTY_HEMET_NESINGWARY, me); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + std::cos(me->GetOrientation()) * 5, me->GetPositionY() + std::sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_6); - timer = 5000; - break; - case 2: - orphan->SetFacingToObject(me); - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_7); - timer = 5000; - break; - case 3: - Talk(TEXT_NESINGWARY_1); - timer = 5000; - break; - case 4: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_8); - timer = 5000; - break; - case 5: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_9); - timer = 5000; - break; - case 6: - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - player->GroupEventHappens(QUEST_THE_MIGHTY_HEMET_NESINGWARY, me); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } + else + timer -= diff; + } - void UpdateAI(uint32 diff) override - { - if (phase) - proceedCwEvent(diff); + void UpdateAI(uint32 diff) override + { + if (phase) + proceedCwEvent(diff); - if (!sayStep) - return; + if (!sayStep) + return; - if (sayTimer < diff) - { - Talk(SAY_HEMET_HADRIUS_TAMARA_1 + sayStep - 1); - sayTimer = 3000; - sayStep++; + if (sayTimer < diff) + { + Talk(SAY_HEMET_HADRIUS_TAMARA_1 + sayStep - 1); + sayTimer = 3000; + sayStep++; - if (sayStep > 3) // end - sayStep = 0; - } - else - sayTimer -= diff; + if (sayStep > 3) // end + sayStep = 0; } + else + sayTimer -= diff; + } - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - if (spellInfo->Id != SPELL_OFFER) - return; + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + if (spellInfo->Id != SPELL_OFFER) + return; - Player* player = caster->ToPlayer(); - if (!player) - return; + Player* player = caster->ToPlayer(); + if (!player) + return; - Quest const* quest = sObjectMgr->GetQuestTemplate(QUEST_TASTE_TEST); - if (!quest) - return; + Quest const* quest = sObjectMgr->GetQuestTemplate(QUEST_TASTE_TEST); + if (!quest) + return; - QuestStatusMap::const_iterator itr = player->getQuestStatusMap().find(QUEST_TASTE_TEST); - if (itr->second.Status != QUEST_STATUS_INCOMPLETE) - return; + QuestStatusMap::const_iterator itr = player->getQuestStatusMap().find(QUEST_TASTE_TEST); + if (itr->second.Status != QUEST_STATUS_INCOMPLETE) + return; - for (uint8 i = 0; i < 3; ++i) - { - if (uint32(quest->RequiredNpcOrGo[i]) != me->GetEntry()) - continue; + for (uint8 i = 0; i < 3; ++i) + { + if (uint32(quest->RequiredNpcOrGo[i]) != me->GetEntry()) + continue; - if (itr->second.CreatureOrGOCount[i] != 0) - continue; + if (itr->second.CreatureOrGOCount[i] != 0) + continue; - player->KilledMonsterCredit(me->GetEntry()); - sayStep = 1; - break; - } + player->KilledMonsterCredit(me->GetEntry()); + sayStep = 1; + break; } - - private: - uint16 sayTimer; - uint8 sayStep; - uint32 timer; - int8 phase; - ObjectGuid playerGUID; - ObjectGuid orphanGUID; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_jungle_punch_targetAI(creature); } + +private: + uint16 sayTimer; + uint8 sayStep; + uint32 timer; + int8 phase; + ObjectGuid playerGUID; + ObjectGuid orphanGUID; }; /*###### @@ -396,64 +385,53 @@ enum MiscLifewarden }; // 51957 - Call of the Lifewarden -class spell_q12620_the_lifewarden_wrath : public SpellScriptLoader +class spell_q12620_the_lifewarden_wrath : public SpellScript { -public: - spell_q12620_the_lifewarden_wrath() : SpellScriptLoader("spell_q12620_the_lifewarden_wrath") { } + PrepareSpellScript(spell_q12620_the_lifewarden_wrath); - class spell_q12620_the_lifewarden_wrath_SpellScript : public SpellScript + void HandleSendEvent(SpellEffIndex effIndex) { - PrepareSpellScript(spell_q12620_the_lifewarden_wrath_SpellScript); + PreventHitDefaultEffect(effIndex); - void HandleSendEvent(SpellEffIndex effIndex) + if (Unit* caster = GetCaster()) { - PreventHitDefaultEffect(effIndex); - - if (Unit* caster = GetCaster()) + if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f)) { - if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f)) + presence->AI()->Talk(WHISPER_ACTIVATE, caster); + presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants + // Freya Dummy could be scripted with the following code + + // Revive plants + std::list<Creature*> servants; + GetCaster()->GetCreatureListWithEntryInGrid(servants, NPC_SERVANT, 200.0f); + for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr) { - presence->AI()->Talk(WHISPER_ACTIVATE, caster); - presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants - // Freya Dummy could be scripted with the following code - - // Revive plants - std::list<Creature*> servants; - GetCaster()->GetCreatureListWithEntryInGrid(servants, NPC_SERVANT, 200.0f); - for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr) - { - // Couldn't find a spell that does this - if ((*itr)->isDead()) - (*itr)->Respawn(true); - - (*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true); - (*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false); - (*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false); - - if (Unit* target = (*itr)->SelectNearestTarget(150.0f)) - (*itr)->AI()->AttackStart(target); - } - - // Kill nearby enemies - std::list<Creature*> saboteurs; - caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f); - for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr) - if ((*itr)->IsAlive()) - // Lifeforce has a cast duration, it should be cast at all saboteurs one by one - presence->CastSpell((*itr), SPELL_LIFEFORCE, false); + // Couldn't find a spell that does this + if ((*itr)->isDead()) + (*itr)->Respawn(true); + + (*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true); + (*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false); + (*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false); + + if (Unit* target = (*itr)->SelectNearestTarget(150.0f)) + (*itr)->AI()->AttackStart(target); } - } - } - void Register() override - { - OnEffectHit += SpellEffectFn(spell_q12620_the_lifewarden_wrath_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + // Kill nearby enemies + std::list<Creature*> saboteurs; + caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f); + for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr) + if ((*itr)->IsAlive()) + // Lifeforce has a cast duration, it should be cast at all saboteurs one by one + presence->CastSpell((*itr), SPELL_LIFEFORCE, false); + } } - }; + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_q12620_the_lifewarden_wrath_SpellScript(); + OnEffectHit += SpellEffectFn(spell_q12620_the_lifewarden_wrath::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); } }; @@ -485,96 +463,85 @@ enum KickWhatKick }; // 51330 - Shoot RJR -class spell_q12589_shoot_rjr : public SpellScriptLoader +class spell_q12589_shoot_rjr : public SpellScript { -public: - spell_q12589_shoot_rjr() : SpellScriptLoader("spell_q12589_shoot_rjr") { } + PrepareSpellScript(spell_q12589_shoot_rjr); + + SpellCastResult CheckCast() + { + if (Unit* target = GetExplTargetUnit()) + if (target->GetEntry() == NPC_LUCKY_WILHELM) + return SPELL_CAST_OK; + + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM); + return SPELL_FAILED_CUSTOM_ERROR; + } - class spell_q12589_shoot_rjr_SpellScript : public SpellScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12589_shoot_rjr_SpellScript); + uint32 roll = urand(1, 100); - SpellCastResult CheckCast() - { - if (Unit* target = GetExplTargetUnit()) - if (target->GetEntry() == NPC_LUCKY_WILHELM) - return SPELL_CAST_OK; + uint8 ev; + if (roll <= 50) + ev = EVENT_MISS; + else if (roll <= 83) + ev = EVENT_HIT; + else + ev = EVENT_MISS_BIRD; - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM); - return SPELL_FAILED_CUSTOM_ERROR; - } + Unit* shooter = GetCaster(); + Creature* wilhelm = GetHitUnit()->ToCreature(); + Creature* apple = shooter->FindNearestCreature(NPC_APPLE, 30); + Creature* drostan = shooter->FindNearestCreature(NPC_DROSTAN, 30); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 roll = urand(1, 100); - - uint8 ev; - if (roll <= 50) - ev = EVENT_MISS; - else if (roll <= 83) - ev = EVENT_HIT; - else - ev = EVENT_MISS_BIRD; - - Unit* shooter = GetCaster(); - Creature* wilhelm = GetHitUnit()->ToCreature(); - Creature* apple = shooter->FindNearestCreature(NPC_APPLE, 30); - Creature* drostan = shooter->FindNearestCreature(NPC_DROSTAN, 30); - - if (!wilhelm || !apple || !drostan) - return; + if (!wilhelm || !apple || !drostan) + return; - switch (ev) + switch (ev) + { + case EVENT_MISS_BIRD: { - case EVENT_MISS_BIRD: - { - Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30); - Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30); - - if (bird && crunchy) - { - shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE); - bird->CastSpell(bird, SPELL_BIRD_FALL); - wilhelm->AI()->Talk(SAY_WILHELM_MISS); - drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS); - - bird->KillSelf(); - crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(), - bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseMask(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ())); - /// @todo Make crunchy perform emote eat when he reaches the bird - break; - } - [[fallthrough]]; - } - case EVENT_MISS: + Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30); + Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30); + + if (bird && crunchy) { - shooter->CastSpell(wilhelm, SPELL_MISS_APPLE); + shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE); + bird->CastSpell(bird, SPELL_BIRD_FALL); wilhelm->AI()->Talk(SAY_WILHELM_MISS); drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS); + + bird->KillSelf(); + crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(), + bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseMask(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ())); + /// @todo Make crunchy perform emote eat when he reaches the bird break; } - case EVENT_HIT: - { - shooter->CastSpell(apple, SPELL_HIT_APPLE); - apple->CastSpell(apple, SPELL_APPLE_FALL); - wilhelm->AI()->Talk(SAY_WILHELM_HIT); - if (Player* player = shooter->ToPlayer()) - player->KilledMonsterCredit(NPC_APPLE); - break; - } + [[fallthrough]]; + } + case EVENT_MISS: + { + shooter->CastSpell(wilhelm, SPELL_MISS_APPLE); + wilhelm->AI()->Talk(SAY_WILHELM_MISS); + drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS); + break; + } + case EVENT_HIT: + { + shooter->CastSpell(apple, SPELL_HIT_APPLE); + apple->CastSpell(apple, SPELL_APPLE_FALL); + wilhelm->AI()->Talk(SAY_WILHELM_HIT); + if (Player* player = shooter->ToPlayer()) + player->KilledMonsterCredit(NPC_APPLE); + break; } } + } - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_q12589_shoot_rjr_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_q12589_shoot_rjr_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_q12589_shoot_rjr_SpellScript(); + OnCheckCast += SpellCheckCastFn(spell_q12589_shoot_rjr::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_q12589_shoot_rjr::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -593,34 +560,23 @@ enum SongOfWindAndWater NPC_HAIPHOON_AIR = 28985 }; -class npc_haiphoon : public CreatureScript +struct npc_haiphoon : public VehicleAI { -public: - npc_haiphoon() : CreatureScript("npc_haiphoon") { } + npc_haiphoon(Creature* creature) : VehicleAI(creature) { } - struct npc_haiphoonAI : public VehicleAI + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override { - npc_haiphoonAI(Creature* creature) : VehicleAI(creature) { } + if (target == me) + return; - void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override + if (spellInfo->Id == SPELL_DEVOUR_WIND && me->GetCharmerOrOwnerPlayerOrPlayerItself()) { - if (target == me) - return; - - if (spellInfo->Id == SPELL_DEVOUR_WIND && me->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - me->UpdateEntry(NPC_HAIPHOON_AIR); - } - else if (spellInfo->Id == SPELL_DEVOUR_WATER && me->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - me->UpdateEntry(NPC_HAIPHOON_WATER); - } + me->UpdateEntry(NPC_HAIPHOON_AIR); + } + else if (spellInfo->Id == SPELL_DEVOUR_WATER && me->GetCharmerOrOwnerPlayerOrPlayerItself()) + { + me->UpdateEntry(NPC_HAIPHOON_WATER); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_haiphoonAI(creature); } }; @@ -787,10 +743,10 @@ void AddSC_sholazar_basin() RegisterCreatureAI(npc_engineer_helice); RegisterSpellScript(spell_q12688_detonate_1); RegisterSpellScript(spell_q12688_detonate_2); - new npc_jungle_punch_target(); - new spell_q12620_the_lifewarden_wrath(); - new spell_q12589_shoot_rjr(); - new npc_haiphoon(); + RegisterCreatureAI(npc_jungle_punch_target); + RegisterSpellScript(spell_q12620_the_lifewarden_wrath); + RegisterSpellScript(spell_q12589_shoot_rjr); + RegisterCreatureAI(npc_haiphoon); RegisterSpellScript(spell_q12611_deathbolt); RegisterSpellScript(spell_sholazar_take_sputum_sample); RegisterSpellScript(spell_sholazar_sputum_collected); diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index db489e63bac..6bcb02c4e49 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -44,67 +44,56 @@ enum BrunnhildarPrisoner SPELL_SHARD_IMPACT = 55047 }; -class npc_brunnhildar_prisoner : public CreatureScript +struct npc_brunnhildar_prisoner : public ScriptedAI { -public: - npc_brunnhildar_prisoner() : CreatureScript("npc_brunnhildar_prisoner") { } - - struct npc_brunnhildar_prisonerAI : public ScriptedAI + npc_brunnhildar_prisoner(Creature* creature) : ScriptedAI(creature) { - npc_brunnhildar_prisonerAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + Initialize(); + } - void Initialize() - { - freed = false; - } + void Initialize() + { + freed = false; + } - bool freed; + bool freed; - void Reset() override - { - Initialize(); - me->CastSpell(me, SPELL_ICE_PRISON, true); - } + void Reset() override + { + Initialize(); + me->CastSpell(me, SPELL_ICE_PRISON, true); + } - void JustAppeared() override - { - Reset(); - } + void JustAppeared() override + { + Reset(); + } - void UpdateAI(uint32 /*diff*/) override - { - if (!freed) - return; + void UpdateAI(uint32 /*diff*/) override + { + if (!freed) + return; - if (!me->GetVehicle()) - me->DespawnOrUnsummon(); - } + if (!me->GetVehicle()) + me->DespawnOrUnsummon(); + } - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - Unit* unitCaster = caster->ToUnit(); - if (!unitCaster) - return; + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; - if (spellInfo->Id != SPELL_ICE_LANCE) - return; + if (spellInfo->Id != SPELL_ICE_LANCE) + return; - if (unitCaster->GetVehicleKit()->GetAvailableSeatCount() != 0) - { - me->CastSpell(me, SPELL_FREE_PRISONER, true); - me->CastSpell(unitCaster, SPELL_RIDE_DRAKE, true); - me->CastSpell(me, SPELL_SHARD_IMPACT, true); - freed = true; - } + if (unitCaster->GetVehicleKit()->GetAvailableSeatCount() != 0) + { + me->CastSpell(me, SPELL_FREE_PRISONER, true); + me->CastSpell(unitCaster, SPELL_RIDE_DRAKE, true); + me->CastSpell(me, SPELL_SHARD_IMPACT, true); + freed = true; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_brunnhildar_prisonerAI(creature); } }; @@ -128,167 +117,134 @@ enum FreedProtoDrake EVENT_REACHED_HOME = 2, }; -class npc_freed_protodrake : public CreatureScript +struct npc_freed_protodrake : public VehicleAI { -public: - npc_freed_protodrake() : CreatureScript("npc_freed_protodrake") { } + npc_freed_protodrake(Creature* creature) : VehicleAI(creature) { } - struct npc_freed_protodrakeAI : public VehicleAI - { - npc_freed_protodrakeAI(Creature* creature) : VehicleAI(creature) { } + EventMap events; - EventMap events; + void Reset() override + { + events.ScheduleEvent(EVENT_CHECK_AREA, 5s); + } - void Reset() override - { - events.ScheduleEvent(EVENT_CHECK_AREA, 5s); - } + void MovementInform(uint32 type, uint32 id) override + { + if (type != WAYPOINT_MOTION_TYPE) + return; - void MovementInform(uint32 type, uint32 id) override - { - if (type != WAYPOINT_MOTION_TYPE) - return; + if (id == 15) + // drake reached village + events.ScheduleEvent(EVENT_REACHED_HOME, 2s); + } - if (id == 15) - // drake reached village - events.ScheduleEvent(EVENT_REACHED_HOME, 2s); - } + void UpdateAI(uint32 diff) override + { + VehicleAI::UpdateAI(diff); + events.Update(diff); - void UpdateAI(uint32 diff) override + switch (events.ExecuteEvent()) { - VehicleAI::UpdateAI(diff); - events.Update(diff); - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_AREA: - if (me->GetAreaId() == AREA_VALLEY_OF_ANCIENT_WINTERS) - { - if (Vehicle* vehicle = me->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - { - Talk(TEXT_EMOTE, passenger); - me->GetMotionMaster()->MovePath(NPC_DRAKE, false); - } - } - else - events.ScheduleEvent(EVENT_CHECK_AREA, 5s); - break; - case EVENT_REACHED_HOME: + case EVENT_CHECK_AREA: + if (me->GetAreaId() == AREA_VALLEY_OF_ANCIENT_WINTERS) + { if (Vehicle* vehicle = me->GetVehicleKit()) - if (Unit* player = vehicle->GetPassenger(0)) - if (player->GetTypeId() == TYPEID_PLAYER) - { - // for each prisoner on drake, give credit - for (uint8 i = 1; i < 4; ++i) - if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i)) - { - if (prisoner->GetTypeId() != TYPEID_UNIT) - return; - prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true); - prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true); - prisoner->ExitVehicle(); - } - me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true); - player->ExitVehicle(); - } - break; - } + if (Unit* passenger = vehicle->GetPassenger(0)) + { + Talk(TEXT_EMOTE, passenger); + me->GetMotionMaster()->MovePath(NPC_DRAKE, false); + } + } + else + events.ScheduleEvent(EVENT_CHECK_AREA, 5s); + break; + case EVENT_REACHED_HOME: + if (Vehicle* vehicle = me->GetVehicleKit()) + if (Unit* player = vehicle->GetPassenger(0)) + if (player->GetTypeId() == TYPEID_PLAYER) + { + // for each prisoner on drake, give credit + for (uint8 i = 1; i < 4; ++i) + if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i)) + { + if (prisoner->GetTypeId() != TYPEID_UNIT) + return; + prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true); + prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true); + prisoner->ExitVehicle(); + } + me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true); + player->ExitVehicle(); + } + break; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_freed_protodrakeAI(creature); } }; -class npc_icefang : public CreatureScript +struct npc_icefang : public EscortAI { -public: - npc_icefang() : CreatureScript("npc_icefang") { } - - struct npc_icefangAI : public EscortAI - { - npc_icefangAI(Creature* creature) : EscortAI(creature) { } + npc_icefang(Creature* creature) : EscortAI(creature) { } - void AttackStart(Unit* /*who*/) override { } - void JustEngagedWith(Unit* /*who*/) override { } - void EnterEvadeMode(EvadeReason /*why*/) override { } + void AttackStart(Unit* /*who*/) override { } + void JustEngagedWith(Unit* /*who*/) override { } + void EnterEvadeMode(EvadeReason /*why*/) override { } - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override + { + if (who->GetTypeId() == TYPEID_PLAYER) { - if (who->GetTypeId() == TYPEID_PLAYER) - { - if (apply) - Start(false, true, who->GetGUID()); - } + if (apply) + Start(false, true, who->GetGUID()); } + } - void JustDied(Unit* /*killer*/) override { } - void OnCharmed(bool /*isNew*/) override { } - - void UpdateAI(uint32 diff) override - { - EscortAI::UpdateAI(diff); + void JustDied(Unit* /*killer*/) override { } + void OnCharmed(bool /*isNew*/) override { } - if (!UpdateVictim()) - return; - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 diff) override { - return new npc_icefangAI(creature); + EscortAI::UpdateAI(diff); + + if (!UpdateVictim()) + return; } }; -class npc_hyldsmeet_protodrake : public CreatureScript +enum NPCs { - enum NPCs - { - NPC_HYLDSMEET_DRAKERIDER = 29694 - }; - - public: - npc_hyldsmeet_protodrake() : CreatureScript("npc_hyldsmeet_protodrake") { } - - class npc_hyldsmeet_protodrakeAI : public CreatureAI - { - public: - npc_hyldsmeet_protodrakeAI(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0) { } - - void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) override - { - if (apply) - return; + NPC_HYLDSMEET_DRAKERIDER = 29694 +}; - if (who->GetEntry() == NPC_HYLDSMEET_DRAKERIDER) - _accessoryRespawnTimer = 5 * MINUTE * IN_MILLISECONDS; - } +class npc_hyldsmeet_protodrake : public CreatureAI +{ +public: + npc_hyldsmeet_protodrake(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0) { } - void UpdateAI(uint32 diff) override - { - //! We need to manually reinstall accessories because the vehicle itself is friendly to players, - //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable. - Vehicle* _vehicleKit = me->GetVehicleKit(); - if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit) - { - _vehicleKit->InstallAllAccessories(true); - _accessoryRespawnTimer = 0; - } - else - _accessoryRespawnTimer -= diff; - } + void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) override + { + if (apply) + return; - private: - uint32 _accessoryRespawnTimer; - }; + if (who->GetEntry() == NPC_HYLDSMEET_DRAKERIDER) + _accessoryRespawnTimer = 5 * MINUTE * IN_MILLISECONDS; + } - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 diff) override + { + //! We need to manually reinstall accessories because the vehicle itself is friendly to players, + //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable. + Vehicle* _vehicleKit = me->GetVehicleKit(); + if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit) { - return new npc_hyldsmeet_protodrakeAI(creature); + _vehicleKit->InstallAllAccessories(true); + _accessoryRespawnTimer = 0; } + else + _accessoryRespawnTimer -= diff; + } + +private: + uint32 _accessoryRespawnTimer; }; /*##### @@ -329,154 +285,143 @@ enum BrannBronzebeard EVENT_SCRIPT_13 = 15 }; -class npc_brann_bronzebeard_keystone : public CreatureScript +struct npc_brann_bronzebeard_keystone : public ScriptedAI { -public: - npc_brann_bronzebeard_keystone() : CreatureScript("npc_brann_bronzebeard_keystone") { } + npc_brann_bronzebeard_keystone(Creature* creature) : ScriptedAI(creature) + { + objectCounter = 0; + } - struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI + void Reset() override { - npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) - { - objectCounter = 0; - } + for (ObjectGuid& guid : objectGUID) + guid.Clear(); - void Reset() override - { - for (ObjectGuid& guid : objectGUID) - guid.Clear(); + playerGUID.Clear(); + voiceGUID.Clear(); + objectCounter = 0; + } - playerGUID.Clear(); - voiceGUID.Clear(); - objectCounter = 0; - } + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + playerGUID = player->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_1, 100ms); + return false; + } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - CloseGossipMenuFor(player); - playerGUID = player->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_1, 100ms); - return false; - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SCRIPT_1: + case EVENT_SCRIPT_1: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + Talk(SAY_BRANN_1, player); + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49s)) + voiceGUID = voice->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_2, 4s); + break; + case EVENT_SCRIPT_2: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false); + events.ScheduleEvent(EVENT_SCRIPT_3, 6s); + break; + case EVENT_SCRIPT_3: + me->SetEmoteState(EMOTE_STATE_WORK_MINING); + events.ScheduleEvent(EVENT_SCRIPT_4, 6s); + break; + case EVENT_SCRIPT_4: + me->SetEmoteState(EMOTE_ONESHOT_NONE); + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + { + voice->CastSpell(voice, SPELL_RESURRECTION); if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - Talk(SAY_BRANN_1, player); - me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49s)) - voiceGUID = voice->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_2, 4s); - break; - case EVENT_SCRIPT_2: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false); - events.ScheduleEvent(EVENT_SCRIPT_3, 6s); - break; - case EVENT_SCRIPT_3: - me->SetEmoteState(EMOTE_STATE_WORK_MINING); - events.ScheduleEvent(EVENT_SCRIPT_4, 6s); - break; - case EVENT_SCRIPT_4: - me->SetEmoteState(EMOTE_ONESHOT_NONE); + voice->AI()->Talk(SAY_VOICE_1, player); + } + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, QuaternionData(0.f, 0.f, -0.737277f, 0.6755905f), 0s)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_5, 6s); + break; + case EVENT_SCRIPT_5: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - { - voice->CastSpell(voice, SPELL_RESURRECTION); - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - voice->AI()->Talk(SAY_VOICE_1, player); - } - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, QuaternionData(0.f, 0.f, -0.737277f, 0.6755905f), 0s)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_5, 6s); - break; - case EVENT_SCRIPT_5: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_2, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, QuaternionData(0.f, 0.f, -0.9271832f, 0.3746083f), 0s)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_6, 6s); - break; - case EVENT_SCRIPT_6: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_3, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, QuaternionData(0.f, 0.f, 0.9961939f, 0.08716504f), 0s)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_7, 6s); - break; - case EVENT_SCRIPT_7: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_4, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, QuaternionData(0.f, 0.f, 0.8703556f, 0.4924237f), 0s)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_8, 6s); - break; - case EVENT_SCRIPT_8: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_5, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, QuaternionData(0.f, 0.f, 0.5446386f, 0.8386708f), 0s)) - objectGUID[objectCounter] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_9, 6s); - break; - case EVENT_SCRIPT_9: + voice->AI()->Talk(SAY_VOICE_2, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, QuaternionData(0.f, 0.f, -0.9271832f, 0.3746083f), 0s)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_6, 6s); + break; + case EVENT_SCRIPT_6: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->CastSpell(voice, SPELL_RESURRECTION); - events.ScheduleEvent(EVENT_SCRIPT_10, 6s); - break; - case EVENT_SCRIPT_10: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - { - Talk(SAY_BRANN_2, player); - player->KilledMonsterCredit(me->GetEntry()); - } - events.ScheduleEvent(EVENT_SCRIPT_11, 6s); - break; - case EVENT_SCRIPT_11: - me->SetFacingTo(2.932153f); - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - Talk(SAY_BRANN_3, player); - - for (uint8 i = 0; i < 5; ++i) - if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i])) - go->Delete(); - - events.ScheduleEvent(EVENT_SCRIPT_12, 6s); - break; - case EVENT_SCRIPT_12: - me->GetMotionMaster()->Clear(); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false); - events.ScheduleEvent(EVENT_SCRIPT_13, 10s); - break; - case EVENT_SCRIPT_13: - me->DisappearAndDie(); - break; - } - } - } + voice->AI()->Talk(SAY_VOICE_3, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, QuaternionData(0.f, 0.f, 0.9961939f, 0.08716504f), 0s)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_7, 6s); + break; + case EVENT_SCRIPT_7: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_4, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, QuaternionData(0.f, 0.f, 0.8703556f, 0.4924237f), 0s)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_8, 6s); + break; + case EVENT_SCRIPT_8: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_5, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, QuaternionData(0.f, 0.f, 0.5446386f, 0.8386708f), 0s)) + objectGUID[objectCounter] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_9, 6s); + break; + case EVENT_SCRIPT_9: + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->CastSpell(voice, SPELL_RESURRECTION); + events.ScheduleEvent(EVENT_SCRIPT_10, 6s); + break; + case EVENT_SCRIPT_10: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + { + Talk(SAY_BRANN_2, player); + player->KilledMonsterCredit(me->GetEntry()); + } + events.ScheduleEvent(EVENT_SCRIPT_11, 6s); + break; + case EVENT_SCRIPT_11: + me->SetFacingTo(2.932153f); + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + Talk(SAY_BRANN_3, player); - private: - EventMap events; - ObjectGuid playerGUID; - ObjectGuid objectGUID[5]; - ObjectGuid voiceGUID; - uint8 objectCounter; - }; + for (uint8 i = 0; i < 5; ++i) + if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i])) + go->Delete(); - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_brann_bronzebeard_keystoneAI(creature); + events.ScheduleEvent(EVENT_SCRIPT_12, 6s); + break; + case EVENT_SCRIPT_12: + me->GetMotionMaster()->Clear(); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false); + events.ScheduleEvent(EVENT_SCRIPT_13, 10s); + break; + case EVENT_SCRIPT_13: + me->DisappearAndDie(); + break; + } + } } + +private: + EventMap events; + ObjectGuid playerGUID; + ObjectGuid objectGUID[5]; + ObjectGuid voiceGUID; + uint8 objectCounter; }; /*##### @@ -546,241 +491,230 @@ uint32 const WyrmControlSpells[PHASE_MAX][ControllableSpellsCount] = { 0, 0, 0, 0 } }; -class npc_wild_wyrm : public CreatureScript +struct npc_wild_wyrm : public VehicleAI { - public: - npc_wild_wyrm() : CreatureScript("npc_wild_wyrm") { } + npc_wild_wyrm(Creature* creature) : VehicleAI(creature) + { + Initialize(); + } - struct npc_wild_wyrmAI : public VehicleAI - { - npc_wild_wyrmAI(Creature* creature) : VehicleAI(creature) - { - Initialize(); - } + void Initialize() + { + _phase = PHASE_INITIAL; + _playerCheckTimer = 1 * IN_MILLISECONDS; + } - void Initialize() - { - _phase = PHASE_INITIAL; - _playerCheckTimer = 1 * IN_MILLISECONDS; - } + void InitSpellsForPhase() + { + ASSERT(_phase < PHASE_MAX); + for (uint8 i = 0; i < ControllableSpellsCount; ++i) + me->m_spells[i] = WyrmControlSpells[_phase][i]; + } - void InitSpellsForPhase() - { - ASSERT(_phase < PHASE_MAX); - for (uint8 i = 0; i < ControllableSpellsCount; ++i) - me->m_spells[i] = WyrmControlSpells[_phase][i]; - } + void Reset() override + { + Initialize(); - void Reset() override - { - Initialize(); + _playerGuid.Clear(); + _scheduler.CancelAll(); - _playerGuid.Clear(); - _scheduler.CancelAll(); + InitSpellsForPhase(); - InitSpellsForPhase(); + me->SetImmuneToPC(false); + } - me->SetImmuneToPC(false); - } + void DoAction(int32 action) override + { + Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid); + if (!player) + return; - void DoAction(int32 action) override - { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid); - if (!player) - return; + switch (action) + { + case ACTION_CLAW_SWIPE_WARN: + Talk(SAY_SWIPE, player); + break; + case ACTION_CLAW_SWIPE_DODGE: + Talk(SAY_DODGED, player); + break; + case ACTION_GRIP_FAILING: + Talk(SAY_GRIP_WARN, player); + break; + case ACTION_GRIP_LOST: + DoCastAOE(SPELL_EJECT_PASSENGER_1, true); + EnterEvadeMode(); + break; + case ACTION_FATAL_STRIKE_MISS: + Talk(SAY_STRIKE_MISS, player); + break; + default: + break; + } + } - switch (action) - { - case ACTION_CLAW_SWIPE_WARN: - Talk(SAY_SWIPE, player); - break; - case ACTION_CLAW_SWIPE_DODGE: - Talk(SAY_DODGED, player); - break; - case ACTION_GRIP_FAILING: - Talk(SAY_GRIP_WARN, player); - break; - case ACTION_GRIP_LOST: - DoCastAOE(SPELL_EJECT_PASSENGER_1, true); - EnterEvadeMode(); - break; - case ACTION_FATAL_STRIKE_MISS: - Talk(SAY_STRIKE_MISS, player); - break; - default: - break; - } - } + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + if (_playerGuid || spellInfo->Id != SPELL_SPEAR_OF_HODIR) + return; - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - if (_playerGuid || spellInfo->Id != SPELL_SPEAR_OF_HODIR) - return; + _playerGuid = caster->GetGUID(); + DoCastAOE(SPELL_FULL_HEAL_MANA, true); + me->SetImmuneToPC(true); - _playerGuid = caster->GetGUID(); - DoCastAOE(SPELL_FULL_HEAL_MANA, true); - me->SetImmuneToPC(true); + me->GetMotionMaster()->MovePoint(POINT_START_FIGHT, *caster); + } - me->GetMotionMaster()->MovePoint(POINT_START_FIGHT, *caster); - } + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) + return; - void MovementInform(uint32 type, uint32 id) override + switch (id) + { + case POINT_START_FIGHT: { - if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) + Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid); + if (!player) return; - switch (id) - { - case POINT_START_FIGHT: - { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid); - if (!player) - return; - - DoCast(player, SPELL_PLAYER_MOUNT_WYRM); - me->GetMotionMaster()->Clear(); - break; - } - case POINT_FALL: - DoCastAOE(SPELL_EJECT_ALL_PASSENGERS); - me->KillSelf(); - break; - default: - break; - } + DoCast(player, SPELL_PLAYER_MOUNT_WYRM); + me->GetMotionMaster()->Clear(); + break; } + case POINT_FALL: + DoCastAOE(SPELL_EJECT_ALL_PASSENGERS); + me->KillSelf(); + break; + default: + break; + } + } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - if (damage >= me->GetHealth()) - { - damage = me->GetHealth() - 1; + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (damage >= me->GetHealth()) + { + damage = me->GetHealth() - 1; - if (_phase == PHASE_DEAD) - return; + if (_phase == PHASE_DEAD) + return; - _phase = PHASE_DEAD; - _scheduler.CancelAll() - .Async([this] - { - InitSpellsForPhase(); + _phase = PHASE_DEAD; + _scheduler.CancelAll() + .Async([this] + { + InitSpellsForPhase(); - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid)) - player->VehicleSpellInitialize(); + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid)) + player->VehicleSpellInitialize(); - DoCastAOE(SPELL_WYRM_KILL_CREDIT); - DoCastAOE(SPELL_FALLING_DRAGON_FEIGN_DEATH); + DoCastAOE(SPELL_WYRM_KILL_CREDIT); + DoCastAOE(SPELL_FALLING_DRAGON_FEIGN_DEATH); - me->RemoveAurasDueToSpell(SPELL_JAWS_OF_DEATH_PERIODIC); - me->RemoveAurasDueToSpell(SPELL_PRY_JAWS_OPEN); + me->RemoveAurasDueToSpell(SPELL_JAWS_OF_DEATH_PERIODIC); + me->RemoveAurasDueToSpell(SPELL_PRY_JAWS_OPEN); - me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); + me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); - me->GetMotionMaster()->MoveFall(POINT_FALL); - }); - } - } + me->GetMotionMaster()->MoveFall(POINT_FALL); + }); + } + } - void PassengerBoarded(Unit* passenger, int8 seatId, bool apply) override - { - if (!apply || passenger->GetGUID() != _playerGuid) - return; + void PassengerBoarded(Unit* passenger, int8 seatId, bool apply) override + { + if (!apply || passenger->GetGUID() != _playerGuid) + return; - if (seatId != SEAT_INITIAL) - return; + if (seatId != SEAT_INITIAL) + return; - me->CastSpell(nullptr, SPELL_GRIP, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_AURA_STACK, 50)); - DoCastAOE(SPELL_CLAW_SWIPE_PERIODIC); + me->CastSpell(nullptr, SPELL_GRIP, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_AURA_STACK, 50)); + DoCastAOE(SPELL_CLAW_SWIPE_PERIODIC); - _scheduler.Async([this] - { - me->GetMotionMaster()->MovePath(PATH_WILD_WYRM, true); - }) - .Schedule(Milliseconds(500), [this](TaskContext context) + _scheduler.Async([this] + { + me->GetMotionMaster()->MovePath(PATH_WILD_WYRM, true); + }) + .Schedule(Milliseconds(500), [this](TaskContext context) + { + if (_phase == PHASE_MOUTH) + return; + + if (me->HealthBelowPct(25)) + { + _phase = PHASE_MOUTH; + context.Async([this] { - if (_phase == PHASE_MOUTH) - return; + InitSpellsForPhase(); + DoCastAOE(SPELL_LOW_HEALTH_TRIGGER, true); + me->RemoveAurasDueToSpell(SPELL_CLAW_SWIPE_PERIODIC); + me->RemoveAurasDueToSpell(SPELL_GRIP); - if (me->HealthBelowPct(25)) - { - _phase = PHASE_MOUTH; - context.Async([this] - { - InitSpellsForPhase(); - DoCastAOE(SPELL_LOW_HEALTH_TRIGGER, true); - me->RemoveAurasDueToSpell(SPELL_CLAW_SWIPE_PERIODIC); - me->RemoveAurasDueToSpell(SPELL_GRIP); - - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid)) - Talk(SAY_PHASE_2, player); - - DoCastAOE(SPELL_EJECT_PASSENGER_1, true); - DoCastAOE(SPELL_JAWS_OF_DEATH_PERIODIC); - DoCastAOE(SPELL_FLY_STATE_VISUAL); - }); - return; - } + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid)) + Talk(SAY_PHASE_2, player); - context.Repeat(); + DoCastAOE(SPELL_EJECT_PASSENGER_1, true); + DoCastAOE(SPELL_JAWS_OF_DEATH_PERIODIC); + DoCastAOE(SPELL_FLY_STATE_VISUAL); }); + return; } - bool EvadeCheck() const - { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid); - if (!player) - return false; + context.Repeat(); + }); + } - switch (_phase) - { - case PHASE_INITIAL: - case PHASE_MOUTH: - if (!player->IsAlive()) - return false; - break; - case PHASE_DEAD: - break; - default: - ABORT(); - break; - } + bool EvadeCheck() const + { + Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid); + if (!player) + return false; - return true; - } + switch (_phase) + { + case PHASE_INITIAL: + case PHASE_MOUTH: + if (!player->IsAlive()) + return false; + break; + case PHASE_DEAD: + break; + default: + ABORT(); + break; + } - void UpdateAI(uint32 diff) override - { - if (!_playerGuid) - { - if (UpdateVictim()) - DoMeleeAttackIfReady(); - return; - } + return true; + } - if (_playerCheckTimer <= diff) - { - if (!EvadeCheck()) - EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + void UpdateAI(uint32 diff) override + { + if (!_playerGuid) + { + if (UpdateVictim()) + DoMeleeAttackIfReady(); + return; + } - _playerCheckTimer = 1 * IN_MILLISECONDS; - } - else - _playerCheckTimer -= diff; + if (_playerCheckTimer <= diff) + { + if (!EvadeCheck()) + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); - _scheduler.Update(diff); - } + _playerCheckTimer = 1 * IN_MILLISECONDS; + } + else + _playerCheckTimer -= diff; - private: - uint8 _phase; - uint32 _playerCheckTimer; - ObjectGuid _playerGuid; - TaskScheduler _scheduler; - }; + _scheduler.Update(diff); + } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wild_wyrmAI(creature); - } +private: + uint8 _phase; + uint32 _playerCheckTimer; + ObjectGuid _playerGuid; + TaskScheduler _scheduler; }; /*##### @@ -822,67 +756,47 @@ enum JokkumScriptcast }; // 61319 - Jokkum Scriptcast -class spell_jokkum_scriptcast : public SpellScriptLoader +class spell_jokkum_scriptcast : public AuraScript { - public: spell_jokkum_scriptcast() : SpellScriptLoader("spell_jokkum_scriptcast") { } - - class spell_jokkum_scriptcast_AuraScript : public AuraScript - { - PrepareAuraScript(spell_jokkum_scriptcast_AuraScript); + PrepareAuraScript(spell_jokkum_scriptcast); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_JOKKUM_SUMMON }); - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - target->CastSpell(target, SPELL_JOKKUM_SUMMON, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_JOKKUM_SUMMON }); + } - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_jokkum_scriptcast_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* target = GetTarget()) + target->CastSpell(target, SPELL_JOKKUM_SUMMON, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_jokkum_scriptcast_AuraScript(); - } + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_jokkum_scriptcast::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; // 56650 - Player Cast Veranus Summon -class spell_veranus_summon : public SpellScriptLoader +class spell_veranus_summon : public AuraScript { - public: spell_veranus_summon() : SpellScriptLoader("spell_veranus_summon") { } + PrepareAuraScript(spell_veranus_summon); - class spell_veranus_summon_AuraScript : public AuraScript - { - PrepareAuraScript(spell_veranus_summon_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_SUMMON_VERANUS_AND_THORIM }); - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - target->CastSpell(target, SPELL_SUMMON_VERANUS_AND_THORIM, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_VERANUS_AND_THORIM }); + } - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_veranus_summon_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* target = GetTarget()) + target->CastSpell(target, SPELL_SUMMON_VERANUS_AND_THORIM, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_veranus_summon_AuraScript(); - } + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_veranus_summon::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; enum CloseRift @@ -891,346 +805,246 @@ enum CloseRift }; // 56763 - Close Rift -class spell_close_rift : public SpellScriptLoader +class spell_close_rift : public AuraScript { - public: - spell_close_rift() : SpellScriptLoader("spell_close_rift") { } - - class spell_close_rift_AuraScript : public AuraScript - { - PrepareAuraScript(spell_close_rift_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_DESPAWN_RIFT }); - } + PrepareAuraScript(spell_close_rift); - void HandlePeriodic(AuraEffect const* /* aurEff */) - { - if (++_counter == 5) - GetTarget()->CastSpell(nullptr, SPELL_DESPAWN_RIFT, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_close_rift_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_DESPAWN_RIFT }); + } - private: - uint8 _counter = 0; + void HandlePeriodic(AuraEffect const* /* aurEff */) + { + if (++_counter == 5) + GetTarget()->CastSpell(nullptr, SPELL_DESPAWN_RIFT, true); + } - }; + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_close_rift::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } - AuraScript* GetAuraScript() const override - { - return new spell_close_rift_AuraScript(); - } +private: + uint8 _counter = 0; }; // 56689 - Grip -class spell_grip : public SpellScriptLoader +class spell_grip : public AuraScript { - public: - spell_grip() : SpellScriptLoader("spell_grip") { } + PrepareAuraScript(spell_grip); - class spell_grip_AuraScript : public AuraScript - { - PrepareAuraScript(spell_grip_AuraScript); - - void DummyTick(AuraEffect const* /*aurEff*/) - { - ++_tickNumber; - - // each 15 ticks stack reduction increases by 2 (increases by 1 at each 7th and 15th tick) - // except for the first 15 ticks that remove 1 stack each - uint32 const period = ((_tickNumber - 1) % 15) + 1; - uint32 const sequence = (_tickNumber - 1) / 15; + void DummyTick(AuraEffect const* /*aurEff*/) + { + ++_tickNumber; - uint32 stacksToRemove; - if (sequence == 0) - stacksToRemove = 1; - else - { - stacksToRemove = sequence * 2; - if (period > 7) - ++stacksToRemove; - } + // each 15 ticks stack reduction increases by 2 (increases by 1 at each 7th and 15th tick) + // except for the first 15 ticks that remove 1 stack each + uint32 const period = ((_tickNumber - 1) % 15) + 1; + uint32 const sequence = (_tickNumber - 1) / 15; - // while we could do ModStackAmount(-stacksToRemove), this is how it's done in sniffs :) - for (uint32 i = 0; i < stacksToRemove; ++i) - ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE); + uint32 stacksToRemove; + if (sequence == 0) + stacksToRemove = 1; + else + { + stacksToRemove = sequence * 2; + if (period > 7) + ++stacksToRemove; + } - if (GetStackAmount() < 15 && !_warning) - { - _warning = true; - GetTarget()->GetAI()->DoAction(ACTION_GRIP_FAILING); - } - else if (GetStackAmount() > 30) - _warning = false; - } + // while we could do ModStackAmount(-stacksToRemove), this is how it's done in sniffs :) + for (uint32 i = 0; i < stacksToRemove; ++i) + ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE); - void HandleDrop(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; + if (GetStackAmount() < 15 && !_warning) + { + _warning = true; + GetTarget()->GetAI()->DoAction(ACTION_GRIP_FAILING); + } + else if (GetStackAmount() > 30) + _warning = false; + } - GetTarget()->GetAI()->DoAction(ACTION_GRIP_LOST); - } + void HandleDrop(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_grip_AuraScript::DummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + GetTarget()->GetAI()->DoAction(ACTION_GRIP_LOST); + } - AfterEffectRemove += AuraEffectRemoveFn(spell_grip_AuraScript::HandleDrop, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_grip::DummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - // tick number in the AuraEffect gets reset each time we stack the aura, so keep track of it locally - uint32 _tickNumber = 0; + AfterEffectRemove += AuraEffectRemoveFn(spell_grip::HandleDrop, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } - bool _warning = false; - }; + // tick number in the AuraEffect gets reset each time we stack the aura, so keep track of it locally + uint32 _tickNumber = 0; - AuraScript* GetAuraScript() const override - { - return new spell_grip_AuraScript(); - } + bool _warning = false; }; // 60533 - Grab On -class spell_grab_on : public SpellScriptLoader +class spell_grab_on : public SpellScript { - public: - spell_grab_on() : SpellScriptLoader("spell_grab_on") { } - - class spell_grab_on_SpellScript : public SpellScript - { - PrepareSpellScript(spell_grab_on_SpellScript); + PrepareSpellScript(spell_grab_on); - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP, GetCaster()->GetGUID())) - grip->ModStackAmount(GetEffectValue(), AURA_REMOVE_BY_DEFAULT, false); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_grab_on_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP, GetCaster()->GetGUID())) + grip->ModStackAmount(GetEffectValue(), AURA_REMOVE_BY_DEFAULT, false); + } - SpellScript* GetSpellScript() const override - { - return new spell_grab_on_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_grab_on::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 56690 - Thrust Spear // 60586 - Mighty Spear Thrust template <int8 StacksToLose> -class spell_loosen_grip : public SpellScriptLoader +class spell_loosen_grip : public SpellScript { - public: - spell_loosen_grip(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + PrepareSpellScript(spell_loosen_grip); - template <int8 StacksLost> - class spell_loosen_grip_SpellScript : public SpellScript - { - PrepareSpellScript(spell_loosen_grip_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP)) - grip->ModStackAmount(-StacksLost, AURA_REMOVE_BY_EXPIRE); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_loosen_grip_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP)) + grip->ModStackAmount(-StacksToLose, AURA_REMOVE_BY_EXPIRE); + } - SpellScript* GetSpellScript() const override - { - return new spell_loosen_grip_SpellScript<StacksToLose>(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_loosen_grip::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 60596 - Low Health Trigger -class spell_low_health_trigger : public SpellScriptLoader +class spell_low_health_trigger : public SpellScript { - public: - spell_low_health_trigger() : SpellScriptLoader("spell_low_health_trigger") { } + PrepareSpellScript(spell_low_health_trigger); - class spell_low_health_trigger_SpellScript : public SpellScript - { - PrepareSpellScript(spell_low_health_trigger_SpellScript); - - bool Validate(SpellInfo const* spellInfo) override - { - return ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(nullptr, GetEffectValue(), true); - } + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_low_health_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(nullptr, GetEffectValue(), true); + } - SpellScript* GetSpellScript() const override - { - return new spell_low_health_trigger_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_low_health_trigger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 60776 - Claw Swipe // 60864 - Jaws of Death -class spell_jaws_of_death_claw_swipe_pct_damage : public SpellScriptLoader +class spell_jaws_of_death_claw_swipe_pct_damage : public SpellScript { - public: - spell_jaws_of_death_claw_swipe_pct_damage() : SpellScriptLoader("spell_jaws_of_death_claw_swipe_pct_damage") { } - - class spell_jaws_of_death_claw_swipe_pct_damage_SpellScript : public SpellScript - { - PrepareSpellScript(spell_jaws_of_death_claw_swipe_pct_damage_SpellScript); + PrepareSpellScript(spell_jaws_of_death_claw_swipe_pct_damage); - void HandleDamage(SpellEffIndex /*effIndex*/) - { - SetEffectValue(static_cast<int32>(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue()))); - } - - void Register() override - { - OnEffectLaunchTarget += SpellEffectFn(spell_jaws_of_death_claw_swipe_pct_damage_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; + void HandleDamage(SpellEffIndex /*effIndex*/) + { + SetEffectValue(static_cast<int32>(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue()))); + } - SpellScript* GetSpellScript() const override - { - return new spell_jaws_of_death_claw_swipe_pct_damage_SpellScript(); - } + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_jaws_of_death_claw_swipe_pct_damage::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } }; // 56705 - Claw Swipe -class spell_claw_swipe_check : public SpellScriptLoader +class spell_claw_swipe_check : public AuraScript { - public: spell_claw_swipe_check() : SpellScriptLoader("spell_claw_swipe_check") { } + PrepareAuraScript(spell_claw_swipe_check); - class spell_claw_swipe_check_AuraScript : public AuraScript - { - PrepareAuraScript(spell_claw_swipe_check_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->GetAI()->DoAction(ACTION_CLAW_SWIPE_WARN); - } + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->GetAI()->DoAction(ACTION_CLAW_SWIPE_WARN); + } - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Vehicle* vehicle = GetTarget()->GetVehicleKit()) + { + if (Unit* player = vehicle->GetPassenger(SEAT_INITIAL)) { - if (Vehicle* vehicle = GetTarget()->GetVehicleKit()) + if (player->HasAura(SPELL_DODGE_CLAWS)) { - if (Unit* player = vehicle->GetPassenger(SEAT_INITIAL)) - { - if (player->HasAura(SPELL_DODGE_CLAWS)) - { - GetTarget()->GetAI()->DoAction(ACTION_CLAW_SWIPE_DODGE); - return; - } - } + GetTarget()->GetAI()->DoAction(ACTION_CLAW_SWIPE_DODGE); + return; } - - GetTarget()->CastSpell(nullptr, aurEff->GetAmount(), false); } + } - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_claw_swipe_check_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectApplyFn(spell_claw_swipe_check_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + GetTarget()->CastSpell(nullptr, aurEff->GetAmount(), false); + } - AuraScript* GetAuraScript() const override - { - return new spell_claw_swipe_check_AuraScript(); - } + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_claw_swipe_check::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectApplyFn(spell_claw_swipe_check::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; // 60587 - Fatal Strike -class spell_fatal_strike : public SpellScriptLoader +class spell_fatal_strike : public SpellScript { - public: - spell_fatal_strike() : SpellScriptLoader("spell_fatal_strike") { } + PrepareSpellScript(spell_fatal_strike); - class spell_fatal_strike_SpellScript : public SpellScript - { - PrepareSpellScript(spell_fatal_strike_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_FATAL_STRIKE_DAMAGE }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 chance = 0; - if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_PRY_JAWS_OPEN, EFFECT_0)) - chance = aurEff->GetAmount(); - - if (!roll_chance_i(chance)) - { - GetCaster()->GetAI()->DoAction(ACTION_FATAL_STRIKE_MISS); - return; - } - - GetCaster()->CastSpell(nullptr, SPELL_FATAL_STRIKE_DAMAGE, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FATAL_STRIKE_DAMAGE }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_fatal_strike_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 chance = 0; + if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_PRY_JAWS_OPEN, EFFECT_0)) + chance = aurEff->GetAmount(); - SpellScript* GetSpellScript() const override + if (!roll_chance_i(chance)) { - return new spell_fatal_strike_SpellScript(); + GetCaster()->GetAI()->DoAction(ACTION_FATAL_STRIKE_MISS); + return; } + + GetCaster()->CastSpell(nullptr, SPELL_FATAL_STRIKE_DAMAGE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_fatal_strike::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // 56672 - Player Mount Wyrm -class spell_player_mount_wyrm : public SpellScriptLoader +class spell_player_mount_wyrm : public AuraScript { - public: - spell_player_mount_wyrm() : SpellScriptLoader("spell_player_mount_wyrm") { } - - class spell_player_mount_wyrm_AuraScript : public AuraScript - { - PrepareAuraScript(spell_player_mount_wyrm_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_FIGHT_WYRM }); - } + PrepareAuraScript(spell_player_mount_wyrm); - void HandleDummy(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(nullptr, SPELL_FIGHT_WYRM, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FIGHT_WYRM }); + } - void Register() override - { - AfterEffectRemove += AuraEffectApplyFn(spell_player_mount_wyrm_AuraScript::HandleDummy, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + void HandleDummy(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(nullptr, SPELL_FIGHT_WYRM, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_player_mount_wyrm_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectApplyFn(spell_player_mount_wyrm::HandleDummy, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; /*###### @@ -1428,25 +1242,25 @@ class spell_storm_peaks_unstable_explosive_detonation : public SpellScript void AddSC_storm_peaks() { - new npc_brunnhildar_prisoner(); - new npc_freed_protodrake(); - new npc_icefang(); - new npc_hyldsmeet_protodrake(); - new npc_brann_bronzebeard_keystone(); - new npc_wild_wyrm(); - - new spell_jokkum_scriptcast(); - new spell_veranus_summon(); - new spell_close_rift(); - new spell_grip(); - new spell_grab_on(); - new spell_loosen_grip<5>("spell_thrust_spear"); - new spell_loosen_grip<15>("spell_mighty_spear_thrust"); - new spell_low_health_trigger(); - new spell_jaws_of_death_claw_swipe_pct_damage(); - new spell_claw_swipe_check(); - new spell_fatal_strike(); - new spell_player_mount_wyrm(); + RegisterCreatureAI(npc_brunnhildar_prisoner); + RegisterCreatureAI(npc_freed_protodrake); + RegisterCreatureAI(npc_icefang); + RegisterCreatureAI(npc_hyldsmeet_protodrake); + RegisterCreatureAI(npc_brann_bronzebeard_keystone); + RegisterCreatureAI(npc_wild_wyrm); + + RegisterSpellScript(spell_jokkum_scriptcast); + RegisterSpellScript(spell_veranus_summon); + RegisterSpellScript(spell_close_rift); + RegisterSpellScript(spell_grip); + RegisterSpellScript(spell_grab_on); + RegisterSpellScriptWithArgs(spell_loosen_grip<5>, "spell_thrust_spear"); + RegisterSpellScriptWithArgs(spell_loosen_grip<15>, "spell_mighty_spear_thrust"); + RegisterSpellScript(spell_low_health_trigger); + RegisterSpellScript(spell_jaws_of_death_claw_swipe_pct_damage); + RegisterSpellScript(spell_claw_swipe_check); + RegisterSpellScript(spell_fatal_strike); + RegisterSpellScript(spell_player_mount_wyrm); RegisterSpellScript(spell_q12823_remove_collapsing_cave_aura); RegisterSpellScript(spell_read_pronouncement); RegisterSpellScript(spell_bear_flank_master); diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index c483b6aa139..b333db9e0e0 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -117,143 +117,121 @@ uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES] = NPC_WINTERGRASP_SIEGE_ENGINE_HORDE }; -class npc_wg_demolisher_engineer : public CreatureScript +struct npc_wg_demolisher_engineer : public ScriptedAI { - public: - npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } + npc_wg_demolisher_engineer(Creature* creature) : ScriptedAI(creature) { } - struct npc_wg_demolisher_engineerAI : public ScriptedAI - { - npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { } + bool OnGossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - bool OnGossipHello(Player* player) override + if (CanBuild()) + { + if (player->HasAura(SPELL_CORPORAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + else if (player->HasAura(SPELL_LIEUTENANT)) { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); - - if (CanBuild()) - { - if (player->HasAura(SPELL_CORPORAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (player->HasAura(SPELL_LIEUTENANT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - } - } - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - - SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); - return true; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); } + } + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override - { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - CloseGossipMenuFor(player); - - if (CanBuild()) - { - switch (action - GOSSIP_ACTION_INFO_DEF) - { - case 0: - DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true); - break; - case 1: - DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true); - break; - case 2: - DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); - break; - } - if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) - DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); - } - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - private: - bool CanBuild() const - { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return false; + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); - switch (me->GetEntry()) - { - case NPC_GOBLIN_MECHANIC: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); - case NPC_GNOMISH_ENGINEER: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); - default: - return false; - } + if (CanBuild()) + { + switch (action - GOSSIP_ACTION_INFO_DEF) + { + case 0: + DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); + break; } - }; + if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) + DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); + } + return true; + } + +private: + bool CanBuild() const + { + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return false; - CreatureAI* GetAI(Creature* creature) const override + switch (me->GetEntry()) { - return new npc_wg_demolisher_engineerAI(creature); + case NPC_GOBLIN_MECHANIC: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); + case NPC_GNOMISH_ENGINEER: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); + default: + return false; } + } }; -class npc_wg_spirit_guide : public CreatureScript +struct npc_wg_spirit_guide : public ScriptedAI { - public: - npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } - - struct npc_wg_spirit_guideAI : public ScriptedAI - { - npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } + npc_wg_spirit_guide(Creature* creature) : ScriptedAI(creature) { } - void UpdateAI(uint32 /*diff*/) override - { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); - } + void UpdateAI(uint32 /*diff*/) override + { + if (!me->HasUnitState(UNIT_STATE_CASTING)) + DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); + } - bool OnGossipHello(Player* player) override - { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); + bool OnGossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < graveyard.size(); i++) - if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); + GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < graveyard.size(); i++) + if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); - SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override - { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp) - { - GraveyardVect gy = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < gy.size(); i++) - if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->Continent, safeLoc->Loc.X, safeLoc->Loc.Y, safeLoc->Loc.Z, 0); - } - return true; - } - }; + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); - CreatureAI* GetAI(Creature* creature) const override + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (wintergrasp) { - return new npc_wg_spirit_guideAI(creature); + GraveyardVect gy = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < gy.size(); i++) + if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) + if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->Continent, safeLoc->Loc.X, safeLoc->Loc.Y, safeLoc->Loc.Z, 0); } + return true; + } }; enum WGQueue @@ -261,142 +239,121 @@ enum WGQueue SPELL_FROST_ARMOR = 12544 }; -class npc_wg_queue : public CreatureScript +struct npc_wg_queue : public ScriptedAI { - public: - npc_wg_queue() : CreatureScript("npc_wg_queue") { } + npc_wg_queue(Creature* creature) : ScriptedAI(creature) + { + FrostArmor_Timer = 0; + } + + uint32 FrostArmor_Timer; - struct npc_wg_queueAI : public ScriptedAI + void Reset() override + { + FrostArmor_Timer = 0; + } + + void JustEngagedWith(Unit* /*who*/) override { } + + void UpdateAI(uint32 diff) override + { + if (FrostArmor_Timer <= diff) { - npc_wg_queueAI(Creature* creature) : ScriptedAI(creature) - { - FrostArmor_Timer = 0; - } + DoCast(me, SPELL_FROST_ARMOR); + FrostArmor_Timer = 180000; + } + else FrostArmor_Timer -= diff; - uint32 FrostArmor_Timer; + DoMeleeAttackIfReady(); + } - void Reset() override - { - FrostArmor_Timer = 0; - } + bool OnGossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - void JustEngagedWith(Unit* /*who*/) override { } + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - void UpdateAI(uint32 diff) override + if (wintergrasp->IsWarTime()) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID()); + } + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + player->SendUpdateWorldState(4354, GameTime::GetGameTime() + timer); + if (timer < 15 * MINUTE) { - if (FrostArmor_Timer <= diff) - { - DoCast(me, SPELL_FROST_ARMOR); - FrostArmor_Timer = 180000; - } - else FrostArmor_Timer -= diff; - - DoMeleeAttackIfReady(); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID()); } + else + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); + } + return true; + } - bool OnGossipHello(Player* player) override - { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID()); - } - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - player->SendUpdateWorldState(4354, GameTime::GetGameTime() + timer); - if (timer < 15 * MINUTE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID()); - } - else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); - } - return true; - } + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - wintergrasp->InvitePlayerToWar(player); - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (timer < 15 * MINUTE) - wintergrasp->InvitePlayerToQueue(player); - } - return true; - } - }; + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - CreatureAI* GetAI(Creature* creature) const override + if (wintergrasp->IsWarTime()) + wintergrasp->InvitePlayerToWar(player); + else { - return new npc_wg_queueAI(creature); + uint32 timer = wintergrasp->GetTimer() / 1000; + if (timer < 15 * MINUTE) + wintergrasp->InvitePlayerToQueue(player); } + return true; + } }; -class go_wg_vehicle_teleporter : public GameObjectScript +struct go_wg_vehicle_teleporter : public GameObjectAI { - public: - go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { } - - struct go_wg_vehicle_teleporterAI : public GameObjectAI - { - go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { } + go_wg_vehicle_teleporter(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { } - bool IsFriendly(Unit* passenger) - { - return ((me->GetFaction() == FACTION_HORDE_GENERIC_WG && passenger->GetFaction() == HORDE) || - (me->GetFaction() == FACTION_ALLIANCE_GENERIC_WG && passenger->GetFaction() == ALLIANCE)); - } - - Creature* GetValidVehicle(Creature* cVeh) - { - if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) - if (Vehicle* vehicle = cVeh->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - if (IsFriendly(passenger)) - if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1s)) - return teleportTrigger; - - return nullptr; - } + bool IsFriendly(Unit* passenger) + { + return ((me->GetFaction() == FACTION_HORDE_GENERIC_WG && passenger->GetFaction() == HORDE) || + (me->GetFaction() == FACTION_ALLIANCE_GENERIC_WG && passenger->GetFaction() == ALLIANCE)); + } - void UpdateAI(uint32 diff) override - { - _checkTimer += diff; - if (_checkTimer >= 1000) - { - for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) - if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true)) - if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature)) - teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); - - _checkTimer = 0; - } - } - private: - uint32 _checkTimer; - }; + Creature* GetValidVehicle(Creature* cVeh) + { + if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) + if (Vehicle* vehicle = cVeh->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + if (IsFriendly(passenger)) + if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1s)) + return teleportTrigger; + + return nullptr; + } - GameObjectAI* GetAI(GameObject* go) const override + void UpdateAI(uint32 diff) override + { + _checkTimer += diff; + if (_checkTimer >= 1000) { - return new go_wg_vehicle_teleporterAI(go); + for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) + if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true)) + if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature)) + teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); + + _checkTimer = 0; } + } + +private: + uint32 _checkTimer; }; /* 49899 - Activate Robotic Arms @@ -404,70 +361,48 @@ class go_wg_vehicle_teleporter : public GameObjectScript 56662 - Build Siege Vehicle (Force) 56664 - Build Catapult (Force) 61409 - Build Siege Vehicle (Force) */ -class spell_wintergrasp_force_building : public SpellScriptLoader +class spell_wintergrasp_force_building : public SpellScript { - public: - spell_wintergrasp_force_building() : SpellScriptLoader("spell_wintergrasp_force_building") { } + PrepareSpellScript(spell_wintergrasp_force_building); - class spell_wintergrasp_force_building_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( { - PrepareSpellScript(spell_wintergrasp_force_building_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo( - { - SPELL_BUILD_CATAPULT_FORCE, - SPELL_BUILD_DEMOLISHER_FORCE, - SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, - SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE - }); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false); - } + SPELL_BUILD_CATAPULT_FORCE, + SPELL_BUILD_DEMOLISHER_FORCE, + SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, + SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE + }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false); + } - SpellScript* GetSpellScript() const override - { - return new spell_wintergrasp_force_building_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 61178 - Grab Passenger -class spell_wintergrasp_grab_passenger : public SpellScriptLoader +class spell_wintergrasp_grab_passenger : public SpellScript { - public: - spell_wintergrasp_grab_passenger() : SpellScriptLoader("spell_wintergrasp_grab_passenger") { } + PrepareSpellScript(spell_wintergrasp_grab_passenger); - class spell_wintergrasp_grab_passenger_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_grab_passenger_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* target = GetHitPlayer()) - target->CastSpell(GetCaster(), SPELL_RIDE_WG_VEHICLE, false); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* target = GetHitPlayer()) + target->CastSpell(GetCaster(), SPELL_RIDE_WG_VEHICLE, false); + } - SpellScript* GetSpellScript() const override - { - return new spell_wintergrasp_grab_passenger_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript @@ -500,66 +435,44 @@ enum WgTeleport }; // 54640 - Teleport -class spell_wintergrasp_defender_teleport : public SpellScriptLoader +class spell_wintergrasp_defender_teleport : public SpellScript { - public: - spell_wintergrasp_defender_teleport() : SpellScriptLoader("spell_wintergrasp_defender_teleport") { } - - class spell_wintergrasp_defender_teleport_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_defender_teleport_SpellScript); + PrepareSpellScript(spell_wintergrasp_defender_teleport); - SpellCastResult CheckCast() - { - if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) - if (Player* target = GetExplTargetUnit()->ToPlayer()) - // check if we are in Wintergrasp at all, SotA uses same teleport spells - if ((target->GetZoneId() == AREA_WINTERGRASP && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER)) - return SPELL_FAILED_BAD_TARGETS; - return SPELL_CAST_OK; - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport_SpellScript::CheckCast); - } - }; + SpellCastResult CheckCast() + { + if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) + if (Player* target = GetExplTargetUnit()->ToPlayer()) + // check if we are in Wintergrasp at all, SotA uses same teleport spells + if ((target->GetZoneId() == AREA_WINTERGRASP && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER)) + return SPELL_FAILED_BAD_TARGETS; + return SPELL_CAST_OK; + } - SpellScript* GetSpellScript() const override - { - return new spell_wintergrasp_defender_teleport_SpellScript(); - } + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport::CheckCast); + } }; // 54643 - Teleport -class spell_wintergrasp_defender_teleport_trigger : public SpellScriptLoader +class spell_wintergrasp_defender_teleport_trigger : public SpellScript { - public: - spell_wintergrasp_defender_teleport_trigger() : SpellScriptLoader("spell_wintergrasp_defender_teleport_trigger") { } - - class spell_wintergrasp_defender_teleport_trigger_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger_SpellScript); - - void HandleDummy(SpellEffIndex /*effindex*/) - { - if (Unit* target = GetHitUnit()) - { - WorldLocation loc = target->GetWorldLocation(); - SetExplTargetDest(loc); - } - } + PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger); - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex /*effindex*/) + { + if (Unit* target = GetHitUnit()) { - return new spell_wintergrasp_defender_teleport_trigger_SpellScript(); + WorldLocation loc = target->GetWorldLocation(); + SetExplTargetDest(loc); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // 58549 - Tenacity @@ -637,15 +550,15 @@ class condition_is_wintergrasp_alliance : public ConditionScript void AddSC_wintergrasp() { - new npc_wg_queue(); - new npc_wg_spirit_guide(); - new npc_wg_demolisher_engineer(); - new go_wg_vehicle_teleporter(); - new spell_wintergrasp_force_building(); - new spell_wintergrasp_grab_passenger(); + RegisterCreatureAI(npc_wg_queue); + RegisterCreatureAI(npc_wg_spirit_guide); + RegisterCreatureAI(npc_wg_demolisher_engineer); + RegisterGameObjectAI(go_wg_vehicle_teleporter); + RegisterSpellScript(spell_wintergrasp_force_building); + RegisterSpellScript(spell_wintergrasp_grab_passenger); new achievement_wg_didnt_stand_a_chance(); - new spell_wintergrasp_defender_teleport(); - new spell_wintergrasp_defender_teleport_trigger(); + RegisterSpellScript(spell_wintergrasp_defender_teleport); + RegisterSpellScript(spell_wintergrasp_defender_teleport_trigger); RegisterSpellScript(spell_wintergrasp_tenacity_refresh); new condition_is_wintergrasp_horde(); new condition_is_wintergrasp_alliance(); diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index e0d3c4ef9aa..4acff22283c 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -44,76 +44,65 @@ enum DrakuruShackles SPELL_FREE_RAGECLAW = 55223 }; -class npc_drakuru_shackles : public CreatureScript +struct npc_drakuru_shackles : public ScriptedAI { -public: - npc_drakuru_shackles() : CreatureScript("npc_drakuru_shackles") { } + npc_drakuru_shackles(Creature* creature) : ScriptedAI(creature) { } - struct npc_drakuru_shacklesAI : public ScriptedAI + void Reset() override { - npc_drakuru_shacklesAI(Creature* creature) : ScriptedAI(creature) { } + _rageclawGUID.Clear(); + me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - void Reset() override - { - _rageclawGUID.Clear(); - me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - - float x, y, z; - me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 0.1f); + float x, y, z; + me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 0.1f); - if (Creature* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1s)) - { - _rageclawGUID = summon->GetGUID(); - LockRageclaw(summon); - } - } - - void LockRageclaw(Creature* rageclaw) + if (Creature* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1s)) { - // pointer check not needed - me->SetFacingToObject(rageclaw); - rageclaw->SetFacingToObject(me); + _rageclawGUID = summon->GetGUID(); + LockRageclaw(summon); } + } - void UnlockRageclaw(Creature* rageclaw) - { - // pointer check not needed - DoCast(rageclaw, SPELL_FREE_RAGECLAW, true); + void LockRageclaw(Creature* rageclaw) + { + // pointer check not needed + me->SetFacingToObject(rageclaw); + rageclaw->SetFacingToObject(me); + } - me->setDeathState(DEAD); - } + void UnlockRageclaw(Creature* rageclaw) + { + // pointer check not needed + DoCast(rageclaw, SPELL_FREE_RAGECLAW, true); - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - Player* playerCaster = caster->ToPlayer(); - if (!playerCaster) - return; + me->setDeathState(DEAD); + } - if (spellInfo->Id == SPELL_UNLOCK_SHACKLE) + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Player* playerCaster = caster->ToPlayer(); + if (!playerCaster) + return; + + if (spellInfo->Id == SPELL_UNLOCK_SHACKLE) + { + if (playerCaster->GetQuestStatus(QUEST_TROLLS_IS_GONE_CRAZY) == QUEST_STATUS_INCOMPLETE) { - if (playerCaster->GetQuestStatus(QUEST_TROLLS_IS_GONE_CRAZY) == QUEST_STATUS_INCOMPLETE) + if (Creature* rageclaw = ObjectAccessor::GetCreature(*me, _rageclawGUID)) { - if (Creature* rageclaw = ObjectAccessor::GetCreature(*me, _rageclawGUID)) - { - UnlockRageclaw(rageclaw); - playerCaster->KilledMonster(rageclaw->GetCreatureTemplate(), _rageclawGUID); - me->RemoveAurasDueToSpell(SPELL_CHAIN_OF_THE_SCURGE_RIGHT); - me->DespawnOrUnsummon(); - } - else - me->setDeathState(JUST_DIED); + UnlockRageclaw(rageclaw); + playerCaster->KilledMonster(rageclaw->GetCreatureTemplate(), _rageclawGUID); + me->RemoveAurasDueToSpell(SPELL_CHAIN_OF_THE_SCURGE_RIGHT); + me->DespawnOrUnsummon(); } + else + me->setDeathState(JUST_DIED); } } - - private: - ObjectGuid _rageclawGUID; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_drakuru_shacklesAI(creature); } + +private: + ObjectGuid _rageclawGUID; }; /*#### @@ -126,41 +115,30 @@ enum Rageclaw SAY_RAGECLAW = 0 }; -class npc_captured_rageclaw : public CreatureScript +struct npc_captured_rageclaw : public ScriptedAI { -public: - npc_captured_rageclaw() : CreatureScript("npc_captured_rageclaw") { } + npc_captured_rageclaw(Creature* creature) : ScriptedAI(creature) { } - struct npc_captured_rageclawAI : public ScriptedAI + void Reset() override { - npc_captured_rageclawAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - me->SetFaction(FACTION_FRIENDLY); - DoCast(me, SPELL_CHAIN_OF_THE_SCURGE_RIGHT, true); - } + me->SetFaction(FACTION_FRIENDLY); + DoCast(me, SPELL_CHAIN_OF_THE_SCURGE_RIGHT, true); + } - void MoveInLineOfSight(Unit* /*who*/) override { } + void MoveInLineOfSight(Unit* /*who*/) override { } - void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_FREE_RAGECLAW) { - if (spellInfo->Id == SPELL_FREE_RAGECLAW) - { - me->RemoveAurasDueToSpell(SPELL_CHAIN_OF_THE_SCURGE_LEFT); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->SetFaction(me->GetCreatureTemplate()->faction); - DoCast(me, SPELL_UNSHACKLED, true); - Talk(SAY_RAGECLAW); - me->GetMotionMaster()->MoveRandom(10); - me->DespawnOrUnsummon(10s); - } + me->RemoveAurasDueToSpell(SPELL_CHAIN_OF_THE_SCURGE_LEFT); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(me->GetCreatureTemplate()->faction); + DoCast(me, SPELL_UNSHACKLED, true); + Talk(SAY_RAGECLAW); + me->GetMotionMaster()->MoveRandom(10); + me->DespawnOrUnsummon(10s); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_captured_rageclawAI(creature); } }; @@ -168,33 +146,22 @@ public: ## npc_released_offspring_harkoa ####*/ -class npc_released_offspring_harkoa : public CreatureScript +struct npc_released_offspring_harkoa : public ScriptedAI { -public: - npc_released_offspring_harkoa() : CreatureScript("npc_released_offspring_harkoa") { } + npc_released_offspring_harkoa(Creature* creature) : ScriptedAI(creature) { } - struct npc_released_offspring_harkoaAI : public ScriptedAI + void Reset() override { - npc_released_offspring_harkoaAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - float x, y, z; - me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 25.0f); - me->GetMotionMaster()->MovePoint(0, x, y, z); - } - - void MovementInform(uint32 Type, uint32 /*uiId*/) override - { - if (Type != POINT_MOTION_TYPE) - return; - me->DespawnOrUnsummon(); - } - }; + float x, y, z; + me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 25.0f); + me->GetMotionMaster()->MovePoint(0, x, y, z); + } - CreatureAI* GetAI(Creature* creature) const override + void MovementInform(uint32 Type, uint32 /*uiId*/) override { - return new npc_released_offspring_harkoaAI(creature); + if (Type != POINT_MOTION_TYPE) + return; + me->DespawnOrUnsummon(); } }; @@ -215,76 +182,65 @@ enum CrusadeRecruitEvents EVENT_RECRUIT_2 = 2 }; -class npc_crusade_recruit : public CreatureScript +struct npc_crusade_recruit : public ScriptedAI { -public: - npc_crusade_recruit() : CreatureScript("npc_crusade_recruit") { } + npc_crusade_recruit(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - struct npc_crusade_recruitAI : public ScriptedAI + void Initialize() { - npc_crusade_recruitAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + _heading = me->GetOrientation(); + } - void Initialize() - { - _heading = me->GetOrientation(); - } + void Reset() override + { + me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); + me->SetEmoteState(EMOTE_STATE_COWER); + Initialize(); + } - void Reset() override - { - me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->SetEmoteState(EMOTE_STATE_COWER); - Initialize(); - } + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = _events.ExecuteEvent()) { - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_RECRUIT_1: - me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->SetEmoteState(EMOTE_ONESHOT_NONE); - Talk(SAY_RECRUIT); - _events.ScheduleEvent(EVENT_RECRUIT_2, 3s); - break; - case EVENT_RECRUIT_2: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (std::cos(_heading) * 10), me->GetPositionY() + (std::sin(_heading) * 10), me->GetPositionZ()); - me->DespawnOrUnsummon(5s); - break; - default: - break; - } + case EVENT_RECRUIT_1: + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + me->SetEmoteState(EMOTE_ONESHOT_NONE); + Talk(SAY_RECRUIT); + _events.ScheduleEvent(EVENT_RECRUIT_2, 3s); + break; + case EVENT_RECRUIT_2: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (std::cos(_heading) * 10), me->GetPositionY() + (std::sin(_heading) * 10), me->GetPositionZ()); + me->DespawnOrUnsummon(5s); + break; + default: + break; } - - if (!UpdateVictim()) - return; } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - _events.ScheduleEvent(EVENT_RECRUIT_1, 100ms); - CloseGossipMenuFor(player); - me->CastSpell(player, SPELL_QUEST_CREDIT, true); - me->SetFacingToObject(player); - return false; - } - - private: - EventMap _events; - float _heading; // Store creature heading - }; + if (!UpdateVictim()) + return; + } - CreatureAI* GetAI(Creature* creature) const override + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { - return new npc_crusade_recruitAI(creature); + _events.ScheduleEvent(EVENT_RECRUIT_1, 100ms); + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_QUEST_CREDIT, true); + me->SetFacingToObject(player); + return false; } + +private: + EventMap _events; + float _heading; // Store creature heading }; /*###### @@ -421,145 +377,123 @@ enum FinklesteinEvents EVENT_HARD_6 = 6 }; -class npc_alchemist_finklestein : public CreatureScript +struct npc_alchemist_finklestein : public ScriptedAI { -public: - npc_alchemist_finklestein() : CreatureScript("npc_alchemist_finklestein") { } + npc_alchemist_finklestein(Creature* creature) : ScriptedAI(creature) + { + _getingredienttry = 0; + } - struct npc_alchemist_finklesteinAI : public ScriptedAI - { - npc_alchemist_finklesteinAI(Creature* creature) : ScriptedAI(creature) - { - _getingredienttry = 0; - } + void Reset() override + { + _playerGUID.Clear(); + _getingredienttry = 0; + _events.ScheduleEvent(EVENT_TURN_TO_POT, 15s, 26s); + } - void Reset() override - { - _playerGUID.Clear(); - _getingredienttry = 0; - _events.ScheduleEvent(EVENT_TURN_TO_POT, 15s, 26s); + void SetData(uint32 type, uint32 data) override + { + if (type == 1 && data == 1) + switch (_getingredienttry) + { + case 2: + case 3: + _events.ScheduleEvent(EVENT_EASY_123, 100ms); + break; + case 4: + _events.ScheduleEvent(EVENT_MEDIUM_4, 100ms); + break; + case 5: + _events.ScheduleEvent(EVENT_MEDIUM_5, 100ms); + break; + case 6: + _events.ScheduleEvent(EVENT_HARD_6, 100ms); + break; + default: + break; } + } - void SetData(uint32 type, uint32 data) override - { - if (type == 1 && data == 1) - switch (_getingredienttry) - { - case 2: - case 3: - _events.ScheduleEvent(EVENT_EASY_123, 100ms); - break; - case 4: - _events.ScheduleEvent(EVENT_MEDIUM_4, 100ms); - break; - case 5: - _events.ScheduleEvent(EVENT_MEDIUM_5, 100ms); - break; - case 6: - _events.ScheduleEvent(EVENT_HARD_6, 100ms); - break; - default: - break; - } - } + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) + case EVENT_TURN_TO_POT: + me->SetFacingTo(6.230825f); + me->SetEmoteState(EMOTE_STATE_USE_STANDING_NO_SHEATHE); + _events.ScheduleEvent(EVENT_TURN_BACK, 11s); + break; + case EVENT_TURN_BACK: + me->SetFacingTo(4.886922f); + me->SetEmoteState(EMOTE_STATE_NONE); + _events.ScheduleEvent(EVENT_TURN_TO_POT, 25s, 41s); + break; + case EVENT_EASY_123: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) { - case EVENT_TURN_TO_POT: - me->SetFacingTo(6.230825f); - me->SetEmoteState(EMOTE_STATE_USE_STANDING_NO_SHEATHE); - _events.ScheduleEvent(EVENT_TURN_BACK, 11s); - break; - case EVENT_TURN_BACK: - me->SetFacingTo(4.886922f); - me->SetEmoteState(EMOTE_STATE_NONE); - _events.ScheduleEvent(EVENT_TURN_TO_POT, 25s, 41s); - break; - case EVENT_EASY_123: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - Talk(SAY_EASY_123, player); - DoCast(player, SPELL_RANDOM_INGREDIENT_EASY_AURA); - ++_getingredienttry; - } - break; - case EVENT_MEDIUM_4: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - Talk(SAY_MEDIUM_4, player); - DoCast(player, SPELL_RANDOM_INGREDIENT_MEDIUM_AURA); - ++_getingredienttry; - } - break; - case EVENT_MEDIUM_5: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - Talk(SAY_MEDIUM_5, player); - DoCast(player, SPELL_RANDOM_INGREDIENT_MEDIUM_AURA); - ++_getingredienttry; - } - break; - case EVENT_HARD_6: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - Talk(SAY_HARD_6, player); - DoCast(player, SPELL_RANDOM_INGREDIENT_HARD_AURA); - ++_getingredienttry; - } - break; - default: - break; + Talk(SAY_EASY_123, player); + DoCast(player, SPELL_RANDOM_INGREDIENT_EASY_AURA); + ++_getingredienttry; } - } - } - - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - CloseGossipMenuFor(player); - DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); - _playerGUID = player->GetGUID(); - _getingredienttry = 1; - _events.ScheduleEvent(EVENT_EASY_123, 100ms); - return false; + break; + case EVENT_MEDIUM_4: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { + Talk(SAY_MEDIUM_4, player); + DoCast(player, SPELL_RANDOM_INGREDIENT_MEDIUM_AURA); + ++_getingredienttry; + } + break; + case EVENT_MEDIUM_5: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { + Talk(SAY_MEDIUM_5, player); + DoCast(player, SPELL_RANDOM_INGREDIENT_MEDIUM_AURA); + ++_getingredienttry; + } + break; + case EVENT_HARD_6: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { + Talk(SAY_HARD_6, player); + DoCast(player, SPELL_RANDOM_INGREDIENT_HARD_AURA); + ++_getingredienttry; + } + break; + default: + break; } + } + } - private: - EventMap _events; - ObjectGuid _playerGUID; - uint8 _getingredienttry; - }; + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); + _playerGUID = player->GetGUID(); + _getingredienttry = 1; + _events.ScheduleEvent(EVENT_EASY_123, 100ms); + return false; + } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_alchemist_finklesteinAI(creature); - } +private: + EventMap _events; + ObjectGuid _playerGUID; + uint8 _getingredienttry; }; -class go_finklesteins_cauldron : public GameObjectScript +struct go_finklesteins_cauldron : public GameObjectAI { -public: - go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } + go_finklesteins_cauldron(GameObject* go) : GameObjectAI(go) { } - struct go_finklesteins_cauldronAI : public GameObjectAI + bool OnGossipHello(Player* player) override { - go_finklesteins_cauldronAI(GameObject* go) : GameObjectAI(go) { } - - bool OnGossipHello(Player* player) override - { - player->CastSpell(player, SPELL_POT_CHECK); - return true; - } - }; - - GameObjectAI* GetAI(GameObject* go) const override - { - return new go_finklesteins_cauldronAI(go); + player->CastSpell(player, SPELL_POT_CHECK); + return true; } }; @@ -591,128 +525,108 @@ uint32 const FetchIngredients[21][4] = // 51015 - Random Ingredient Easy Aura // 51154 - Random Ingredient Medium Aura // 51157 - Random Ingredient Hard Aura -class spell_random_ingredient_aura : public SpellScriptLoader +class spell_random_ingredient_aura : public AuraScript { - public: spell_random_ingredient_aura() : SpellScriptLoader("spell_random_ingredient_aura") { } + PrepareAuraScript(spell_random_ingredient_aura); - class spell_random_ingredient_aura_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareAuraScript(spell_random_ingredient_aura_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_RANDOM_INGREDIENT_EASY, - SPELL_RANDOM_INGREDIENT_MEDIUM, - SPELL_RANDOM_INGREDIENT_HARD - }); - } - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - switch (GetSpellInfo()->Id) - { - case SPELL_RANDOM_INGREDIENT_EASY_AURA: - GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_EASY); - break; - case SPELL_RANDOM_INGREDIENT_MEDIUM_AURA: - GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_MEDIUM); - break; - case SPELL_RANDOM_INGREDIENT_HARD_AURA: - GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_HARD); - break; - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_random_ingredient_aura_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; + SPELL_RANDOM_INGREDIENT_EASY, + SPELL_RANDOM_INGREDIENT_MEDIUM, + SPELL_RANDOM_INGREDIENT_HARD + }); + } - AuraScript* GetAuraScript() const override + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + switch (GetSpellInfo()->Id) { - return new spell_random_ingredient_aura_AuraScript(); + case SPELL_RANDOM_INGREDIENT_EASY_AURA: + GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_EASY); + break; + case SPELL_RANDOM_INGREDIENT_MEDIUM_AURA: + GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_MEDIUM); + break; + case SPELL_RANDOM_INGREDIENT_HARD_AURA: + GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_HARD); + break; } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_random_ingredient_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } }; // 51105 - Random Ingredient Medium // 51107 - Random Ingredient Hard // 51134 - Random Ingredient Easy -class spell_random_ingredient : public SpellScriptLoader +class spell_random_ingredient : public SpellScript { - public: spell_random_ingredient() : SpellScriptLoader("spell_random_ingredient") { } + PrepareSpellScript(spell_random_ingredient); - class spell_random_ingredient_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareSpellScript(spell_random_ingredient_SpellScript); + SPELL_FETCH_KNOTROOT, SPELL_HAVE_KNOTROOT, + SPELL_FETCH_PICKLED_EAGLE_EGG, SPELL_HAVE_PICKLED_EAGLE_EGG, + SPELL_FETCH_SPECKLED_GUANO, SPELL_HAVE_SPECKLED_GUANO, + SPELL_FETCH_WITHERED_BATWING, SPELL_HAVE_WITHERED_BATWING, + SPELL_FETCH_SEASONED_SLIDER_CIDER, SPELL_HAVE_SEASONED_SLIDER_CIDER, + SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH, SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH, + SPELL_FETCH_MUDDY_MIRE_MAGGOT, SPELL_HAVE_MUDDY_MIRE_MAGGOT, + SPELL_FETCH_SPIKY_SPIDER_EGG, SPELL_HAVE_SPIKY_SPIDER_EGG, + SPELL_FETCH_HAIRY_HERRING_HEAD, SPELL_HAVE_HAIRY_HERRING_HEAD, + SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION, SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION, + SPELL_FETCH_ICECROWN_BOTTLED_WATER, SPELL_HAVE_ICECROWN_BOTTLED_WATER, + SPELL_FETCH_WASPS_WINGS, SPELL_HAVE_WASPS_WINGS, + SPELL_FETCH_PRISMATIC_MOJO, SPELL_HAVE_PRISMATIC_MOJO, + SPELL_FETCH_RAPTOR_CLAW, SPELL_HAVE_RAPTOR_CLAW, + SPELL_FETCH_AMBERSEED, SPELL_HAVE_AMBERSEED, + SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW, SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW, + SPELL_FETCH_CHILLED_SERPENT_MUCUS, SPELL_HAVE_CHILLED_SERPENT_MUCUS, + SPELL_FETCH_CRYSTALLIZED_HOGSNOT, SPELL_HAVE_CRYSTALLIZED_HOGSNOT, + SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS, SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS, + SPELL_FETCH_TROLLBANE, SPELL_HAVE_TROLLBANE, + SPELL_FETCH_FROZEN_SPIDER_ICHOR, SPELL_HAVE_FROZEN_SPIDER_ICHOR, + }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_FETCH_KNOTROOT, SPELL_HAVE_KNOTROOT, - SPELL_FETCH_PICKLED_EAGLE_EGG, SPELL_HAVE_PICKLED_EAGLE_EGG, - SPELL_FETCH_SPECKLED_GUANO, SPELL_HAVE_SPECKLED_GUANO, - SPELL_FETCH_WITHERED_BATWING, SPELL_HAVE_WITHERED_BATWING, - SPELL_FETCH_SEASONED_SLIDER_CIDER, SPELL_HAVE_SEASONED_SLIDER_CIDER, - SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH, SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH, - SPELL_FETCH_MUDDY_MIRE_MAGGOT, SPELL_HAVE_MUDDY_MIRE_MAGGOT, - SPELL_FETCH_SPIKY_SPIDER_EGG, SPELL_HAVE_SPIKY_SPIDER_EGG, - SPELL_FETCH_HAIRY_HERRING_HEAD, SPELL_HAVE_HAIRY_HERRING_HEAD, - SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION, SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION, - SPELL_FETCH_ICECROWN_BOTTLED_WATER, SPELL_HAVE_ICECROWN_BOTTLED_WATER, - SPELL_FETCH_WASPS_WINGS, SPELL_HAVE_WASPS_WINGS, - SPELL_FETCH_PRISMATIC_MOJO, SPELL_HAVE_PRISMATIC_MOJO, - SPELL_FETCH_RAPTOR_CLAW, SPELL_HAVE_RAPTOR_CLAW, - SPELL_FETCH_AMBERSEED, SPELL_HAVE_AMBERSEED, - SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW, SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW, - SPELL_FETCH_CHILLED_SERPENT_MUCUS, SPELL_HAVE_CHILLED_SERPENT_MUCUS, - SPELL_FETCH_CRYSTALLIZED_HOGSNOT, SPELL_HAVE_CRYSTALLIZED_HOGSNOT, - SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS, SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS, - SPELL_FETCH_TROLLBANE, SPELL_HAVE_TROLLBANE, - SPELL_FETCH_FROZEN_SPIDER_ICHOR, SPELL_HAVE_FROZEN_SPIDER_ICHOR, - }); - } + void HandleScriptEffect(SpellEffIndex /* effIndex */) + { + if (Player* player = GetHitPlayer()) + { + uint8 ingredient = 0; - void HandleScriptEffect(SpellEffIndex /* effIndex */) + switch (GetSpellInfo()->Id) { - if (Player* player = GetHitPlayer()) - { - uint8 ingredient = 0; - - switch (GetSpellInfo()->Id) - { - case SPELL_RANDOM_INGREDIENT_EASY: - ingredient = urand(0, 10); - break; - case SPELL_RANDOM_INGREDIENT_MEDIUM: - ingredient = urand(11, 15); - break; - case SPELL_RANDOM_INGREDIENT_HARD: - ingredient = urand(16, 20); - break; - } - - if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) - { - finklestein->CastSpell(player, FetchIngredients[ingredient][0], true); - finklestein->AI()->Talk(FetchIngredients[ingredient][3], player); - } - } + case SPELL_RANDOM_INGREDIENT_EASY: + ingredient = urand(0, 10); + break; + case SPELL_RANDOM_INGREDIENT_MEDIUM: + ingredient = urand(11, 15); + break; + case SPELL_RANDOM_INGREDIENT_HARD: + ingredient = urand(16, 20); + break; } - void Register() override + if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) { - OnEffectHitTarget += SpellEffectFn(spell_random_ingredient_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + finklestein->CastSpell(player, FetchIngredients[ingredient][0], true); + finklestein->AI()->Talk(FetchIngredients[ingredient][3], player); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_random_ingredient_SpellScript(); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_random_ingredient::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; /*##### @@ -720,137 +634,117 @@ class spell_random_ingredient : public SpellScriptLoader #####*/ // 51046 - Pot Check -class spell_pot_check : public SpellScriptLoader +class spell_pot_check : public SpellScript { - public: spell_pot_check() : SpellScriptLoader("spell_pot_check") { } + PrepareSpellScript(spell_pot_check); - class spell_pot_check_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareSpellScript(spell_pot_check_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_FETCH_KNOTROOT, SPELL_HAVE_KNOTROOT, - SPELL_FETCH_PICKLED_EAGLE_EGG, SPELL_HAVE_PICKLED_EAGLE_EGG, - SPELL_FETCH_SPECKLED_GUANO, SPELL_HAVE_SPECKLED_GUANO, - SPELL_FETCH_WITHERED_BATWING, SPELL_HAVE_WITHERED_BATWING, - SPELL_FETCH_SEASONED_SLIDER_CIDER, SPELL_HAVE_SEASONED_SLIDER_CIDER, - SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH, SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH, - SPELL_FETCH_MUDDY_MIRE_MAGGOT, SPELL_HAVE_MUDDY_MIRE_MAGGOT, - SPELL_FETCH_SPIKY_SPIDER_EGG, SPELL_HAVE_SPIKY_SPIDER_EGG, - SPELL_FETCH_HAIRY_HERRING_HEAD, SPELL_HAVE_HAIRY_HERRING_HEAD, - SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION, SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION, - SPELL_FETCH_ICECROWN_BOTTLED_WATER, SPELL_HAVE_ICECROWN_BOTTLED_WATER, - SPELL_FETCH_WASPS_WINGS, SPELL_HAVE_WASPS_WINGS, - SPELL_FETCH_PRISMATIC_MOJO, SPELL_HAVE_PRISMATIC_MOJO, - SPELL_FETCH_RAPTOR_CLAW, SPELL_HAVE_RAPTOR_CLAW, - SPELL_FETCH_AMBERSEED, SPELL_HAVE_AMBERSEED, - SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW, SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW, - SPELL_FETCH_CHILLED_SERPENT_MUCUS, SPELL_HAVE_CHILLED_SERPENT_MUCUS, - SPELL_FETCH_CRYSTALLIZED_HOGSNOT, SPELL_HAVE_CRYSTALLIZED_HOGSNOT, - SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS, SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS, - SPELL_FETCH_TROLLBANE, SPELL_HAVE_TROLLBANE, - SPELL_FETCH_FROZEN_SPIDER_ICHOR, SPELL_HAVE_FROZEN_SPIDER_ICHOR, - }); - } + SPELL_FETCH_KNOTROOT, SPELL_HAVE_KNOTROOT, + SPELL_FETCH_PICKLED_EAGLE_EGG, SPELL_HAVE_PICKLED_EAGLE_EGG, + SPELL_FETCH_SPECKLED_GUANO, SPELL_HAVE_SPECKLED_GUANO, + SPELL_FETCH_WITHERED_BATWING, SPELL_HAVE_WITHERED_BATWING, + SPELL_FETCH_SEASONED_SLIDER_CIDER, SPELL_HAVE_SEASONED_SLIDER_CIDER, + SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH, SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH, + SPELL_FETCH_MUDDY_MIRE_MAGGOT, SPELL_HAVE_MUDDY_MIRE_MAGGOT, + SPELL_FETCH_SPIKY_SPIDER_EGG, SPELL_HAVE_SPIKY_SPIDER_EGG, + SPELL_FETCH_HAIRY_HERRING_HEAD, SPELL_HAVE_HAIRY_HERRING_HEAD, + SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION, SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION, + SPELL_FETCH_ICECROWN_BOTTLED_WATER, SPELL_HAVE_ICECROWN_BOTTLED_WATER, + SPELL_FETCH_WASPS_WINGS, SPELL_HAVE_WASPS_WINGS, + SPELL_FETCH_PRISMATIC_MOJO, SPELL_HAVE_PRISMATIC_MOJO, + SPELL_FETCH_RAPTOR_CLAW, SPELL_HAVE_RAPTOR_CLAW, + SPELL_FETCH_AMBERSEED, SPELL_HAVE_AMBERSEED, + SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW, SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW, + SPELL_FETCH_CHILLED_SERPENT_MUCUS, SPELL_HAVE_CHILLED_SERPENT_MUCUS, + SPELL_FETCH_CRYSTALLIZED_HOGSNOT, SPELL_HAVE_CRYSTALLIZED_HOGSNOT, + SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS, SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS, + SPELL_FETCH_TROLLBANE, SPELL_HAVE_TROLLBANE, + SPELL_FETCH_FROZEN_SPIDER_ICHOR, SPELL_HAVE_FROZEN_SPIDER_ICHOR, + }); + } - void HandleScriptEffect(SpellEffIndex /* effIndex */) + void HandleScriptEffect(SpellEffIndex /* effIndex */) + { + if (Player* player = GetHitPlayer()) { - if (Player* player = GetHitPlayer()) + for (uint8 i = 0; i < 21; ++i) { - for (uint8 i = 0; i < 21; ++i) + if (player->HasAura(FetchIngredients[i][0])) { - if (player->HasAura(FetchIngredients[i][0])) + player->CastSpell(player, SPELL_THROW_INGREDIENT); + player->RemoveAura(FetchIngredients[i][0]); + if (player->HasAura(FetchIngredients[i][1])) { - player->CastSpell(player, SPELL_THROW_INGREDIENT); - player->RemoveAura(FetchIngredients[i][0]); - if (player->HasAura(FetchIngredients[i][1])) + player->RemoveAura(FetchIngredients[i][1]); + player->DestroyItemCount(FetchIngredients[i][2], 1, true); + if (i < 15) { - player->RemoveAura(FetchIngredients[i][1]); - player->DestroyItemCount(FetchIngredients[i][2], 1, true); - if (i < 15) - { - if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) - finklestein->AI()->SetData(1, 1); - return; - } - else - { - if (player->GetQuestStatus(QUEST_THE_ALCHEMIST_APPRENTICE_DAILY) == QUEST_STATUS_INCOMPLETE) - { - player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); - player->CastSpell(player, SPELL_KILL_CREDIT); - } - } + if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) + finklestein->AI()->SetData(1, 1); + return; } else { - RemoveItems(player); - player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); - if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) - finklestein->AI()->Talk(SAY_RUINED, player); - return; + if (player->GetQuestStatus(QUEST_THE_ALCHEMIST_APPRENTICE_DAILY) == QUEST_STATUS_INCOMPLETE) + { + player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); + player->CastSpell(player, SPELL_KILL_CREDIT); + } } } - } - } - } - - void RemoveItems(Player* player) - { - for (uint8 i = 0; i < 21; ++i) - if (player->HasItemCount(FetchIngredients[i][2], 1, true)) - player->DestroyItemCount(FetchIngredients[i][2], 1, true); + else + { + RemoveItems(player); + player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); + if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) + finklestein->AI()->Talk(SAY_RUINED, player); + return; + } + } + } } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_pot_check_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void RemoveItems(Player* player) + { + for (uint8 i = 0; i < 21; ++i) + if (player->HasItemCount(FetchIngredients[i][2], 1, true)) + player->DestroyItemCount(FetchIngredients[i][2], 1, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_pot_check_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pot_check::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; /*##### # spell_fetch_ingredient_aura #####*/ -class spell_fetch_ingredient_aura : public SpellScriptLoader +class spell_fetch_ingredient_aura : public AuraScript { - public: spell_fetch_ingredient_aura() : SpellScriptLoader("spell_fetch_ingredient_aura") { } - - class spell_fetch_ingredient_aura_AuraScript : public AuraScript - { - PrepareAuraScript(spell_fetch_ingredient_aura_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - if (target->HasAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF)) - if (Creature* finklestein = GetClosestCreatureWithEntry(target, NPC_FINKLESTEIN, 100.0f)) - { - target->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); - finklestein->AI()->Talk(SAY_RUINED, target); - } - } + PrepareAuraScript(spell_fetch_ingredient_aura); - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_fetch_ingredient_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + if (target->HasAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF)) + if (Creature* finklestein = GetClosestCreatureWithEntry(target, NPC_FINKLESTEIN, 100.0f)) + { + target->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); + finklestein->AI()->Talk(SAY_RUINED, target); + } + } - AuraScript* GetAuraScript() const override - { - return new spell_fetch_ingredient_aura_AuraScript(); - } + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_fetch_ingredient_aura::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; enum StormCloud @@ -862,48 +756,37 @@ enum StormCloud RIDE_VEHICLE = 43671 }; -class npc_storm_cloud : public CreatureScript +struct npc_storm_cloud : public ScriptedAI { -public: - npc_storm_cloud() : CreatureScript("npc_storm_cloud") { } + npc_storm_cloud(Creature* creature) : ScriptedAI(creature) { } - struct npc_storm_cloudAI : public ScriptedAI + void Reset() override { - npc_storm_cloudAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - me->CastSpell(me, STORM_VISUAL, true); - } + me->CastSpell(me, STORM_VISUAL, true); + } - void JustAppeared() override - { - Reset(); - } + void JustAppeared() override + { + Reset(); + } - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - Unit* unitCaster = caster->ToUnit(); - if (!unitCaster) - return; + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + { + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; - if (spellInfo->Id != GYMERS_GRAB) - return; + if (spellInfo->Id != GYMERS_GRAB) + return; - if (Vehicle* veh = unitCaster->GetVehicleKit()) + if (Vehicle* veh = unitCaster->GetVehicleKit()) + { + if (veh->GetAvailableSeatCount() != 0) { - if (veh->GetAvailableSeatCount() != 0) - { - me->CastSpell(caster, RIDE_VEHICLE, true); - me->CastSpell(caster, HEALING_WINDS, true); - } + me->CastSpell(caster, RIDE_VEHICLE, true); + me->CastSpell(caster, HEALING_WINDS, true); } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_storm_cloudAI(creature); } }; @@ -1065,17 +948,17 @@ class spell_cocooned_on_quest : public SpellScript void AddSC_zuldrak() { - new npc_drakuru_shackles(); - new npc_captured_rageclaw(); - new npc_released_offspring_harkoa(); - new npc_crusade_recruit(); - new npc_alchemist_finklestein(); - new go_finklesteins_cauldron(); - new spell_random_ingredient_aura(); - new spell_random_ingredient(); - new spell_pot_check(); - new spell_fetch_ingredient_aura(); - new npc_storm_cloud(); + RegisterCreatureAI(npc_drakuru_shackles); + RegisterCreatureAI(npc_captured_rageclaw); + RegisterCreatureAI(npc_released_offspring_harkoa); + RegisterCreatureAI(npc_crusade_recruit); + RegisterCreatureAI(npc_alchemist_finklestein); + RegisterGameObjectAI(go_finklesteins_cauldron); + RegisterSpellScript(spell_random_ingredient_aura); + RegisterSpellScript(spell_random_ingredient); + RegisterSpellScript(spell_pot_check); + RegisterSpellScript(spell_fetch_ingredient_aura); + RegisterCreatureAI(npc_storm_cloud); RegisterSpellScript(spell_scourge_disguise); RegisterSpellScript(spell_scourge_disguise_instability); RegisterSpellScript(spell_scourge_disguise_expiring); |