mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-13 01:08:35 +00:00
Merge branch 'azerothcore:master' into Playerbot
This commit is contained in:
5
data/sql/updates/db_world/2022_09_14_00.sql
Normal file
5
data/sql/updates/db_world/2022_09_14_00.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
-- DB update 2022_09_13_03 -> 2022_09_14_00
|
||||
--
|
||||
UPDATE `spell_proc_event` SET `Cooldown`=0 WHERE `entry`=-16256;
|
||||
UPDATE `spell_proc_event` SET `Cooldown`=500 WHERE `entry`=-16257;
|
||||
|
||||
8
data/sql/updates/db_world/2022_09_14_01.sql
Normal file
8
data/sql/updates/db_world/2022_09_14_01.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
-- DB update 2022_09_14_00 -> 2022_09_14_01
|
||||
--
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 12256;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 12256);
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(12256, 0, 0, 1, 8, 0, 100, 512, 19250, 0, 120000, 120000, 0, 33, 12247, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Mark of Detonation - On Spellhit - Kill Credit'),
|
||||
(12256, 0, 1, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 41, 0, 120, 0, 0, 0, 0, 20, 177668, 0, 0, 0, 0, 0, 0, 0, 'Mark of Detonation - On Spellhit - Despawn Mark of Detonation');
|
||||
10
data/sql/updates/db_world/2022_09_14_02.sql
Normal file
10
data/sql/updates/db_world/2022_09_14_02.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
-- DB update 2022_09_14_01 -> 2022_09_14_02
|
||||
--
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_obsidian_eradicator', `AiName`='' WHERE `entry`=15262;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=15262 AND `source_type`=0;
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=25671;
|
||||
INSERT INTO `spell_script_names` VALUES
|
||||
(25671,'spell_drain_mana');
|
||||
|
||||
UPDATE `creature_template` SET `unit_flags2`=0 WHERE `entry`=15262;
|
||||
9
data/sql/updates/db_world/2022_09_14_03.sql
Normal file
9
data/sql/updates/db_world/2022_09_14_03.sql
Normal file
@@ -0,0 +1,9 @@
|
||||
-- DB update 2022_09_14_02 -> 2022_09_14_03
|
||||
--
|
||||
DELETE FROM `creature_queststarter` WHERE `id` = 15738 AND `quest` = 8815;
|
||||
INSERT INTO `creature_queststarter` (`id`, `quest`) VALUES
|
||||
(15738, 8815);
|
||||
|
||||
DELETE FROM `creature_questender` WHERE `id` = 15378 AND `quest` = 8832;
|
||||
INSERT INTO `creature_questender` (`id`, `quest`) VALUES
|
||||
(15738, 8815);
|
||||
4
data/sql/updates/db_world/2022_09_14_04.sql
Normal file
4
data/sql/updates/db_world/2022_09_14_04.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
-- DB update 2022_09_14_03 -> 2022_09_14_04
|
||||
--
|
||||
UPDATE `creature_template` SET `AiName`='', `ScriptName`='npc_anubisath_warder' WHERE `entry`=15311;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=15311 AND `source_type`=0;
|
||||
3
data/sql/updates/db_world/2022_09_14_05.sql
Normal file
3
data/sql/updates/db_world/2022_09_14_05.sql
Normal file
@@ -0,0 +1,3 @@
|
||||
-- DB update 2022_09_14_04 -> 2022_09_14_05
|
||||
--
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_vekniss_stinger' WHERE `entry`=15235;
|
||||
17
data/sql/updates/db_world/2022_09_15_00.sql
Normal file
17
data/sql/updates/db_world/2022_09_15_00.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
-- DB update 2022_09_14_05 -> 2022_09_15_00
|
||||
-- Pathing for Razorspine Entry: 23841
|
||||
SET @NPC := 39309;
|
||||
SET @PATH := @NPC * 10;
|
||||
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-2667.589,`position_y`=-4017.5479,`position_z`=1.7994823 WHERE `guid`=@NPC;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-2667.589,-4017.5479,1.7994823,NULL,0,0,0,100,0),
|
||||
(@PATH,2,-2682.1023,-4013.1038,7.623457,NULL,0,0,0,100,0),
|
||||
(@PATH,3,-2701.14,-4009.6328,17.22806,NULL,0,0,0,100,0),
|
||||
(@PATH,4,-2722.923,-4008.8137,29.876986,NULL,0,0,0,100,0),
|
||||
(@PATH,5,-2737.096,-4004.9934,33.11826,NULL,0,0,0,100,0),
|
||||
(@PATH,6,-2722.923,-4008.8137,29.876986,NULL,0,0,0,100,0),
|
||||
(@PATH,7,-2701.14,-4009.6328,17.22806,NULL,0,0,0,100,0),
|
||||
(@PATH,8,-2682.1023,-4013.1038,7.623457,NULL,0,0,0,100,0);
|
||||
@@ -8348,7 +8348,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
|
||||
|
||||
// Used in case when access to whole aura is needed
|
||||
// All procs should be handled like this...
|
||||
bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* /*procSpell*/, uint32 /*procFlag*/, uint32 procEx, uint32 /*cooldown*/, bool* handled)
|
||||
bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* /*procSpell*/, uint32 /*procFlag*/, uint32 procEx, uint32 cooldown, bool* handled)
|
||||
{
|
||||
SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
|
||||
|
||||
@@ -8521,6 +8521,24 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_SHAMAN:
|
||||
{
|
||||
// Flurry
|
||||
if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
|
||||
{
|
||||
if (cooldown)
|
||||
{
|
||||
if (HasSpellCooldown(dummySpell->Id))
|
||||
{
|
||||
*handled = true;
|
||||
break;
|
||||
}
|
||||
|
||||
AddSpellCooldown(dummySpell->Id, 0, cooldown);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1549,7 +1549,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
|
||||
// collision occured
|
||||
if (col || dcol || (overdistance > 0.0f && !map->IsInWater(phasemask, tstX, tstY, ground, collisionHeight)) || (fabs(prevZ - tstZ) > maxtravelDistZ && (tstZ > prevZ)))
|
||||
{
|
||||
if ((overdistance > 0.0f) && (overdistance < step))
|
||||
if ((overdistance > 0.0f) && (overdistance < 1.f))
|
||||
{
|
||||
destx = prevX + overdistance * cos(pos.GetOrientation());
|
||||
desty = prevY + overdistance * sin(pos.GetOrientation());
|
||||
@@ -1592,7 +1592,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
|
||||
}
|
||||
//}
|
||||
|
||||
lastpos.Relocate(destx, desty, destz + 0.5f, pos.GetOrientation());
|
||||
lastpos.Relocate(destx, desty, destz, pos.GetOrientation());
|
||||
dest = SpellDestination(lastpos);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -34,7 +34,8 @@ enum Spells
|
||||
SPELL_EARTH_SHOCK = 26194,
|
||||
SPELL_TRUE_FULFILLMENT = 785,
|
||||
SPELL_INITIALIZE_IMAGE = 3730,
|
||||
SPELL_SUMMON_IMAGES = 747
|
||||
SPELL_SUMMON_IMAGES = 747,
|
||||
SPELL_BIRTH = 34115
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -42,7 +43,9 @@ enum Events
|
||||
EVENT_ARCANE_EXPLOSION = 1,
|
||||
EVENT_FULLFILMENT = 2,
|
||||
EVENT_BLINK = 3,
|
||||
EVENT_EARTH_SHOCK = 4
|
||||
EVENT_EARTH_SHOCK = 4,
|
||||
EVENT_TELEPORT = 5,
|
||||
EVENT_INIT_IMAGE = 6
|
||||
};
|
||||
|
||||
uint32 const BlinkSpells[3] = { 4801, 8195, 20449 };
|
||||
@@ -56,7 +59,9 @@ struct boss_skeram : public BossAI
|
||||
_Reset();
|
||||
_flag = 0;
|
||||
_hpct = 75.0f;
|
||||
me->SetVisible(true);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetImmuneToAll(false);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
@@ -72,6 +77,29 @@ struct boss_skeram : public BossAI
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* creature) override
|
||||
{
|
||||
BossAI::JustSummoned(creature);
|
||||
|
||||
float ImageHealthPct = 0.f;
|
||||
if (me->GetHealthPct() < 25.0f)
|
||||
ImageHealthPct = 0.50f;
|
||||
else if (me->GetHealthPct() < 50.0f)
|
||||
ImageHealthPct = 0.20f;
|
||||
else
|
||||
ImageHealthPct = 0.10f;
|
||||
|
||||
creature->SetMaxHealth(me->GetMaxHealth() * ImageHealthPct);
|
||||
creature->SetHealth(creature->GetMaxHealth() * (me->GetHealthPct() / 100.0f));
|
||||
|
||||
creature->CastSpell(creature, SPELL_BIRTH, true);
|
||||
creature->SetControlled(true, UNIT_STATE_ROOT);
|
||||
creature->SetReactState(REACT_PASSIVE);
|
||||
creature->SetImmuneToAll(true);
|
||||
|
||||
_copiesGUIDs.push_back(creature->GetGUID());
|
||||
}
|
||||
|
||||
void DoTeleport(Creature* creature)
|
||||
{
|
||||
// Shift the boss and images (Get it? *Shift*?)
|
||||
uint8 rand = 0;
|
||||
@@ -86,24 +114,18 @@ struct boss_skeram : public BossAI
|
||||
|
||||
while (_flag & (1 << rand))
|
||||
rand = urand(0, 2);
|
||||
creature->CastSpell(creature, BlinkSpells[rand]);
|
||||
|
||||
creature->SetReactState(REACT_AGGRESSIVE);
|
||||
creature->SetImmuneToAll(false);
|
||||
creature->SetControlled(false, UNIT_STATE_ROOT);
|
||||
creature->CastSpell(creature, BlinkSpells[rand], true);
|
||||
|
||||
_flag |= (1 << rand);
|
||||
|
||||
if (_flag & (1 << 7))
|
||||
_flag = 0;
|
||||
|
||||
float ImageHealthPct;
|
||||
|
||||
if (me->GetHealthPct() < 25.0f)
|
||||
ImageHealthPct = 0.50f;
|
||||
else if (me->GetHealthPct() < 50.0f)
|
||||
ImageHealthPct = 0.20f;
|
||||
else
|
||||
ImageHealthPct = 0.10f;
|
||||
|
||||
creature->SetMaxHealth(me->GetMaxHealth() * ImageHealthPct);
|
||||
creature->SetHealth(creature->GetMaxHealth() * (me->GetHealthPct() / 100.0f));
|
||||
BossAI::JustSummoned(creature);
|
||||
events.ScheduleEvent(EVENT_INIT_IMAGE, 400ms);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
@@ -129,7 +151,10 @@ struct boss_skeram : public BossAI
|
||||
events.ScheduleEvent(EVENT_BLINK, 30s, 45s);
|
||||
events.ScheduleEvent(EVENT_EARTH_SHOCK, 1200ms);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
if (!me->IsSummon())
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -154,23 +179,42 @@ struct boss_skeram : public BossAI
|
||||
case EVENT_BLINK:
|
||||
DoCast(me, BlinkSpells[urand(0, 2)]);
|
||||
DoResetThreat();
|
||||
me->SetVisible(true);
|
||||
events.ScheduleEvent(EVENT_BLINK, 10s, 30s);
|
||||
break;
|
||||
case EVENT_EARTH_SHOCK:
|
||||
DoCastVictim(SPELL_EARTH_SHOCK);
|
||||
events.ScheduleEvent(EVENT_EARTH_SHOCK, 1200ms);
|
||||
break;
|
||||
case EVENT_TELEPORT:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetImmuneToAll(false);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
for (ObjectGuid const& guid : _copiesGUIDs)
|
||||
{
|
||||
if (Creature* image = ObjectAccessor::GetCreature(*me, guid))
|
||||
{
|
||||
DoTeleport(image);
|
||||
}
|
||||
}
|
||||
DoResetThreat();
|
||||
events.RescheduleEvent(EVENT_BLINK, 10s, 30s);
|
||||
break;
|
||||
case EVENT_INIT_IMAGE:
|
||||
me->CastSpell(me, SPELL_INITIALIZE_IMAGE, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!me->IsSummon() && me->GetHealthPct() < _hpct)
|
||||
{
|
||||
_copiesGUIDs.clear();
|
||||
DoCast(me, SPELL_SUMMON_IMAGES, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetImmuneToAll(true);
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
Talk(SAY_SPLIT);
|
||||
_hpct -= 25.0f;
|
||||
me->SetVisible(false);
|
||||
events.RescheduleEvent(EVENT_BLINK, 2s);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 2s);
|
||||
}
|
||||
|
||||
if (Unit* myVictim = me->GetVictim())
|
||||
@@ -193,6 +237,7 @@ struct boss_skeram : public BossAI
|
||||
private:
|
||||
float _hpct;
|
||||
uint8 _flag;
|
||||
GuidVector _copiesGUIDs;
|
||||
};
|
||||
|
||||
class spell_skeram_arcane_explosion : public SpellScript
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "MapReference.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
@@ -23,22 +25,36 @@
|
||||
|
||||
enum Spells
|
||||
{
|
||||
// Anubisath Defender
|
||||
SPELL_SHADOW_FROST_REFLECT = 19595,
|
||||
SPELL_FIRE_ARCANE_REFLECT = 13022,
|
||||
SPELL_METEOR = 26558,
|
||||
SPELL_PLAGUE = 26556,
|
||||
SPELL_SHADOW_STORM = 26555,
|
||||
SPELL_THUNDERCLAP = 26554,
|
||||
|
||||
SPELL_ENRAGE = 14204,
|
||||
SPELL_EXPLODE = 25699,
|
||||
|
||||
SPELL_SUMMON_WARRIOR = 17431,
|
||||
SPELL_SUMMON_SWARMGUARD = 17430,
|
||||
|
||||
SPELL_FEAR = 26070,
|
||||
SPELL_ENTAGLING_ROOTS = 26071,
|
||||
SPELL_SILENCE = 26069,
|
||||
SPELL_DUST_CLOUD = 26072,
|
||||
SPELL_FIRE_NOVA = 26073,
|
||||
|
||||
SPELL_SUMMON_LARGE_OBSIDIAN_CHUNK = 27630, // Server-side
|
||||
|
||||
TALK_ENRAGE = 0
|
||||
SPELL_SHOCK_BLAST = 26458,
|
||||
SPELL_DRAIN_MANA = 25671,
|
||||
SPELL_DRAIN_MANA_VISUAL = 26639,
|
||||
|
||||
TALK_ENRAGE = 0,
|
||||
|
||||
// Vekniss Stinger
|
||||
SPELL_VEKNISS_CATALYST = 26078,
|
||||
SPELL_STINGER_CHARGE_NORMAL = 26081,
|
||||
SPELL_STINGER_CHARGE_BUFFED = 26082,
|
||||
};
|
||||
|
||||
struct npc_anubisath_defender : public ScriptedAI
|
||||
@@ -151,6 +167,59 @@ private:
|
||||
bool _enraged;
|
||||
};
|
||||
|
||||
struct npc_vekniss_stinger : public ScriptedAI
|
||||
{
|
||||
npc_vekniss_stinger(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_scheduler.CancelAll();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who) override
|
||||
{
|
||||
DoCast(who ,who->HasAura(SPELL_VEKNISS_CATALYST) ? SPELL_STINGER_CHARGE_BUFFED : SPELL_STINGER_CHARGE_NORMAL, true);
|
||||
|
||||
_scheduler.Schedule(6s, [this](TaskContext context)
|
||||
{
|
||||
Unit* target = SelectTarget(SelectTargetMethod::Random, 0, [&](Unit* u)
|
||||
{
|
||||
return u && !u->IsPet() && u->IsWithinDist2d(me, 20.f) && u->HasAura(SPELL_VEKNISS_CATALYST);
|
||||
});
|
||||
if (!target)
|
||||
{
|
||||
target = SelectTarget(SelectTargetMethod::Random, 0, [&](Unit* u)
|
||||
{
|
||||
return u && !u->IsPet() && u->IsWithinDist2d(me, 20.f);
|
||||
});
|
||||
}
|
||||
|
||||
if (target)
|
||||
{
|
||||
DoCast(target, target->HasAura(SPELL_VEKNISS_CATALYST) ? SPELL_STINGER_CHARGE_BUFFED : SPELL_STINGER_CHARGE_NORMAL, true);
|
||||
}
|
||||
|
||||
context.Repeat(6s);
|
||||
});
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_scheduler.Update(diff,
|
||||
std::bind(&ScriptedAI::DoMeleeAttackIfReady, this));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskScheduler _scheduler;
|
||||
};
|
||||
|
||||
enum NPCs
|
||||
{
|
||||
NPC_VEKNISS_DRONE = 15300
|
||||
@@ -183,8 +252,166 @@ class spell_aggro_drones : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
struct npc_obsidian_eradicator : public ScriptedAI
|
||||
{
|
||||
npc_obsidian_eradicator(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_scheduler.CancelAll();
|
||||
me->SetPower(POWER_MANA, 0);
|
||||
_targets.clear();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_scheduler.Schedule(3500ms, [this](TaskContext context)
|
||||
{
|
||||
if (_targets.empty())
|
||||
{
|
||||
Map::PlayerList const& players = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if (Player* player = itr->GetSource())
|
||||
{
|
||||
if (player->IsAlive() && !player->IsGameMaster() && !player->IsSpectator() && player->GetPower(POWER_MANA) > 0)
|
||||
{
|
||||
_targets.push_back(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Acore::Containers::RandomResize(_targets, 10);
|
||||
}
|
||||
|
||||
for (Unit* target : _targets)
|
||||
{
|
||||
DoCast(target, SPELL_DRAIN_MANA, true);
|
||||
}
|
||||
|
||||
if (me->GetPowerPct(POWER_MANA) >= 100.f)
|
||||
{
|
||||
DoCastAOE(SPELL_SHOCK_BLAST, true);
|
||||
}
|
||||
|
||||
context.Repeat(3500ms);
|
||||
});
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_scheduler.Update(diff,
|
||||
std::bind(&ScriptedAI::DoMeleeAttackIfReady, this));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskScheduler _scheduler;
|
||||
std::list<Player*> _targets;
|
||||
};
|
||||
|
||||
class spell_drain_mana : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_drain_mana);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
target->CastSpell(caster, SPELL_DRAIN_MANA_VISUAL, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_drain_mana::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
struct npc_anubisath_warder : public ScriptedAI
|
||||
{
|
||||
npc_anubisath_warder(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_scheduler.CancelAll();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
if (urand(0, 1))
|
||||
{
|
||||
_scheduler.Schedule(5s, 5s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_FEAR, true);
|
||||
context.Repeat(20s, 20s);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
_scheduler.Schedule(5s, 5s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_ENTAGLING_ROOTS, true);
|
||||
context.Repeat(20s, 20s);
|
||||
});
|
||||
}
|
||||
|
||||
if (urand(0, 1))
|
||||
{
|
||||
_scheduler.Schedule(4s, 4s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_SILENCE, true);
|
||||
context.Repeat(15s, 15s);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
_scheduler.Schedule(4s, 4s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_DUST_CLOUD, true);
|
||||
context.Repeat(15s, 15s);
|
||||
});
|
||||
}
|
||||
|
||||
_scheduler.Schedule(2s, 2s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_FIRE_NOVA, true);
|
||||
context.Repeat(8s, 15s);
|
||||
});
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_scheduler.Update(diff,
|
||||
std::bind(&ScriptedAI::DoMeleeAttackIfReady, this));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskScheduler _scheduler;
|
||||
};
|
||||
|
||||
void AddSC_temple_of_ahnqiraj()
|
||||
{
|
||||
RegisterTempleOfAhnQirajCreatureAI(npc_anubisath_defender);
|
||||
RegisterTempleOfAhnQirajCreatureAI(npc_vekniss_stinger);
|
||||
RegisterSpellScript(spell_aggro_drones);
|
||||
RegisterTempleOfAhnQirajCreatureAI(npc_obsidian_eradicator);
|
||||
RegisterSpellScript(spell_drain_mana);
|
||||
RegisterTempleOfAhnQirajCreatureAI(npc_anubisath_warder);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user