eluna-scripts-ornfelt/lua/WowEmulationScriptPack/C++/darkmoon.cpp
2024-09-23 07:59:23 +02:00

905 lines
29 KiB
C++

/*================
UWoW.biz
================*/
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
const Position mfPos[22] =
{
// Snarler spawn
{ -3924.37f, 6303.53f, 17.59f, 1.88f },
{ -4011.98f, 6416.34f, 14.75f, 3.73f },
{ -4097.92f, 6458.10f, 14.80f, 3.19f },
{ -4170.17f, 6503.14f, 13.41f, 1.55f },
{ -4266.80f, 6521.71f, 14.39f, 2.68f },
{ -4318.40f, 6601.40f, 9.853f, 1.47f },
{ -4056.26f, 6664.42f, 13.22f, 2.99f },
{ -4009.05f, 6561.04f, 17.15f, 4.37f },
{ -3932.42f, 6584.56f, 12.91f, 3.70f },
{ -3838.57f, 6461.64f, 11.91f, 3.92f },
{ -4268.83f, 6678.51f, 9.731f, 4.84f },
// Dreadhowl spawn
{ -4225.82f, 6556.37f, 14.61f, 5.84f },
{ -4141.07f, 6523.72f, 16.81f, 6.06f },
{ -4073.94f, 6580.90f, 16.70f, 0.27f },
{ -3957.37f, 6617.45f, 12.66f, 0.43f },
{ -3865.21f, 6524.91f, 18.89f, 2.94f },
{ -3872.48f, 6498.26f, 17.90f, 3.39f },
{ -3914.52f, 6398.61f, 13.61f, 4.04f },
{ -4038.38f, 6514.68f, 13.36f, 3.01f },
{ -4344.90f, 6583.72f, 10.64f, 1.75f },
{ -4193.76f, 6122.50f, 13.00f, 6.06f },
{ -4082.68f, 6121.38f, 17.41f, 5.37f }
};
Position const SpawnRingsAT[57] =
{
{ -4278.502f, 6305.27f, 55.3745f },
{ -4387.158f, 6218.971f, 85.1059f },
{ -4384.887f, 6059.405f, 30.4877f },
{ -4464.976f, 6074.34f, 56.51786f },
{ -4416.028f, 6263.413f, 30.60862f },
{ -4411.45f, 6469.171f, 37.86602f },
{ -4417.354f, 6368.175f, 34.5676f },
{ -4061.708f, 6240.754f, 55.67439f },
{ -3976.156f, 6239.41f, 59.68959f },
{ -4298.453f, 6435.71f, 99.74864f },
{ -4000.738f, 6319.748f, 61.96915f },
{ -4123.092f, 6420.391f, 79.5131f },
{ -4200.064f, 6404.912f, 49.83862f },
{ -4153.389f, 6421.354f, 49.73269f },
{ -4177.096f, 6412.299f, 53.74761f },
{ -3994.031f, 6130.03f, 143.9004f },
{ -4152.132f, 6029.343f, 112.4916f },
{ -4276.29f, 6004.999f, 98.62133f },
{ -4327.917f, 6013.772f, 118.3816f },
{ -4282.986f, 6089.893f, 74.05066f },
{ -4204.17f, 6195.492f, 80.76868f },
{ -4127.677f, 6190.193f, 87.08089f },
{ -4125.719f, 6353.675f, 70.76109f },
{ -4219.653f, 6288.33f, 56.897f },
{ -4088.217f, 6675.956f, 53.79656f },
{ -4162.233f, 6763.257f, 25.24334f },
{ -4231.226f, 6586.085f, 93.67531f },
{ -4265.304f, 6513.369f, 93.58659f },
{ -4163.147f, 6539.726f, 78.76099f },
{ -3860.811f, 6494.958f, 97.87495f },
{ -4015.245f, 6472.497f, 85.551f },
{ -3931.849f, 6370.7f, 73.34687f },
{ -3871.005f, 6321.215f, 78.78794f },
{ -3888.948f, 6244.342f, 71.50654f },
{ -4311.99f, 5950.87f, 104.305f },
{ -4237.936f, 5942.774f, 117.577f },
{ -4196.168f, 5890.585f, 127.7626f },
{ -4142.12f, 5947.434f, 119.1986f },
{ -3812.991f, 6369.193f, 118.9729f },
{ -3861.29f, 6380.367f, 55.15146f },
{ -3794.465f, 6427.009f, 69.57449f },
{ -3781.519f, 6438.263f, 61.80006f },
{ -3754.766f, 6475.822f, 64.21665f },
{ -3833.854f, 6670.972f, 60.10976f },
{ -4319.019f, 6655.865f, 24.96414f },
{ -3760.503f, 6175.529f, 123.6823f },
{ -4149.393f, 6684.266f, 31.54233f },
{ -3951.658f, 6719.8f, 37.38012f },
{ -4147.766f, 6777.004f, 32.39946f },
{ -3792.443f, 6895.78f, 26.00098f },
{ -3740.898f, 6846.799f, 56.73854f },
{ -3777.356f, 6723.497f, 24.15144f },
{ -3880.603f, 6715.769f, 22.8216f },
{ -4068.458f, 5933.453f, 115.6255f },
{ -3969.863f, 5989.153f, 113.2228f },
{ -3887.325f, 6097.111f, 116.1136f },
{ -3817.255f, 6127.589f, 126.3984f }
};
Position const FireworksPosition[80] =
{
{ -4544.65f, 6334.98f, 52.1605f, 5.91667f },
{ -4541.89f, 6325.75f, 41.7596f, 5.91667f },
{ -4540.63f, 6364.69f, 44.9669f, 0.0f },
{ -4537.7f, 6400.11f, 36.5094f, 5.96903f },
{ -4534.14f, 6296.77f, 43.5847f, 5.91667f },
{ -4533.17f, 6343.92f, 50.1097f, 0.0f },
{ -4531.12f, 6310.38f, 45.1551f, 0.0f },
{ -4531.03f, 6280.25f, 54.6476f, 0.0f },
{ -4529.45f, 6354.64f, 55.1482f, 0.0f },
{ -4528.64f, 6266.19f, 31.9376f, 5.91667f },
{ -4527.65f, 6332.33f, 40.1272f, 5.07891f },
{ -4526.68f, 6363.64f, 44.7062f, 0.0f },
{ -4525.71f, 6288.72f, 48.1038f, 0.0f },
{ -4525.63f, 6384.03f, 53.5779f, 0.0f },
{ -4524.67f, 6316.6f, 48.7323f, 0.0f },
{ -4520.83f, 6260.86f, 37.8736f, 0.0f },
{ -4520.3f, 6292.53f, 40.4214f, 5.96903f },
{ -4519.77f, 6403.69f, 43.1206f, 5.86431f },
{ -4519.41f, 6272.97f, 51.5572f, 0.0f },
{ -4519.25f, 6348.09f, 52.1605f, 5.91667f },
{ -4517.73f, 6338.35f, 34.5586f, 0.0f },
{ -4516.94f, 6326.41f, 29.2419f, 0.0f },
{ -4514.63f, 6318.62f, 34.7368f, 0.0f },
{ -4503.62f, 6465.65f, 44.3478f, 6.02139f },
{ -4493.34f, 6473.99f, 35.7746f, 5.65487f },
{ -4492.24f, 6465.79f, 31.6434f, 5.98648f },
{ -4488.78f, 6481.73f, 38.9686f, 5.53269f },
{ -4487.85f, 6491.03f, 33.1126f, 5.42798f },
{ -4482.63f, 6500.52f, 37.9616f, 5.95157f },
{ -4477.26f, 6491.57f, 31.0258f, 5.68977f },
{ -4476.76f, 6482.15f, 29.8048f, 5.79449f },
{ -4473.32f, 6507.6f, 30.3042f, 5.89921f },
{ -4472.88f, 6498.33f, 40.7714f, 6.02139f },
{ -4472.76f, 6491.1f, 36.1525f, 5.65487f },
{ -4467.58f, 6508.39f, 45.1855f, 5.86431f },
{ -4467.15f, 6501.41f, 36.9703f, 5.95157f },
{ -4466.62f, 6494.08f, 33.7662f, 5.5676f },
{ -4465.95f, 6512.94f, 39.878f, 5.79449f },
{ -4458.28f, 6506.05f, 35.9752f, 5.21854f },
{ -4333.28f, 6328.26f, 50.6691f, 6.07375f },
{ -4327.08f, 6312.23f, 50.9248f, 0.837758f },
{ -4308.33f, 6299.62f, 50.9248f, 0.0349062f },
{ -4280.79f, 6247.96f, 61.2803f, 0.0f },
{ -4235.35f, 6299.37f, 59.2793f, 0.471238f },
{ -4228.04f, 6366.35f, 48.0665f, 5.21854f },
{ -4224.79f, 6367.33f, 42.3254f, 5.44543f },
{ -4222.59f, 6369.06f, 54.4394f, 4.62512f },
{ -4220.52f, 6290.68f, 56.2118f, 1.51844f },
{ -4199.27f, 6274.16f, 43.235f, 0.261798f },
{ -4197.99f, 6292.5f, 75.3727f, 0.715585f },
{ -4193.09f, 6406.92f, 59.2182f, 5.5676f },
{ -4188.42f, 6410.98f, 63.6761f, 5.5676f },
{ -4181.77f, 6415.56f, 58.8968f, 4.86947f },
{ -4169.41f, 6419.68f, 68.0678f, 5.23599f },
{ -4163.61f, 6270.24f, 62.7918f, 1.20428f },
{ -4158.45f, 6423.26f, 58.8968f, 5.74214f },
{ -4149.61f, 6323.87f, 39.8507f, 1.13446f },
{ -4149.06f, 6321.79f, 37.9468f, 0.575957f },
{ -4147.95f, 6271.83f, 73.3056f, 1.36136f },
{ -4147.95f, 6271.83f, 73.3056f, 1.36136f },
{ -4146.92f, 6406.8f, 67.5933f, 4.99164f },
{ -4146.72f, 6318.32f, 45.121f, 1.13446f },
{ -4146.29f, 6426.08f, 68.8216f, 5.74214f },
{ -4133.4f, 6252.52f, 53.8934f, 1.53589f },
{ -4124.62f, 6405.38f, 61.2377f, 4.71239f },
{ -4116.79f, 6264.26f, 53.8934f, 1.13446f },
{ -4111.1f, 6281.71f, 43.4595f, 0.0f },
{ -4108.68f, 6400.98f, 81.9603f, 4.24115f },
{ -4086.59f, 6247.51f, 68.6752f, 1.95477f },
{ -4085.56f, 6397.07f, 56.9609f, 3.87463f },
{ -4074.21f, 6378.33f, 49.9692f, 3.52557f },
{ -4056.88f, 6282.83f, 54.621f, 0.0f },
{ -4056.38f, 6244.72f, 59.0023f, 1.53589f },
{ -4051.87f, 6361.73f, 74.6655f, 2.26892f },
{ -4050.18f, 6240.66f, 64.5838f, 0.0f },
{ -4049.27f, 6260.36f, 48.8318f, 5.07891f },
{ -4037.0f, 6311.08f, 46.0511f, 5.07891f },
{ -4030.94f, 6270.2f, 50.5471f, 5.91667f },
{ -4029.15f, 6355.71f, 59.4579f, 3.14159f },
{ -4025.65f, 6291.04f, 65.1026f, 0.0f }
};
enum Spells
{
SPELL_DARKMOON_DEATHMATCH_TELE_1 = 108919,
SPELL_DARKMOON_DEATHMATCH_TELE_2 = 113212,
SPELL_DARKMOON_DEATHMATCH_TELE_3 = 113213,
SPELL_DARKMOON_DEATHMATCH_TELE_4 = 113216,
SPELL_DARKMOON_DEATHMATCH_TELE_5 = 113219,
SPELL_DARKMOON_DEATHMATCH_TELE_6 = 113224,
SPELL_DARKMOON_DEATHMATCH_TELE_7 = 113227,
SPELL_DARKMOON_DEATHMATCH_TELE_8 = 113228,
SPELL_RING_TOSS_HIT = 101699,
SPELL_RING_TOSS_MISS = 101697,
SPELL_RING_TOSS_MISS_2 = 101698,
SPELL_LANDING_RESULT_KILL_CREDIT = 100962,
SPELL_BULLSEYE = 62173,
SPELL_GREAT_SHOT = 62175,
SPELL_POOR_SHOT = 62179,
SPELL_CANNONBALL = 62244,
SPELL_TONK_TARGET = 62265,
SPELL_DARKMOON_MAGIC_WINGS = 102116,
SPELL_GOSSIP_CREATE_RIFLE = 101991,
SPELL_INDICATOR = 43313,
SPELL_INDICATOR_QUICK_SHOT = 101010,
SPELL_SUMMON_GNOLL = 102036,
SPELL_SUMMON_GNOLL_BABY = 102043,
SPELL_SUMMON_GNOLL_BONUS = 102044
};
enum Creatures
{
NPC_DUBENKO = 54490,
NPC_TONK_TARGET = 33081,
NPC_DARKMOON_FAIRE_CANNON_TARGET = 33068,
NPC_DARKMOON_FAIRE_CANNON = 15218,
NPC_DARKMOON_FAIRE_TARGET = 24171
};
enum Events
{
EVENT_SHOTEVENT_ACTIVE = 1,
EVENT_SHOTEVENT_PAUSE = 2
};
// 71992 - Moonfang <Darkmoon Den Mother>
class boss_darkmoon_moonfang_mother : public CreatureScript
{
enum eSay
{
SAY_SUMM_SNARLER = 0,
SAY_SUMM_DREADHOWL = 1,
SAY_SUMM_MOTHER = 2
};
enum eCreatures
{
NPC_MOONFANG_SNARLER = 56160,
NPC_MOONFANG_DREADHOWL = 71982
};
enum eSpells
{
SPELL_LEAP_FOR_THE_KILL = 144546,
SPELL_FANGS_OF_THE_MOON = 144700,
SPELL_MOONFANG_TEARS = 144702,
SPELL_CALL_THE_PACK = 144602,
SPELL_MOONFANG_CURSE = 144590
};
public:
boss_darkmoon_moonfang_mother() : CreatureScript("boss_darkmoon_moonfang_mother") {}
struct boss_darkmoon_moonfang_motherAI : public ScriptedAI
{
boss_darkmoon_moonfang_motherAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
me->SetVisible(false);
prevEvent1 = true;
prevEvent2 = false;
sDiedCount = 0;
}
EventMap events;
SummonList summons;
bool prevEvent1;
bool prevEvent2;
uint8 sDiedCount;
void Reset() override
{
events.Reset();
summons.DespawnAll();
if (prevEvent1)
{
SummonMoonfang();
ZoneTalk(SAY_SUMM_SNARLER);
}
}
void SummonMoonfang()
{
if (prevEvent1)
for (uint8 i = 0; i < 11; i++)
me->SummonCreature(NPC_MOONFANG_SNARLER, mfPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
if (prevEvent2)
for (uint8 i = 11; i < 22; i++)
me->SummonCreature(NPC_MOONFANG_DREADHOWL, mfPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
}
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
{
if (prevEvent1 || prevEvent2)
sDiedCount++;
if (sDiedCount == 11)
{
prevEvent1 = false;
prevEvent2 = true;
ZoneTalk(SAY_SUMM_DREADHOWL);
SummonMoonfang();
}
if (sDiedCount == 22)
{
prevEvent2 = false;
me->SetVisible(true);
ZoneTalk(SAY_SUMM_MOTHER);
}
}
void EnterCombat(Unit* /*who*/) override
{
events.ScheduleEvent(EVENT_1, 0); // cast leap
events.ScheduleEvent(EVENT_2, 10000); // cast stuns the target
events.ScheduleEvent(EVENT_3, 8000); // cast tears AOE
events.ScheduleEvent(EVENT_4, 64000); // summon moonfangs
events.ScheduleEvent(EVENT_5, 180000); // cast mind control
}
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && me->isInCombat())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_1:
if (auto target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true))
DoCast(target, SPELL_LEAP_FOR_THE_KILL, false);
events.ScheduleEvent(EVENT_1, 12000);
break;
case EVENT_2:
if (auto target = me->getVictim())
DoCast(target, SPELL_FANGS_OF_THE_MOON, false);
events.ScheduleEvent(EVENT_2, 10000);
break;
case EVENT_3:
DoCast(SPELL_MOONFANG_TEARS);
events.ScheduleEvent(EVENT_3, 22000);
break;
case EVENT_4:
DoCast(SPELL_CALL_THE_PACK);
events.ScheduleEvent(EVENT_4, 64000);
break;
case EVENT_5:
DoCast(SPELL_MOONFANG_CURSE);
events.ScheduleEvent(EVENT_5, 180000);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_darkmoon_moonfang_motherAI(creature);
}
};
// Darkmoon Faire Gnolls - 54444, 54466, 54549
class npc_darkmoon_faire_gnolls : public CreatureScript
{
enum Spells
{
SPELL_WHACK = 102022,
SPELL_GNOLL_KILL_CREDIT = 101835
};
public:
npc_darkmoon_faire_gnolls() : CreatureScript("npc_darkmoon_faire_gnolls") { }
struct npc_darkmoon_faire_gnollsAI : public Scripted_NoMovementAI
{
npc_darkmoon_faire_gnollsAI(Creature* c) : Scripted_NoMovementAI(c)
{
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
EventMap events;
void Reset() override
{
me->DespawnOrUnsummon(3000);
}
void SpellHit(Unit* pCaster, const SpellInfo* Spell) override
{
if (Spell->Id == SPELL_WHACK)
{
DoCast(pCaster, SPELL_GNOLL_KILL_CREDIT);
me->Kill(me);
}
}
};
CreatureAI* GetAI(Creature *creature) const override
{
return new npc_darkmoon_faire_gnollsAI(creature);
}
};
// Darkmoon Faire Gnoll Holder - 54547
struct npc_darkmoon_faire_gnoll_holder : public ScriptedAI
{
npc_darkmoon_faire_gnoll_holder(Creature* creature) : ScriptedAI(creature)
{
me->SetReactState(REACT_PASSIVE);
}
EventMap events;
ObjectGuid owner;
void Reset() override
{
events.ScheduleEvent(EVENT_1, 3000);
}
void IsSummonedBy(Unit* who) override
{
owner = who->GetGUID();
me->AddPlayerInPersonnalVisibilityList(owner);
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_1:
{
std::list<Creature*> creatures;
me->GetCreatureListWithEntryInGrid(creatures, 54546, 40.0f);
if (!creatures.empty())
{
Trinity::Containers::RandomResizeList(creatures, 1);
uint32 Spells[3] =
{
SPELL_SUMMON_GNOLL,
SPELL_SUMMON_GNOLL_BABY,
SPELL_SUMMON_GNOLL_BONUS,
};
uint8 rand = urand(0, 3);
if (auto player = ObjectAccessor::GetPlayer(*me, owner))
if (auto target = creatures.front())
player->CastSpell(target, Spells[rand], true);
}
events.ScheduleEvent(EVENT_1, 2000);
break;
}
}
}
}
};
// Rinling - 14841
struct npc_darkmoon_faire_rinling : public ScriptedAI
{
npc_darkmoon_faire_rinling(Creature* creature) : ScriptedAI(creature)
{
me->SetReactState(REACT_PASSIVE);
}
EventMap events;
void Reset() override
{
events.ScheduleEvent(EVENT_SHOTEVENT_ACTIVE, 3000);
}
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override
{
if (action == 1)
{
player->CastSpell(player, SPELL_GOSSIP_CREATE_RIFLE, true);
player->CLOSE_GOSSIP_MENU();
}
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SHOTEVENT_ACTIVE:
{
std::list<Creature*> creatures;
me->GetCreatureListWithEntryInGrid(creatures, NPC_DARKMOON_FAIRE_TARGET, 15.0f);
if (!creatures.empty())
{
Trinity::Containers::RandomResizeList(creatures, 1);
if (Creature* pTarget = creatures.front())
{
pTarget->CastSpell(pTarget, SPELL_INDICATOR, true);
pTarget->CastSpell(pTarget, SPELL_INDICATOR_QUICK_SHOT, true);
}
}
events.ScheduleEvent(EVENT_SHOTEVENT_PAUSE, 3000);
break;
}
case EVENT_SHOTEVENT_PAUSE:
{
std::list<Creature*> creatures;
me->GetCreatureListWithEntryInGrid(creatures, NPC_DARKMOON_FAIRE_TARGET, 15.0f);
if (!creatures.empty())
for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter)
(*iter)->RemoveAura(SPELL_INDICATOR);
events.ScheduleEvent(EVENT_SHOTEVENT_ACTIVE, 3000);
break;
}
}
}
}
};
class spell_darkmoon_cannon_prep : public AuraScript
{
PrepareAuraScript(spell_darkmoon_cannon_prep);
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
if (Unit* pCaster = GetCaster())
pCaster->SetControlled(true, UNIT_STATE_ROOT);
}
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
if (Unit* pCaster = GetCaster())
{
pCaster->SetControlled(false, UNIT_STATE_ROOT);
if (Creature* CanonTrigger = pCaster->FindNearestCreature(NPC_DARKMOON_FAIRE_CANNON, 30.0f))
CanonTrigger->CastSpell(pCaster, SPELL_DARKMOON_MAGIC_WINGS, true);
}
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_darkmoon_cannon_prep::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_darkmoon_cannon_prep::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
}
};
//62244
class spell_darkmoon_cannonball : public AuraScript
{
PrepareAuraScript(spell_darkmoon_cannonball);
void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
{
Unit* pCaster = GetCaster();
if (!pCaster)
return;
if (pCaster->IsInWater())
if (Creature* CanonTrigger = pCaster->FindNearestCreature(NPC_DARKMOON_FAIRE_CANNON_TARGET, 30.0f))
{
pCaster->CastSpell(pCaster, GetSpellInfo()->Effects[EFFECT_0]->BasePoints, true);
if (pCaster->IsInRange(CanonTrigger, 0.0f, 1.0f))
{
for (uint8 i = 0; i < 5; ++i)
pCaster->CastSpell(pCaster, SPELL_LANDING_RESULT_KILL_CREDIT, true);
pCaster->CastSpell(pCaster, SPELL_BULLSEYE, true);
}
else if (pCaster->IsInRange(CanonTrigger, 1.0f, 4.0f))
{
for (uint8 i = 0; i < 3; ++i)
pCaster->CastSpell(pCaster, SPELL_LANDING_RESULT_KILL_CREDIT, true);
pCaster->CastSpell(pCaster, SPELL_GREAT_SHOT, true);
}
else if (pCaster->IsInRange(CanonTrigger, 4.0f, 15.0f))
{
pCaster->CastSpell(pCaster, SPELL_POOR_SHOT, true);
}
pCaster->RemoveAura(SPELL_CANNONBALL);
}
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_darkmoon_cannonball::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// Cannon - 102292
class spell_darkmoon_faire_cannon : public SpellScript
{
PrepareSpellScript(spell_darkmoon_faire_cannon);
void HandleHitTarget(SpellEffIndex /*effIndex*/)
{
PreventHitDefaultEffect(EFFECT_0);
Unit* caster = GetCaster()->GetOwner();
Unit* target = GetHitUnit()->ToCreature();
if (!caster || !target)
return;
if (target->isAlive() && target->GetEntry() == NPC_TONK_TARGET)
caster->CastSpell(caster, SPELL_TONK_TARGET, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_darkmoon_faire_cannon::HandleHitTarget, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
// Ring Toss - 101695
class spell_darkmoon_ring_toss : public SpellScript
{
PrepareSpellScript(spell_darkmoon_ring_toss);
void HandleHitTarget(SpellEffIndex /*effIndex*/)
{
PreventHitDefaultEffect(EFFECT_0);
Unit* caster = GetCaster();
Unit* target = GetHitUnit()->ToCreature();
if (!caster || !target)
return;
if (target->GetEntry() == NPC_DUBENKO)
{
float distance = target->GetDistance2d(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY());
if (distance < 0.5f)
caster->CastSpell(target, SPELL_RING_TOSS_HIT, true);
else if (distance < 2.0f)
caster->CastSpell(target, SPELL_RING_TOSS_MISS, true);
else if (distance < 4.0f)
caster->CastSpell(target, SPELL_RING_TOSS_MISS_2, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_darkmoon_ring_toss::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
class spell_darkmoon_deathmatch_teleport : public SpellScript
{
PrepareSpellScript(spell_darkmoon_deathmatch_teleport);
void HandleScript(SpellEffIndex effIndex)
{
Player* pTarget = GetHitUnit()->ToPlayer();
if (!pTarget)
return;
uint32 Spells[8] =
{
SPELL_DARKMOON_DEATHMATCH_TELE_1,
SPELL_DARKMOON_DEATHMATCH_TELE_2,
SPELL_DARKMOON_DEATHMATCH_TELE_3,
SPELL_DARKMOON_DEATHMATCH_TELE_4,
SPELL_DARKMOON_DEATHMATCH_TELE_5,
SPELL_DARKMOON_DEATHMATCH_TELE_6,
SPELL_DARKMOON_DEATHMATCH_TELE_7,
SPELL_DARKMOON_DEATHMATCH_TELE_8
};
uint8 rand = urand(0, 8);
pTarget->CastSpell(pTarget, Spells[rand]);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_darkmoon_deathmatch_teleport::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class spell_darkmoon_summon_rings : public SpellScript
{
PrepareSpellScript(spell_darkmoon_summon_rings);
void HandleScript(SpellEffIndex effIndex)
{
Player* caster = GetHitUnit()->ToPlayer();
if (!caster)
return;
for (uint8 i = 0; i < 57; ++i)
caster->CastSpell(SpawnRingsAT[i], 170815, false);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_darkmoon_summon_rings::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
//46668
class spell_darkmoon_carousel_whee : public AuraScript
{
PrepareAuraScript(spell_darkmoon_carousel_whee);
uint32 update;
bool Validate(SpellInfo const* /*spell*/) override
{
update = 0;
return true;
}
void OnUpdate(uint32 diff)
{
update += diff;
if (update >= 5000)
{
Player* _player = GetCaster()->ToPlayer();
if (!_player)
return;
if (_player->IsOnVehicle())
{
if (_player->GetMapId() == 974)
{
if (GameObject* Go = GetClosestGameObjectWithEntry(_player, 216666, 15.0f))
{
if (Aura* aura = GetAura())
{
uint32 currentMaxDuration = aura->GetMaxDuration();
uint32 newMaxDurantion = currentMaxDuration + (5 * MINUTE * IN_MILLISECONDS);
newMaxDurantion = newMaxDurantion <= (60 * MINUTE * IN_MILLISECONDS) ? newMaxDurantion : (60 * MINUTE * IN_MILLISECONDS);
aura->SetMaxDuration(newMaxDurantion);
aura->SetDuration(newMaxDurantion);
}
}
}
}
update = 0;
}
}
void Register() override
{
OnAuraUpdate += AuraUpdateFn(spell_darkmoon_carousel_whee::OnUpdate);
}
};
class spell_dnd_cancel_shapeshift_and_mounts : public AuraScript
{
PrepareAuraScript(spell_dnd_cancel_shapeshift_and_mounts);
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
Unit* caster = GetCaster();
if (!caster)
return;
caster->Dismount();
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_dnd_cancel_shapeshift_and_mounts::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
// 102058
class spell_darkmoon_ring_toss_power : public AuraScript
{
PrepareAuraScript(spell_darkmoon_ring_toss_power);
uint16 timer;
bool Load()
{
timer = 1000;
return true;
}
void OnUpdate(uint32 diff, AuraEffect* /*aurEff*/)
{
Unit* caster = GetCaster();
if (!caster)
return;
uint32 powerAmt = caster->GetPower(POWER_ALTERNATE);
if (timer <= diff)
{
if (powerAmt == 0)
caster->RemoveAura(102058);
timer = 1000;
}
else
timer -= diff;
}
void Register() override
{
OnEffectUpdate += AuraEffectUpdateFn(spell_darkmoon_ring_toss_power::OnUpdate, EFFECT_1, SPELL_AURA_ENABLE_ALT_POWER);
}
};
uint32 RandGo[5] = { 180735, 180725, 180726, 180729, 180733 };
struct npc_trigger_firework_darkmoon : public ScriptedAI
{
npc_trigger_firework_darkmoon(Creature* creature) : ScriptedAI(creature) {}
EventMap events;
void Reset() override
{
events.ScheduleEvent(EVENT_1, urand(1000, 3500));
events.ScheduleEvent(EVENT_2, urand(1200, 3500));
events.ScheduleEvent(EVENT_3, urand(1700, 3500));
events.ScheduleEvent(EVENT_4, urand(1500, 3500));
events.ScheduleEvent(EVENT_5, urand(1000, 3800));
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_1:
me->SummonGameObject(RandGo[urand(0, 4)], FireworksPosition[urand(0, 79)], 0, 0, 0, 0, 0, 1);
events.ScheduleEvent(EVENT_1, urand(2350, 6920));
break;
case EVENT_2:
me->SummonGameObject(RandGo[urand(0, 4)], FireworksPosition[urand(0, 79)], 0, 0, 0, 0, 0, 1);
events.ScheduleEvent(EVENT_2, urand(3100, 5800));
break;
case EVENT_3:
me->SummonGameObject(RandGo[urand(0, 4)], FireworksPosition[urand(0, 79)], 0, 0, 0, 0, 0, 1);
events.ScheduleEvent(EVENT_3, urand(3500, 5100));
break;
case EVENT_4:
me->SummonGameObject(RandGo[urand(0, 4)], FireworksPosition[urand(0, 79)], 0, 0, 0, 0, 0, 1);
events.ScheduleEvent(EVENT_4, urand(3230, 3500));
break;
case EVENT_5:
me->SummonGameObject(RandGo[urand(0, 4)], FireworksPosition[urand(0, 79)], 0, 0, 0, 0, 0, 1);
events.ScheduleEvent(EVENT_5, urand(5150, 6530));
break;
}
}
}
};
void AddSC_darkmoon()
{
new boss_darkmoon_moonfang_mother();
new npc_darkmoon_faire_gnolls();
RegisterCreatureAI(npc_darkmoon_faire_gnoll_holder);
RegisterCreatureAI(npc_darkmoon_faire_rinling);
RegisterAuraScript(spell_darkmoon_cannon_prep);
RegisterAuraScript(spell_darkmoon_cannonball);
RegisterSpellScript(spell_darkmoon_faire_cannon);
RegisterSpellScript(spell_darkmoon_ring_toss);
RegisterSpellScript(spell_darkmoon_deathmatch_teleport);
RegisterSpellScript(spell_darkmoon_summon_rings);
RegisterAuraScript(spell_darkmoon_carousel_whee);
RegisterAuraScript(spell_dnd_cancel_shapeshift_and_mounts);
RegisterAuraScript(spell_darkmoon_ring_toss_power);
RegisterCreatureAI(npc_trigger_firework_darkmoon);
}