From a595fe3b17d112655ede22da86ed15f9f139b96e Mon Sep 17 00:00:00 2001 From: Emlembow <36314674+Emlembow@users.noreply.github.com> Date: Sun, 18 Aug 2024 16:45:07 -0700 Subject: [PATCH] Auto-commit: changes committed --- AfflictionWarlock.lua | 178 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 AfflictionWarlock.lua diff --git a/AfflictionWarlock.lua b/AfflictionWarlock.lua new file mode 100644 index 0000000..960e9cc --- /dev/null +++ b/AfflictionWarlock.lua @@ -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) \ No newline at end of file