437fe2d8fd
Port From (https://github.com/TrinityCore/TrinityCore/commit/605e5f94c0d71cad8e83fa5a07eaec4e6bed9cc3)
1043 lines
32 KiB
C#
1043 lines
32 KiB
C#
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
|
|
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
|
|
|
using Framework.Constants;
|
|
using Framework.Dynamic;
|
|
using Game.AI;
|
|
using Game.Entities;
|
|
using Game.Maps;
|
|
using Game.Scripting;
|
|
using Game.Spells;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Scripts.EasternKingdoms.MagistersTerrace.PriestessDelrissa
|
|
{
|
|
struct TextIds
|
|
{
|
|
public const uint SayAggro = 0;
|
|
public const uint SayDeath = 10;
|
|
}
|
|
|
|
struct SpellIds
|
|
{
|
|
public const uint DispelMagic = 27609;
|
|
public const uint FlashHeal = 17843;
|
|
public const uint SwPainNormal = 14032;
|
|
public const uint SwPainHeroic = 15654;
|
|
public const uint Shield = 44291;
|
|
public const uint RenewNormal = 44174;
|
|
public const uint RenewHeroic = 46192;
|
|
|
|
// Apoko
|
|
public const uint WindfuryTotem = 27621;
|
|
public const uint WarStomp = 46026;
|
|
public const uint Purge = 27626;
|
|
public const uint LesserHealingWave = 44256;
|
|
public const uint FrostShock = 21401;
|
|
public const uint FireNovaTotem = 44257;
|
|
public const uint EarthbindTotem = 15786;
|
|
|
|
public const uint HealingPotion = 15503;
|
|
|
|
// RogueSpells
|
|
public const uint KidneyShot = 27615;
|
|
public const uint Gouge = 12540;
|
|
public const uint Kick = 27613;
|
|
public const uint Vanish = 44290;
|
|
public const uint Backstab = 15657;
|
|
public const uint Eviscerate = 27611;
|
|
|
|
// WarlockSpells
|
|
public const uint Immolate = 44267;
|
|
public const uint ShadowBolt = 12471;
|
|
public const uint SeedOfCorruption = 44141;
|
|
public const uint CurseOfAgony = 14875;
|
|
public const uint Fear = 38595;
|
|
public const uint ImpFireball = 44164;
|
|
public const uint SummonImp = 44163;
|
|
|
|
// KickDown
|
|
public const uint Knockdown = 11428;
|
|
public const uint SnapKick = 46182;
|
|
|
|
// MageSpells
|
|
public const uint Polymorph = 13323;
|
|
public const uint IceBlock = 27619;
|
|
public const uint Blizzard = 44178;
|
|
public const uint IceLance = 46194;
|
|
public const uint ConeOfCold = 38384;
|
|
public const uint Frostbolt = 15043;
|
|
public const uint Blink = 14514;
|
|
|
|
// WarriorSpells
|
|
public const uint InterceptStun = 27577;
|
|
public const uint Disarm = 27581;
|
|
public const uint PiercingHowl = 23600;
|
|
public const uint FrighteningShout = 19134;
|
|
public const uint Hamstring = 27584;
|
|
public const uint BattleShout = 27578;
|
|
public const uint MortalStrike = 44268;
|
|
|
|
// HunterSpells
|
|
public const uint AimedShot = 44271;
|
|
public const uint Shoot = 15620;
|
|
public const uint ConcussiveShot = 27634;
|
|
public const uint MultiShot = 31942;
|
|
public const uint WingClip = 44286;
|
|
public const uint FreezingTrap = 44136;
|
|
|
|
// EngineerSpells
|
|
public const uint GoblinDragonGun = 44272;
|
|
public const uint RocketLaunch = 44137;
|
|
public const uint Recombobulate = 44274;
|
|
public const uint HighExplosiveSheep = 44276;
|
|
public const uint FelIronBomb = 46024;
|
|
public const uint SheepExplosion = 44279;
|
|
}
|
|
|
|
struct CreatureIds
|
|
{
|
|
public const uint Sliver = 24552;
|
|
}
|
|
|
|
struct MiscConst
|
|
{
|
|
public const uint MaxActiveLackey = 4;
|
|
|
|
public const float fOrientation = 4.98f;
|
|
public const float fZLocation = -19.921f;
|
|
|
|
public static float[][] LackeyLocations =
|
|
{
|
|
new float[] {123.77f, 17.6007f},
|
|
new float[] {131.731f, 15.0827f},
|
|
new float[] {121.563f, 15.6213f},
|
|
new float[] {129.988f, 17.2355f},
|
|
};
|
|
|
|
public static uint[] m_auiAddEntries =
|
|
{
|
|
24557, //Kagani Nightstrike
|
|
24558, //Elris Duskhallow
|
|
24554, //Eramas Brightblaze
|
|
24561, //Yazzaj
|
|
24559, //Warlord Salaris
|
|
24555, //Garaxxas
|
|
24553, //Apoko
|
|
24556, //Zelfan
|
|
};
|
|
|
|
public static uint[] LackeyDeath = { 1, 2, 3, 4, };
|
|
|
|
public static uint[] PlayerDeath = { 5, 6, 7, 8, 9, };
|
|
}
|
|
|
|
[Script]
|
|
class boss_priestess_delrissa : BossAI
|
|
{
|
|
List<uint> LackeyEntryList = new();
|
|
public ObjectGuid[] m_auiLackeyGUID = new ObjectGuid[MiscConst.MaxActiveLackey];
|
|
|
|
byte PlayersKilled;
|
|
|
|
public boss_priestess_delrissa(Creature creature) : base(creature, DataTypes.PriestessDelrissa)
|
|
{
|
|
Initialize();
|
|
LackeyEntryList.Clear();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
PlayersKilled = 0;
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(15), task =>
|
|
{
|
|
ulong health = me.GetHealth();
|
|
Unit target = me;
|
|
for (byte i = 0; i < m_auiLackeyGUID.Length; ++i)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, m_auiLackeyGUID[i]);
|
|
if (pAdd != null && pAdd.IsAlive() && pAdd.GetHealth() < health)
|
|
target = pAdd;
|
|
}
|
|
|
|
DoCast(target, SpellIds.FlashHeal);
|
|
task.Repeat();
|
|
});
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
Unit target = me;
|
|
|
|
if (RandomHelper.URand(0, 1) != 0)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, m_auiLackeyGUID[RandomHelper.Rand32() % m_auiLackeyGUID.Length]);
|
|
if (pAdd != null && pAdd.IsAlive())
|
|
target = pAdd;
|
|
}
|
|
|
|
DoCast(target, SpellIds.RenewNormal);
|
|
task.Repeat(TimeSpan.FromSeconds(5));
|
|
});
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(2), task =>
|
|
{
|
|
Unit target = me;
|
|
|
|
if (RandomHelper.URand(0, 1) != 0)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, m_auiLackeyGUID[RandomHelper.Rand32() % m_auiLackeyGUID.Length]);
|
|
if (pAdd != null && pAdd.IsAlive() && !pAdd.HasAura(SpellIds.Shield))
|
|
target = pAdd;
|
|
}
|
|
|
|
DoCast(target, SpellIds.Shield);
|
|
task.Repeat(TimeSpan.FromSeconds(7.5));
|
|
});
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(5), task =>
|
|
{
|
|
Unit target = SelectTarget(SelectTargetMethod.Random, 0, 100, true);
|
|
if (target != null)
|
|
DoCast(target, SpellIds.SwPainNormal);
|
|
|
|
task.Repeat(TimeSpan.FromSeconds(10));
|
|
});
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(7.5), task =>
|
|
{
|
|
Unit target = null;
|
|
|
|
if (RandomHelper.URand(0, 1) != 0)
|
|
target = SelectTarget(SelectTargetMethod.Random, 0, 100, true);
|
|
else
|
|
{
|
|
if (RandomHelper.URand(0, 1) != 0)
|
|
target = me;
|
|
else
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, m_auiLackeyGUID[RandomHelper.Rand32() % m_auiLackeyGUID.Length]);
|
|
if (pAdd != null && pAdd.IsAlive())
|
|
target = pAdd;
|
|
}
|
|
}
|
|
|
|
if (target != null)
|
|
DoCast(target, SpellIds.DispelMagic);
|
|
|
|
task.Repeat(TimeSpan.FromSeconds(12));
|
|
});
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(5), task =>
|
|
{
|
|
me.GetHomePosition(out _, out _, out float z, out _);
|
|
if (me.GetPositionZ() >= z + 10)
|
|
{
|
|
EnterEvadeMode();
|
|
return;
|
|
}
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
InitializeLackeys();
|
|
}
|
|
|
|
//this mean she at some point evaded
|
|
public override void JustReachedHome()
|
|
{
|
|
instance.SetBossState(DataTypes.PriestessDelrissa, EncounterState.Fail);
|
|
}
|
|
|
|
public override void JustEngagedWith(Unit who)
|
|
{
|
|
Talk(TextIds.SayAggro);
|
|
|
|
foreach (var lackeyGuid in m_auiLackeyGUID)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, lackeyGuid);
|
|
if (pAdd != null && !pAdd.IsEngaged())
|
|
AddThreat(who, 0.0f, pAdd);
|
|
}
|
|
|
|
instance.SetBossState(DataTypes.PriestessDelrissa, EncounterState.InProgress);
|
|
}
|
|
|
|
void InitializeLackeys()
|
|
{
|
|
//can be called if Creature are dead, so avoid
|
|
if (!me.IsAlive())
|
|
return;
|
|
|
|
byte j = 0;
|
|
|
|
//it's empty, so first time
|
|
if (LackeyEntryList.Empty())
|
|
{
|
|
//fill vector array with entries from Creature array
|
|
for (byte i = 0; i < LackeyEntryList.Count; ++i)
|
|
LackeyEntryList[i] = MiscConst.m_auiAddEntries[i];
|
|
|
|
//remove random entries
|
|
LackeyEntryList.RandomResize(MiscConst.MaxActiveLackey);
|
|
|
|
//summon all the remaining in vector
|
|
foreach (var guid in LackeyEntryList)
|
|
{
|
|
Creature pAdd = me.SummonCreature(guid, MiscConst.LackeyLocations[j][0], MiscConst.LackeyLocations[j][1], MiscConst.fZLocation, MiscConst.fOrientation, TempSummonType.CorpseDespawn);
|
|
if (pAdd != null)
|
|
m_auiLackeyGUID[j] = pAdd.GetGUID();
|
|
|
|
++j;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (var guid in LackeyEntryList)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, m_auiLackeyGUID[j]);
|
|
|
|
//object already removed, not exist
|
|
if (pAdd == null)
|
|
{
|
|
pAdd = me.SummonCreature(guid, MiscConst.LackeyLocations[j][0], MiscConst.LackeyLocations[j][1], MiscConst.fZLocation, MiscConst.fOrientation, TempSummonType.CorpseDespawn);
|
|
if (pAdd != null)
|
|
m_auiLackeyGUID[j] = pAdd.GetGUID();
|
|
}
|
|
++j;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void KilledUnit(Unit victim)
|
|
{
|
|
if (!victim.IsPlayer())
|
|
return;
|
|
|
|
Talk(MiscConst.PlayerDeath[PlayersKilled]);
|
|
|
|
if (PlayersKilled < 4)
|
|
++PlayersKilled;
|
|
}
|
|
|
|
public override void JustDied(Unit killer)
|
|
{
|
|
Talk(TextIds.SayDeath);
|
|
|
|
if (instance.GetData(DataTypes.DelrissaDeathCount) == MiscConst.MaxActiveLackey)
|
|
instance.SetBossState(DataTypes.PriestessDelrissa, EncounterState.Done);
|
|
else
|
|
me.RemoveDynamicFlag(UnitDynFlags.Lootable);
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
//all 8 possible lackey use this common
|
|
class boss_priestess_lackey_common : ScriptedAI
|
|
{
|
|
InstanceScript instance;
|
|
bool UsedPotion;
|
|
|
|
public ObjectGuid[] m_auiLackeyGUIDs = new ObjectGuid[MiscConst.MaxActiveLackey];
|
|
|
|
public boss_priestess_lackey_common(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
instance = creature.GetInstanceScript();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
UsedPotion = false;
|
|
|
|
// These guys does not follow normal threat system rules
|
|
// For later development, some alternative threat system should be made
|
|
// We do not know what this system is based upon, but one theory is class (healers=high threat, dps=medium, etc)
|
|
// We reset their threat frequently as an alternative until such a system exist
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(20), task =>
|
|
{
|
|
ResetThreatList();
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
AcquireGUIDs();
|
|
|
|
// in case she is not alive and Reset was for some reason called, respawn her (most likely party wipe after killing her)
|
|
Creature delrissa = instance.GetCreature(DataTypes.PriestessDelrissa);
|
|
if (delrissa != null)
|
|
{
|
|
if (!delrissa.IsAlive())
|
|
delrissa.Respawn();
|
|
}
|
|
}
|
|
|
|
public override void JustEngagedWith(Unit who)
|
|
{
|
|
if (who == null)
|
|
return;
|
|
|
|
foreach (var guid in m_auiLackeyGUIDs)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, guid);
|
|
if (pAdd != null && !pAdd.IsEngaged() && pAdd != me)
|
|
AddThreat(who, 0.0f, pAdd);
|
|
}
|
|
|
|
Creature delrissa = instance.GetCreature(DataTypes.PriestessDelrissa);
|
|
if (delrissa != null)
|
|
if (delrissa.IsAlive() && !delrissa.IsEngaged())
|
|
AddThreat(who, 0.0f, delrissa);
|
|
}
|
|
|
|
public override void JustDied(Unit killer)
|
|
{
|
|
Creature delrissa = instance.GetCreature(DataTypes.PriestessDelrissa);
|
|
uint uiLackeyDeathCount = instance.GetData(DataTypes.DelrissaDeathCount);
|
|
|
|
if (delrissa == null)
|
|
return;
|
|
|
|
//should delrissa really yell if dead?
|
|
delrissa.GetAI().Talk(MiscConst.LackeyDeath[uiLackeyDeathCount]);
|
|
|
|
instance.SetData(DataTypes.DelrissaDeathCount, (uint)EncounterState.Special);
|
|
|
|
//increase local var, since we now may have four dead
|
|
++uiLackeyDeathCount;
|
|
|
|
if (uiLackeyDeathCount == MiscConst.MaxActiveLackey)
|
|
{
|
|
//time to make her lootable and complete event if she died before lackeys
|
|
if (!delrissa.IsAlive())
|
|
{
|
|
delrissa.SetDynamicFlag(UnitDynFlags.Lootable);
|
|
|
|
instance.SetBossState(DataTypes.PriestessDelrissa, EncounterState.Done);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void KilledUnit(Unit victim)
|
|
{
|
|
Creature delrissa = instance.GetCreature(DataTypes.PriestessDelrissa);
|
|
if (delrissa != null)
|
|
delrissa.GetAI().KilledUnit(victim);
|
|
}
|
|
|
|
void AcquireGUIDs()
|
|
{
|
|
Creature delrissa = instance.GetCreature(DataTypes.PriestessDelrissa);
|
|
if (delrissa != null)
|
|
{
|
|
for (byte i = 0; i < MiscConst.MaxActiveLackey; ++i)
|
|
m_auiLackeyGUIDs[i] = (delrissa.GetAI() as boss_priestess_delrissa).m_auiLackeyGUID[i];
|
|
}
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UsedPotion && HealthBelowPct(25))
|
|
{
|
|
DoCast(me, SpellIds.HealingPotion);
|
|
UsedPotion = true;
|
|
}
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_kagani_nightstrike : boss_priestess_lackey_common
|
|
{
|
|
bool InVanish;
|
|
|
|
//Rogue
|
|
public boss_kagani_nightstrike(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(5.5), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Gouge);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(7), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Kick);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(2), task =>
|
|
{
|
|
DoCast(me, SpellIds.Vanish);
|
|
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
|
|
ResetThreatList();
|
|
|
|
if (unit != null)
|
|
AddThreat(unit, 1000.0f);
|
|
|
|
InVanish = true;
|
|
me.SetCanMelee(false);
|
|
task.Repeat(TimeSpan.FromSeconds(30));
|
|
task.Schedule(TimeSpan.FromSeconds(10), waitTask =>
|
|
{
|
|
if (InVanish)
|
|
{
|
|
DoCastVictim(SpellIds.Backstab, new CastSpellExtraArgs(true));
|
|
DoCastVictim(SpellIds.KidneyShot, new CastSpellExtraArgs(true));
|
|
me.SetVisible(true); // ...? Hacklike
|
|
me.SetCanMelee(true);
|
|
InVanish = false;
|
|
}
|
|
waitTask.Repeat();
|
|
});
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(6), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Eviscerate);
|
|
task.Repeat(TimeSpan.FromSeconds(4));
|
|
});
|
|
|
|
InVanish = false;
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
me.SetVisible(true);
|
|
me.SetCanMelee(true);
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_ellris_duskhallow : boss_priestess_lackey_common
|
|
{
|
|
//Warlock
|
|
public boss_ellris_duskhallow(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(6), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Immolate);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(3), task =>
|
|
{
|
|
DoCastVictim(SpellIds.ShadowBolt);
|
|
task.Repeat(TimeSpan.FromSeconds(5));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(2), task =>
|
|
{
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (unit != null)
|
|
DoCast(unit, SpellIds.SeedOfCorruption);
|
|
|
|
task.Repeat(TimeSpan.FromSeconds(10));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(1), task =>
|
|
{
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (unit != null)
|
|
DoCast(unit, SpellIds.CurseOfAgony);
|
|
|
|
task.Repeat(TimeSpan.FromSeconds(13));
|
|
});
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (unit != null)
|
|
DoCast(unit, SpellIds.Fear);
|
|
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void JustEngagedWith(Unit who)
|
|
{
|
|
DoCast(me, SpellIds.SummonImp);
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_eramas_brightblaze : boss_priestess_lackey_common
|
|
{
|
|
//Monk
|
|
public boss_eramas_brightblaze(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(6), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Knockdown);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(4.5), task =>
|
|
{
|
|
DoCastVictim(SpellIds.SnapKick);
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_yazzai : boss_priestess_lackey_common
|
|
{
|
|
bool HasIceBlocked;
|
|
|
|
//Mage
|
|
public boss_yazzai(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
HasIceBlocked = false;
|
|
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(1), task =>
|
|
{
|
|
Unit target = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (target != null)
|
|
{
|
|
DoCast(target, SpellIds.Polymorph);
|
|
task.Repeat(TimeSpan.FromSeconds(20));
|
|
}
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(8), task =>
|
|
{
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (unit != null)
|
|
DoCast(unit, SpellIds.Blizzard);
|
|
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(12), task =>
|
|
{
|
|
DoCastVictim(SpellIds.IceLance);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
DoCastVictim(SpellIds.ConeOfCold);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(3), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Frostbolt);
|
|
task.Repeat(TimeSpan.FromSeconds(8));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(8), task =>
|
|
{
|
|
bool InMeleeRange = false;
|
|
foreach (var pair in me.GetCombatManager().GetPvECombatRefs())
|
|
{
|
|
if (pair.Value.GetOther(me).IsWithinMeleeRange(me))
|
|
{
|
|
InMeleeRange = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//if anybody is in melee range than escape by blink
|
|
if (InMeleeRange)
|
|
DoCast(me, SpellIds.Blink);
|
|
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
if (HealthBelowPct(35) && !HasIceBlocked)
|
|
{
|
|
DoCast(me, SpellIds.IceBlock);
|
|
HasIceBlocked = true;
|
|
}
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_warlord_salaris : boss_priestess_lackey_common
|
|
{
|
|
//Warrior
|
|
public boss_warlord_salaris(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
_scheduler.Schedule(TimeSpan.FromMilliseconds(500), task =>
|
|
{
|
|
bool InMeleeRange = false;
|
|
foreach (var pair in me.GetCombatManager().GetPvECombatRefs())
|
|
{
|
|
if (pair.Value.GetOther(me).IsWithinMeleeRange(me))
|
|
{
|
|
InMeleeRange = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//if nobody is in melee range than try to use Intercept
|
|
if (!InMeleeRange)
|
|
{
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (unit != null)
|
|
DoCast(unit, SpellIds.InterceptStun);
|
|
}
|
|
|
|
task.Repeat(TimeSpan.FromSeconds(10));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(6), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Disarm);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
DoCastVictim(SpellIds.PiercingHowl);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(18), task =>
|
|
{
|
|
DoCastVictim(SpellIds.FrighteningShout);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(4.5), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Hamstring);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(8), task =>
|
|
{
|
|
DoCastVictim(SpellIds.MortalStrike);
|
|
task.Repeat(TimeSpan.FromSeconds(4.5));
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void JustEngagedWith(Unit who)
|
|
{
|
|
DoCast(me, SpellIds.BattleShout);
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_garaxxas : boss_priestess_lackey_common
|
|
{
|
|
TaskScheduler _meleeScheduler = new();
|
|
|
|
ObjectGuid m_uiPetGUID;
|
|
|
|
//Hunter
|
|
public boss_garaxxas(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(6), task =>
|
|
{
|
|
DoCastVictim(SpellIds.AimedShot);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(2.5), task =>
|
|
{
|
|
DoCastVictim(SpellIds.Shoot);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(8), task =>
|
|
{
|
|
DoCastVictim(SpellIds.ConcussiveShot);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
DoCastVictim(SpellIds.MultiShot);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(4), task =>
|
|
{
|
|
DoCastVictim(SpellIds.WingClip);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(15), task =>
|
|
{
|
|
//attempt find go summoned from spell (cast by me)
|
|
GameObject go = me.GetGameObject(SpellIds.FreezingTrap);
|
|
|
|
//if we have a go, we need to wait (only one trap at a time)
|
|
if (go != null)
|
|
task.Repeat(TimeSpan.FromSeconds(2.5));
|
|
else
|
|
{
|
|
//if go does not exist, then we can cast
|
|
DoCastVictim(SpellIds.FreezingTrap);
|
|
task.Repeat();
|
|
}
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
Unit pPet = Global.ObjAccessor.GetUnit(me, m_uiPetGUID);
|
|
if (pPet == null)
|
|
me.SummonCreature(CreatureIds.Sliver, 0.0f, 0.0f, 0.0f, 0.0f, TempSummonType.CorpseDespawn);
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void JustSummoned(Creature summoned)
|
|
{
|
|
m_uiPetGUID = summoned.GetGUID();
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
if (me.IsWithinDistInMap(me.GetVictim(), SharedConst.AttackDistance))
|
|
_meleeScheduler.Update(diff);
|
|
else
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_apoko : boss_priestess_lackey_common
|
|
{
|
|
byte Totem_Amount;
|
|
|
|
//Shaman
|
|
public boss_apoko(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
Totem_Amount = 1;
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(2), task =>
|
|
{
|
|
DoCast(me, RandomHelper.RAND(SpellIds.WindfuryTotem, SpellIds.FireNovaTotem, SpellIds.EarthbindTotem));
|
|
++Totem_Amount;
|
|
task.Repeat(TimeSpan.FromMilliseconds(Totem_Amount * 2000));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
DoCast(me, SpellIds.WarStomp);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(8), task =>
|
|
{
|
|
Unit unit = SelectTarget(SelectTargetMethod.Random, 0);
|
|
if (unit != null)
|
|
DoCast(unit, SpellIds.Purge);
|
|
|
|
task.Repeat(TimeSpan.FromSeconds(15));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(5), task =>
|
|
{
|
|
DoCast(me, SpellIds.LesserHealingWave);
|
|
task.Repeat();
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(7), task =>
|
|
{
|
|
DoCastVictim(SpellIds.FrostShock);
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
|
|
[Script]
|
|
class boss_zelfan : boss_priestess_lackey_common
|
|
{
|
|
//Engineer
|
|
public boss_zelfan(Creature creature) : base(creature)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(20), task =>
|
|
{
|
|
DoCastVictim(SpellIds.GoblinDragonGun);
|
|
task.Repeat(TimeSpan.FromSeconds(10));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(7), task =>
|
|
{
|
|
DoCastVictim(SpellIds.RocketLaunch);
|
|
task.Repeat(TimeSpan.FromSeconds(9));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(4), task =>
|
|
{
|
|
foreach (var guid in m_auiLackeyGUIDs)
|
|
{
|
|
Unit pAdd = Global.ObjAccessor.GetUnit(me, guid);
|
|
if (pAdd != null && pAdd.IsPolymorphed())
|
|
{
|
|
DoCast(pAdd, SpellIds.Recombobulate);
|
|
break;
|
|
}
|
|
}
|
|
task.Repeat(TimeSpan.FromSeconds(2));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(10), task =>
|
|
{
|
|
DoCast(me, SpellIds.HighExplosiveSheep);
|
|
task.Repeat(TimeSpan.FromSeconds(65));
|
|
});
|
|
_scheduler.Schedule(TimeSpan.FromSeconds(15), task =>
|
|
{
|
|
DoCastVictim(SpellIds.FelIronBomb);
|
|
task.Repeat();
|
|
});
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
Initialize();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void UpdateAI(uint diff)
|
|
{
|
|
if (!UpdateVictim())
|
|
return;
|
|
|
|
base.UpdateAI(diff);
|
|
|
|
_scheduler.Update(diff);
|
|
}
|
|
}
|
|
} |