parent
4cb3ebd717
commit
a595fe3b17
@ -0,0 +1,178 @@ |
||||
local Tinkr, Bastion = ... |
||||
local AfflictionModule = Bastion.Module:New('AfflictionWarlock') |
||||
local Player = Bastion.UnitManager:Get('player') |
||||
local Target = Bastion.UnitManager:Get('target') |
||||
local SpellBook = Bastion.SpellBook:New() |
||||
|
||||
-- Spells |
||||
local Agony = SpellBook:GetSpell(980) |
||||
local UnstableAffliction = SpellBook:GetSpell(316099) |
||||
local Corruption = SpellBook:GetSpell(172) |
||||
local MaleficRapture = SpellBook:GetSpell(324536) |
||||
local ShadowBolt = SpellBook:GetSpell(686) |
||||
local SeedOfCorruption = SpellBook:GetSpell(27243) |
||||
local DrainSoul = SpellBook:GetSpell(198590) |
||||
local Haunt = SpellBook:GetSpell(48181) |
||||
local VileTaint = SpellBook:GetSpell(278350) |
||||
local SoulRot = SpellBook:GetSpell(325640) |
||||
local SummonDarkglare = SpellBook:GetSpell(205180) |
||||
local PhantomSingularity = SpellBook:GetSpell(205179) |
||||
local SiphonLife = SpellBook:GetSpell(63106) |
||||
|
||||
-- Create APLs |
||||
local DefaultAPL = Bastion.APL:New('default') |
||||
local AoEAPL = Bastion.APL:New('aoe') |
||||
local OpeningAPL = Bastion.APL:New('opening') |
||||
local CooldownAPL = Bastion.APL:New('cooldown') |
||||
|
||||
-- Helper function to count active DoTs on target |
||||
local function CountDotsOnTarget(unit) |
||||
local count = 0 |
||||
if unit:GetAuras():FindMy(Agony):IsUp() then count = count + 1 end |
||||
if unit:GetAuras():FindMy(Corruption):IsUp() then count = count + 1 end |
||||
if unit:GetAuras():FindMy(UnstableAffliction):IsUp() then count = count + 1 end |
||||
if unit:GetAuras():FindMy(SiphonLife):IsUp() then count = count + 1 end |
||||
if unit:GetAuras():FindMy(PhantomSingularity):IsUp() then count = count + 1 end |
||||
if unit:GetAuras():FindMy(VileTaint):IsUp() then count = count + 1 end |
||||
return count |
||||
end |
||||
|
||||
-- Function to check if there are nearby enemies without DoTs |
||||
local function NearbyEnemiesNeedDots() |
||||
local needDots = false |
||||
Bastion.ObjectManager.enemies:each(function(unit) |
||||
if unit:IsAlive() and Player:CanSee(unit) and Player:GetDistance(unit) <= 40 and unit:IsAffectingCombat() then |
||||
if not unit:GetAuras():FindMy(Agony):IsUp() or not unit:GetAuras():FindMy(Corruption):IsUp() then |
||||
needDots = true |
||||
return true -- Break the loop |
||||
end |
||||
end |
||||
end) |
||||
return needDots |
||||
end |
||||
|
||||
-- Function to check if the target is valid for attacks |
||||
local function IsValidTarget(unit) |
||||
return unit and unit:Exists() and unit:IsAlive() and unit:IsEnemy() and Player:CanSee(unit) and unit:IsAffectingCombat() |
||||
end |
||||
|
||||
-- Default APL |
||||
DefaultAPL:AddSpell( |
||||
Agony:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) and Target:GetAuras():FindMy(Agony):GetRemainingTime() < 5.4 |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
DefaultAPL:AddSpell( |
||||
UnstableAffliction:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) and Target:GetAuras():FindMy(UnstableAffliction):GetRemainingTime() < 6.3 |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
DefaultAPL:AddSpell( |
||||
Corruption:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) and Target:GetAuras():FindMy(Corruption):GetRemainingTime() < 4.2 |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
DefaultAPL:AddSpell( |
||||
MaleficRapture:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) and |
||||
((Player:GetPower() == Player:GetMaxPower() or Player:GetPower() >= 4) or NearbyEnemiesNeedDots()) |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
DefaultAPL:AddSpell( |
||||
ShadowBolt:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) and Player:GetPower() < 4 |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
-- AoE APL |
||||
AoEAPL:AddSpell( |
||||
SeedOfCorruption:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and Bastion.ObjectManager.enemies:count() >= 3 and |
||||
IsValidTarget(Target) and not Target:GetAuras():FindMy(Corruption):IsUp() |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
-- Opening APL |
||||
OpeningAPL:AddSpell( |
||||
UnstableAffliction:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and Target:Exists() and Target:IsEnemy() and not Player:IsAffectingCombat() |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
OpeningAPL:AddSpell( |
||||
Agony:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and Target:Exists() and Target:IsEnemy() and not Player:IsAffectingCombat() |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
OpeningAPL:AddSpell( |
||||
Corruption:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and Target:Exists() and Target:IsEnemy() and not Player:IsAffectingCombat() |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
-- Cooldown APL |
||||
CooldownAPL:AddSpell( |
||||
Haunt:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
CooldownAPL:AddSpell( |
||||
VileTaint:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) |
||||
end):SetTarget(Target):OnCast(function(self) |
||||
if IsSpellPending() == 64 then |
||||
local x, y, z = ObjectPosition(Target:GetOMToken()) |
||||
if x and y and z then |
||||
self:Click(x, y, z) |
||||
end |
||||
end |
||||
end) |
||||
) |
||||
|
||||
CooldownAPL:AddSpell( |
||||
SoulRot:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) |
||||
end):SetTarget(Target) |
||||
) |
||||
|
||||
CooldownAPL:AddSpell( |
||||
SummonDarkglare:CastableIf(function(self) |
||||
return self:IsKnownAndUsable() and IsValidTarget(Target) and CountDotsOnTarget(Target) >= 3 |
||||
end):SetTarget(Player):OnCast(function(self) |
||||
if IsSpellPending() == 64 then |
||||
local x, y, z = ObjectPosition(Player:GetOMToken()) |
||||
if x and y and z then |
||||
self:Click(x, y, z) |
||||
end |
||||
end |
||||
end) |
||||
) |
||||
|
||||
AfflictionModule:Sync(function() |
||||
if not Player:IsAffectingCombat() then |
||||
if Target:Exists() and Target:IsEnemy() and Target:IsAlive() and not Target:IsAffectingCombat() then |
||||
OpeningAPL:Execute() |
||||
end |
||||
return |
||||
end |
||||
|
||||
if not IsValidTarget(Target) then |
||||
return |
||||
end |
||||
|
||||
CooldownAPL:Execute() |
||||
|
||||
if Bastion.ObjectManager.enemies:count() >= 3 then |
||||
AoEAPL:Execute() |
||||
end |
||||
|
||||
DefaultAPL:Execute() |
||||
end) |
||||
|
||||
Bastion:Register(AfflictionModule) |
Loading…
Reference in new issue