Allow size and range check features to be configured.

This also improves the range check to fall back to UnitInRange if no
friendly spell is available
This commit is contained in:
2023-04-01 01:17:54 +02:00
parent 825738a040
commit e72c4b3e3f
2 changed files with 88 additions and 20 deletions

View File

@@ -44,15 +44,25 @@ local colors = {
white = {1.0, 1.0, 1.0}
}
function UnitFrame:Init(unit, width, height, hideInRaid)
function UnitFrame:Init(unit, config)
local width = config.size.width
local height = config.size.height
self.unit = unit
self.hideInRaid = hideInRaid or false
self.hideInRaid = config.hideInRaid
self.rangeFriendly = config.range.friendly
self.rangeEnemy = config.range.enemy
self.rangeFade = config.range.fade
local secure = self:CreateSecureFrame(width, height)
secure:Hide()
self.hp = StatusBar:new(self, width, height, 0, true)
self.power = StatusBar:new(self, width, 6, 2, false)
self.power:Hide()
self.auras = AuraList:new(self)
local overlays = CreateFrame("Frame", nil, secure)
overlays:SetFrameStrata("MEDIUM")
overlays:SetFrameLevel(100)
@@ -118,16 +128,44 @@ function UnitFrame:StopRangeTicker()
end
end
-- Returns
-- true if the unit is in range
-- false if the unit is not in range
-- nil if it could not be determined
function UnitFrame:IsInRange()
local unit = self.unit
local friendlySpell = self.rangeFriendly
local enemySpell = self.rangeEnemy
-- Prefer to use configured spells
if friendlySpell and UnitCanAssist("player", unit) then
return IsSpellInRange(friendlySpell, unit) == 1
elseif enemySpell and UnitCanAttack("player", unit) then
return IsSpellInRange(enemySpell, unit) == 1
end
-- Fall back to raid/party only range check
local inRange, checkedRange = UnitInRange(unit)
if checkedRange then
return inRange
end
return nil
end
function UnitFrame:UpdateRange()
local unit = self.unit
if UnitIsDead(unit) then
if UnitIsDeadOrGhost(unit) then
self.secureFrame:SetAlpha(1.0)
return
end
local inRange = self:IsInRange()
if inRange or inRange == nil then
self.secureFrame:SetAlpha(1.0)
elseif not UnitIsFriend("player", unit) and IsSpellInRange("Lightning Bolt", unit) ~= 1 then
self.secureFrame:SetAlpha(0.2)
elseif UnitIsFriend("player", unit) and IsSpellInRange("Healing Surge", unit) ~= 1 then
self.secureFrame:SetAlpha(0.2)
else
self.secureFrame:SetAlpha(1.0)
self.secureFrame:SetAlpha(self.rangeFade)
end
end