mirror of
https://github.com/ornfelt/azerothcore_lua_scripts
synced 2026-08-22 06:26:03 -04:00
905 lines
29 KiB
C++
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);
|
|
}
|