From 6408b3a222badd69a70b1da6c69ea701022bb353 Mon Sep 17 00:00:00 2001 From: Emlembow <36314674+Emlembow@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:09:04 -0700 Subject: [PATCH] Auto-commit: changes committed --- FrostDK.lua | 168 ++++++++++++++++++++++++++++++++++++++++++++++++ Outlaw.lua | 126 ++++++++++++++++++++++++++++++++++++ ProtWarrior.lua | 147 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 441 insertions(+) create mode 100644 FrostDK.lua create mode 100644 Outlaw.lua create mode 100644 ProtWarrior.lua diff --git a/FrostDK.lua b/FrostDK.lua new file mode 100644 index 0000000..55f51fd --- /dev/null +++ b/FrostDK.lua @@ -0,0 +1,168 @@ +local Tinkr, Bastion = ... +local FrostDKModule = Bastion.Module:New('FrostDK') +local Player = Bastion.UnitManager:Get('player') +local Target = Bastion.UnitManager:Get('target') +local SpellBook = Bastion.SpellBook:New() + +-- Spells +local FrostStrike = SpellBook:GetSpell(49143) +local Obliterate = SpellBook:GetSpell(49020) +local RemorselessWinter = SpellBook:GetSpell(196770) +local HowlingBlast = SpellBook:GetSpell(49184) +local SoulReaper = SpellBook:GetSpell(343294) +local GlacialAdvance = SpellBook:GetSpell(194913) +local DeathAndDecay = SpellBook:GetSpell(43265) +local FrostwyrmsFury = SpellBook:GetSpell(279302) +local PillarOfFrost = SpellBook:GetSpell(51271) + +-- Buffs +local IcyTalons = SpellBook:GetSpell(194879) +local UnleashedFrenzy = SpellBook:GetSpell(338501) +local KillingMachine = SpellBook:GetSpell(51124) +local Rime = SpellBook:GetSpell(59052) +local RuneOfRazorice = SpellBook:GetSpell(326911) +local ShatteredFrost = SpellBook:GetSpell(385727) + +-- Debuffs +local FrostFever = SpellBook:GetSpell(55095) + +-- Create APLs +local SingleTargetAPL = Bastion.APL:New('single_target') +local MultiTargetAPL = Bastion.APL:New('multi_target') +local CooldownAPL = Bastion.APL:New('cooldown') + +-- Single Target APL +SingleTargetAPL:AddSpell( + FrostStrike:CastableIf(function(self) + local icyTalons = Player:GetAuras():FindMy(IcyTalons) + local unleashedFrenzy = Player:GetAuras():FindMy(UnleashedFrenzy) + return self:IsKnownAndUsable() and (icyTalons:GetCount() < 3 or unleashedFrenzy:GetCount() < 3 or + (Player:GetAuras():FindMy(RuneOfRazorice):IsUp() and Player:GetAuras():FindMy(ShatteredFrost):IsUp())) + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + Obliterate:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(KillingMachine):GetCount() == 2 + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + RemorselessWinter:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Player) +) + +SingleTargetAPL:AddSpell( + HowlingBlast:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(Rime):IsUp() + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + Obliterate:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(KillingMachine):IsUp() + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + SoulReaper:CastableIf(function(self) + return self:IsKnownAndUsable() and Target:GetHP() < 35 + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + FrostStrike:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetPower() >= 70 + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + Obliterate:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +SingleTargetAPL:AddSpell( + FrostStrike:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +-- Multi Target APL +MultiTargetAPL:AddSpell( + GlacialAdvance:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +MultiTargetAPL:AddSpell( + RemorselessWinter:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Player) +) + +MultiTargetAPL:AddSpell( + DeathAndDecay:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Player) +) + +MultiTargetAPL:AddSpell( + Obliterate:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(KillingMachine):IsUp() + end):SetTarget(Target) +) + +MultiTargetAPL:AddSpell( + FrostStrike:CastableIf(function(self) + local unleashedFrenzy = Player:GetAuras():FindMy(UnleashedFrenzy) + return self:IsKnownAndUsable() and (unleashedFrenzy:GetRemainingTime() < 3 or + (Player:GetAuras():FindMy(RuneOfRazorice):GetCount() == 5 and Player:GetAuras():FindMy(ShatteredFrost):IsUp())) + end):SetTarget(Target) +) + +MultiTargetAPL:AddSpell( + HowlingBlast:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(Rime):IsUp() + end):SetTarget(Target) +) + +MultiTargetAPL:AddSpell( + Obliterate:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +MultiTargetAPL:AddSpell( + FrostStrike:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +-- Cooldown APL +CooldownAPL:AddSpell( + PillarOfFrost:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Player) +) + +CooldownAPL:AddSpell( + FrostwyrmsFury:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(PillarOfFrost):IsUp() + end):SetTarget(Target) +) + +FrostDKModule:Sync(function() + if not Player:IsAffectingCombat() then return end + + CooldownAPL:Execute() + + if Player:GetEnemies(8) > 2 then + MultiTargetAPL:Execute() + else + SingleTargetAPL:Execute() + end +end) + +Bastion:Register(FrostDKModule) \ No newline at end of file diff --git a/Outlaw.lua b/Outlaw.lua new file mode 100644 index 0000000..ddaeb92 --- /dev/null +++ b/Outlaw.lua @@ -0,0 +1,126 @@ +local Tinkr, Bastion = ... +local OutlawModule = Bastion.Module:New('OutlawRogue') +local Player = Bastion.UnitManager:Get('player') +local Target = Bastion.UnitManager:Get('target') +local SpellBook = Bastion.SpellBook:New() + +-- Spells +local BladeFlurry = SpellBook:GetSpell(13877) +local BetweenTheEyes = SpellBook:GetSpell(315341) +local SliceAndDice = SpellBook:GetSpell(315496) +local RollTheBones = SpellBook:GetSpell(315508) +local Dispatch = SpellBook:GetSpell(2098) +local PistolShot = SpellBook:GetSpell(185763) +local SinisterStrike = SpellBook:GetSpell(193315) +local Gouge = SpellBook:GetSpell(1776) +local KidneyShot = SpellBook:GetSpell(408) +local Blind = SpellBook:GetSpell(2094) +local TricksOfTheTrade = SpellBook:GetSpell(57934) + +-- Buffs +local SliceAndDiceBuff = SpellBook:GetSpell(315496) +local BladeFlurryBuff = SpellBook:GetSpell(13877) +local OpportunityBuff = SpellBook:GetSpell(195627) + +-- 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( + TricksOfTheTrade:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:IsTanking(Target) + end):SetTarget(Bastion.UnitManager:Get('tank')) +) + +-- Cooldown APL +CooldownAPL:AddSpell( + BladeFlurry:CastableIf(function(self) + return self:IsKnownAndUsable() and not Player:GetAuras():FindMy(BladeFlurryBuff):IsUp() and Player:GetEnemies(8) > 1 + end):SetTarget(Player) +) + +CooldownAPL:AddSpell( + RollTheBones:CastableIf(function(self) + return self:IsKnownAndUsable() and GetRTBBuffCount() < 2 + end):SetTarget(Player) +) + +-- Default APL +DefaultAPL:AddSpell( + SliceAndDice:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(SliceAndDiceBuff):GetRemainingTime() < 3 and Player:GetComboPoints() >= 5 + end):SetTarget(Player) +) + +DefaultAPL:AddSpell( + BetweenTheEyes:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetComboPoints() >= 5 + end):SetTarget(Target) +) + +DefaultAPL:AddSpell( + Dispatch:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetComboPoints() >= 5 + end):SetTarget(Target) +) + +DefaultAPL:AddSpell( + PistolShot:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetAuras():FindMy(OpportunityBuff):IsUp() + end):SetTarget(Target) +) + +DefaultAPL:AddSpell( + SinisterStrike:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +-- Interrupt/CC APL +local InterruptAPL = Bastion.APL:New('interrupt') + +InterruptAPL:AddSpell( + Gouge:CastableIf(function(self) + return self:IsKnownAndUsable() and Target:IsCasting() and not Target:IsInterruptible() and Player:IsFacing(Target) + end):SetTarget(Target) +) + +InterruptAPL:AddSpell( + KidneyShot:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetComboPoints() >= 5 and Target:IsCasting() + end):SetTarget(Target) +) + +InterruptAPL:AddSpell( + Blind:CastableIf(function(self) + return self:IsKnownAndUsable() and Target:IsCasting() and not Target:IsInterruptible() + end):SetTarget(Target) +) + +-- Helper function to count Roll the Bones buffs +function GetRTBBuffCount() + local count = 0 + local rtbBuffs = {193356, 193357, 193358, 193359, 199600, 199603} + for _, buffId in ipairs(rtbBuffs) do + if Player:GetAuras():FindMy(SpellBook:GetSpell(buffId)):IsUp() then + count = count + 1 + end + end + return count +end + +OutlawModule:Sync(function() + if not Player:IsAffectingCombat() then + UtilityAPL:Execute() + return + end + + InterruptAPL:Execute() + CooldownAPL:Execute() + DefaultAPL:Execute() +end) + +Bastion:Register(OutlawModule) \ No newline at end of file diff --git a/ProtWarrior.lua b/ProtWarrior.lua new file mode 100644 index 0000000..c08b9be --- /dev/null +++ b/ProtWarrior.lua @@ -0,0 +1,147 @@ +local Tinkr, Bastion = ... +local ProtWarriorModule = Bastion.Module:New('ProtWarrior') +local Player = Bastion.UnitManager:Get('player') +local Target = Bastion.UnitManager:Get('target') +local SpellBook = Bastion.SpellBook:New() + +-- Power type for Rage +local RAGE_POWER_TYPE = 1 + +-- Spells +local ShieldSlam = SpellBook:GetSpell(23922) +local ThunderClap = SpellBook:GetSpell(6343) +local Revenge = SpellBook:GetSpell(6572) +local IgnorePain = SpellBook:GetSpell(190456) +local ShieldBlock = SpellBook:GetSpell(2565) +local DemoralizingShout = SpellBook:GetSpell(1160) +local Avatar = SpellBook:GetSpell(401150) +local Ravager = SpellBook:GetSpell(228920) +local ShieldCharge = SpellBook:GetSpell(385952) +local HeroicThrow = SpellBook:GetSpell(57755) +local Taunt = SpellBook:GetSpell(355) +local Shockwave = SpellBook:GetSpell(46968) +local BattleShout = SpellBook:GetSpell(6673) + +-- Buffs +local ShieldBlockBuff = SpellBook:GetSpell(132404) +local AvatarBuff = SpellBook:GetSpell(401150) +local BattleShoutBuff = SpellBook:GetSpell(6673) + +-- 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( + BattleShout:CastableIf(function(self) + return self:IsKnownAndUsable() and not Player:GetAuras():FindMy(BattleShoutBuff):IsUp() + end):SetTarget(Player) +) + +UtilityAPL:AddSpell( + HeroicThrow:CastableIf(function(self) + return self:IsKnownAndUsable() and Target:Exists() and not Player:InMelee(Target) + end):SetTarget(Target) +) + +-- Cooldown APL +CooldownAPL:AddSpell( + Avatar:CastableIf(function(self) + return self:IsKnownAndUsable() and not Player:GetAuras():FindMy(AvatarBuff):IsUp() and Player:GetEnemies(8) > 2 + end):SetTarget(Player) +) + +CooldownAPL:AddSpell( + Ravager:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetEnemies(8) > 2 + end):SetTarget(Player) +) + +CooldownAPL:AddSpell( + DemoralizingShout:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetEnemies(8) > 2 + end):SetTarget(Player) +) + +-- Defensive APL +DefensiveAPL:AddSpell( + ShieldBlock:CastableIf(function(self) + return self:IsKnownAndUsable() and not Player:GetAuras():FindMy(ShieldBlockBuff):IsUp() and Player:GetPower(RAGE_POWER_TYPE) >= 30 + end):SetTarget(Player) +) + +DefensiveAPL:AddSpell( + IgnorePain:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetPower(RAGE_POWER_TYPE) >= 40 and Player:GetHP() <= 80 + end):SetTarget(Player) +) + +-- Default APL +DefaultAPL:AddSpell( + ShieldCharge:CastableIf(function(self) + return self:IsKnownAndUsable() and Target:Exists() and Player:GetDistance(Target) <= 25 + end):SetTarget(Target) +) + +DefaultAPL:AddSpell( + ShieldSlam:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +DefaultAPL:AddSpell( + ThunderClap:CastableIf(function(self) + return self:IsKnownAndUsable() + end):SetTarget(Target) +) + +DefaultAPL:AddSpell( + Revenge:CastableIf(function(self) + return self:IsKnownAndUsable() and Player:GetPower(RAGE_POWER_TYPE) >= 20 + end):SetTarget(Target) +) + +-- Interrupt APL +local InterruptAPL = Bastion.APL:New('interrupt') + +InterruptAPL:AddSpell( + Shockwave:CastableIf(function(self) + return self:IsKnownAndUsable() and Target:IsCasting() and not Target:IsInterruptible() and Player:InMelee(Target) + end):SetTarget(Target) +) + +InterruptAPL:AddSpell( + Taunt:CastableIf(function(self) + return self:IsKnownAndUsable() and not Player:IsTanking(Target) and Target:Exists() + end):SetTarget(Target) +) + +-- Rage Management +local function ManageRage() + if Player:GetPower(RAGE_POWER_TYPE) >= 80 then + if not Player:GetAuras():FindMy(ShieldBlockBuff):IsUp() then + ShieldBlock:Cast(Player) + elseif Player:GetHP() <= 90 then + IgnorePain:Cast(Player) + else + Revenge:Cast(Target) + end + end +end + +ProtWarriorModule:Sync(function() + if not Player:IsAffectingCombat() then + UtilityAPL:Execute() + return + end + + ManageRage() + InterruptAPL:Execute() + DefensiveAPL:Execute() + CooldownAPL:Execute() + DefaultAPL:Execute() +end) + +Bastion:Register(ProtWarriorModule) \ No newline at end of file