parent
78c817cfb8
commit
6408b3a222
@ -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) |
@ -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) |
@ -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) |
Loading…
Reference in new issue