initial commit
This commit is contained in:
180
Modules/UnitFrames/Elements/Range.lua
Normal file
180
Modules/UnitFrames/Elements/Range.lua
Normal file
@@ -0,0 +1,180 @@
|
||||
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||
local UF = E:GetModule('UnitFrames');
|
||||
local SpellRange = E.Libs.SpellRange
|
||||
|
||||
local pairs, ipairs = pairs, ipairs
|
||||
local CheckInteractDistance = CheckInteractDistance
|
||||
local UnitCanAttack = UnitCanAttack
|
||||
local UnitInParty = UnitInParty
|
||||
local UnitInRaid = UnitInRaid
|
||||
local UnitInRange = UnitInRange
|
||||
local UnitIsConnected = UnitIsConnected
|
||||
local UnitIsDeadOrGhost = UnitIsDeadOrGhost
|
||||
local UnitPhaseReason = UnitPhaseReason
|
||||
local UnitIsPlayer = UnitIsPlayer
|
||||
local UnitIsUnit = UnitIsUnit
|
||||
|
||||
local SR = {}
|
||||
local function AddTable(tbl)
|
||||
SR[E.myclass][tbl] = {}
|
||||
end
|
||||
|
||||
local function AddSpell(tbl, spellID)
|
||||
SR[E.myclass][tbl][#SR[E.myclass][tbl] + 1] = spellID
|
||||
end
|
||||
|
||||
function UF:UpdateRangeCheckSpells()
|
||||
if not SR[E.myclass] then SR[E.myclass] = {} end
|
||||
|
||||
for tbl, spells in pairs(E.global.unitframe.spellRangeCheck[E.myclass]) do
|
||||
AddTable(tbl) --Create the table holding spells, even if it ends up being an empty table
|
||||
for spellID in pairs(spells) do
|
||||
local enabled = spells[spellID]
|
||||
if enabled then --We will allow value to be false to disable this spell from being used
|
||||
AddSpell(tbl, spellID, enabled)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function getUnit(unit)
|
||||
if not unit:find('party') or not unit:find('raid') then
|
||||
for i=1, 4 do
|
||||
if UnitIsUnit(unit, 'party'..i) then
|
||||
return 'party'..i
|
||||
end
|
||||
end
|
||||
|
||||
for i=1, 40 do
|
||||
if UnitIsUnit(unit, 'raid'..i) then
|
||||
return 'raid'..i
|
||||
end
|
||||
end
|
||||
else
|
||||
return unit
|
||||
end
|
||||
end
|
||||
|
||||
local function friendlyIsInRange(unit)
|
||||
if not UnitIsUnit(unit, 'player') and (UnitInParty(unit) or UnitInRaid(unit)) then
|
||||
unit = getUnit(unit) -- swap the unit with `raid#` or `party#` when its NOT `player`, UnitIsUnit is true, and its not using `raid#` or `party#` already
|
||||
end
|
||||
|
||||
if UnitIsPlayer(unit) and UnitPhaseReason(unit) then
|
||||
return false -- is not in same phase
|
||||
end
|
||||
|
||||
local inRange, checkedRange = UnitInRange(unit)
|
||||
if checkedRange and not inRange then
|
||||
return false -- blizz checked and said the unit is out of range
|
||||
end
|
||||
|
||||
if CheckInteractDistance(unit, 1) then
|
||||
return true -- within 28 yards (arg2 as 1 is Compare Achievements distance)
|
||||
end
|
||||
|
||||
local object = SR[E.myclass]
|
||||
if object then
|
||||
if object.resSpells and (#object.resSpells > 0) and UnitIsDeadOrGhost(unit) then -- dead with rez spells
|
||||
for _, spellID in ipairs(object.resSpells) do
|
||||
if SpellRange.IsSpellInRange(spellID, unit) == 1 then
|
||||
return true -- within rez range
|
||||
end
|
||||
end
|
||||
|
||||
return false -- dead but no spells are in range
|
||||
end
|
||||
|
||||
if object.friendlySpells and (#object.friendlySpells > 0) then -- you have some healy spell
|
||||
for _, spellID in ipairs(object.friendlySpells) do
|
||||
if SpellRange.IsSpellInRange(spellID, unit) == 1 then
|
||||
return true -- within healy spell range
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false -- not within 28 yards and no spells in range
|
||||
end
|
||||
|
||||
local function petIsInRange(unit)
|
||||
if CheckInteractDistance(unit, 2) then
|
||||
return true -- within 8 yards (arg2 as 2 is Trade distance)
|
||||
end
|
||||
|
||||
local object = SR[E.myclass]
|
||||
if object then
|
||||
if object.friendlySpells and (#object.friendlySpells > 0) then -- you have some healy spell
|
||||
for _, spellID in ipairs(object.friendlySpells) do
|
||||
if SpellRange.IsSpellInRange(spellID, unit) == 1 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if object.petSpells and (#object.petSpells > 0) then -- you have some pet spell
|
||||
for _, spellID in ipairs(object.petSpells) do
|
||||
if SpellRange.IsSpellInRange(spellID, unit) == 1 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false -- not within 8 yards and no spells in range
|
||||
end
|
||||
|
||||
local function enemyIsInRange(unit)
|
||||
if CheckInteractDistance(unit, 2) then
|
||||
return true -- within 8 yards (arg2 as 2 is Trade distance)
|
||||
end
|
||||
|
||||
local object = SR[E.myclass]
|
||||
if object and object.enemySpells and (#object.enemySpells > 0) then -- you have some damage spell
|
||||
for _, spellID in ipairs(object.enemySpells) do
|
||||
if SpellRange.IsSpellInRange(spellID, unit) == 1 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false -- not within 8 yards and no spells in range
|
||||
end
|
||||
|
||||
local function enemyIsInLongRange(unit)
|
||||
local object = SR[E.myclass]
|
||||
if object and object.longEnemySpells and (#object.longEnemySpells > 0) then -- you have some 30+ range damage spell
|
||||
for _, spellID in ipairs(object.longEnemySpells) do
|
||||
if SpellRange.IsSpellInRange(spellID, unit) == 1 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function UF:UpdateRange(unit)
|
||||
if not self.Fader then return end
|
||||
local alpha
|
||||
|
||||
unit = unit or self.unit
|
||||
|
||||
if self.forceInRange or unit == 'player' then
|
||||
alpha = self.Fader.MaxAlpha
|
||||
elseif self.forceNotInRange then
|
||||
alpha = self.Fader.MinAlpha
|
||||
elseif unit then
|
||||
if UnitCanAttack('player', unit) then
|
||||
alpha = ((enemyIsInRange(unit) or enemyIsInLongRange(unit)) and self.Fader.MaxAlpha) or self.Fader.MinAlpha
|
||||
elseif UnitIsUnit(unit, 'pet') then
|
||||
alpha = (petIsInRange(unit) and self.Fader.MaxAlpha) or self.Fader.MinAlpha
|
||||
else
|
||||
alpha = (UnitIsConnected(unit) and friendlyIsInRange(unit) and self.Fader.MaxAlpha) or self.Fader.MinAlpha
|
||||
end
|
||||
else
|
||||
alpha = self.Fader.MaxAlpha
|
||||
end
|
||||
|
||||
self.Fader.RangeAlpha = alpha
|
||||
end
|
||||
Reference in New Issue
Block a user