Basic rotations that work
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OkRotations/MistweaverMonk.lua

252 lines
7.6 KiB

--Talents: C4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzCzsMmxMmxM2w2sMbjHAz2yyMzyCImZgZYmFDsMzMDzGzMMLzEAAAAAEgFLz22sNzMBAA2A
local Tinkr, Bastion = ...
local RestoMonkModule = Bastion.Module:New('MistweaverMonk')
local Player = Bastion.UnitManager:Get('player')
local Target = Bastion.UnitManager:Get('target')
-- Initialize SpellBook
local SpellBook = Bastion.SpellBook:New()
-- Spells
local RenewingMist = SpellBook:GetSpell(115151)
local EnvelopingMist = SpellBook:GetSpell(124682)
local Vivify = SpellBook:GetSpell(116670)
local RisingSunKick = SpellBook:GetSpell(107428)
local ThunderFocusTea = SpellBook:GetSpell(116680)
local TigerPalm = SpellBook:GetSpell(100780)
local BlackoutKick = SpellBook:GetSpell(100784)
local SpinningCraneKick = SpellBook:GetSpell(101546)
local Revival = SpellBook:GetSpell(115310)
local Restoral = SpellBook:GetSpell(388615)
local InvokeYulon = SpellBook:GetSpell(322118)
local InvokeChiJi = SpellBook:GetSpell(325197)
local SoothingMist = SpellBook:GetSpell(115175)
local ManaTea = SpellBook:GetSpell(197908)
local CelestialConduit = SpellBook:GetSpell(443028)
local FortifyingBrew = SpellBook:GetSpell(243435)
local DiffuseMagic = SpellBook:GetSpell(122783)
local LifeCocoon = SpellBook:GetSpell(116849)
local JadefireStomp = SpellBook:GetSpell(388193)
local SheilunsGift = SpellBook:GetSpell(399491)
-- Buffs
local TeachingsOfTheMonastery = SpellBook:GetSpell(202090)
local StrengthOfTheBlackOx = SpellBook:GetSpell(392883)
-- Custom Units
local Lowest = Bastion.UnitManager:CreateCustomUnit('lowest', function(unit)
local lowest = nil
local lowestHP = math.huge
Bastion.UnitManager:EnumFriends(function(unit)
if unit:IsDead() or Player:GetDistance(unit) > 40 or not Player:CanSee(unit) then
return false
end
local hp = unit:GetHP()
if hp < lowestHP then
lowest = unit
lowestHP = hp
end
end)
return lowest or Player
end)
-- APLs
local DefaultAPL = Bastion.APL:New('default')
local CooldownAPL = Bastion.APL:New('cooldown')
local DefensiveAPL = Bastion.APL:New('defensive')
local DpsAPL = Bastion.APL:New('dps')
-- Helper Functions
local function ShouldUseRenewingMist()
return RenewingMist:GetCharges() >= 2
end
local function ShouldUseEnvelopingMist()
return Player:GetAuras():FindMy(StrengthOfTheBlackOx):IsUp()
end
local function NeedsUrgentHealing()
return Lowest:GetHP() < 70 or Player:GetPartyHPAround(30, 80) >= 3
end
-- Default APL
DefaultAPL:AddSpell(
SheilunsGift:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetPartyHPAround(40, 80) >= 3
end):SetTarget(Player)
)
DefaultAPL:AddSpell(
Vivify:CastableIf(function(self)
return Lowest:Exists() and Lowest:GetHP() < 70 and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Lowest)
)
DefaultAPL:AddSpell(
RenewingMist:CastableIf(function(self)
return ShouldUseRenewingMist() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Lowest)
)
DefaultAPL:AddSpell(
RisingSunKick:CastableIf(function(self)
return Target:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Target)
)
DefaultAPL:AddSpell(
ThunderFocusTea:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Player)
)
DefaultAPL:AddSpell(
EnvelopingMist:CastableIf(function(self)
return Lowest:Exists() and ShouldUseEnvelopingMist() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Lowest)
)
DefaultAPL:AddSpell(
TigerPalm:CastableIf(function(self)
return Target:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Target)
)
-- Cooldown APL
CooldownAPL:AddSpell(
CelestialConduit:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetPartyHPAround(40, 70) >= 3
end):SetTarget(Player)
)
CooldownAPL:AddSpell(
InvokeChiJi:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetPartyHPAround(40, 85) >= 2
end):SetTarget(Player)
)
CooldownAPL:AddSpell(
InvokeYulon:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetPartyHPAround(40, 75) >= 3
end):SetTarget(Player)
)
CooldownAPL:AddSpell(
ManaTea:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetMana() < 50
end):SetTarget(Player)
)
-- Defensive APL
DefensiveAPL:AddSpell(
FortifyingBrew:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetHP() < 50
end):SetTarget(Player)
)
DefensiveAPL:AddSpell(
DiffuseMagic:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetHP() < 70
end):SetTarget(Player)
)
DefensiveAPL:AddSpell(
LifeCocoon:CastableIf(function(self)
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Lowest:GetHP() < 40
end):SetTarget(Lowest)
)
-- DPS APL
DpsAPL:AddSpell(
JadefireStomp:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Player)
)
DpsAPL:AddSpell(
RisingSunKick:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:IsWithinCombatDistance(Target, 5) -- Assuming 5 is melee range
end):SetTarget(Target)
)
DpsAPL:AddSpell(
SpinningCraneKick:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetEnemies(8) >= 2
end):SetTarget(Player)
)
DpsAPL:AddSpell(
BlackoutKick:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:IsWithinCombatDistance(Target, 5)
end):SetTarget(Target)
)
DpsAPL:AddSpell(
TigerPalm:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:IsWithinCombatDistance(Target, 5)
and Player:GetAuras():FindMy(TeachingsOfTheMonastery):GetCount() < 3
end):SetTarget(Target)
)
DpsAPL:AddSpell(
SpinningCraneKick:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:GetEnemies(8) >= 3
end):SetTarget(Player)
)
-- Module Sync
RestoMonkModule:Sync(function()
if Player:IsMounted() then
return
end
if Player:IsAffectingCombat() then
DefensiveAPL:Execute()
-- Prioritize DPS in Mythic+, but still maintain healing
if NeedsUrgentHealing() then
CooldownAPL:Execute()
DefaultAPL:Execute()
else
DpsAPL:Execute()
-- Weave in essential healing abilities
if RenewingMist:GetCharges() >= 2 then
RenewingMist:Cast(Lowest)
end
if Vivify:IsKnownAndUsable() and Lowest:GetHP() < 80 then
Vivify:Cast(Lowest)
end
end
else
-- Out of combat logic
if Lowest:GetHP() < 90 then
DefaultAPL:Execute()
end
end
end)
Bastion:Register(RestoMonkModule)