aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp1010
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp311
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp631
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp1287
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp904
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp504
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp1486
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp589
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp941
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);