parent
6408b3a222
commit
cea7d35b50
@ -0,0 +1,275 @@ |
|||||||
|
local Tinkr, Bastion = ... |
||||||
|
local BloodDKModule = Bastion.Module:New('BloodDeathKnight') |
||||||
|
local Player = Bastion.UnitManager:Get('player') |
||||||
|
local Target = Bastion.UnitManager:Get('target') |
||||||
|
local SpellBook = Bastion.SpellBook:New() |
||||||
|
|
||||||
|
-- Spells |
||||||
|
local DeathStrike = SpellBook:GetSpell(49998) |
||||||
|
local Marrowrend = SpellBook:GetSpell(195182) |
||||||
|
local HeartStrike = SpellBook:GetSpell(206930) |
||||||
|
local BloodBoil = SpellBook:GetSpell(50842) |
||||||
|
local DeathAndDecay = SpellBook:GetSpell(43265) |
||||||
|
local DancingRuneWeapon = SpellBook:GetSpell(49028) |
||||||
|
local Tombstone = SpellBook:GetSpell(219809) |
||||||
|
local Bonestorm = SpellBook:GetSpell(194844) |
||||||
|
local AbominationLimb = SpellBook:GetSpell(315443) |
||||||
|
local EmpowerRuneWeapon = SpellBook:GetSpell(47568) |
||||||
|
local DeathsCaress = SpellBook:GetSpell(195292) |
||||||
|
local RaiseDead = SpellBook:GetSpell(46585) |
||||||
|
local BlindingSleet = SpellBook:GetSpell(207167) |
||||||
|
local AntiMagicShell = SpellBook:GetSpell(48707) |
||||||
|
local GorefiendGrasp = SpellBook:GetSpell(108199) |
||||||
|
local MindFreeze = SpellBook:GetSpell(47528) |
||||||
|
local Asphyxiate = SpellBook:GetSpell(221562) |
||||||
|
local RaiseAlly = SpellBook:GetSpell(61999) |
||||||
|
local AntiMagicZone = SpellBook:GetSpell(51052) |
||||||
|
local VampiricBlood = SpellBook:GetSpell(55233) |
||||||
|
|
||||||
|
-- Buffs |
||||||
|
local BoneShield = SpellBook:GetSpell(195181) |
||||||
|
local DancingRuneWeaponBuff = SpellBook:GetSpell(81256) |
||||||
|
|
||||||
|
-- Helper Functions |
||||||
|
local function GetEnemiesInRange(range) |
||||||
|
local count = 0 |
||||||
|
Bastion.UnitManager:EnumEnemies(function(unit) |
||||||
|
if unit:GetDistance(Player) <= range then |
||||||
|
count = count + 1 |
||||||
|
end |
||||||
|
end) |
||||||
|
return count |
||||||
|
end |
||||||
|
|
||||||
|
local function HasEnoughRunicPower(cost) |
||||||
|
return Player:GetPower() >= cost |
||||||
|
end |
||||||
|
|
||||||
|
-- Create APLs |
||||||
|
local DefaultAPL = Bastion.APL:New('default') |
||||||
|
local CooldownAPL = Bastion.APL:New('cooldown') |
||||||
|
local DefensiveAPL = Bastion.APL:New('defensive') |
||||||
|
local UtilityAPL = Bastion.APL:New('utility') |
||||||
|
|
||||||
|
-- Utility APL |
||||||
|
UtilityAPL:AddSpell( |
||||||
|
BlindingSleet:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and GetEnemiesInRange(12) >= 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
UtilityAPL:AddSpell( |
||||||
|
GorefiendGrasp:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and GetEnemiesInRange(15) >= 3 |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
UtilityAPL:AddSpell( |
||||||
|
MindFreeze:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and Target:IsCasting() and Target:IsInterruptible() |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
UtilityAPL:AddSpell( |
||||||
|
Asphyxiate:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Target:IsStunned() |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
-- Cooldown APL |
||||||
|
CooldownAPL:AddSpell( |
||||||
|
DancingRuneWeapon:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:GetAuras():FindMy(DancingRuneWeaponBuff):IsUp() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
AbominationLimb:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
EmpowerRuneWeapon:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
-- Defensive APL |
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
AntiMagicShell:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and Player:GetHP() <= 70 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
AntiMagicZone:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and Player:GetHP() <= 50 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
VampiricBlood:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and Player:GetHP() <= 60 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
-- Default APL |
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Marrowrend:CastableIf(function(self) |
||||||
|
local boneShieldCount = Player:GetAuras():FindMy(BoneShield):GetCount() |
||||||
|
return self:IsKnownAndUsable() and |
||||||
|
(boneShieldCount <= 6 or |
||||||
|
(boneShieldCount <= 7 and Player:GetAuras():FindMy(BoneShield):GetRemainingTime() < 3)) |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
DeathStrike:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and HasEnoughRunicPower(45) and Player:GetHP() <= 80 |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Tombstone:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and Player:GetAuras():FindMy(BoneShield):GetCount() > 6 |
||||||
|
and not Player:GetAuras():FindMy(DancingRuneWeaponBuff):IsUp() |
||||||
|
and Player:GetAuras():FindMy(DeathAndDecay):IsUp() |
||||||
|
and DancingRuneWeapon:GetCooldownRemaining() > 0 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Bonestorm:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and Player:GetAuras():FindMy(BoneShield):GetCount() > 11 |
||||||
|
and not Player:GetAuras():FindMy(DancingRuneWeaponBuff):IsUp() |
||||||
|
and Player:GetAuras():FindMy(DeathAndDecay):IsUp() |
||||||
|
and HasEnoughRunicPower(100) |
||||||
|
and DancingRuneWeapon:GetCooldownRemaining() > 0 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
DeathAndDecay:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:GetAuras():FindMy(DeathAndDecay):IsUp() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
BloodBoil:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and self:GetCharges() > 1 |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
HeartStrike:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
-- Opener sequence |
||||||
|
local OpenerSequence = Bastion.Sequencer:New({ |
||||||
|
function(self) |
||||||
|
if DeathAndDecay:IsKnownAndUsable() then |
||||||
|
DeathAndDecay:Cast(Player) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if DeathsCaress:IsKnownAndUsable() then |
||||||
|
DeathsCaress:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if RaiseDead:IsKnownAndUsable() then |
||||||
|
RaiseDead:Cast(Player) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if DancingRuneWeapon:IsKnownAndUsable() then |
||||||
|
DancingRuneWeapon:Cast(Player) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if BloodBoil:IsKnownAndUsable() then |
||||||
|
BloodBoil:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if Tombstone:IsKnownAndUsable() then |
||||||
|
Tombstone:Cast(Player) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if HeartStrike:IsKnownAndUsable() then |
||||||
|
HeartStrike:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if DeathStrike:IsKnownAndUsable() then |
||||||
|
DeathStrike:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if HeartStrike:IsKnownAndUsable() then |
||||||
|
HeartStrike:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if BloodBoil:IsKnownAndUsable() then |
||||||
|
BloodBoil:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if DeathStrike:IsKnownAndUsable() then |
||||||
|
DeathStrike:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
function(self) |
||||||
|
if Marrowrend:IsKnownAndUsable() then |
||||||
|
Marrowrend:Cast(Target) |
||||||
|
return true |
||||||
|
end |
||||||
|
return false |
||||||
|
end, |
||||||
|
}, function() |
||||||
|
return not Player:IsAffectingCombat() |
||||||
|
end) |
||||||
|
|
||||||
|
DefaultAPL:AddSequence(OpenerSequence, function() |
||||||
|
return not Player:IsAffectingCombat() |
||||||
|
end) |
||||||
|
|
||||||
|
BloodDKModule:Sync(function() |
||||||
|
if not Player:IsAffectingCombat() then |
||||||
|
return |
||||||
|
end |
||||||
|
|
||||||
|
DefensiveAPL:Execute() |
||||||
|
UtilityAPL:Execute() |
||||||
|
CooldownAPL:Execute() |
||||||
|
DefaultAPL:Execute() |
||||||
|
end) |
||||||
|
|
||||||
|
Bastion:Register(BloodDKModule) |
Loading…
Reference in new issue