mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 02:46:33 +01:00
Merge branch 'master' into 4.x
This commit is contained in:
@@ -582,7 +582,7 @@ public:
|
||||
{
|
||||
Unit* pJaina = GetClosestCreatureWithEntry(me, NPC_JAINA, 50.0f);
|
||||
if (!pJaina)
|
||||
pJaina = pJaina = me->SummonCreature(NPC_JAINA, 1895.48f, 1292.66f, 143.706f, 0.023475f, TEMPSUMMON_DEAD_DESPAWN, 180000);
|
||||
pJaina = me->SummonCreature(NPC_JAINA, 1895.48f, 1292.66f, 143.706f, 0.023475f, TEMPSUMMON_DEAD_DESPAWN, 180000);
|
||||
if (pJaina)
|
||||
uiJainaGUID = pJaina->GetGUID();
|
||||
bStepping = false;
|
||||
|
||||
@@ -91,49 +91,50 @@ public:
|
||||
|
||||
struct boss_anub_arakAI : public ScriptedAI
|
||||
{
|
||||
boss_anub_arakAI(Creature* c) : ScriptedAI(c), lSummons(me)
|
||||
boss_anub_arakAI(Creature* creature) : ScriptedAI(creature), Summons(me)
|
||||
{
|
||||
instance = c->GetInstanceScript();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
bool bChanneling;
|
||||
bool bGuardianSummoned;
|
||||
bool bVenomancerSummoned;
|
||||
bool bDatterSummoned;
|
||||
uint8 uiPhase;
|
||||
uint32 uiUndergroundPhase;
|
||||
uint32 uiCarrionBeetlesTimer;
|
||||
uint32 uiLeechingSwarmTimer;
|
||||
uint32 uiPoundTimer;
|
||||
uint32 uiSubmergeTimer;
|
||||
uint32 uiUndergroundTimer;
|
||||
uint32 uiVenomancerTimer;
|
||||
uint32 uiDatterTimer;
|
||||
bool Channeling;
|
||||
bool GuardianSummoned;
|
||||
bool VenomancerSummoned;
|
||||
bool DatterSummoned;
|
||||
uint8 Phase;
|
||||
uint32 UndergroundPhase;
|
||||
uint32 CarrionBeetlesTimer;
|
||||
uint32 LeechingSwarmTimer;
|
||||
uint32 PoundTimer;
|
||||
uint32 SubmergeTimer;
|
||||
uint32 UndergroundTimer;
|
||||
uint32 VenomancerTimer;
|
||||
uint32 DatterTimer;
|
||||
uint32 DelayTimer;
|
||||
|
||||
uint32 uiImpaleTimer;
|
||||
uint32 uiImpalePhase;
|
||||
uint64 uiImpaleTarget;
|
||||
uint32 ImpaleTimer;
|
||||
uint32 ImpalePhase;
|
||||
uint64 ImpaleTarget;
|
||||
|
||||
SummonList lSummons;
|
||||
SummonList Summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiCarrionBeetlesTimer = 8*IN_MILLISECONDS;
|
||||
uiLeechingSwarmTimer = 20*IN_MILLISECONDS;
|
||||
uiImpaleTimer = 9*IN_MILLISECONDS;
|
||||
uiPoundTimer = 15*IN_MILLISECONDS;
|
||||
CarrionBeetlesTimer = 8*IN_MILLISECONDS;
|
||||
LeechingSwarmTimer = 20*IN_MILLISECONDS;
|
||||
ImpaleTimer = 9*IN_MILLISECONDS;
|
||||
PoundTimer = 15*IN_MILLISECONDS;
|
||||
|
||||
uiPhase = PHASE_MELEE;
|
||||
uiUndergroundPhase = 0;
|
||||
bChanneling = false;
|
||||
uiImpalePhase = IMPALE_PHASE_TARGET;
|
||||
Phase = PHASE_MELEE;
|
||||
UndergroundPhase = 0;
|
||||
Channeling = false;
|
||||
ImpalePhase = IMPALE_PHASE_TARGET;
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
|
||||
lSummons.DespawnAll();
|
||||
Summons.DespawnAll();
|
||||
|
||||
if (instance)
|
||||
{
|
||||
@@ -147,13 +148,13 @@ public:
|
||||
Position targetPos;
|
||||
target->GetPosition(&targetPos);
|
||||
|
||||
if (TempSummon* pImpaleTarget = me->SummonCreature(CREATURE_IMPALE_TARGET, targetPos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 6*IN_MILLISECONDS))
|
||||
if (TempSummon* impaleTarget = me->SummonCreature(CREATURE_IMPALE_TARGET, targetPos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 6*IN_MILLISECONDS))
|
||||
{
|
||||
uiImpaleTarget = pImpaleTarget->GetGUID();
|
||||
pImpaleTarget->SetReactState(REACT_PASSIVE);
|
||||
pImpaleTarget->SetDisplayId(DISPLAY_INVISIBLE);
|
||||
pImpaleTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
return pImpaleTarget;
|
||||
ImpaleTarget = impaleTarget->GetGUID();
|
||||
impaleTarget->SetReactState(REACT_PASSIVE);
|
||||
impaleTarget->SetDisplayId(DISPLAY_INVISIBLE);
|
||||
impaleTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
return impaleTarget;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -162,11 +163,15 @@ public:
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
DelayTimer = 0;
|
||||
if (instance)
|
||||
{
|
||||
instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
}
|
||||
|
||||
void DelayEventStart()
|
||||
{
|
||||
if (instance)
|
||||
instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -174,41 +179,45 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
switch (uiPhase)
|
||||
if (DelayTimer && DelayTimer > 5000)
|
||||
DelayEventStart();
|
||||
else DelayTimer+=diff;
|
||||
|
||||
switch (Phase)
|
||||
{
|
||||
case PHASE_UNDERGROUND:
|
||||
if (uiImpaleTimer <= diff)
|
||||
if (ImpaleTimer <= diff)
|
||||
{
|
||||
switch (uiImpalePhase)
|
||||
switch (ImpalePhase)
|
||||
{
|
||||
case IMPALE_PHASE_TARGET:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
if (Creature* pImpaleTarget = DoSummonImpaleTarget(target))
|
||||
pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SHAKEGROUND, true);
|
||||
uiImpaleTimer = 3*IN_MILLISECONDS;
|
||||
uiImpalePhase = IMPALE_PHASE_ATTACK;
|
||||
if (Creature* impaleTarget = DoSummonImpaleTarget(target))
|
||||
impaleTarget->CastSpell(impaleTarget, SPELL_IMPALE_SHAKEGROUND, true);
|
||||
ImpaleTimer = 3*IN_MILLISECONDS;
|
||||
ImpalePhase = IMPALE_PHASE_ATTACK;
|
||||
}
|
||||
break;
|
||||
case IMPALE_PHASE_ATTACK:
|
||||
if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget))
|
||||
if (Creature* impaleTarget = Unit::GetCreature(*me, ImpaleTarget))
|
||||
{
|
||||
pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SPIKE, false);
|
||||
pImpaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND);
|
||||
impaleTarget->CastSpell(impaleTarget, SPELL_IMPALE_SPIKE, false);
|
||||
impaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND);
|
||||
}
|
||||
uiImpalePhase = IMPALE_PHASE_DMG;
|
||||
uiImpaleTimer = 1*IN_MILLISECONDS;
|
||||
ImpalePhase = IMPALE_PHASE_DMG;
|
||||
ImpaleTimer = 1*IN_MILLISECONDS;
|
||||
break;
|
||||
case IMPALE_PHASE_DMG:
|
||||
if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget))
|
||||
me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_IMPALE_DMG, SPELL_IMPALE_DMG_H), true);
|
||||
uiImpalePhase = IMPALE_PHASE_TARGET;
|
||||
uiImpaleTimer = 9*IN_MILLISECONDS;
|
||||
if (Creature* impaleTarget = Unit::GetCreature(*me, ImpaleTarget))
|
||||
me->CastSpell(impaleTarget, DUNGEON_MODE(SPELL_IMPALE_DMG, SPELL_IMPALE_DMG_H), true);
|
||||
ImpalePhase = IMPALE_PHASE_TARGET;
|
||||
ImpaleTimer = 9*IN_MILLISECONDS;
|
||||
break;
|
||||
}
|
||||
} else uiImpaleTimer -= diff;
|
||||
} else ImpaleTimer -= diff;
|
||||
|
||||
if (!bGuardianSummoned)
|
||||
if (!GuardianSummoned)
|
||||
{
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
{
|
||||
@@ -218,14 +227,14 @@ public:
|
||||
DoZoneInCombat(Guardian);
|
||||
}
|
||||
}
|
||||
bGuardianSummoned = true;
|
||||
GuardianSummoned = true;
|
||||
}
|
||||
|
||||
if (!bVenomancerSummoned)
|
||||
if (!VenomancerSummoned)
|
||||
{
|
||||
if (uiVenomancerTimer <= diff)
|
||||
if (VenomancerTimer <= diff)
|
||||
{
|
||||
if (uiUndergroundPhase > 1)
|
||||
if (UndergroundPhase > 1)
|
||||
{
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
{
|
||||
@@ -235,16 +244,16 @@ public:
|
||||
DoZoneInCombat(Venomancer);
|
||||
}
|
||||
}
|
||||
bVenomancerSummoned = true;
|
||||
VenomancerSummoned = true;
|
||||
}
|
||||
} else uiVenomancerTimer -= diff;
|
||||
} else VenomancerTimer -= diff;
|
||||
}
|
||||
|
||||
if (!bDatterSummoned)
|
||||
if (!DatterSummoned)
|
||||
{
|
||||
if (uiDatterTimer <= diff)
|
||||
if (DatterTimer <= diff)
|
||||
{
|
||||
if (uiUndergroundPhase > 2)
|
||||
if (UndergroundPhase > 2)
|
||||
{
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
{
|
||||
@@ -254,71 +263,74 @@ public:
|
||||
DoZoneInCombat(Datter);
|
||||
}
|
||||
}
|
||||
bDatterSummoned = true;
|
||||
DatterSummoned = true;
|
||||
}
|
||||
} else uiDatterTimer -= diff;
|
||||
} else DatterTimer -= diff;
|
||||
|
||||
if(me->HasAura(SPELL_LEECHING_SWARM))
|
||||
me->RemoveAurasDueToSpell(SPELL_LEECHING_SWARM);
|
||||
}
|
||||
|
||||
if (uiUndergroundTimer <= diff)
|
||||
if (UndergroundTimer <= diff)
|
||||
{
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
uiPhase = PHASE_MELEE;
|
||||
} else uiUndergroundTimer -= diff;
|
||||
Phase = PHASE_MELEE;
|
||||
} else UndergroundTimer -= diff;
|
||||
break;
|
||||
|
||||
case PHASE_MELEE:
|
||||
if (((uiUndergroundPhase == 0 && HealthBelowPct(75))
|
||||
|| (uiUndergroundPhase == 1 && HealthBelowPct(50))
|
||||
|| (uiUndergroundPhase == 2 && HealthBelowPct(25)))
|
||||
if (((UndergroundPhase == 0 && HealthBelowPct(75))
|
||||
|| (UndergroundPhase == 1 && HealthBelowPct(50))
|
||||
|| (UndergroundPhase == 2 && HealthBelowPct(25)))
|
||||
&& !me->HasUnitState(UNIT_STAT_CASTING))
|
||||
{
|
||||
bGuardianSummoned = false;
|
||||
bVenomancerSummoned = false;
|
||||
bDatterSummoned = false;
|
||||
GuardianSummoned = false;
|
||||
VenomancerSummoned = false;
|
||||
DatterSummoned = false;
|
||||
|
||||
uiUndergroundTimer = 40*IN_MILLISECONDS;
|
||||
uiVenomancerTimer = 25*IN_MILLISECONDS;
|
||||
uiDatterTimer = 32*IN_MILLISECONDS;
|
||||
UndergroundTimer = 40*IN_MILLISECONDS;
|
||||
VenomancerTimer = 25*IN_MILLISECONDS;
|
||||
DatterTimer = 32*IN_MILLISECONDS;
|
||||
|
||||
uiImpalePhase = 0;
|
||||
uiImpaleTimer = 9*IN_MILLISECONDS;
|
||||
ImpalePhase = 0;
|
||||
ImpaleTimer = 9*IN_MILLISECONDS;
|
||||
|
||||
DoCast(me, SPELL_SUBMERGE, false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
uiPhase = PHASE_UNDERGROUND;
|
||||
++uiUndergroundPhase;
|
||||
Phase = PHASE_UNDERGROUND;
|
||||
++UndergroundPhase;
|
||||
}
|
||||
|
||||
if (bChanneling == true)
|
||||
if (Channeling == true)
|
||||
{
|
||||
for (uint8 i = 0; i < 8; ++i)
|
||||
DoCast(me->getVictim(), SPELL_SUMMON_CARRION_BEETLES, true);
|
||||
bChanneling = false;
|
||||
Channeling = false;
|
||||
}
|
||||
else if (uiCarrionBeetlesTimer <= diff)
|
||||
else if (CarrionBeetlesTimer <= diff)
|
||||
{
|
||||
bChanneling = true;
|
||||
Channeling = true;
|
||||
DoCastVictim(SPELL_CARRION_BEETLES);
|
||||
uiCarrionBeetlesTimer = 25*IN_MILLISECONDS;
|
||||
} else uiCarrionBeetlesTimer -= diff;
|
||||
CarrionBeetlesTimer = 25*IN_MILLISECONDS;
|
||||
} else CarrionBeetlesTimer -= diff;
|
||||
|
||||
if (uiLeechingSwarmTimer <= diff)
|
||||
if (LeechingSwarmTimer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_LEECHING_SWARM, true);
|
||||
uiLeechingSwarmTimer = 19*IN_MILLISECONDS;
|
||||
} else uiLeechingSwarmTimer -= diff;
|
||||
LeechingSwarmTimer = 19*IN_MILLISECONDS;
|
||||
} else LeechingSwarmTimer -= diff;
|
||||
|
||||
if (uiPoundTimer <= diff)
|
||||
if (PoundTimer <= diff)
|
||||
{
|
||||
if (Unit* target = me->getVictim())
|
||||
{
|
||||
if (Creature* pImpaleTarget = DoSummonImpaleTarget(target))
|
||||
me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_POUND, SPELL_POUND_H), false);
|
||||
}
|
||||
uiPoundTimer = 16500;
|
||||
} else uiPoundTimer -= diff;
|
||||
PoundTimer = 16500;
|
||||
} else PoundTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
break;
|
||||
@@ -328,7 +340,7 @@ public:
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
lSummons.DespawnAll();
|
||||
Summons.DespawnAll();
|
||||
if (instance)
|
||||
instance->SetData(DATA_ANUBARAK_EVENT, DONE);
|
||||
}
|
||||
@@ -342,7 +354,7 @@ public:
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
lSummons.Summon(summon);
|
||||
Summons.Summon(summon);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -590,7 +590,7 @@ class boss_freya : public CreatureScript
|
||||
waveCount++;
|
||||
}
|
||||
|
||||
void JustDied(Unit* who)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
//! Freya's chest is dynamically spawned on death by different spells.
|
||||
const uint32 summonSpell[2][4] =
|
||||
|
||||
@@ -303,9 +303,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript
|
||||
|
||||
if (resetcheck_timer <= diff)
|
||||
{
|
||||
uint32 tempx, tempy;
|
||||
tempx = uint32(me->GetPositionX());
|
||||
tempy = uint32(me->GetPositionY());
|
||||
uint32 tempx = uint32(me->GetPositionX());
|
||||
if (tempx > 255 || tempx < 205)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
|
||||
@@ -573,7 +573,7 @@ public:
|
||||
{
|
||||
Talk(SAY_KUR_MORE);
|
||||
|
||||
if (Creature* temp = me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
|
||||
if (me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
|
||||
Talk(SAY_KUR_MORE_TWO);
|
||||
|
||||
me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0]-2.5f, kurenaiAmbushB[1]-2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
|
||||
@@ -47,6 +47,7 @@ go_jotunheim_cage
|
||||
go_table_theka
|
||||
go_soulwell
|
||||
go_bashir_crystalforge
|
||||
go_ethereal_teleport_pad
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
@@ -921,6 +922,32 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## go_ethereal_teleport_pad
|
||||
######*/
|
||||
|
||||
enum eEtherealTeleportPad
|
||||
{
|
||||
NPC_IMAGE_WIND_TRADER = 20518,
|
||||
ITEM_TELEPORTER_POWER_PACK = 28969,
|
||||
};
|
||||
|
||||
class go_ethereal_teleport_pad : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_ethereal_teleport_pad() : GameObjectScript("go_ethereal_teleport_pad") { }
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject* pGO)
|
||||
{
|
||||
if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK, 1))
|
||||
return false;
|
||||
|
||||
pGO->SummonCreature(NPC_IMAGE_WIND_TRADER, pGO->GetPositionX(), pGO->GetPositionY(), pGO->GetPositionZ(), pGO->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## go_soulwell
|
||||
######*/
|
||||
@@ -1282,6 +1309,7 @@ void AddSC_go_scripts()
|
||||
new go_jotunheim_cage;
|
||||
new go_table_theka;
|
||||
new go_inconspicuous_landmark;
|
||||
new go_ethereal_teleport_pad;
|
||||
new go_soulwell;
|
||||
new go_tadpole_cage;
|
||||
new go_dragonflayer_cage;
|
||||
|
||||
@@ -1623,46 +1623,44 @@ public:
|
||||
## npc_winter_reveler
|
||||
####*/
|
||||
|
||||
enum WinterReveler
|
||||
{
|
||||
SPELL_MISTLETOE_DEBUFF = 26218,
|
||||
SPELL_CREATE_MISTLETOE = 26206,
|
||||
SPELL_CREATE_HOLLY = 26207,
|
||||
SPELL_CREATE_SNOWFLAKES = 45036,
|
||||
};
|
||||
|
||||
class npc_winter_reveler : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_winter_reveler() : CreatureScript("npc_winter_reveler") { }
|
||||
public:
|
||||
npc_winter_reveler() : CreatureScript("npc_winter_reveler") { }
|
||||
|
||||
struct npc_winter_revelerAI : public ScriptedAI
|
||||
{
|
||||
npc_winter_revelerAI(Creature* c) : ScriptedAI(c) {}
|
||||
void ReceiveEmote(Player* player, uint32 emote)
|
||||
struct npc_winter_revelerAI : public ScriptedAI
|
||||
{
|
||||
if (!IsHolidayActive(HOLIDAY_FEAST_OF_WINTER_VEIL))
|
||||
return;
|
||||
//TODO: check auralist.
|
||||
if (player->HasAura(26218))
|
||||
return;
|
||||
npc_winter_revelerAI(Creature* c) : ScriptedAI(c) {}
|
||||
|
||||
if (emote == TEXT_EMOTE_KISS)
|
||||
void ReceiveEmote(Player* player, uint32 emote)
|
||||
{
|
||||
me->CastSpell(me, 26218, false);
|
||||
player->CastSpell(player, 26218, false);
|
||||
switch (urand(0, 2))
|
||||
if (player->HasAura(SPELL_MISTLETOE_DEBUFF))
|
||||
return;
|
||||
|
||||
if (!IsHolidayActive(HOLIDAY_FEAST_OF_WINTER_VEIL))
|
||||
return;
|
||||
|
||||
if (emote == TEXT_EMOTE_KISS)
|
||||
{
|
||||
case 0:
|
||||
me->CastSpell(player, 26207, false);
|
||||
break;
|
||||
case 1:
|
||||
me->CastSpell(player, 26206, false);
|
||||
break;
|
||||
case 2:
|
||||
me->CastSpell(player, 45036, false);
|
||||
break;
|
||||
uint32 spellId = RAND<uint32>(SPELL_CREATE_MISTLETOE, SPELL_CREATE_HOLLY, SPELL_CREATE_SNOWFLAKES);
|
||||
me->CastSpell(player, spellId, false);
|
||||
me->CastSpell(player, SPELL_MISTLETOE_DEBUFF, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_winter_revelerAI(creature);
|
||||
}
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_winter_revelerAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*####
|
||||
@@ -1678,8 +1676,6 @@ public:
|
||||
|
||||
#define C_VIPER 19921
|
||||
|
||||
#define RAND 5
|
||||
|
||||
class npc_snake_trap : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -1726,7 +1722,7 @@ public:
|
||||
float attackRadius = me->GetAttackDistance(who);
|
||||
if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
|
||||
{
|
||||
if (!(rand() % RAND))
|
||||
if (!(rand() % 5))
|
||||
{
|
||||
me->setAttackTimer(BASE_ATTACK, (rand() % 10) * 100);
|
||||
SpellTimer = (rand() % 10) * 100;
|
||||
@@ -2163,6 +2159,121 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
# npc_fire_elemental
|
||||
######*/
|
||||
#define SPELL_FIRENOVA 12470
|
||||
#define SPELL_FIRESHIELD 13376
|
||||
#define SPELL_FIREBLAST 57984
|
||||
|
||||
class npc_fire_elemental : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_fire_elemental() : CreatureScript("npc_fire_elemental") { }
|
||||
|
||||
struct npc_fire_elementalAI : public ScriptedAI
|
||||
{
|
||||
npc_fire_elementalAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 FireNova_Timer;
|
||||
uint32 FireShield_Timer;
|
||||
uint32 FireBlast_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
FireNova_Timer = 5000 + rand() % 15000; // 5-20 sec cd
|
||||
FireBlast_Timer = 5000 + rand() % 15000; // 5-20 sec cd
|
||||
FireShield_Timer = 0;
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
if (FireShield_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FIRESHIELD);
|
||||
FireShield_Timer = 2 * IN_MILLISECONDS;
|
||||
}
|
||||
else
|
||||
FireShield_Timer -= diff;
|
||||
|
||||
if (FireBlast_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FIREBLAST);
|
||||
FireBlast_Timer = 5000 + rand() % 15000; // 5-20 sec cd
|
||||
}
|
||||
else
|
||||
FireBlast_Timer -= diff;
|
||||
|
||||
if (FireNova_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FIRENOVA);
|
||||
FireNova_Timer = 5000 + rand() % 15000; // 5-20 sec cd
|
||||
}
|
||||
else
|
||||
FireNova_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI *GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_fire_elementalAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
# npc_earth_elemental
|
||||
######*/
|
||||
#define SPELL_ANGEREDEARTH 36213
|
||||
|
||||
class npc_earth_elemental : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_earth_elemental() : CreatureScript("npc_earth_elemental") { }
|
||||
|
||||
struct npc_earth_elementalAI : public ScriptedAI
|
||||
{
|
||||
npc_earth_elementalAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 AngeredEarth_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
AngeredEarth_Timer = 0;
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (AngeredEarth_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ANGEREDEARTH);
|
||||
AngeredEarth_Timer = 5000 + rand() % 15000; // 5-20 sec cd
|
||||
}
|
||||
else
|
||||
AngeredEarth_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI *GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_earth_elementalAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
# npc_wormhole
|
||||
######*/
|
||||
@@ -2673,5 +2784,7 @@ void AddSC_npcs_special()
|
||||
new npc_locksmith;
|
||||
new npc_tabard_vendor;
|
||||
new npc_experience;
|
||||
new npc_fire_elemental;
|
||||
new npc_earth_elemental;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user