Range Check added
This commit is contained in:
parent
a83c1ad0c2
commit
7b0bf921c4
@ -35,4 +35,6 @@ Modules\XiconProfiles.lua
|
|||||||
Modules\Pets.lua
|
Modules\Pets.lua
|
||||||
Modules\ExportImport.lua
|
Modules\ExportImport.lua
|
||||||
Modules\CombatIndicator.lua
|
Modules\CombatIndicator.lua
|
||||||
|
Modules\RangeCheck.lua
|
||||||
|
Modules\ShadowsightTimer.lua
|
||||||
EventListener.lua
|
EventListener.lua
|
||||||
|
232
Libs/LibSpellRange-1.0/LibSpellRange-1.0.lua
Normal file
232
Libs/LibSpellRange-1.0/LibSpellRange-1.0.lua
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
--- = Background =
|
||||||
|
-- Blizzard's IsSpellInRange API has always been very limited - you either must have the name of the spell, or its spell book ID. Checking directly by spellID is simply not possible.
|
||||||
|
-- Now, in Mists of Pandaria, Blizzard changed the way that many talents and specialization spells work - instead of giving you a new spell when leaned, they replace existing spells. These replacement spells do not work with Blizzard's IsSpellInRange function whatsoever; this limitation is what prompted the creation of this lib.
|
||||||
|
-- = Usage =
|
||||||
|
-- **LibSpellRange-1.0** exposes an enhanced version of IsSpellInRange that:
|
||||||
|
-- * Allows ranged checking based on both spell name and spellID.
|
||||||
|
-- * Works correctly with replacement spells that will not work using Blizzard's IsSpellInRange method alone.
|
||||||
|
--
|
||||||
|
-- @class file
|
||||||
|
-- @name LibSpellRange-1.0.lua
|
||||||
|
|
||||||
|
local major = "SpellRange-1.0"
|
||||||
|
local minor = 15
|
||||||
|
|
||||||
|
assert(LibStub, format("%s requires LibStub.", major))
|
||||||
|
|
||||||
|
local Lib = LibStub:NewLibrary(major, minor)
|
||||||
|
if not Lib then return end
|
||||||
|
|
||||||
|
local tonumber = _G.tonumber
|
||||||
|
local strlower = _G.strlower
|
||||||
|
local wipe = _G.wipe
|
||||||
|
local type = _G.type
|
||||||
|
|
||||||
|
local GetSpellTabInfo = _G.GetSpellTabInfo
|
||||||
|
local GetNumSpellTabs = _G.GetNumSpellTabs
|
||||||
|
local GetSpellBookItemInfo = _G.GetSpellBookItemInfo
|
||||||
|
local GetSpellBookItemName = _G.GetSpellBookItemName
|
||||||
|
local GetSpellLink = _G.GetSpellLink
|
||||||
|
local GetSpellInfo = _G.GetSpellInfo
|
||||||
|
|
||||||
|
local IsSpellInRange = _G.IsSpellInRange
|
||||||
|
local SpellHasRange = _G.SpellHasRange
|
||||||
|
|
||||||
|
-- isNumber is basically a tonumber cache for maximum efficiency
|
||||||
|
Lib.isNumber = Lib.isNumber or setmetatable({}, {
|
||||||
|
__mode = "kv",
|
||||||
|
__index = function(t, i)
|
||||||
|
local o = tonumber(i) or false
|
||||||
|
t[i] = o
|
||||||
|
return o
|
||||||
|
end})
|
||||||
|
local isNumber = Lib.isNumber
|
||||||
|
|
||||||
|
-- strlower cache for maximum efficiency
|
||||||
|
Lib.strlowerCache = Lib.strlowerCache or setmetatable(
|
||||||
|
{}, {
|
||||||
|
__index = function(t, i)
|
||||||
|
if not i then return end
|
||||||
|
local o
|
||||||
|
if type(i) == "number" then
|
||||||
|
o = i
|
||||||
|
else
|
||||||
|
o = strlower(i)
|
||||||
|
end
|
||||||
|
t[i] = o
|
||||||
|
return o
|
||||||
|
end,
|
||||||
|
}) local strlowerCache = Lib.strlowerCache
|
||||||
|
|
||||||
|
-- Matches lowercase player spell names to their spellBookID
|
||||||
|
Lib.spellsByName_spell = Lib.spellsByName_spell or {}
|
||||||
|
local spellsByName_spell = Lib.spellsByName_spell
|
||||||
|
|
||||||
|
-- Matches player spellIDs to their spellBookID
|
||||||
|
Lib.spellsByID_spell = Lib.spellsByID_spell or {}
|
||||||
|
local spellsByID_spell = Lib.spellsByID_spell
|
||||||
|
|
||||||
|
-- Matches lowercase pet spell names to their spellBookID
|
||||||
|
Lib.spellsByName_pet = Lib.spellsByName_pet or {}
|
||||||
|
local spellsByName_pet = Lib.spellsByName_pet
|
||||||
|
|
||||||
|
-- Matches pet spellIDs to their spellBookID
|
||||||
|
Lib.spellsByID_pet = Lib.spellsByID_pet or {}
|
||||||
|
local spellsByID_pet = Lib.spellsByID_pet
|
||||||
|
|
||||||
|
-- Updates spellsByName and spellsByID
|
||||||
|
local function UpdateBook(bookType)
|
||||||
|
local max = 0
|
||||||
|
for i = 1, GetNumSpellTabs() do
|
||||||
|
local _, _, offs, numspells, _, specId = GetSpellTabInfo(i)
|
||||||
|
if specId == 0 then
|
||||||
|
max = offs + numspells
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local spellsByName = Lib["spellsByName_" .. bookType]
|
||||||
|
local spellsByID = Lib["spellsByID_" .. bookType]
|
||||||
|
|
||||||
|
wipe(spellsByName)
|
||||||
|
wipe(spellsByID)
|
||||||
|
|
||||||
|
for spellBookID = 1, max do
|
||||||
|
local type, baseSpellID = GetSpellBookItemInfo(spellBookID, bookType)
|
||||||
|
|
||||||
|
if type == "SPELL" or type == "PETACTION" then
|
||||||
|
local currentSpellName = GetSpellBookItemName(spellBookID, bookType)
|
||||||
|
local link = GetSpellLink(currentSpellName)
|
||||||
|
local currentSpellID = tonumber(link and link:gsub("|", "||"):match("spell:(%d+)"))
|
||||||
|
|
||||||
|
-- For each entry we add to a table,
|
||||||
|
-- only add it if there isn't anything there already.
|
||||||
|
-- This prevents weird passives from overwriting real, legit spells.
|
||||||
|
-- For example, in WoW 7.3.5 the ret paladin mastery
|
||||||
|
-- was coming back with a base spell named "Judgement",
|
||||||
|
-- which was overwriting the real "Judgement".
|
||||||
|
-- Passives usually come last in the spellbook,
|
||||||
|
-- so this should work just fine as a workaround.
|
||||||
|
-- This issue with "Judgement" is gone in BFA because the mastery changed.
|
||||||
|
|
||||||
|
if currentSpellName and not spellsByName[strlower(currentSpellName)] then
|
||||||
|
spellsByName[strlower(currentSpellName)] = spellBookID
|
||||||
|
end
|
||||||
|
if currentSpellID and not spellsByID[currentSpellID] then
|
||||||
|
spellsByID[currentSpellID] = spellBookID
|
||||||
|
end
|
||||||
|
|
||||||
|
if type == "SPELL" then
|
||||||
|
-- PETACTION (pet abilities) don't return a spellID for baseSpellID,
|
||||||
|
-- so base spells only work for proper player spells.
|
||||||
|
local baseSpellName = GetSpellInfo(baseSpellID)
|
||||||
|
if baseSpellName and not spellsByName[strlower(baseSpellName)] then
|
||||||
|
spellsByName[strlower(baseSpellName)] = spellBookID
|
||||||
|
end
|
||||||
|
if baseSpellID and not spellsByID[baseSpellID] then
|
||||||
|
spellsByID[baseSpellID] = spellBookID
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Handles updating spellsByName and spellsByID
|
||||||
|
if not Lib.updaterFrame then
|
||||||
|
Lib.updaterFrame = CreateFrame("Frame")
|
||||||
|
end
|
||||||
|
Lib.updaterFrame:UnregisterAllEvents()
|
||||||
|
Lib.updaterFrame:RegisterEvent("SPELLS_CHANGED")
|
||||||
|
|
||||||
|
local function UpdateSpells()
|
||||||
|
UpdateBook("spell")
|
||||||
|
UpdateBook("pet")
|
||||||
|
end
|
||||||
|
|
||||||
|
Lib.updaterFrame:SetScript("OnEvent", UpdateSpells)
|
||||||
|
UpdateSpells()
|
||||||
|
|
||||||
|
--- Improved spell range checking function.
|
||||||
|
-- @name SpellRange.IsSpellInRange
|
||||||
|
-- @paramsig spell, unit
|
||||||
|
-- @param spell Name or spellID of a spell that you wish to check the range of. The spell must be a spell that you have in your spellbook or your pet's spellbook.
|
||||||
|
-- @param unit UnitID of the spell that you wish to check the range on.
|
||||||
|
-- @return Exact same returns as http://wowprogramming.com/docs/api/IsSpellInRange
|
||||||
|
-- @usage
|
||||||
|
-- -- Check spell range by spell name on unit "target"
|
||||||
|
-- local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
-- local inRange = SpellRange.IsSpellInRange("Stormstrike", "target")
|
||||||
|
--
|
||||||
|
-- -- Check spell range by spellID on unit "mouseover"
|
||||||
|
-- local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
-- local inRange = SpellRange.IsSpellInRange(17364, "mouseover")
|
||||||
|
function Lib.IsSpellInRange(spellInput, unit)
|
||||||
|
if isNumber[spellInput] then
|
||||||
|
local spell = spellsByID_spell[spellInput]
|
||||||
|
if spell then
|
||||||
|
return IsSpellInRange(spell, "spell", unit)
|
||||||
|
else
|
||||||
|
local spell = spellsByID_pet[spellInput]
|
||||||
|
if spell then
|
||||||
|
return IsSpellInRange(spell, "pet", unit)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local spellInput = strlowerCache[spellInput]
|
||||||
|
|
||||||
|
local spell = spellsByName_spell[spellInput]
|
||||||
|
if spell then
|
||||||
|
return IsSpellInRange(spell, "spell", unit)
|
||||||
|
else
|
||||||
|
local spell = spellsByName_pet[spellInput]
|
||||||
|
if spell then
|
||||||
|
return IsSpellInRange(spell, "pet", unit)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return IsSpellInRange(spellInput, unit)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Improved SpellHasRange.
|
||||||
|
-- @name SpellRange.SpellHasRange
|
||||||
|
-- @paramsig spell
|
||||||
|
-- @param spell Name or spellID of a spell that you wish to check for a range. The spell must be a spell that you have in your spellbook or your pet's spellbook.
|
||||||
|
-- @return Exact same returns as http://wowprogramming.com/docs/api/SpellHasRange
|
||||||
|
-- @usage
|
||||||
|
-- -- Check if a spell has a range by spell name
|
||||||
|
-- local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
-- local hasRange = SpellRange.SpellHasRange("Stormstrike")
|
||||||
|
--
|
||||||
|
-- -- Check if a spell has a range by spellID
|
||||||
|
-- local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
-- local hasRange = SpellRange.SpellHasRange(17364)
|
||||||
|
function Lib.SpellHasRange(spellInput)
|
||||||
|
if isNumber[spellInput] then
|
||||||
|
local spell = spellsByID_spell[spellInput]
|
||||||
|
if spell then
|
||||||
|
return SpellHasRange(spell, "spell")
|
||||||
|
else
|
||||||
|
local spell = spellsByID_pet[spellInput]
|
||||||
|
if spell then
|
||||||
|
return SpellHasRange(spell, "pet")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local spellInput = strlowerCache[spellInput]
|
||||||
|
|
||||||
|
local spell = spellsByName_spell[spellInput]
|
||||||
|
if spell then
|
||||||
|
return SpellHasRange(spell, "spell")
|
||||||
|
else
|
||||||
|
local spell = spellsByName_pet[spellInput]
|
||||||
|
if spell then
|
||||||
|
return SpellHasRange(spell, "pet")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return SpellHasRange(spellInput)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
61
Libs/LibSpellRange-1.0/README.md
Normal file
61
Libs/LibSpellRange-1.0/README.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# LibSpellRange-1.0
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Blizzard's `IsSpellInRange` API has always been very limited - you either must have the name of the spell,
|
||||||
|
or its spell book ID. Checking directly by spellID is simply not possible.
|
||||||
|
Now, since Mists of Pandaria, Blizzard changed the way that many talents and specialization spells work -
|
||||||
|
instead of giving you a new spell when leaned, they replace existing spells. These replacement spells do
|
||||||
|
not work with Blizzard's IsSpellInRange function whatsoever; this limitation is what prompted the creation of this lib.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
**LibSpellRange-1.0** exposes an enhanced version of IsSpellInRange that:
|
||||||
|
|
||||||
|
* Allows ranged checking based on both spell name and spellID.
|
||||||
|
* Works correctly with replacement spells that will not work using Blizzard's IsSpellInRange method alone.
|
||||||
|
|
||||||
|
### `SpellRange.IsSpellInRange(spell, unit)` - Improved `IsSpellInRange`
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
- `spell` - Name or spellID of a spell that you wish to check the range of. The spell must be a spell that you have in your spellbook or your pet's spellbook.
|
||||||
|
- `unit` - UnitID of the spell that you wish to check the range on.
|
||||||
|
|
||||||
|
#### Return value
|
||||||
|
|
||||||
|
Exact same returns as [the built-in `IsSpellInRange`](http://wowprogramming.com/docs/api/IsSpellInRange.html)
|
||||||
|
|
||||||
|
#### Usage
|
||||||
|
|
||||||
|
``` lua
|
||||||
|
-- Check spell range by spell name on unit "target"
|
||||||
|
local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
local inRange = SpellRange.IsSpellInRange("Stormstrike", "target")
|
||||||
|
|
||||||
|
-- Check spell range by spellID on unit "mouseover"
|
||||||
|
local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
local inRange = SpellRange.IsSpellInRange(17364, "mouseover")
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SpellRange.SpellHasRange(spell)` - Improved `SpellHasRange`
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
- `spell` - Name or spellID of a spell that you wish to check for a range. The spell must be a spell that you have in your spellbook or your pet's spellbook.
|
||||||
|
|
||||||
|
#### Return value
|
||||||
|
|
||||||
|
Exact same returns as [the built-in `SpellHasRange`](http://wowprogramming.com/docs/api/SpellHasRange.html)
|
||||||
|
|
||||||
|
#### Usage
|
||||||
|
|
||||||
|
``` lua
|
||||||
|
-- Check if a spell has a range by spell name
|
||||||
|
local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
local hasRange = SpellRange.SpellHasRange("Stormstrike")
|
||||||
|
|
||||||
|
-- Check if a spell has a range by spellID
|
||||||
|
local SpellRange = LibStub("SpellRange-1.0")
|
||||||
|
local hasRange = SpellRange.SpellHasRange(17364)
|
||||||
|
```
|
3
Libs/LibSpellRange-1.0/lib.xml
Normal file
3
Libs/LibSpellRange-1.0/lib.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<Ui>
|
||||||
|
<Script file="LibSpellRange-1.0.lua"/>
|
||||||
|
</Ui>
|
407
Modules/RangeCheck.lua
Normal file
407
Modules/RangeCheck.lua
Normal file
@ -0,0 +1,407 @@
|
|||||||
|
local UnitIsConnected = UnitIsConnected
|
||||||
|
local UnitInPhase = UnitInPhase
|
||||||
|
local UnitInRaid = UnitInRaid
|
||||||
|
local UnitInParty = UnitInParty
|
||||||
|
local UnitInRange = UnitInRange
|
||||||
|
local CheckInteractDistance = CheckInteractDistance
|
||||||
|
local C_Timer = C_Timer
|
||||||
|
local UnitIsUnit = UnitIsUnit
|
||||||
|
local UnitClass = UnitClass
|
||||||
|
local GetSpellInfo = GetSpellInfo
|
||||||
|
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
|
||||||
|
local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE
|
||||||
|
local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS
|
||||||
|
local select, ipairs, type, tonumber, tostring, format = select, ipairs, type, tonumber, tostring, format
|
||||||
|
|
||||||
|
local LibStub = LibStub
|
||||||
|
local Gladdy = LibStub("Gladdy")
|
||||||
|
local LSR = LibStub("SpellRange-1.0")
|
||||||
|
local L = Gladdy.L
|
||||||
|
|
||||||
|
local classSpells = {
|
||||||
|
["MAGE"] = 118,
|
||||||
|
["PRIEST"] = 32379,
|
||||||
|
["DRUID"] = 33786,
|
||||||
|
["SHAMAN"] = 10414,
|
||||||
|
["PALADIN"] = 10308,
|
||||||
|
["WARLOCK"] = 5782,
|
||||||
|
["WARRIOR"] = 20252,
|
||||||
|
["HUNTER"] = 27018,
|
||||||
|
["ROGUE"] = 36554,
|
||||||
|
}
|
||||||
|
|
||||||
|
local function defaultSpells()
|
||||||
|
local defaults = {}
|
||||||
|
for _,class in ipairs(Gladdy.CLASSES) do
|
||||||
|
defaults[class] = { min = classSpells[class] }
|
||||||
|
end
|
||||||
|
return defaults
|
||||||
|
end
|
||||||
|
|
||||||
|
local RangeCheck = Gladdy:NewModule("Range Check", nil, {
|
||||||
|
rangeCheckEnabled = true,
|
||||||
|
rangeCheckDefaultSpells = defaultSpells(),
|
||||||
|
rangeCheckOorFactor = 1.5,
|
||||||
|
rangeCheckHealthBar = true,
|
||||||
|
rangeCheckHealthBarText = true,
|
||||||
|
rangeCheckPowerBar = true,
|
||||||
|
rangeCheckPowerBarText = true,
|
||||||
|
rangeCheckClassIcon = false,
|
||||||
|
rangeCheckTrinket = false,
|
||||||
|
rangeCheckRacial = false,
|
||||||
|
})
|
||||||
|
|
||||||
|
function RangeCheck:Initialize()
|
||||||
|
self:RegisterMessage("JOINED_ARENA")
|
||||||
|
self:RegisterMessage("ENEMY_STEALTH")
|
||||||
|
self.playerClass = select(2, UnitClass("player"))
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:Reset()
|
||||||
|
self.test = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:ResetUnit(unit)
|
||||||
|
local button = Gladdy.buttons[unit]
|
||||||
|
self:CancelTimer(button)
|
||||||
|
button.lastState = 0
|
||||||
|
self:SetColor(button, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:Test(unit)
|
||||||
|
local button = Gladdy.buttons[unit]
|
||||||
|
if not button then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
self.test = true
|
||||||
|
button.lastState = 0
|
||||||
|
if Gladdy.db.rangeCheckEnabled then
|
||||||
|
if unit == "arena1" then
|
||||||
|
--button.unit = "target"
|
||||||
|
--self:CreateTimer(button)
|
||||||
|
self:SetRangeAlpha(button, nil)
|
||||||
|
else
|
||||||
|
self:SetRangeAlpha(button, true)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self:SetRangeAlpha(button, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:UpdateFrame(unit)
|
||||||
|
if self.test then
|
||||||
|
self:Test(unit)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:SetColor(button, oorFac)
|
||||||
|
if button.lastState == oorFac then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not button.classColors then
|
||||||
|
if button.class then
|
||||||
|
button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
|
||||||
|
else
|
||||||
|
button.classColors = { r = 0.66, g = 0.66, b = 0.66 }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if Gladdy.db.rangeCheckHealthBar then
|
||||||
|
button.healthBar.hp:SetStatusBarColor(button.classColors.r/oorFac, button.classColors.g/oorFac, button.classColors.b/oorFac, 1)
|
||||||
|
else
|
||||||
|
button.healthBar.hp:SetStatusBarColor(button.classColors.r, button.classColors.g, button.classColors.b, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
if Gladdy.db.rangeCheckHealthBarText then
|
||||||
|
button.healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r/oorFac, Gladdy.db.healthBarFontColor.g/oorFac, Gladdy.db.healthBarFontColor.b/oorFac, Gladdy.db.healthBarFontColor.a)
|
||||||
|
button.healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r/oorFac, Gladdy.db.healthBarFontColor.g/oorFac, Gladdy.db.healthBarFontColor.b/oorFac, Gladdy.db.healthBarFontColor.a)
|
||||||
|
else
|
||||||
|
button.healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
|
||||||
|
button.healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
|
||||||
|
end
|
||||||
|
|
||||||
|
if Gladdy.db.rangeCheckPowerBar then
|
||||||
|
button.powerBar.energy:SetStatusBarColor(button.powerBar.powerColor.r/oorFac, button.powerBar.powerColor.g/oorFac, button.powerBar.powerColor.b/oorFac, 1)
|
||||||
|
else
|
||||||
|
button.powerBar.energy:SetStatusBarColor(button.powerBar.powerColor.r, button.powerBar.powerColor.g, button.powerBar.powerColor.b, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
if Gladdy.db.rangeCheckPowerBarText then
|
||||||
|
button.powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r/oorFac, Gladdy.db.powerBarFontColor.g/oorFac, Gladdy.db.powerBarFontColor.b/oorFac, Gladdy.db.powerBarFontColor.a)
|
||||||
|
button.powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r/oorFac, Gladdy.db.powerBarFontColor.g/oorFac, Gladdy.db.powerBarFontColor.b/oorFac, Gladdy.db.powerBarFontColor.a)
|
||||||
|
else
|
||||||
|
button.powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
|
||||||
|
button.powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
|
||||||
|
end
|
||||||
|
|
||||||
|
if Gladdy.db.rangeCheckTrinket then
|
||||||
|
button.trinket.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
|
||||||
|
else
|
||||||
|
button.trinket.texture:SetVertexColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
if Gladdy.db.rangeCheckClassIcon then
|
||||||
|
button.classIcon.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
|
||||||
|
button.aura.icon:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
|
||||||
|
else
|
||||||
|
button.classIcon.texture:SetVertexColor(1, 1, 1)
|
||||||
|
button.aura.icon:SetVertexColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
if Gladdy.db.rangeCheckRacial then
|
||||||
|
button.racial.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
|
||||||
|
else
|
||||||
|
button.racial.texture:SetVertexColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
button.lastState = oorFac
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:SetRangeAlpha(button, inRange)
|
||||||
|
local oorFac = Gladdy.db.rangeCheckOorFactor
|
||||||
|
if inRange then
|
||||||
|
RangeCheck:SetColor(button, 1)
|
||||||
|
else
|
||||||
|
RangeCheck:SetColor(button, oorFac)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:JOINED_ARENA()
|
||||||
|
self.test = nil
|
||||||
|
if Gladdy.db.rangeCheckEnabled then
|
||||||
|
for i = 1, Gladdy.curBracket do
|
||||||
|
local button = Gladdy.buttons["arena"..i]
|
||||||
|
--if i == 1 then button.unit = "focus" end
|
||||||
|
self:CreateTimer(button)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:ENEMY_STEALTH(unit, stealth)
|
||||||
|
local button = Gladdy.buttons[unit]
|
||||||
|
if not button then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
button.lastState = 0
|
||||||
|
if stealth then
|
||||||
|
button.healthBar.hp:SetStatusBarColor(0.66, 0.66, 0.66, 1)
|
||||||
|
button.classColors = { r = 0.66, g = 0.66, b = 0.66 }
|
||||||
|
else
|
||||||
|
if button.class then
|
||||||
|
button.healthBar.hp:SetStatusBarColor(RAID_CLASS_COLORS[button.class].r, RAID_CLASS_COLORS[button.class].g, RAID_CLASS_COLORS[button.class].b, 1)
|
||||||
|
button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck.CheckRange(self)
|
||||||
|
local button = self.parent
|
||||||
|
|
||||||
|
local spell = Gladdy.db.rangeCheckDefaultSpells[RangeCheck.playerClass].min
|
||||||
|
|
||||||
|
if( not UnitIsConnected(button.unit) or not UnitInPhase(button.unit) ) then
|
||||||
|
RangeCheck:SetRangeAlpha(button, false)
|
||||||
|
elseif( spell ) then
|
||||||
|
RangeCheck:SetRangeAlpha(button, LSR.IsSpellInRange(spell, button.unit) == 1)
|
||||||
|
-- That didn't work, but they are grouped lets try the actual API for this, it's a bit flaky though and not that useful generally
|
||||||
|
elseif( UnitInRaid(button.unit) or UnitInParty(button.unit) ) then
|
||||||
|
RangeCheck:SetRangeAlpha(button, UnitInRange(button.unit, "player"))
|
||||||
|
-- Nope, fall back to interaction :(
|
||||||
|
else
|
||||||
|
RangeCheck:SetRangeAlpha(button, CheckInteractDistance(button.unit, 4))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:CreateTimer(frame)
|
||||||
|
if not frame.range then
|
||||||
|
frame.range = C_Timer.NewTicker(0.05, RangeCheck.CheckRange)
|
||||||
|
frame.range.parent = frame
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:CancelTimer(frame)
|
||||||
|
if frame.range then
|
||||||
|
frame.range:Cancel()
|
||||||
|
frame.range = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:ForceUpdate(frame)
|
||||||
|
if( UnitIsUnit(frame.unit, "player") ) then
|
||||||
|
frame.healthBar:SetAlpha(1)
|
||||||
|
frame.powerBar:SetAlpha(1)
|
||||||
|
self:CancelTimer(frame)
|
||||||
|
else
|
||||||
|
self:CreateTimer(frame)
|
||||||
|
self.CheckRange(frame.parent)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:GetOptions()
|
||||||
|
return {
|
||||||
|
header = {
|
||||||
|
type = "header",
|
||||||
|
name = L["Range Check"],
|
||||||
|
order = 2,
|
||||||
|
},
|
||||||
|
|
||||||
|
rangeCheckEnabled = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Enabled"],
|
||||||
|
desc = L["Enable racial icon"],
|
||||||
|
order = 3,
|
||||||
|
}),
|
||||||
|
group = {
|
||||||
|
type = "group",
|
||||||
|
childGroups = "tree",
|
||||||
|
name = L["General"],
|
||||||
|
order = 5,
|
||||||
|
args = {
|
||||||
|
general = {
|
||||||
|
type = "group",
|
||||||
|
name = L["General"],
|
||||||
|
order = 1,
|
||||||
|
args = {
|
||||||
|
header = {
|
||||||
|
type = "header",
|
||||||
|
name = L["General"],
|
||||||
|
order = 1,
|
||||||
|
},
|
||||||
|
rangeCheckOorFactor = Gladdy:option({
|
||||||
|
type = "range",
|
||||||
|
name = L["Out of Range Darkening Level"],
|
||||||
|
desc = L["Higher is darker"],
|
||||||
|
min = 1.1,
|
||||||
|
max = 5,
|
||||||
|
step = 0.1,
|
||||||
|
width = "full",
|
||||||
|
order = 2,
|
||||||
|
}),
|
||||||
|
rangeCheckHealthBar = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Health Bar"],
|
||||||
|
width = "full",
|
||||||
|
order = 3,
|
||||||
|
}),
|
||||||
|
rangeCheckHealthBarText = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Health Bar Text"],
|
||||||
|
width = "full",
|
||||||
|
order = 4,
|
||||||
|
}),
|
||||||
|
rangeCheckPowerBar = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Power Bar"],
|
||||||
|
width = "full",
|
||||||
|
order = 5,
|
||||||
|
}),
|
||||||
|
rangeCheckPowerBarText = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Power Bar Text"],
|
||||||
|
width = "full",
|
||||||
|
order = 6,
|
||||||
|
}),
|
||||||
|
rangeCheckClassIcon = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Class Icon"],
|
||||||
|
width = "full",
|
||||||
|
order = 7,
|
||||||
|
}),
|
||||||
|
rangeCheckTrinket = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Trinket"],
|
||||||
|
width = "full",
|
||||||
|
order = 8,
|
||||||
|
}),
|
||||||
|
rangeCheckRacial = Gladdy:option({
|
||||||
|
type = "toggle",
|
||||||
|
name = L["Fade"] .. " " .. L["Racial"],
|
||||||
|
width = "full",
|
||||||
|
order = 9,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
oorSpells = {
|
||||||
|
type = "group",
|
||||||
|
childGroups = "tree",
|
||||||
|
name = L["Spells"],
|
||||||
|
order = 5,
|
||||||
|
args = RangeCheck:GetSpells(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function RangeCheck:GetSpells()
|
||||||
|
local group = {
|
||||||
|
description = {
|
||||||
|
type = "description",
|
||||||
|
name = "Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066.",
|
||||||
|
order = 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i,class in ipairs(Gladdy.CLASSES) do
|
||||||
|
group[class] = {
|
||||||
|
type = "group",
|
||||||
|
name = LOCALIZED_CLASS_NAMES_MALE[class],
|
||||||
|
order = i + 1,
|
||||||
|
icon = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes",
|
||||||
|
iconCoords = CLASS_ICON_TCOORDS[class],
|
||||||
|
args = {
|
||||||
|
headerMin = {
|
||||||
|
type = "header",
|
||||||
|
name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %dyds", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
|
||||||
|
or "nil",
|
||||||
|
order = 1,
|
||||||
|
},
|
||||||
|
min = {
|
||||||
|
type = "input",
|
||||||
|
name = "Spell ID", --format("|T%s:20|t %s", select(3, GetSpellInfo(k)), select(1, GetSpellInfo(k)))
|
||||||
|
order = 2,
|
||||||
|
width = "full",
|
||||||
|
pattern = "%d+",
|
||||||
|
validate = function(_, value)
|
||||||
|
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
|
||||||
|
return type(tonumber(value)) == "number"
|
||||||
|
end,
|
||||||
|
--image = select(3, GetSpellInfo(defaultSpells()[class].min)),
|
||||||
|
get = function(_)
|
||||||
|
return tostring(Gladdy.db.rangeCheckDefaultSpells[class].min)
|
||||||
|
end,
|
||||||
|
set = function(_, value)
|
||||||
|
Gladdy.db.rangeCheckDefaultSpells[class].min = tonumber(value)
|
||||||
|
--Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.min.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
|
||||||
|
-- or "nil"
|
||||||
|
Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %dyds", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
|
||||||
|
or "nil"
|
||||||
|
end
|
||||||
|
},
|
||||||
|
--[[headerMax = {
|
||||||
|
type = "header",
|
||||||
|
name = L["Max"],
|
||||||
|
order = 3,
|
||||||
|
},
|
||||||
|
max = {
|
||||||
|
type = "input",
|
||||||
|
name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)))
|
||||||
|
or "nil",
|
||||||
|
order = 4,
|
||||||
|
width = "full",
|
||||||
|
pattern = "%d+",
|
||||||
|
validate = function(_, value)
|
||||||
|
return type(tonumber(value)) == "number"
|
||||||
|
end,
|
||||||
|
--image = select(3, GetSpellInfo(defaultSpells()[class].max)),
|
||||||
|
get = function(_)
|
||||||
|
return tostring(Gladdy.db.rangeCheckDefaultSpells[class].max)
|
||||||
|
end,
|
||||||
|
set = function(_, value)
|
||||||
|
Gladdy.db.rangeCheckDefaultSpells[class].max = tonumber(value)
|
||||||
|
Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.max.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)))
|
||||||
|
or "nil"
|
||||||
|
end
|
||||||
|
}--]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
return group
|
||||||
|
end
|
@ -14,4 +14,5 @@
|
|||||||
<Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/>
|
<Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/>
|
||||||
<Include file="libs\DRData-1.0\DRData-1.0.xml"/>
|
<Include file="libs\DRData-1.0\DRData-1.0.xml"/>
|
||||||
<Include file="libs\LibClassAuras-1.0\lib.xml"/>
|
<Include file="libs\LibClassAuras-1.0\lib.xml"/>
|
||||||
|
<Include file="libs\LibSpellRange-1.0\lib.xml"/>
|
||||||
</Ui>
|
</Ui>
|
Loading…
Reference in New Issue
Block a user