mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-19 11:00:50 +00:00
Compare commits
45
Commits
9daf6165fd
...
v9.0.22
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
60f953178f | ||
|
|
1dc10964a2 | ||
|
|
0fc08e77c0 | ||
|
|
7f3795b45b | ||
|
|
8eee766652 | ||
|
|
2b5288a688 | ||
|
|
daba4e202e | ||
|
|
98c7751416 | ||
|
|
8796fab6d8 | ||
|
|
7ca0e40d8b | ||
|
|
2f93b246a1 | ||
|
|
c647698f8f | ||
|
|
48026008b6 | ||
|
|
c1d96bae58 | ||
|
|
1d44c5ec6f | ||
|
|
8f88dfd852 | ||
|
|
a57214aeb0 | ||
|
|
9bde843e33 | ||
|
|
ad13e6ace3 | ||
|
|
82c74c2db5 | ||
|
|
a3cfd711fe | ||
|
|
a7ad1f073f | ||
|
|
fe5b3b135b | ||
|
|
9c29f0c7d4 | ||
|
|
685ecb4a3e | ||
|
|
8cdaf1fc00 | ||
|
|
bb39c9d94e | ||
|
|
18059ffbb7 | ||
|
|
d75e280238 | ||
|
|
9eb34b8f0a | ||
|
|
f8dde49f09 | ||
|
|
74fbbb6154 | ||
|
|
af6893c10c | ||
|
|
be6b2ea036 | ||
|
|
afdb6c3862 | ||
|
|
b230a45b92 | ||
|
|
ef1fa47539 | ||
|
|
ab0ad7dcf9 | ||
|
|
c82813df5b | ||
|
|
6e1f8095a2 | ||
|
|
9cabdf2974 | ||
|
|
b6931359b0 | ||
|
|
e017dbf515 | ||
|
|
69d778d6d6 | ||
|
|
75a25cf614 |
+22
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"runtime": {
|
||||||
|
"version": "Lua 5.1"
|
||||||
|
},
|
||||||
|
"diagnostics": {
|
||||||
|
"disable": ["deprecated"],
|
||||||
|
"globals": [
|
||||||
|
"this",
|
||||||
|
"event",
|
||||||
|
"arg",
|
||||||
|
"arg1",
|
||||||
|
"arg2",
|
||||||
|
"arg3",
|
||||||
|
"arg4",
|
||||||
|
"arg5",
|
||||||
|
"arg6",
|
||||||
|
"arg7",
|
||||||
|
"arg8",
|
||||||
|
"arg9"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
+30
-1
@@ -204,6 +204,12 @@ function pfUI.api.UnitHasBuff(unit, name)
|
|||||||
return C_UnitAuras.GetAuraDataBySpellName(unit, name, "HELPFUL") ~= nil or nil
|
return C_UnitAuras.GetAuraDataBySpellName(unit, name, "HELPFUL") ~= nil or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- [ IsPlayerGuid ]
|
||||||
|
-- Returns whether a GUID or unit token refers to the local player.
|
||||||
|
-- guid [string] A unit GUID (or unitID) to test.
|
||||||
|
-- return: [bool] true if it is the player otherwise "false"
|
||||||
|
pfUI.api.IsPlayerGuid = _G.IsPlayerGuid
|
||||||
|
|
||||||
-- [ GetUnbuffedRoster ]
|
-- [ GetUnbuffedRoster ]
|
||||||
-- Returns a comma-joined, colored list of group members missing the named aura.
|
-- Returns a comma-joined, colored list of group members missing the named aura.
|
||||||
-- name [string] the localized aura name to check for
|
-- name [string] the localized aura name to check for
|
||||||
@@ -397,14 +403,33 @@ end
|
|||||||
-- Returns an itemLink for the given itemname
|
-- Returns an itemLink for the given itemname
|
||||||
-- 'name' [string] name of the item
|
-- 'name' [string] name of the item
|
||||||
-- returns: [string] entire itemLink for the given item
|
-- returns: [string] entire itemLink for the given item
|
||||||
|
local itemLinkCache = {}
|
||||||
|
local itemLinkMisses = {}
|
||||||
|
local ITEMLINK_MAX_SCANS = 2
|
||||||
function pfUI.api.GetItemLinkByName(name)
|
function pfUI.api.GetItemLinkByName(name)
|
||||||
for itemID = 1, 25818 do
|
-- GetInboxItem() hands us a nil name for attachment-less mail
|
||||||
|
if not name then return end
|
||||||
|
-- cache successful resolutions so repeated lookups (e.g. per inbox click) are free
|
||||||
|
if itemLinkCache[name] then return itemLinkCache[name] end
|
||||||
|
|
||||||
|
-- Failures have to be counted, not just retried. An unresolvable name walks
|
||||||
|
-- the entire id range and finds nothing -- a visible hitch on every tooltip
|
||||||
|
-- hover. Allow a couple of attempts (rendering the tooltip caches the item,
|
||||||
|
-- so the next hover usually resolves), then stop scanning for that name.
|
||||||
|
local misses = itemLinkMisses[name] or 0
|
||||||
|
if misses >= ITEMLINK_MAX_SCANS then return end
|
||||||
|
|
||||||
|
-- Octo/Turtle custom items live well past the 25818 vanilla ceiling
|
||||||
|
for itemID = 1, 61000 do
|
||||||
local itemName = C_Item.GetItemNameByID(itemID)
|
local itemName = C_Item.GetItemNameByID(itemID)
|
||||||
if itemName and itemName == name then
|
if itemName and itemName == name then
|
||||||
local _, itemLink = C_Item.GetItemInfo(itemID)
|
local _, itemLink = C_Item.GetItemInfo(itemID)
|
||||||
|
itemLinkCache[name] = itemLink
|
||||||
return itemLink
|
return itemLink
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
itemLinkMisses[name] = misses + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [ FindItem ]
|
-- [ FindItem ]
|
||||||
@@ -646,6 +671,10 @@ end
|
|||||||
function pfUI.api.CreateGoldString(money)
|
function pfUI.api.CreateGoldString(money)
|
||||||
if type(money) ~= "number" then return "-" end
|
if type(money) ~= "number" then return "-" end
|
||||||
|
|
||||||
|
if _G.GetCoinTextureString then
|
||||||
|
return "|cffffffff" .. _G.GetCoinTextureString(money) .. "|r"
|
||||||
|
end
|
||||||
|
|
||||||
local gold = floor(money/ 100 / 100)
|
local gold = floor(money/ 100 / 100)
|
||||||
local silver = floor(mod((money/100),100))
|
local silver = floor(mod((money/100),100))
|
||||||
local copper = floor(mod(money,100))
|
local copper = floor(mod(money,100))
|
||||||
|
|||||||
@@ -785,6 +785,9 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("tooltip", nil, "itemid", "0")
|
pfUI:UpdateConfig("tooltip", nil, "itemid", "0")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "movespeed", "0")
|
pfUI:UpdateConfig("tooltip", nil, "movespeed", "0")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "aurasource", "0")
|
pfUI:UpdateConfig("tooltip", nil, "aurasource", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "spellid", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "unitid", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "showbuffs", "0")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "alpha", "0.8")
|
pfUI:UpdateConfig("tooltip", nil, "alpha", "0.8")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "alwaysperc", "0")
|
pfUI:UpdateConfig("tooltip", nil, "alwaysperc", "0")
|
||||||
pfUI:UpdateConfig("tooltip", "compare", "basestats", "1")
|
pfUI:UpdateConfig("tooltip", "compare", "basestats", "1")
|
||||||
@@ -963,6 +966,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("thirdparty", "dpsmate", "dock", "0")
|
pfUI:UpdateConfig("thirdparty", "dpsmate", "dock", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "shagudps", "skin", "0")
|
pfUI:UpdateConfig("thirdparty", "shagudps", "skin", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "shagudps", "dock", "0")
|
pfUI:UpdateConfig("thirdparty", "shagudps", "dock", "0")
|
||||||
|
pfUI:UpdateConfig("thirdparty", "greedmeter", "dock", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "swstats", "skin", "0")
|
pfUI:UpdateConfig("thirdparty", "swstats", "skin", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "swstats", "dock", "0")
|
pfUI:UpdateConfig("thirdparty", "swstats", "dock", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "ktm", "skin", "0")
|
pfUI:UpdateConfig("thirdparty", "ktm", "skin", "0")
|
||||||
|
|||||||
+126
-73
@@ -140,32 +140,43 @@ function pfUI.api.GetUnitStats(unitstr)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local aggrodata = { }
|
local aggrodata = { }
|
||||||
|
local aggroScan = nil -- static { u, t, tt } triples, built once so the hot scan allocates nothing
|
||||||
function pfUI.api.UnitHasAggro(unit)
|
function pfUI.api.UnitHasAggro(unit)
|
||||||
-- Only cache positive results to allow instant detection when aggro changes
|
local now = GetTime()
|
||||||
if aggrodata[unit] and aggrodata[unit].state > 0 and GetTime() < aggrodata[unit].check + 1 then
|
local data = aggrodata[unit]
|
||||||
return aggrodata[unit].state
|
-- Cache positive results 1s (so aggro clears fast) AND negative results 0.3s
|
||||||
|
-- (so we don't rescan the whole unit table on every call while nothing has aggro).
|
||||||
|
if data and now < data.check + (data.state > 0 and 1 or 0.3) then
|
||||||
|
return data.state
|
||||||
end
|
end
|
||||||
|
|
||||||
aggrodata[unit] = aggrodata[unit] or { }
|
if not data then data = { }; aggrodata[unit] = data end
|
||||||
aggrodata[unit].check = GetTime()
|
data.check = now
|
||||||
aggrodata[unit].state = 0
|
data.state = 0
|
||||||
|
|
||||||
if UnitExists(unit) and UnitIsFriend(unit, "player") then
|
if UnitExists(unit) and UnitIsFriend(unit, "player") then
|
||||||
for u in pairs(pfValidUnits) do
|
-- pfValidUnits never changes after load, so precompute the "<u>target" /
|
||||||
local t = u .. "target"
|
-- "<u>targettarget" token strings once instead of concatenating per call.
|
||||||
local tt = t .. "target"
|
if not aggroScan then
|
||||||
|
aggroScan = {}
|
||||||
if UnitExists(t) and UnitIsUnit(t, unit) and UnitCanAttack(u, unit) then
|
for u in pairs(pfValidUnits) do
|
||||||
aggrodata[unit].state = aggrodata[unit].state + 1
|
local t = u .. "target"
|
||||||
|
table.insert(aggroScan, { u = u, t = t, tt = t .. "target" })
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if UnitExists(tt) and UnitIsUnit(tt, unit) and UnitCanAttack(t, unit) then
|
for i = 1, table.getn(aggroScan) do
|
||||||
aggrodata[unit].state = aggrodata[unit].state + 1
|
local s = aggroScan[i]
|
||||||
|
if UnitExists(s.t) and UnitIsUnit(s.t, unit) and UnitCanAttack(s.u, unit) then
|
||||||
|
data.state = data.state + 1
|
||||||
|
end
|
||||||
|
if UnitExists(s.tt) and UnitIsUnit(s.tt, unit) and UnitCanAttack(s.t, unit) then
|
||||||
|
data.state = data.state + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return aggrodata[unit].state
|
return data.state
|
||||||
end
|
end
|
||||||
|
|
||||||
pfUI.uf.glow = CreateFrame("Frame", nil, UIParent)
|
pfUI.uf.glow = CreateFrame("Frame", nil, UIParent)
|
||||||
@@ -194,8 +205,13 @@ function pfUI.uf:UpdateVisibility()
|
|||||||
|
|
||||||
-- cache result of strsub to avoid repeating calls
|
-- cache result of strsub to avoid repeating calls
|
||||||
if not self.cache_raid then
|
if not self.cache_raid then
|
||||||
if strsub(self:GetName(),0,6) == "pfRaid" then
|
local name = self:GetName()
|
||||||
self.cache_raid = tonumber(strsub(self:GetName(),7,8)) or 0
|
if strsub(name,0,9) == "pfRaidPet" then
|
||||||
|
-- pet grid slot (pfRaidPet1..40); used to mirror party pets below
|
||||||
|
self.cache_raid = 0
|
||||||
|
self.cache_raidpet = tonumber(strsub(name,10)) or 0
|
||||||
|
elseif strsub(name,0,6) == "pfRaid" then
|
||||||
|
self.cache_raid = tonumber(strsub(name,7,8)) or 0
|
||||||
else
|
else
|
||||||
self.cache_raid = 0
|
self.cache_raid = 0
|
||||||
end
|
end
|
||||||
@@ -227,6 +243,26 @@ function pfUI.uf:UpdateVisibility()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- show raidpet frames as party pets when a party is shown as a raid grid
|
||||||
|
if self.cache_raidpet then
|
||||||
|
if not IsInRaid() and IsInGroup() and C.unitframes.raidforgroup == "1" then
|
||||||
|
local id = self.cache_raidpet
|
||||||
|
if id == 1 then
|
||||||
|
-- grid slot 1 mirrors the player, so its pet is the player's pet
|
||||||
|
self.id = ""
|
||||||
|
self.label = "pet"
|
||||||
|
elseif id <= 5 then
|
||||||
|
self.id = id - 1
|
||||||
|
self.label = "partypet"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- reset to regular raidpet unitstrings after leaving party mode
|
||||||
|
elseif self.label == "pet" or self.label == "partypet" then
|
||||||
|
self.id = self.cache_raidpet
|
||||||
|
self.label = "raidpet"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- display every unit as player while pfUI.uf.showall is set
|
-- display every unit as player while pfUI.uf.showall is set
|
||||||
if pfUI.uf.showall then
|
if pfUI.uf.showall then
|
||||||
self._label = self._label or self.label
|
self._label = self._label or self.label
|
||||||
@@ -255,9 +291,10 @@ function pfUI.uf:UpdateVisibility()
|
|||||||
-- frame shall not be visible
|
-- frame shall not be visible
|
||||||
visibility = "hide"
|
visibility = "hide"
|
||||||
self.visible = nil
|
self.visible = nil
|
||||||
elseif hide_group and self.cache_raid == 0 and self.label and strsub(self.label,0,5) == "party" then
|
elseif hide_group and self.cache_raid == 0 and not self.cache_raidpet and self.label and strsub(self.label,0,5) == "party" then
|
||||||
-- hide group while shown as a raid grid and option is set (raid frames
|
-- hide group while shown as a raid grid and option is set (raid player
|
||||||
-- carry label "party" under raidforgroup, so exclude them by cache_raid)
|
-- frames carry label "party" and raid pet frames carry label "partypet"
|
||||||
|
-- under raidforgroup, so exclude them by cache_raid / cache_raidpet)
|
||||||
visibility = "hide"
|
visibility = "hide"
|
||||||
self.visible = nil
|
self.visible = nil
|
||||||
elseif ( self.fname == "Group0" or self.fname == "PartyPet0" or self.fname == "Party0Target" )
|
elseif ( self.fname == "Group0" or self.fname == "PartyPet0" or self.fname == "Party0Target" )
|
||||||
@@ -1601,39 +1638,40 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
for i=1, unit.config.bufflimit do
|
for i=1, unit.config.bufflimit do
|
||||||
if not unit.buffs[i] then break end
|
if not unit.buffs[i] then break end
|
||||||
|
|
||||||
local aura = C_UnitAuras.GetBuffDataByIndex(unitstr, i)
|
-- positional UnitBuff allocates nothing (vs a table per icon per refresh)
|
||||||
|
local name, icon, count, _, duration, expirationTime, _, _, _, spellId = C_UnitAuras.UnitBuff(unitstr, i)
|
||||||
|
|
||||||
if aura then
|
if name then
|
||||||
unit.buffs[i].texture:SetTexture(aura.icon)
|
unit.buffs[i].texture:SetTexture(icon)
|
||||||
unit.buffs[i]:Show()
|
unit.buffs[i]:Show()
|
||||||
|
|
||||||
if aura.applications > 1 then
|
if count > 1 then
|
||||||
unit.buffs[i].stacks:SetText(aura.applications)
|
unit.buffs[i].stacks:SetText(count)
|
||||||
else
|
else
|
||||||
unit.buffs[i].stacks:SetText("")
|
unit.buffs[i].stacks:SetText("")
|
||||||
end
|
end
|
||||||
|
|
||||||
if aura.expirationTime > 0 then
|
if expirationTime > 0 then
|
||||||
-- pfUI's cooldown text falls into a 2^32 wraparound branch when start > GetTime(),
|
-- pfUI's cooldown text falls into a 2^32 wraparound branch when start > GetTime(),
|
||||||
-- which happens for talent-extended buffs where the real duration exceeds aura.duration
|
-- which happens for talent-extended buffs where the real duration exceeds the
|
||||||
-- (the Spell.dbc base). Anchor start to now in that case to keep the remaining math sane.
|
-- Spell.dbc base. Anchor start to now in that case to keep the remaining math sane.
|
||||||
local now = GetTime()
|
local now = GetTime()
|
||||||
local start = aura.expirationTime - aura.duration
|
local start = expirationTime - duration
|
||||||
local duration = aura.duration
|
local dur = duration
|
||||||
if start > now or duration <= 0 then
|
if start > now or dur <= 0 then
|
||||||
start, duration = now, aura.expirationTime - now
|
start, dur = now, expirationTime - now
|
||||||
end
|
end
|
||||||
if duration > 0 then
|
if dur > 0 then
|
||||||
CooldownFrame_SetTimer(unit.buffs[i].cd, start, duration, 1)
|
CooldownFrame_SetTimer(unit.buffs[i].cd, start, dur, 1)
|
||||||
else
|
else
|
||||||
CooldownFrame_SetTimer(unit.buffs[i].cd, 0, 0, 0)
|
CooldownFrame_SetTimer(unit.buffs[i].cd, 0, 0, 0)
|
||||||
end
|
end
|
||||||
elseif aura.duration > 0 then
|
elseif duration > 0 then
|
||||||
local guid = UnitGUID(unitstr)
|
local guid = UnitGUID(unitstr)
|
||||||
local guidStarts = guid and pfUI.uf.aura_starts[guid]
|
local guidStarts = guid and pfUI.uf.aura_starts[guid]
|
||||||
local start = guidStarts and guidStarts[aura.spellId]
|
local start = guidStarts and guidStarts[spellId]
|
||||||
if start then
|
if start then
|
||||||
CooldownFrame_SetTimer(unit.buffs[i].cd, start, aura.duration, 1)
|
CooldownFrame_SetTimer(unit.buffs[i].cd, start, duration, 1)
|
||||||
else
|
else
|
||||||
CooldownFrame_SetTimer(unit.buffs[i].cd, 0, 0, 0)
|
CooldownFrame_SetTimer(unit.buffs[i].cd, 0, 0, 0)
|
||||||
end
|
end
|
||||||
@@ -1704,10 +1742,11 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
-- selfdebuff narrows to player-cast harmful auras via the PLAYER filter.
|
-- selfdebuff narrows to player-cast harmful auras via the PLAYER filter.
|
||||||
-- Player-frame debuffs aren't gated on it (it'd hide most party-applied
|
-- Player-frame debuffs aren't gated on it (it'd hide most party-applied
|
||||||
-- effects on you).
|
-- effects on you).
|
||||||
local filter = (unit.label ~= "player" and selfdebuff == "1") and "HARMFUL|PLAYER" or "HARMFUL"
|
-- positional UnitDebuff allocates nothing; PLAYER predicate honored for selfdebuff
|
||||||
local aura = C_UnitAuras.GetAuraDataByIndex(unitstr, i, filter)
|
local filter = (unit.label ~= "player" and selfdebuff == "1") and "PLAYER" or nil
|
||||||
if aura then
|
local name, icon, count, dispelType, duration, expirationTime = C_UnitAuras.UnitDebuff(unitstr, i, filter)
|
||||||
texture, stacks, dtype = aura.icon, aura.applications, aura.dispelName
|
if name then
|
||||||
|
texture, stacks, dtype = icon, count, dispelType
|
||||||
else
|
else
|
||||||
texture, stacks, dtype = nil, 0, nil
|
texture, stacks, dtype = nil, 0, nil
|
||||||
end
|
end
|
||||||
@@ -1720,18 +1759,18 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
if texture then
|
if texture then
|
||||||
unit.debuffs[i]:Show()
|
unit.debuffs[i]:Show()
|
||||||
|
|
||||||
if aura and aura.expirationTime > 0 then
|
if expirationTime > 0 then
|
||||||
-- Cap start to now so talent-extended debuffs (expirationTime past
|
-- Cap start to now so talent-extended debuffs (expirationTime past
|
||||||
-- the dbc base duration) don't push start into the future and trip
|
-- the dbc base duration) don't push start into the future and trip
|
||||||
-- CooldownFrame_SetTimer's 2^32-wraparound branch.
|
-- CooldownFrame_SetTimer's 2^32-wraparound branch.
|
||||||
local now = GetTime()
|
local now = GetTime()
|
||||||
local start = aura.expirationTime - aura.duration
|
local start = expirationTime - duration
|
||||||
local duration = aura.duration
|
local dur = duration
|
||||||
if start > now or duration <= 0 then
|
if start > now or dur <= 0 then
|
||||||
start, duration = now, aura.expirationTime - now
|
start, dur = now, expirationTime - now
|
||||||
end
|
end
|
||||||
if duration > 0 then
|
if dur > 0 then
|
||||||
CooldownFrame_SetTimer(unit.debuffs[i].cd, start, duration, 1)
|
CooldownFrame_SetTimer(unit.debuffs[i].cd, start, dur, 1)
|
||||||
else
|
else
|
||||||
CooldownFrame_SetTimer(unit.debuffs[i].cd, 0, 0, 0)
|
CooldownFrame_SetTimer(unit.debuffs[i].cd, 0, 0, 0)
|
||||||
end
|
end
|
||||||
@@ -1789,6 +1828,17 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Scan the 16 harmful slots once into a reusable set, instead of
|
||||||
|
-- re-scanning all 16 for every dispellable type below. Reused across
|
||||||
|
-- frames (populated and consumed within this single RefreshUnit call).
|
||||||
|
local present = pfUI.uf.dispelPresent or {}
|
||||||
|
pfUI.uf.dispelPresent = present
|
||||||
|
for k in pairs(present) do present[k] = nil end
|
||||||
|
for i=1,16 do
|
||||||
|
local name, _, _, dispelType = C_UnitAuras.UnitDebuff(unitstr, i)
|
||||||
|
if name and dispelType and dispelType ~= "" then present[dispelType] = true end
|
||||||
|
end
|
||||||
|
|
||||||
for _, debuff in pairs(unit.dispellable) do
|
for _, debuff in pairs(unit.dispellable) do
|
||||||
indicator[debuff] = indicator[debuff] or CreateFrame("Frame", nil, indicator)
|
indicator[debuff] = indicator[debuff] or CreateFrame("Frame", nil, indicator)
|
||||||
indicator[debuff]:SetParent(indicator)
|
indicator[debuff]:SetParent(indicator)
|
||||||
@@ -1828,15 +1878,7 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
indicator[debuff].disp = indicator.disp
|
indicator[debuff].disp = indicator.disp
|
||||||
end
|
end
|
||||||
|
|
||||||
indicator[debuff].visible = nil
|
indicator[debuff].visible = present[debuff]
|
||||||
|
|
||||||
for i=1,16 do
|
|
||||||
local a = C_UnitAuras.GetDebuffDataByIndex(unitstr, i)
|
|
||||||
local dtype = a and a.dispelName
|
|
||||||
if dtype == debuff then
|
|
||||||
indicator[debuff].visible = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if indicator[debuff].visible then
|
if indicator[debuff].visible then
|
||||||
indicator[debuff]:Show()
|
indicator[debuff]:Show()
|
||||||
@@ -1883,50 +1925,58 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
|
|
||||||
local pos = 1
|
local pos = 1
|
||||||
if table.getn(unit.indicators) > 0 then
|
if table.getn(unit.indicators) > 0 then
|
||||||
for _, aura in ipairs(C_UnitAuras.GetUnitAuras(unitstr, "HELPFUL")) do
|
local i = 1
|
||||||
local texLower = string.lower(aura.icon)
|
while true do
|
||||||
local timeleft = aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or nil
|
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitBuff(unitstr, i)
|
||||||
|
if not name then break end
|
||||||
|
local texLower = string.lower(icon)
|
||||||
|
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
||||||
|
|
||||||
for _, filter in pairs(unit.indicators) do
|
for _, filter in pairs(unit.indicators) do
|
||||||
if filter == texLower then
|
if filter == texLower then
|
||||||
local hot = HOT_INDICATORS[texLower]
|
local hot = HOT_INDICATORS[texLower]
|
||||||
if hot and string.lower(aura.name) ~= hot.name then
|
if hot and string.lower(name) ~= hot.name then
|
||||||
break -- texture matches but name disambiguates (e.g. shared icon)
|
break -- texture matches but name disambiguates (e.g. shared icon)
|
||||||
end
|
end
|
||||||
if hot then
|
if hot then
|
||||||
local start, duration, prediction = libpredict:GetHotDuration(unitstr, hot.predict)
|
local start, duration, prediction = libpredict:GetHotDuration(unitstr, hot.predict)
|
||||||
pfUI.uf:AddIcon(unit, pos, aura.icon, timeleft or prediction, aura.applications, tonumber(start), tonumber(duration))
|
pfUI.uf:AddIcon(unit, pos, icon, timeleft or prediction, count, tonumber(start), tonumber(duration))
|
||||||
else
|
else
|
||||||
pfUI.uf:AddIcon(unit, pos, aura.icon, timeleft, aura.applications)
|
pfUI.uf:AddIcon(unit, pos, icon, timeleft, count)
|
||||||
end
|
end
|
||||||
pos = pos + 1
|
pos = pos + 1
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if table.getn(unit.indicator_custom) > 0 then
|
if table.getn(unit.indicator_custom) > 0 then
|
||||||
for _, aura in ipairs(C_UnitAuras.GetUnitAuras(unitstr, "HELPFUL")) do
|
local ai = 1
|
||||||
local timeleft = aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or nil
|
while true do
|
||||||
local lowerName = string.lower(aura.name)
|
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitBuff(unitstr, ai)
|
||||||
|
if not name then break end
|
||||||
|
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
||||||
|
local lowerName = string.lower(name)
|
||||||
for _, filter in pairs(unit.indicator_custom) do
|
for _, filter in pairs(unit.indicator_custom) do
|
||||||
if filter == lowerName then
|
if filter == lowerName then
|
||||||
pfUI.uf:AddIcon(unit, pos, aura.icon, timeleft, aura.applications)
|
pfUI.uf:AddIcon(unit, pos, icon, timeleft, count)
|
||||||
pos = pos + 1
|
pos = pos + 1
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
ai = ai + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local debuffFilter = unit.config.selfdebuff == "1" and "HARMFUL|PLAYER" or "HARMFUL"
|
local debuffFilter = unit.config.selfdebuff == "1" and "PLAYER" or nil
|
||||||
for i=1,16 do -- scan for custom debuffs
|
for i=1,16 do -- scan for custom debuffs
|
||||||
local aura = C_UnitAuras.GetAuraDataByIndex(unitstr, i, debuffFilter)
|
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitDebuff(unitstr, i, debuffFilter)
|
||||||
if aura then
|
if name then
|
||||||
local timeleft = aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or nil
|
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
||||||
for _, filter in pairs(unit.indicator_custom) do
|
for _, filter in pairs(unit.indicator_custom) do
|
||||||
if filter == string.lower(aura.name) then
|
if filter == string.lower(name) then
|
||||||
pfUI.uf:AddIcon(unit, pos, aura.icon, timeleft, aura.applications)
|
pfUI.uf:AddIcon(unit, pos, icon, timeleft, count)
|
||||||
pos = pos + 1
|
pos = pos + 1
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@@ -2141,6 +2191,9 @@ function pfUI.uf:EnableClickCast()
|
|||||||
self:SetAttribute(prefix .. "type" .. bid, "target")
|
self:SetAttribute(prefix .. "type" .. bid, "target")
|
||||||
elseif low == "focus" then
|
elseif low == "focus" then
|
||||||
self:SetAttribute(prefix .. "type" .. bid, "focus")
|
self:SetAttribute(prefix .. "type" .. bid, "focus")
|
||||||
|
elseif string.find(low, "^macro:") then
|
||||||
|
self:SetAttribute(prefix .. "type" .. bid, "macro")
|
||||||
|
self:SetAttribute(prefix .. "macro" .. bid, string.gsub(string.sub(action, 7), "^%s+", ""))
|
||||||
elseif string.find(action, "^/") then
|
elseif string.find(action, "^/") then
|
||||||
self:SetAttribute(prefix .. "type" .. bid, "macro")
|
self:SetAttribute(prefix .. "type" .. bid, "macro")
|
||||||
self:SetAttribute(prefix .. "macrotext" .. bid, action)
|
self:SetAttribute(prefix .. "macrotext" .. bid, action)
|
||||||
|
|||||||
Vendored
+6
@@ -63,6 +63,12 @@ for i=1,40 do
|
|||||||
pfValidUnits["nameplate" .. i .. "target"] = true
|
pfValidUnits["nameplate" .. i .. "target"] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if TURTLE_WOW_VERSION then -- We already know this table is going to be replaced by turtle-wow.lua, so there's no point in declaring it.
|
||||||
|
pfSellData = {} -- create empty just incase user has turtle-wow module disabled.
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- This table makes me sick.
|
||||||
-- itemid = buyPrice (copper). Sell price comes from C_Item.GetItemSellPriceByID;
|
-- itemid = buyPrice (copper). Sell price comes from C_Item.GetItemSellPriceByID;
|
||||||
-- this table only carries the curated vendor-buy price (which isn't a static
|
-- this table only carries the curated vendor-buy price (which isn't a static
|
||||||
-- engine field — it's collected from real vendor encounters).
|
-- engine field — it's collected from real vendor encounters).
|
||||||
|
|||||||
@@ -41,8 +41,6 @@
|
|||||||
<!-- Turtle WoW -->
|
<!-- Turtle WoW -->
|
||||||
<Include file="..\skins\blizzard\barbershop.lua"/>
|
<Include file="..\skins\blizzard\barbershop.lua"/>
|
||||||
<Include file="..\skins\blizzard\transmog.lua"/>
|
<Include file="..\skins\blizzard\transmog.lua"/>
|
||||||
<Include file="..\skins\blizzard\custom_merchant.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\arena_score.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\ebc.lua"/>
|
<Include file="..\skins\blizzard\ebc.lua"/>
|
||||||
|
|
||||||
</Ui>
|
</Ui>
|
||||||
|
|||||||
+4
-1
@@ -168,6 +168,9 @@ pfUI.libdebuff_spell_start_self_hooks["libpredict"] = function(spellId, casterGu
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
spell_queue[1] = spellName
|
||||||
|
spell_queue[2] = spellName .. (C_Spell.GetSpellSubtext(spellId) or "")
|
||||||
|
|
||||||
if spell_queue[1] == spellName and cache[spell_queue[2]] then
|
if spell_queue[1] == spellName and cache[spell_queue[2]] then
|
||||||
local amount = cache[spell_queue[2]][1]
|
local amount = cache[spell_queue[2]][1]
|
||||||
local casttime = castTime
|
local casttime = castTime
|
||||||
@@ -1222,7 +1225,7 @@ libpredict.sender:SetScript("OnEvent", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
function libpredict:GetHotDuration(unit, spell)
|
function libpredict:GetHotDuration(unit, spell)
|
||||||
if unit == UNKNOWNOBJECT or unit == UNKOWNBEING then return end
|
if unit == UNKNOWNOBJECT or unit == UKNOWNBEING then return end
|
||||||
|
|
||||||
-- NEW: Try libdebuff first (Nampower AURA_CAST events)
|
-- NEW: Try libdebuff first (Nampower AURA_CAST events)
|
||||||
if pfUI.api.libdebuff and pfUI.api.libdebuff.GetBestAuraCast then
|
if pfUI.api.libdebuff and pfUI.api.libdebuff.GetBestAuraCast then
|
||||||
|
|||||||
@@ -1085,21 +1085,6 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.search.edit:ClearFocus()
|
frame.search.edit:ClearFocus()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
frame.search:SetScript("OnHide", function()
|
|
||||||
frame.search.edit:SetText(T["Search"])
|
|
||||||
for bag = -2, 11 do
|
|
||||||
if pfUI.bags[bag] then
|
|
||||||
local bagsize = GetContainerNumSlots(bag)
|
|
||||||
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
||||||
for slot = 1, bagsize do
|
|
||||||
if pfUI.bags[bag] and pfUI.bags[bag].slots[slot] then
|
|
||||||
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
frame.search.edit:SetScript("OnMouseUp", function()
|
frame.search.edit:SetScript("OnMouseUp", function()
|
||||||
if arg1 == "RightButton" then
|
if arg1 == "RightButton" then
|
||||||
this:ClearFocus()
|
this:ClearFocus()
|
||||||
|
|||||||
+7
-7
@@ -23,7 +23,7 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
CreateBackdropShadow(buff)
|
CreateBackdropShadow(buff)
|
||||||
end
|
end
|
||||||
|
|
||||||
local aura = C_UnitAuras.GetAuraDataByIndex("player", buff.id, buff.btype)
|
local name, icon, count, dispelType, _, expirationTime, _, _, _, spellId = C_UnitAuras.UnitAura("player", buff.id, buff.btype)
|
||||||
|
|
||||||
--detect weapon buffs
|
--detect weapon buffs
|
||||||
if buff.btype == "HELPFUL" and ((C.buffs.separateweapons == "0" and buff.gid <= pfUI.buff.wepbuffs.count) or (pfUI.buff.wepbuffs.count > 0 and buff.weapon ~= nil)) then
|
if buff.btype == "HELPFUL" and ((C.buffs.separateweapons == "0" and buff.gid <= pfUI.buff.wepbuffs.count) or (pfUI.buff.wepbuffs.count > 0 and buff.weapon ~= nil)) then
|
||||||
@@ -55,16 +55,16 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
buff.texture:SetTexture(GetInventoryItemTexture("player", 17))
|
buff.texture:SetTexture(GetInventoryItemTexture("player", 17))
|
||||||
buff.backdrop:SetBackdropBorderColor(GetItemQualityColor(GetInventoryItemQuality("player", 17) or 1))
|
buff.backdrop:SetBackdropBorderColor(GetItemQualityColor(GetInventoryItemQuality("player", 17) or 1))
|
||||||
end
|
end
|
||||||
elseif aura and (( buff.btype == "HARMFUL" and C.buffs.debuffs == "1" ) or ( buff.btype == "HELPFUL" and C.buffs.buffs == "1" )) then
|
elseif name and (( buff.btype == "HARMFUL" and C.buffs.debuffs == "1" ) or ( buff.btype == "HELPFUL" and C.buffs.buffs == "1" )) then
|
||||||
-- Set Buff Texture and Border
|
-- Set Buff Texture and Border
|
||||||
buff.mode = buff.btype
|
buff.mode = buff.btype
|
||||||
buff.expirationTime = aura.expirationTime
|
buff.expirationTime = expirationTime
|
||||||
buff.stackCount = aura.applications
|
buff.stackCount = count
|
||||||
buff.spellId = aura.spellId
|
buff.spellId = spellId
|
||||||
buff.texture:SetTexture(aura.icon)
|
buff.texture:SetTexture(icon)
|
||||||
|
|
||||||
if buff.btype == "HARMFUL" then
|
if buff.btype == "HARMFUL" then
|
||||||
local dispelColor = C_UnitAuras.GetAuraDispelTypeColor(aura.dispelName)
|
local dispelColor = C_UnitAuras.GetAuraDispelTypeColor(dispelType)
|
||||||
buff.backdrop:SetBackdropBorderColor(dispelColor:GetRGBA())
|
buff.backdrop:SetBackdropBorderColor(dispelColor:GetRGBA())
|
||||||
else
|
else
|
||||||
buff.backdrop:SetBackdropBorderColor(br,bg,bb,ba)
|
buff.backdrop:SetBackdropBorderColor(br,bg,bb,ba)
|
||||||
|
|||||||
+12
-11
@@ -75,10 +75,10 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
|
|
||||||
local function GetBuffData(unit, id, type, selfdebuff)
|
local function GetBuffData(unit, id, type, selfdebuff)
|
||||||
local filter = (selfdebuff and type == "HARMFUL") and "HARMFUL|PLAYER" or type
|
local filter = (selfdebuff and type == "HARMFUL") and "HARMFUL|PLAYER" or type
|
||||||
local aura = C_UnitAuras.GetAuraDataByIndex(unit, id, filter)
|
local name, icon, count, dispelType, _, expirationTime = C_UnitAuras.UnitAura(unit, id, filter)
|
||||||
if not aura then return end
|
if not name then return end
|
||||||
local remaining = aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or 0
|
local remaining = expirationTime > 0 and (expirationTime - GetTime()) or 0
|
||||||
return remaining, aura.icon, aura.name, aura.applications
|
return remaining, icon, name, count, dispelType
|
||||||
end
|
end
|
||||||
|
|
||||||
local function StatusBarOnClick()
|
local function StatusBarOnClick()
|
||||||
@@ -90,12 +90,14 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
if val == skill then return end
|
if val == skill then return end
|
||||||
end
|
end
|
||||||
config.whitelist = config.whitelist .. "#" .. skill
|
config.whitelist = config.whitelist .. "#" .. skill
|
||||||
|
fcache[tostring(config)] = nil -- invalidate so the new entry takes effect immediately
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now whitelisted."])
|
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now whitelisted."])
|
||||||
elseif IsShiftKeyDown() then
|
elseif IsShiftKeyDown() then
|
||||||
for _, val in pairs({strsplit("#", config.blacklist)}) do
|
for _, val in pairs({strsplit("#", config.blacklist)}) do
|
||||||
if val == skill then return end
|
if val == skill then return end
|
||||||
end
|
end
|
||||||
config.blacklist = config.blacklist .. "#" .. skill
|
config.blacklist = config.blacklist .. "#" .. skill
|
||||||
|
fcache[tostring(config)] = nil -- invalidate so the new entry takes effect immediately
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now blacklisted."])
|
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now blacklisted."])
|
||||||
end
|
end
|
||||||
elseif this.parent.unit == "player" then
|
elseif this.parent.unit == "player" then
|
||||||
@@ -234,7 +236,7 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
local selfdebuff = frame.config.selfdebuff == "1"
|
local selfdebuff = frame.config.selfdebuff == "1"
|
||||||
|
|
||||||
for i=1,32 do
|
for i=1,32 do
|
||||||
local timeleft, texture, name, stacks = GetBuffData(frame.unit, i, frame.type, selfdebuff)
|
local timeleft, texture, name, stacks, dtype = GetBuffData(frame.unit, i, frame.type, selfdebuff)
|
||||||
timeleft = timeleft or 0
|
timeleft = timeleft or 0
|
||||||
|
|
||||||
if texture and name and name ~= "" and BuffIsVisible(frame.config, name) then
|
if texture and name and name ~= "" and BuffIsVisible(frame.config, name) then
|
||||||
@@ -243,12 +245,14 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
frame.buffs[i][3] = name
|
frame.buffs[i][3] = name
|
||||||
frame.buffs[i][4] = texture
|
frame.buffs[i][4] = texture
|
||||||
frame.buffs[i][5] = stacks
|
frame.buffs[i][5] = stacks
|
||||||
|
frame.buffs[i][6] = dtype
|
||||||
else
|
else
|
||||||
frame.buffs[i][1] = 0
|
frame.buffs[i][1] = 0
|
||||||
frame.buffs[i][2] = nil
|
frame.buffs[i][2] = nil
|
||||||
frame.buffs[i][3] = nil
|
frame.buffs[i][3] = nil
|
||||||
frame.buffs[i][4] = nil
|
frame.buffs[i][4] = nil
|
||||||
frame.buffs[i][5] = 0
|
frame.buffs[i][5] = 0
|
||||||
|
frame.buffs[i][6] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -292,12 +296,9 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
-- calculate dynamic auto color
|
-- calculate dynamic auto color
|
||||||
local r, g, b
|
local r, g, b
|
||||||
if frame.type == "HARMFUL" then
|
if frame.type == "HARMFUL" then
|
||||||
r, g, b = 1, .2, .2
|
-- official Blizzard dispel-type colors (matches unitframes/buff);
|
||||||
local a = C_UnitAuras.GetDebuffDataByIndex(frame.unit, data[2])
|
-- nil/unknown type falls back to the DEBUFF_TYPE_NONE colour
|
||||||
local dtype = a and a.dispelName
|
r, g, b = C_UnitAuras.GetAuraDispelTypeColor(data[6] or ""):GetRGBA()
|
||||||
if dtype and DebuffTypeColor[dtype] then
|
|
||||||
r,g,b = DebuffTypeColor[dtype].r,DebuffTypeColor[dtype].g,DebuffTypeColor[dtype].b
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
r,g,b = str2rgb(data[3])
|
r,g,b = str2rgb(data[3])
|
||||||
end
|
end
|
||||||
|
|||||||
+1
-1
@@ -45,7 +45,7 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
if not cb.tradeskillTotal or not cb.activeName or not cb.showname then return end
|
if not cb.tradeskillTotal or not cb.activeName or not cb.showname then return end
|
||||||
local remaining = cb.tradeskillTotal - (cb.tradeskillCompleted or 0)
|
local remaining = cb.tradeskillTotal - (cb.tradeskillCompleted or 0)
|
||||||
if remaining > 1 then
|
if remaining > 1 then
|
||||||
cb.bar.left:SetText(string.format("%s (%d)", cb.activeName, remaining))
|
cb.bar.left:SetFormattedText("%s (%d)", cb.activeName, remaining)
|
||||||
else
|
else
|
||||||
cb.bar.left:SetText(cb.activeName)
|
cb.bar.left:SetText(cb.activeName)
|
||||||
end
|
end
|
||||||
|
|||||||
+65
-8
@@ -296,6 +296,54 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- [ Chat Background Alpha ]
|
||||||
|
-- Blizzard's per-window transparency slider drives FCF_SetWindowAlpha, which only
|
||||||
|
-- touches the ChatFrame*Background textures that pfUI hides on docked frames. Mirror
|
||||||
|
-- the window's stored alpha onto the visible pfUI backdrop so the native slider
|
||||||
|
-- controls it directly. The slider is authoritative for the panel's alpha.
|
||||||
|
local function ApplyChatBackgroundAlpha(panel, frame)
|
||||||
|
if not (panel and panel.backdrop and frame) then return end
|
||||||
|
local _, _, _, _, _, alpha = GetChatWindowInfo(frame:GetID())
|
||||||
|
alpha = tonumber(alpha)
|
||||||
|
if not alpha then return end
|
||||||
|
local r, g, b = panel.backdrop:GetBackdropColor()
|
||||||
|
panel.backdrop:SetBackdropColor(r, g, b, alpha)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pfUI.chat:RefreshBackgroundAlpha()
|
||||||
|
-- left panel follows the currently selected docked tab
|
||||||
|
local selected = SELECTED_CHAT_FRAME
|
||||||
|
if not (selected and selected:GetParent() == pfUI.chat.left) then
|
||||||
|
selected = ChatFrame1
|
||||||
|
end
|
||||||
|
ApplyChatBackgroundAlpha(pfUI.chat.left, selected)
|
||||||
|
|
||||||
|
if C.chat.right.enable == "1" then
|
||||||
|
ApplyChatBackgroundAlpha(pfUI.chat.right, ChatFrame3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function pfUI.chat:MigrateBackgroundAlpha()
|
||||||
|
-- Runs once per character. The previous SetupPositions default stored a hard 0 window
|
||||||
|
-- alpha, which now renders the pfUI backdrop fully transparent. Restore the historical
|
||||||
|
-- 0.8 look for any pfUI-managed window still sitting at 0. Only existing installs that
|
||||||
|
-- already ran chat setup carry that legacy 0; fresh installs get 0.8 from SetupPositions.
|
||||||
|
if pfUI_init.chatbgalpha then return end
|
||||||
|
if not pfUI_init["chat_position"] then return end
|
||||||
|
pfUI_init.chatbgalpha = true
|
||||||
|
|
||||||
|
local frames = { ChatFrame1, ChatFrame2 }
|
||||||
|
if C.chat.right.enable == "1" then table.insert(frames, ChatFrame3) end
|
||||||
|
|
||||||
|
for _, frame in ipairs(frames) do
|
||||||
|
local _, _, _, _, _, alpha = GetChatWindowInfo(frame:GetID())
|
||||||
|
alpha = tonumber(alpha)
|
||||||
|
if alpha and alpha <= 0 then
|
||||||
|
FCF_SetWindowAlpha(frame, 0.8)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function pfUI.chat:RefreshChat()
|
function pfUI.chat:RefreshChat()
|
||||||
local panelheight = C.global.font_size*1.5 + default_border*2 + 2
|
local panelheight = C.global.font_size*1.5 + default_border*2 + 2
|
||||||
|
|
||||||
@@ -447,9 +495,13 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
for index, value in pairs(DOCKED_CHAT_FRAMES) do
|
for index, value in pairs(DOCKED_CHAT_FRAMES) do
|
||||||
FCF_UpdateButtonSide(value)
|
FCF_UpdateButtonSide(value)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
pfUI.chat:RefreshBackgroundAlpha()
|
||||||
end
|
end
|
||||||
|
|
||||||
hooksecurefunc("FCF_SaveDock", pfUI.chat.RefreshChat)
|
hooksecurefunc("FCF_SaveDock", pfUI.chat.RefreshChat)
|
||||||
|
hooksecurefunc("FCF_SetWindowAlpha", function() pfUI.chat:RefreshBackgroundAlpha() end)
|
||||||
|
hooksecurefunc("FCF_SelectDockFrame", function() pfUI.chat:RefreshBackgroundAlpha() end)
|
||||||
|
|
||||||
if C.chat.global.tabmouse == "1" then
|
if C.chat.global.tabmouse == "1" then
|
||||||
pfUI.chat.mouseovertab = CreateFrame("Frame")
|
pfUI.chat.mouseovertab = CreateFrame("Frame")
|
||||||
@@ -500,7 +552,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
FCF_SetLocked(ChatFrame1, 1)
|
FCF_SetLocked(ChatFrame1, 1)
|
||||||
FCF_SetWindowName(ChatFrame1, GENERAL)
|
FCF_SetWindowName(ChatFrame1, GENERAL)
|
||||||
FCF_SetWindowColor(ChatFrame1, 0, 0, 0)
|
FCF_SetWindowColor(ChatFrame1, 0, 0, 0)
|
||||||
FCF_SetWindowAlpha(ChatFrame1, 0)
|
FCF_SetWindowAlpha(ChatFrame1, 0.8)
|
||||||
FCF_SetChatWindowFontSize(ChatFrame1, 12)
|
FCF_SetChatWindowFontSize(ChatFrame1, 12)
|
||||||
ChatFrame1:SetUserPlaced(1)
|
ChatFrame1:SetUserPlaced(1)
|
||||||
|
|
||||||
@@ -508,7 +560,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
FCF_SetLocked(ChatFrame2, 1)
|
FCF_SetLocked(ChatFrame2, 1)
|
||||||
FCF_SetWindowName(ChatFrame2, COMBAT_LOG)
|
FCF_SetWindowName(ChatFrame2, COMBAT_LOG)
|
||||||
FCF_SetWindowColor(ChatFrame2, 0, 0, 0)
|
FCF_SetWindowColor(ChatFrame2, 0, 0, 0)
|
||||||
FCF_SetWindowAlpha(ChatFrame2, 0)
|
FCF_SetWindowAlpha(ChatFrame2, 0.8)
|
||||||
FCF_SetChatWindowFontSize(ChatFrame2, 12)
|
FCF_SetChatWindowFontSize(ChatFrame2, 12)
|
||||||
ChatFrame2:SetUserPlaced(1)
|
ChatFrame2:SetUserPlaced(1)
|
||||||
|
|
||||||
@@ -518,7 +570,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
FCF_SetLocked(ChatFrame3, 1)
|
FCF_SetLocked(ChatFrame3, 1)
|
||||||
FCF_SetWindowName(ChatFrame3, T["Loot & Spam"])
|
FCF_SetWindowName(ChatFrame3, T["Loot & Spam"])
|
||||||
FCF_SetWindowColor(ChatFrame3, 0, 0, 0)
|
FCF_SetWindowColor(ChatFrame3, 0, 0, 0)
|
||||||
FCF_SetWindowAlpha(ChatFrame3, 0)
|
FCF_SetWindowAlpha(ChatFrame3, 0.8)
|
||||||
FCF_SetChatWindowFontSize(ChatFrame3, 12)
|
FCF_SetChatWindowFontSize(ChatFrame3, 12)
|
||||||
FCF_UnDockFrame(ChatFrame3)
|
FCF_UnDockFrame(ChatFrame3)
|
||||||
FCF_SetTabPosition(ChatFrame3, 0)
|
FCF_SetTabPosition(ChatFrame3, 0)
|
||||||
@@ -566,6 +618,9 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
pfUI.chat:SetScript("OnEvent", function()
|
pfUI.chat:SetScript("OnEvent", function()
|
||||||
|
-- restore legacy chat windows stuck at 0 alpha before anything reads it
|
||||||
|
pfUI.chat:MigrateBackgroundAlpha()
|
||||||
|
|
||||||
-- set the default chat
|
-- set the default chat
|
||||||
FCF_SelectDockFrame(SELECTED_CHAT_FRAME)
|
FCF_SelectDockFrame(SELECTED_CHAT_FRAME)
|
||||||
|
|
||||||
@@ -810,23 +865,25 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- detect the whisper prefix BEFORE prepending a timestamp; the timestamp
|
||||||
|
-- pushes the whisper colour code off position 1 and the find below fails
|
||||||
|
local isWhisper = C.chat.global.whispermod == "1" and string.find(text, wcol, 1) == 1
|
||||||
|
|
||||||
-- show timestamp in chat
|
-- show timestamp in chat
|
||||||
if C.chat.text.time == "1" then
|
if C.chat.text.time == "1" then
|
||||||
text = timecolorhex .. tleft .. date(C.chat.text.timeformat) .. tright .. "|r " .. text
|
text = timecolorhex .. tleft .. date(C.chat.text.timeformat) .. tright .. "|r " .. text
|
||||||
end
|
end
|
||||||
|
|
||||||
-- save chat history
|
-- save chat history
|
||||||
if C.chat.global.whispermod == "1" and string.find(text, wcol, 1) == 1 then
|
if isWhisper then
|
||||||
SaveChatHistory(frame:GetID(), string.gsub(text, wcol, ""), cr, cg, cb)
|
SaveChatHistory(frame:GetID(), string.gsub(text, wcol, ""), cr, cg, cb)
|
||||||
else
|
else
|
||||||
SaveChatHistory(frame:GetID(), text, a1, a2, a3)
|
SaveChatHistory(frame:GetID(), text, a1, a2, a3)
|
||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.global.whispermod == "1" then
|
if isWhisper then
|
||||||
-- patch incoming whisper string to match the colors
|
-- patch incoming whisper string to match the colors
|
||||||
if string.find(text, wcol, 1) == 1 then
|
text = string.gsub(text, "|r", "|r" .. wcol)
|
||||||
text = string.gsub(text, "|r", "|r" .. wcol)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
frame:HookAddMessage(text, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
|
frame:HookAddMessage(text, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ pfUI:RegisterModule("cooldown", function ()
|
|||||||
local parent, parent_name
|
local parent, parent_name
|
||||||
local function pfCooldownOnUpdate()
|
local function pfCooldownOnUpdate()
|
||||||
parent = this:GetParent()
|
parent = this:GetParent()
|
||||||
if not parent then this:Hide() end
|
if not parent then this:Hide() return end
|
||||||
parent_name = parent:GetName()
|
parent_name = parent:GetName()
|
||||||
|
|
||||||
-- avoid to set cooldowns on invalid frames
|
-- avoid to set cooldowns on invalid frames
|
||||||
|
|||||||
+9
-14
@@ -127,7 +127,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
-- welcome dialog
|
-- welcome dialog
|
||||||
pfUI.firstrun:AddStep("init", function()
|
pfUI.firstrun:AddStep("init", function()
|
||||||
local f = CreateFirstRunPage()
|
local f = CreateFirstRunPage()
|
||||||
f.text:SetText(string.format(T["Welcome to |cff33ffccpf|cffffffffUI|r!\n\nI'm the first run wizard that will guide you through some basic configuration. If you're lazy, feel free to hit the \"Defaults\" button. If you wish to run this dialog again, go to the settings and hit the \"Reset Firstrun\" button.\n\nVisit |cff33ffcc%s|r to check for the latest version."], GetAddOnMetadata(pfUI.name, "X-Website")))
|
f.text:SetFormattedText(T["Welcome to |cff33ffccpf|cffffffffUI|r!\n\nI'm the first run wizard that will guide you through some basic configuration. If you're lazy, feel free to hit the \"Defaults\" button. If you wish to run this dialog again, go to the settings and hit the \"Reset Firstrun\" button.\n\nVisit |cff33ffcc%s|r to check for the latest version."], GetAddOnMetadata(pfUI.name, "X-Website"))
|
||||||
return f
|
return f
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -137,8 +137,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
f.text:SetText(T["A new installation of |cff33ffccpf|rUI ships with 4 prebuilt design profiles. Click below if you wish to load one of these profiles."])
|
f.text:SetText(T["A new installation of |cff33ffccpf|rUI ships with 4 prebuilt design profiles. Click below if you wish to load one of these profiles."])
|
||||||
|
|
||||||
f.Modern = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
f.Modern = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
||||||
f.Modern:SetWidth(120)
|
f.Modern:SetSize(120, 20)
|
||||||
f.Modern:SetHeight(20)
|
|
||||||
f.Modern:SetPoint("BOTTOM", -65, 100)
|
f.Modern:SetPoint("BOTTOM", -65, 100)
|
||||||
f.Modern:SetTextColor(1,1,1)
|
f.Modern:SetTextColor(1,1,1)
|
||||||
f.Modern:SetText("Modern")
|
f.Modern:SetText("Modern")
|
||||||
@@ -151,8 +150,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinButton(f.Modern)
|
SkinButton(f.Modern)
|
||||||
|
|
||||||
f.Nostalgia = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
f.Nostalgia = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
||||||
f.Nostalgia:SetWidth(120)
|
f.Nostalgia:SetSize(120, 20)
|
||||||
f.Nostalgia:SetHeight(20)
|
|
||||||
f.Nostalgia:SetPoint("BOTTOM", 65, 100)
|
f.Nostalgia:SetPoint("BOTTOM", 65, 100)
|
||||||
f.Nostalgia:SetTextColor(1,1,1)
|
f.Nostalgia:SetTextColor(1,1,1)
|
||||||
f.Nostalgia:SetText("Nostalgia")
|
f.Nostalgia:SetText("Nostalgia")
|
||||||
@@ -165,8 +163,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinButton(f.Nostalgia)
|
SkinButton(f.Nostalgia)
|
||||||
|
|
||||||
f.Legacy = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
f.Legacy = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
||||||
f.Legacy:SetWidth(120)
|
f.Legacy:SetSize(120, 20)
|
||||||
f.Legacy:SetHeight(20)
|
|
||||||
f.Legacy:SetPoint("BOTTOM", 65, 75)
|
f.Legacy:SetPoint("BOTTOM", 65, 75)
|
||||||
f.Legacy:SetTextColor(1,1,1)
|
f.Legacy:SetTextColor(1,1,1)
|
||||||
f.Legacy:SetText("Legacy")
|
f.Legacy:SetText("Legacy")
|
||||||
@@ -179,8 +176,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinButton(f.Legacy)
|
SkinButton(f.Legacy)
|
||||||
|
|
||||||
f.Slim = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
f.Slim = CreateFrame("Button", nil, f, "UIPanelButtonTemplate")
|
||||||
f.Slim:SetWidth(120)
|
f.Slim:SetSize(120, 20)
|
||||||
f.Slim:SetHeight(20)
|
|
||||||
f.Slim:SetPoint("BOTTOM", -65, 75)
|
f.Slim:SetPoint("BOTTOM", -65, 75)
|
||||||
f.Slim:SetTextColor(1,1,1)
|
f.Slim:SetTextColor(1,1,1)
|
||||||
f.Slim:SetText("Slim")
|
f.Slim:SetText("Slim")
|
||||||
@@ -197,8 +193,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
f.Slider.text:SetPoint("TOP", f.Slider, "BOTTOM", 0, 2)
|
f.Slider.text:SetPoint("TOP", f.Slider, "BOTTOM", 0, 2)
|
||||||
f.Slider.text:SetText(T["Scale"])
|
f.Slider.text:SetText(T["Scale"])
|
||||||
|
|
||||||
f.Slider:SetWidth(240)
|
f.Slider:SetSize(240, 20)
|
||||||
f.Slider:SetHeight(20)
|
|
||||||
f.Slider:SetPoint("BOTTOM", 0, 50)
|
f.Slider:SetPoint("BOTTOM", 0, 50)
|
||||||
f.Slider:SetOrientation('HORIZONTAL')
|
f.Slider:SetOrientation('HORIZONTAL')
|
||||||
f.Slider:SetMinMaxValues(0.5, 2.0)
|
f.Slider:SetMinMaxValues(0.5, 2.0)
|
||||||
@@ -263,7 +258,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinCheckbox(f.checkbox, 18)
|
SkinCheckbox(f.checkbox, 18)
|
||||||
|
|
||||||
f.NextScript = function()
|
f.NextScript = function()
|
||||||
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") end
|
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") return end
|
||||||
pfUI.chat.SetupRightChat(f.checkbox:GetChecked())
|
pfUI.chat.SetupRightChat(f.checkbox:GetChecked())
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -283,7 +278,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinCheckbox(f.checkbox, 18)
|
SkinCheckbox(f.checkbox, 18)
|
||||||
|
|
||||||
f.NextScript = function()
|
f.NextScript = function()
|
||||||
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") end
|
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") return end
|
||||||
if f.checkbox:GetChecked() then
|
if f.checkbox:GetChecked() then
|
||||||
pfUI.chat.SetupPositions()
|
pfUI.chat.SetupPositions()
|
||||||
end
|
end
|
||||||
@@ -305,7 +300,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinCheckbox(f.checkbox, 18)
|
SkinCheckbox(f.checkbox, 18)
|
||||||
|
|
||||||
f.NextScript = function()
|
f.NextScript = function()
|
||||||
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") end
|
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") return end
|
||||||
if f.checkbox:GetChecked() then
|
if f.checkbox:GetChecked() then
|
||||||
pfUI.chat.SetupChannels()
|
pfUI.chat.SetupChannels()
|
||||||
end
|
end
|
||||||
|
|||||||
+16
-5
@@ -2763,22 +2763,32 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
CreateGUIEntry(T["Tooltip"], nil, function()
|
CreateGUIEntry(T["Tooltip"], nil, function()
|
||||||
|
CreateConfig(nil, T["General"], nil, nil, "header")
|
||||||
CreateConfig(nil, T["Tooltip Position"], C.tooltip, "position", "dropdown", pfUI.gui.dropdowns.tooltip_position)
|
CreateConfig(nil, T["Tooltip Position"], C.tooltip, "position", "dropdown", pfUI.gui.dropdowns.tooltip_position)
|
||||||
CreateConfig(nil, T["Tooltip Text Font"], C.tooltip, "font_tooltip", "dropdown", pfUI.gui.dropdowns.fonts)
|
CreateConfig(nil, T["Tooltip Text Font"], C.tooltip, "font_tooltip", "dropdown", pfUI.gui.dropdowns.fonts)
|
||||||
CreateConfig(nil, T["Tooltip Text Font Size"], C.tooltip, "font_tooltip_size")
|
CreateConfig(nil, T["Tooltip Text Font Size"], C.tooltip, "font_tooltip_size")
|
||||||
CreateConfig(nil, T["Cursor Tooltip Align"], C.tooltip, "cursoralign", "dropdown", pfUI.gui.dropdowns.tooltip_align)
|
CreateConfig(nil, T["Cursor Tooltip Align"], C.tooltip, "cursoralign", "dropdown", pfUI.gui.dropdowns.tooltip_align)
|
||||||
CreateConfig(nil, T["Cursor Tooltip Offset"], C.tooltip, "cursoroffset")
|
CreateConfig(nil, T["Cursor Tooltip Offset"], C.tooltip, "cursoroffset")
|
||||||
CreateConfig(nil, T["Enable Extended Guild Information"], C.tooltip, "extguild", "checkbox")
|
|
||||||
CreateConfig(nil, T["Always Show Health In Percent"], C.tooltip, "alwaysperc", "checkbox")
|
|
||||||
CreateConfig(nil, T["Show Item IDs"], C.tooltip, "itemid", "checkbox")
|
|
||||||
CreateConfig(nil, T["Show Movement Speed"], C.tooltip, "movespeed", "checkbox")
|
|
||||||
CreateConfig(nil, T["Show Aura Caster"], C.tooltip, "aurasource", "checkbox")
|
|
||||||
CreateConfig(nil, T["Custom Transparency"], C.tooltip, "alpha")
|
CreateConfig(nil, T["Custom Transparency"], C.tooltip, "alpha")
|
||||||
CreateConfig(nil, T["Status Bar Texture"], C.tooltip.statusbar, "texture", "dropdown", pfUI.gui.dropdowns.uf_bartexture)
|
CreateConfig(nil, T["Status Bar Texture"], C.tooltip.statusbar, "texture", "dropdown", pfUI.gui.dropdowns.uf_bartexture)
|
||||||
|
|
||||||
|
CreateConfig(nil, T["Items"], nil, nil, "header")
|
||||||
CreateConfig(nil, T["Always Show Item Comparison"], C.tooltip.compare, "showalways", "checkbox")
|
CreateConfig(nil, T["Always Show Item Comparison"], C.tooltip.compare, "showalways", "checkbox")
|
||||||
CreateConfig(nil, T["Always Show Extended Vendor Values"], C.tooltip.vendor, "showalways", "checkbox")
|
CreateConfig(nil, T["Always Show Extended Vendor Values"], C.tooltip.vendor, "showalways", "checkbox")
|
||||||
CreateConfig(U["questitem"], T["Show Related Quest On Questitems"], C.tooltip.questitem, "showquest", "checkbox")
|
CreateConfig(U["questitem"], T["Show Related Quest On Questitems"], C.tooltip.questitem, "showquest", "checkbox")
|
||||||
CreateConfig(U["questitem"], T["Show Required Questitem Count"], C.tooltip.questitem, "showcount", "checkbox")
|
CreateConfig(U["questitem"], T["Show Required Questitem Count"], C.tooltip.questitem, "showcount", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Item IDs"], C.tooltip, "itemid", "checkbox")
|
||||||
|
|
||||||
|
CreateConfig(nil, T["Spells"], nil, nil, "header")
|
||||||
|
CreateConfig(nil, T["Show Aura Caster"], C.tooltip, "aurasource", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Spell IDs"], C.tooltip, "spellid", "checkbox")
|
||||||
|
|
||||||
|
CreateConfig(nil, T["Units"], nil, nil, "header")
|
||||||
|
CreateConfig(nil, T["Enable Extended Guild Information"], C.tooltip, "extguild", "checkbox")
|
||||||
|
CreateConfig(nil, T["Always Show Health In Percent"], C.tooltip, "alwaysperc", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Movement Speed"], C.tooltip, "movespeed", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Unit Buffs"], C.tooltip, "showbuffs", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Unit IDs"], C.tooltip, "unitid", "checkbox")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
CreateGUIEntry(T["Castbar"], T["General"], function()
|
CreateGUIEntry(T["Castbar"], T["General"], function()
|
||||||
@@ -2989,6 +2999,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Use Chat Colors for Meters"], C.thirdparty, "chatbg", "checkbox")
|
CreateConfig(nil, T["Use Chat Colors for Meters"], C.thirdparty, "chatbg", "checkbox")
|
||||||
CreateConfig(nil, "ShaguDPS (" .. T["Skin"] .. ")", C.thirdparty.shagudps, "skin", "checkbox")
|
CreateConfig(nil, "ShaguDPS (" .. T["Skin"] .. ")", C.thirdparty.shagudps, "skin", "checkbox")
|
||||||
CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox")
|
CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox")
|
||||||
|
CreateConfig(nil, "GreedMeter (" .. T["Dock"] .. ")", C.thirdparty.greedmeter, "dock", "checkbox")
|
||||||
CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox")
|
CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox")
|
||||||
CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox")
|
CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox")
|
||||||
CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox")
|
CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox")
|
||||||
|
|||||||
+5
-15
@@ -77,9 +77,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if pfUI.loot.my_index or pfUI.loot.disenchanter_index or pfUI.loot.banker_index then
|
if pfUI.loot.my_index or pfUI.loot.disenchanter_index or pfUI.loot.banker_index then
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Special Recipient"]
|
info.text = T["Special Recipient"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.textHeight = 12
|
info.textHeight = 12
|
||||||
info.hasArrow = 1
|
info.hasArrow = 1
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
@@ -158,9 +156,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if level == 1 then
|
if level == 1 then
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Random"]
|
info.text = T["Random"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFRANDOM"
|
info.value = "PFRANDOM"
|
||||||
info.textHeight = 12
|
info.textHeight = 12
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
@@ -170,9 +166,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
|
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Request Rolls"]
|
info.text = T["Request Rolls"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFROLLS"
|
info.value = "PFROLLS"
|
||||||
info.textHeight = 12
|
info.textHeight = 12
|
||||||
info.hasArrow = 1
|
info.hasArrow = 1
|
||||||
@@ -183,9 +177,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if UIDROPDOWNMENU_MENU_VALUE == "PFROLLS" then
|
if UIDROPDOWNMENU_MENU_VALUE == "PFROLLS" then
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Clear Rolls"]
|
info.text = T["Clear Rolls"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFCLEARROLLS"
|
info.value = "PFCLEARROLLS"
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
info.func = pfUI.loot.ClearRolls
|
info.func = pfUI.loot.ClearRolls
|
||||||
@@ -193,9 +185,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
|
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Reroll Ties"]
|
info.text = T["Reroll Ties"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFTIEROLL"
|
info.value = "PFTIEROLL"
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
info.arg1 = pfUI.loot.rollers_sorted
|
info.arg1 = pfUI.loot.rollers_sorted
|
||||||
|
|||||||
@@ -16,12 +16,6 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
local WINMARK = "Interface\\Buttons\\UI-CheckBox-Check"
|
local WINMARK = "Interface\\Buttons\\UI-CheckBox-Check"
|
||||||
local QUESTIONMARK = "Interface\\Icons\\INV_Misc_QuestionMark"
|
local QUESTIONMARK = "Interface\\Icons\\INV_Misc_QuestionMark"
|
||||||
|
|
||||||
local function ClassColor(class)
|
|
||||||
local c = class and RAID_CLASS_COLORS[class]
|
|
||||||
if c then return c.r, c.g, c.b end
|
|
||||||
return 1, 1, 1
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Paint an item row's icon/name/quality from a loaded Item mixin.
|
-- Paint an item row's icon/name/quality from a loaded Item mixin.
|
||||||
local function RenderItemVisual(f, item)
|
local function RenderItemVisual(f, item)
|
||||||
local r, g, b = 1, 1, 1
|
local r, g, b = 1, 1, 1
|
||||||
@@ -277,7 +271,7 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
if wroll and wroll > 0 then f.winroll:SetText(wroll) else f.winroll:SetText("") end
|
if wroll and wroll > 0 then f.winroll:SetText(wroll) else f.winroll:SetText("") end
|
||||||
f.winroll:Show()
|
f.winroll:Show()
|
||||||
f.winname:SetText(wname or UNKNOWN)
|
f.winname:SetText(wname or UNKNOWN)
|
||||||
f.winname:SetTextColor(ClassColor(wclass))
|
f.winname:SetTextColor(PFUI_CLASS_COLORS[wclass]:GetRGB())
|
||||||
f.winname:Show()
|
f.winname:Show()
|
||||||
else
|
else
|
||||||
-- nobody won: everyone passed
|
-- nobody won: everyone passed
|
||||||
@@ -298,7 +292,7 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
|
|
||||||
local function RenderPlayerFrame(pf, name, class, rollType, roll, isWinner)
|
local function RenderPlayerFrame(pf, name, class, rollType, roll, isWinner)
|
||||||
pf.name:SetText(name or UNKNOWN)
|
pf.name:SetText(name or UNKNOWN)
|
||||||
pf.name:SetTextColor(ClassColor(class))
|
pf.name:SetTextColor(PFUI_CLASS_COLORS[class]:GetRGB())
|
||||||
|
|
||||||
pf.rollicon:SetTexture(ROLL_TEX[rollType] or ROLL_TEX[ROLL_PASS])
|
pf.rollicon:SetTexture(ROLL_TEX[rollType] or ROLL_TEX[ROLL_PASS])
|
||||||
if roll and roll > 0 then pf.rolltext:SetText(roll) else pf.rolltext:SetText("") end
|
if roll and roll > 0 then pf.rolltext:SetText(roll) else pf.rolltext:SetText("") end
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ pfUI:RegisterModule("macroicons", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function SaveMacroPopup()
|
local function SaveMacroPopup()
|
||||||
local text = strtrim(picker.editbox:GetText())
|
local text = picker.editbox:GetText()
|
||||||
if text == "" then return end
|
if text == "" then return end
|
||||||
|
|
||||||
local icon = iconPicker.GetIcon()
|
local icon = iconPicker.GetIcon()
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ pfUI:RegisterModule("macrotweak", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- do not write macro calls into chat input history
|
-- do not write macro calls into chat input history
|
||||||
if ChatFrameEditBox._AddHistoryLine then
|
-- (install once: _AddHistoryLine is our backup slot and is nil until we set it)
|
||||||
|
if not ChatFrameEditBox._AddHistoryLine then
|
||||||
local userinput
|
local userinput
|
||||||
ChatFrameEditBox._AddHistoryLine = ChatFrameEditBox.AddHistoryLine
|
ChatFrameEditBox._AddHistoryLine = ChatFrameEditBox.AddHistoryLine
|
||||||
ChatFrameEditBox.AddHistoryLine = function(self, text)
|
ChatFrameEditBox.AddHistoryLine = function(self, text)
|
||||||
|
|||||||
+8
-2
@@ -77,7 +77,13 @@ pfUI:RegisterModule("map", function ()
|
|||||||
if point == "TOPLEFT" and relpoint == "TOPLEFT" then
|
if point == "TOPLEFT" and relpoint == "TOPLEFT" then
|
||||||
offx = offx*oldscale/scale
|
offx = offx*oldscale/scale
|
||||||
offy = offy*oldscale/scale
|
offy = offy*oldscale/scale
|
||||||
WorldMapFrame:SetPoint(point, rel, relpoint, offx, offy)
|
-- Anchor to the parent (3-arg SetPoint) rather than re-using the frame
|
||||||
|
-- GetPoint handed back. Re-anchoring to `rel` throws
|
||||||
|
-- "<unnamed> is dependent on this" as soon as anything else has anchored
|
||||||
|
-- itself to WorldMapFrame, which aborts the whole zoom handler. The
|
||||||
|
-- parent-relative form is also what LoadMovable/SaveMovable already
|
||||||
|
-- assume: SaveMovable stores only xpos/ypos, with no relative frame.
|
||||||
|
WorldMapFrame:SetPoint(point, offx, offy)
|
||||||
end
|
end
|
||||||
|
|
||||||
WorldMapFrame:SetScale(scale)
|
WorldMapFrame:SetScale(scale)
|
||||||
@@ -175,7 +181,7 @@ pfUI:RegisterModule("map", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if mx and my and MouseIsOver(WorldMapButton) then
|
if mx and my and MouseIsOver(WorldMapButton) then
|
||||||
WorldMapButton.coords.text:SetText(string.format('%.1f / %.1f', mx, my))
|
WorldMapButton.coords.text:SetFormattedText('%.1f / %.1f', mx, my)
|
||||||
else
|
else
|
||||||
WorldMapButton.coords.text:SetText("")
|
WorldMapButton.coords.text:SetText("")
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -52,19 +52,19 @@ pfUI:RegisterModule("mapreveal", function ()
|
|||||||
WorldMapTooltip:AddLine(this.name, 1, 1, 1)
|
WorldMapTooltip:AddLine(this.name, 1, 1, 1)
|
||||||
WorldMapTooltip:Show()
|
WorldMapTooltip:Show()
|
||||||
|
|
||||||
if not explorecaches[this.name] then return end
|
if not explorecaches[this.area] then return end
|
||||||
if C.appearance.worldmap.mapreveal == "0" then return end
|
if C.appearance.worldmap.mapreveal == "0" then return end
|
||||||
for texture in pairs(explorecaches[this.name]) do
|
for texture in pairs(explorecaches[this.area]) do
|
||||||
texture:SetVertexColor(1,1,1,1)
|
texture:SetVertexColor(1,1,1,1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local exploreLeave = function()
|
local exploreLeave = function()
|
||||||
WorldMapTooltip:Hide()
|
WorldMapTooltip:Hide()
|
||||||
if not explorecaches[this.name] then return end
|
if not explorecaches[this.area] then return end
|
||||||
if C.appearance.worldmap.mapreveal == "0" then return end
|
if C.appearance.worldmap.mapreveal == "0" then return end
|
||||||
local r,g,b,a = GetStringColor(C.appearance.worldmap.mapreveal_color)
|
local r,g,b,a = GetStringColor(C.appearance.worldmap.mapreveal_color)
|
||||||
for texture in pairs(explorecaches[this.name]) do
|
for texture in pairs(explorecaches[this.area]) do
|
||||||
texture:SetVertexColor(r,g,b,a)
|
texture:SetVertexColor(r,g,b,a)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -120,6 +120,7 @@ pfUI:RegisterModule("mapreveal", function ()
|
|||||||
explore:EnableMouse(true)
|
explore:EnableMouse(true)
|
||||||
explore:SetFrameLevel(255)
|
explore:SetFrameLevel(255)
|
||||||
explore.name = mapFileName .. " (" .. name .. ")"
|
explore.name = mapFileName .. " (" .. name .. ")"
|
||||||
|
explore.area = name -- cache key: explorecaches is keyed by the plain area name
|
||||||
explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY")
|
explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY")
|
||||||
explore.tex:SetBlendMode("ADD")
|
explore.tex:SetBlendMode("ADD")
|
||||||
explore.tex:SetTexCoord(.08, .92, .08, .92)
|
explore.tex:SetTexCoord(.08, .92, .08, .92)
|
||||||
|
|||||||
+1
-1
@@ -138,7 +138,7 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
local coord = pfUI.minimapCoordinates
|
local coord = pfUI.minimapCoordinates
|
||||||
coord.posX, coord.posY = GetPlayerMapPosition("player")
|
coord.posX, coord.posY = GetPlayerMapPosition("player")
|
||||||
if coord.posX ~= 0 and coord.posY ~= 0 then
|
if coord.posX ~= 0 and coord.posY ~= 0 then
|
||||||
coord.text:SetText(string.format("%.1f, %.1f", round(coord.posX * 100, 1), round(coord.posY * 100, 1)))
|
coord.text:SetFormattedText("%.1f, %.1f", round(coord.posX * 100, 1), round(coord.posY * 100, 1))
|
||||||
else
|
else
|
||||||
coord.text:SetText("|cffffaaaaN/A")
|
coord.text:SetText("|cffffaaaaN/A")
|
||||||
end
|
end
|
||||||
|
|||||||
+107
-55
@@ -1039,13 +1039,29 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
local mouseover = plate.cachedGuid and plate.cachedGuid == frameState.mouseoverGuid or nil
|
local mouseover = plate.cachedGuid and plate.cachedGuid == frameState.mouseoverGuid or nil
|
||||||
local unitstr = target and "target" or mouseover and "mouseover" or plate.cachedGuid or nil
|
local unitstr = target and "target" or mouseover and "mouseover" or plate.cachedGuid or nil
|
||||||
|
|
||||||
|
-- target event sometimes fires too quickly, where nameplate identifiers are not
|
||||||
|
-- yet updated. So while being inside this event, we cannot trust the unitstr.
|
||||||
|
if event == "PLAYER_TARGET_CHANGED" then unitstr = nil end
|
||||||
|
|
||||||
|
-- remove unitstr when it doesn't resolve to this plate's unit (stale istarget,
|
||||||
|
-- stale mouseover guid or a despawned unit). Must run before the cache fills
|
||||||
|
-- below -- an unrelated unitstr would poison cache.player/minion with the
|
||||||
|
-- *other* unit's answer, and the nil-gate would then never recompute it.
|
||||||
|
if unitstr and UnitName(unitstr) ~= name then unitstr = nil end
|
||||||
|
|
||||||
-- resolve player vs npc from plate's own unit so libunitscan can't return
|
-- resolve player vs npc from plate's own unit so libunitscan can't return
|
||||||
-- a player record for an NPC sharing the same name (e.g. Chromie). Stored
|
-- a player record for an NPC sharing the same name (e.g. Chromie). Stored
|
||||||
-- as true/false/nil so it doubles as the GetUnitInfo hint.
|
-- as true/false/nil so it doubles as the GetUnitInfo hint.
|
||||||
if plate.cache.player == nil and unitstr then
|
if plate.cache.player == nil and unitstr then
|
||||||
plate.cache.player = UnitIsPlayer(unitstr) and true or false
|
plate.cache.player = UnitIsPlayer(unitstr) and true or false
|
||||||
end
|
end
|
||||||
local class, ulevel, elite, player, guild = GetUnitInfo(name, true, plate.cache.player)
|
if plate.cache.minion == nil and unitstr then
|
||||||
|
plate.cache.minion = UnitIsMinion(unitstr) and true or false
|
||||||
|
end
|
||||||
|
local class, ulevel, elite, player, guild
|
||||||
|
if not plate.cache.minion then
|
||||||
|
class, ulevel, elite, player, guild = GetUnitInfo(name, true, plate.cache.player)
|
||||||
|
end
|
||||||
if plate.cache.player ~= nil then player = plate.cache.player or nil end
|
if plate.cache.player ~= nil then player = plate.cache.player or nil end
|
||||||
|
|
||||||
-- Use database level ONLY if current level is ?? (fixes ?? after reload, but doesn't override visible levels)
|
-- Use database level ONLY if current level is ?? (fixes ?? after reload, but doesn't override visible levels)
|
||||||
@@ -1065,18 +1081,11 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
if player and unittype == "ENEMY_NPC" then unittype = "ENEMY_PLAYER" end
|
if player and unittype == "ENEMY_NPC" then unittype = "ENEMY_PLAYER" end
|
||||||
if player and unittype == "FRIENDLY_NPC" then unittype = "FRIENDLY_PLAYER" end
|
if player and unittype == "FRIENDLY_NPC" then unittype = "FRIENDLY_PLAYER" end
|
||||||
elite = plate.original.levelicon:IsShown() and not player and "boss" or elite
|
elite = plate.original.levelicon:IsShown() and not player and "boss" or elite
|
||||||
if not class then plate.wait_for_scan = true end
|
if not class and not plate.cache.minion then plate.wait_for_scan = true end
|
||||||
|
|
||||||
-- skip data updates on invisible frames
|
-- skip data updates on invisible frames
|
||||||
if not visible then return end
|
if not visible then return end
|
||||||
|
|
||||||
-- target event sometimes fires too quickly, where nameplate identifiers are not
|
|
||||||
-- yet updated. So while being inside this event, we cannot trust the unitstr.
|
|
||||||
if event == "PLAYER_TARGET_CHANGED" then unitstr = nil end
|
|
||||||
|
|
||||||
-- remove unitstr on unit name mismatch
|
|
||||||
if unitstr and UnitName(unitstr) ~= name then unitstr = nil end
|
|
||||||
|
|
||||||
-- always make sure to keep plate visible
|
-- always make sure to keep plate visible
|
||||||
plate:Show()
|
plate:Show()
|
||||||
|
|
||||||
@@ -1151,15 +1160,24 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
if plate.cache.level ~= level or plate.cache.elite ~= elite then
|
if plate.cache.level ~= level or plate.cache.elite ~= elite then
|
||||||
plate.cache.level = level
|
plate.cache.level = level
|
||||||
plate.cache.elite = elite
|
plate.cache.elite = elite
|
||||||
plate.level:SetText(string.format("%s%s", level, (elitestrings[elite] or "")))
|
plate.level:SetFormattedText("%s%s", level, (elitestrings[elite] or ""))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set level color from GetDifficultyColor when using DB level
|
-- Set level color from GetDifficultyColor when using DB level.
|
||||||
|
-- No brightening here: adding a flat offset to all three channels
|
||||||
|
-- desaturates every tier toward white and collapses the boundaries
|
||||||
|
-- (orange reads as yellow, red reads as orange). Use Blizzard's values.
|
||||||
|
-- Clearing cache.levelcolor forces the sync block in OnUpdate to
|
||||||
|
-- re-colour once the ?? resolves and it takes ownership again.
|
||||||
if levelFromDB and type(level) == "number" then
|
if levelFromDB and type(level) == "number" then
|
||||||
local color = GetDifficultyColor(level)
|
local color = GetDifficultyColor(level)
|
||||||
plate.level:SetTextColor(color.r + 0.3, color.g + 0.3, color.b + 0.3, 1)
|
plate.level:SetTextColor(color.r, color.g, color.b, 1)
|
||||||
|
plate.cache.levelcolor = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- remember who owns the level colour so the two writers cannot fight
|
||||||
|
plate.cache.levelfromdb = levelFromDB or nil
|
||||||
|
|
||||||
if guild and C.nameplates.showguildname == "1" then
|
if guild and C.nameplates.showguildname == "1" then
|
||||||
plate.guild:SetText(guild)
|
plate.guild:SetText(guild)
|
||||||
if guild == myGuild then
|
if guild == myGuild then
|
||||||
@@ -1203,21 +1221,21 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
local hasdata = ( rhp and rhpmax ) or estimated or hpmax > 100 or (round(hpmax/100*hp) ~= hp)
|
local hasdata = ( rhp and rhpmax ) or estimated or hpmax > 100 or (round(hpmax/100*hp) ~= hp)
|
||||||
|
|
||||||
if setting == "curperc" and hasdata and rhp then
|
if setting == "curperc" and hasdata and rhp then
|
||||||
plate.health.text:SetText(string.format("%s | %s%%", Abbreviate(rhp), ceil(hp/hpmax*100)))
|
plate.health.text:SetFormattedText("%s | %s%%", Abbreviate(rhp), ceil(hp/hpmax*100))
|
||||||
elseif setting == "cur" and hasdata and rhp then
|
elseif setting == "cur" and hasdata and rhp then
|
||||||
plate.health.text:SetText(string.format("%s", Abbreviate(rhp)))
|
plate.health.text:SetFormattedText("%s", Abbreviate(rhp))
|
||||||
elseif setting == "curmax" and hasdata and rhp then
|
elseif setting == "curmax" and hasdata and rhp then
|
||||||
plate.health.text:SetText(string.format("%s - %s", Abbreviate(rhp), Abbreviate(rhpmax)))
|
plate.health.text:SetFormattedText("%s - %s", Abbreviate(rhp), Abbreviate(rhpmax))
|
||||||
elseif setting == "curmaxs" and hasdata and rhp then
|
elseif setting == "curmaxs" and hasdata and rhp then
|
||||||
plate.health.text:SetText(string.format("%s / %s", Abbreviate(rhp), Abbreviate(rhpmax)))
|
plate.health.text:SetFormattedText("%s / %s", Abbreviate(rhp), Abbreviate(rhpmax))
|
||||||
elseif setting == "curmaxperc" and hasdata and rhp then
|
elseif setting == "curmaxperc" and hasdata and rhp then
|
||||||
plate.health.text:SetText(string.format("%s - %s | %s%%", Abbreviate(rhp), Abbreviate(rhpmax), ceil(hp/hpmax*100)))
|
plate.health.text:SetFormattedText("%s - %s | %s%%", Abbreviate(rhp), Abbreviate(rhpmax), ceil(hp/hpmax*100))
|
||||||
elseif setting == "curmaxpercs" and hasdata and rhp then
|
elseif setting == "curmaxpercs" and hasdata and rhp then
|
||||||
plate.health.text:SetText(string.format("%s / %s | %s%%", Abbreviate(rhp), Abbreviate(rhpmax), ceil(hp/hpmax*100)))
|
plate.health.text:SetFormattedText("%s / %s | %s%%", Abbreviate(rhp), Abbreviate(rhpmax), ceil(hp/hpmax*100))
|
||||||
elseif setting == "deficit" and rhp then
|
elseif setting == "deficit" and rhp then
|
||||||
plate.health.text:SetText(string.format("-%s" .. (hasdata and "" or "%%"), Abbreviate(rhpmax - rhp)))
|
plate.health.text:SetFormattedText("-%s" .. (hasdata and "" or "%%"), Abbreviate(rhpmax - rhp))
|
||||||
else -- "percent" as fallback
|
else -- "percent" as fallback
|
||||||
plate.health.text:SetText(string.format("%s%%", ceil(hp/hpmax*100)))
|
plate.health.text:SetFormattedText("%s%%", ceil(hp/hpmax*100))
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
plate.health.text:SetText()
|
plate.health.text:SetText()
|
||||||
@@ -1251,9 +1269,32 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
plate.cache.r, plate.cache.g, plate.cache.b = r, g, b
|
plate.cache.r, plate.cache.g, plate.cache.b = r, g, b
|
||||||
end
|
end
|
||||||
|
|
||||||
if r + g + b ~= plate.cache.namecolor and unittype == "FRIENDLY_PLAYER" and C.nameplates["friendclassnamec"] == "1" and class and PFUI_CLASS_COLORS[class] then
|
-- Friendly player names take this colour when friendclassnamec is on.
|
||||||
plate.name:SetTextColor(r, g, b, a)
|
-- Ownership is recorded so the OnUpdate sync below stands down rather than
|
||||||
plate.cache.namecolor = r + g + b
|
-- racing us: both writers used to share cache.namecolor despite storing
|
||||||
|
-- unrelated quantities (this colour vs Blizzard's name FontString), so
|
||||||
|
-- either could suppress the other -- and since nameplate.cache survives
|
||||||
|
-- pool reuse, a recycled plate could keep the previous unit's name colour.
|
||||||
|
local ownname = unittype == "FRIENDLY_PLAYER" and C.nameplates["friendclassnamec"] == "1"
|
||||||
|
and class and true or nil
|
||||||
|
|
||||||
|
if plate.cache.ownname ~= ownname then
|
||||||
|
plate.cache.ownname = ownname
|
||||||
|
-- ownership flipped: whichever writer is now in charge must re-assert
|
||||||
|
plate.cache.namecolor = nil
|
||||||
|
plate.cache.ownnamecolor = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- read the class colour directly rather than reusing the bar's r,g,b: the
|
||||||
|
-- bar only carries a class colour when friendclassc happens to be on, and
|
||||||
|
-- it also picks up the tapped-grey and barcombatstate overrides, neither of
|
||||||
|
-- which belongs on the name.
|
||||||
|
if ownname then
|
||||||
|
local cr, cg, cb, ca = PFUI_CLASS_COLORS[class]:GetRGBA()
|
||||||
|
if cr + cg + cb ~= plate.cache.ownnamecolor then
|
||||||
|
plate.cache.ownnamecolor = cr + cg + cb
|
||||||
|
plate.name:SetTextColor(cr, cg, cb, ca)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if target and C.nameplates.cpdisplay == "1" then
|
if target and C.nameplates.cpdisplay == "1" then
|
||||||
@@ -1281,19 +1322,22 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
for i = 1, 16 do debuffDisplayBuf[i].effect = nil end
|
for i = 1, 16 do debuffDisplayBuf[i].effect = nil end
|
||||||
if unitstr then
|
if unitstr then
|
||||||
local filter = cfg.owndebuffs and "HARMFUL|PLAYER" or "HARMFUL"
|
local filter = cfg.owndebuffs and "HARMFUL|PLAYER" or "HARMFUL"
|
||||||
local auras = C_UnitAuras.GetUnitAuras(unitstr, filter)
|
|
||||||
local now = GetTime()
|
local now = GetTime()
|
||||||
for _, aura in ipairs(auras) do
|
-- positional UnitAura writes straight into the reusable buffer, so the
|
||||||
if debuffCount >= 16 then break end
|
-- per-plate scan allocates nothing (no per-aura table, no result array)
|
||||||
|
local i = 1
|
||||||
|
while debuffCount < 16 do
|
||||||
|
local aname, icon, count, dispelType, duration, expirationTime = C_UnitAuras.UnitAura(unitstr, i, filter)
|
||||||
|
if not aname then break end
|
||||||
debuffCount = debuffCount + 1
|
debuffCount = debuffCount + 1
|
||||||
local timeleft = (aura.expirationTime and aura.expirationTime > 0) and (aura.expirationTime - now) or nil
|
|
||||||
local b = debuffDisplayBuf[debuffCount]
|
local b = debuffDisplayBuf[debuffCount]
|
||||||
b.effect = aura.name
|
b.effect = aname
|
||||||
b.texture = aura.icon
|
b.texture = icon
|
||||||
b.stacks = aura.applications
|
b.stacks = count
|
||||||
b.dtype = aura.dispelName
|
b.dtype = dispelType
|
||||||
b.duration = aura.duration
|
b.duration = duration
|
||||||
b.timeleft = timeleft
|
b.timeleft = (expirationTime and expirationTime > 0) and (expirationTime - now) or nil
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for i = 1, 16 do
|
for i = 1, 16 do
|
||||||
@@ -1516,38 +1560,46 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
-- otherwise an NPC sharing a name with a known player flips wait_for_scan
|
-- otherwise an NPC sharing a name with a known player flips wait_for_scan
|
||||||
-- off here, then OnDataChanged re-sets it, every frame until the mob scan
|
-- off here, then OnDataChanged re-sets it, every frame until the mob scan
|
||||||
-- lands.
|
-- lands.
|
||||||
if nameplate.wait_for_scan and GetUnitInfo(name, true, nameplate.cache.player) then
|
if nameplate.wait_for_scan and not nameplate.cache.minion and GetUnitInfo(name, true, nameplate.cache.player) then
|
||||||
nameplate.wait_for_scan = nil
|
nameplate.wait_for_scan = nil
|
||||||
update = true
|
update = true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- trigger update when name color changed (includes combat state check)
|
-- trigger update when name color changed (includes combat state check).
|
||||||
local r, g, b = original.name:GetTextColor()
|
-- Skipped once OnDataChanged owns the name colour (class-coloured friendly
|
||||||
local inCombatWithPlayer = cfg.namefightcolor and UnitAffectingCombat(nameplate.unit) and UnitAffectingCombat("player")
|
-- players), so the two writers cannot overwrite each other.
|
||||||
|
if not nameplate.cache.ownname then
|
||||||
|
local r, g, b = original.name:GetTextColor()
|
||||||
|
local inCombatWithPlayer = cfg.namefightcolor and UnitAffectingCombat(nameplate.unit) and UnitAffectingCombat("player")
|
||||||
|
|
||||||
if r + g + b ~= nameplate.cache.namecolor or (cfg.namefightcolor and nameplate.cache.inCombat ~= inCombatWithPlayer) then
|
if r + g + b ~= nameplate.cache.namecolor or (cfg.namefightcolor and nameplate.cache.inCombat ~= inCombatWithPlayer) then
|
||||||
nameplate.cache.namecolor = r + g + b
|
nameplate.cache.namecolor = r + g + b
|
||||||
nameplate.cache.inCombat = inCombatWithPlayer
|
nameplate.cache.inCombat = inCombatWithPlayer
|
||||||
|
|
||||||
if cfg.namefightcolor then
|
if cfg.namefightcolor then
|
||||||
if (r > .9 and g < .2 and b < .2) or inCombatWithPlayer then
|
if (r > .9 and g < .2 and b < .2) or inCombatWithPlayer then
|
||||||
nameplate.name:SetTextColor(1,0.4,0.2,1)
|
nameplate.name:SetTextColor(1,0.4,0.2,1)
|
||||||
|
else
|
||||||
|
nameplate.name:SetTextColor(r,g,b,1)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
nameplate.name:SetTextColor(r,g,b,1)
|
nameplate.name:SetTextColor(1,1,1,1)
|
||||||
end
|
end
|
||||||
else
|
update = true
|
||||||
nameplate.name:SetTextColor(1,1,1,1)
|
|
||||||
end
|
end
|
||||||
update = true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- trigger update when level color changed
|
-- trigger update when level color changed. Skipped while the level came
|
||||||
local r, g, b = original.level:GetTextColor()
|
-- from the database (?? plates), where OnDataChanged owns the colour --
|
||||||
r, g, b = r + .3, g + .3, b + .3
|
-- otherwise both writers race and cache.levelcolor goes stale, which
|
||||||
if r + g + b ~= nameplate.cache.levelcolor then
|
-- leaves a recycled plate wearing the previous unit's colour.
|
||||||
nameplate.cache.levelcolor = r + g + b
|
if not nameplate.cache.levelfromdb then
|
||||||
nameplate.level:SetTextColor(r,g,b,1)
|
local r, g, b = original.level:GetTextColor()
|
||||||
update = true
|
if r + g + b ~= nameplate.cache.levelcolor then
|
||||||
|
nameplate.cache.levelcolor = r + g + b
|
||||||
|
nameplate.level:SetTextColor(r,g,b,1)
|
||||||
|
update = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- use timer based updates
|
-- use timer based updates
|
||||||
@@ -1657,7 +1709,7 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
rounded = floor(remaining * 100)
|
rounded = floor(remaining * 100)
|
||||||
if castbar.lastTextTick ~= rounded then
|
if castbar.lastTextTick ~= rounded then
|
||||||
castbar.lastTextTick = rounded
|
castbar.lastTextTick = rounded
|
||||||
castbar.text:SetText(string.format("%.2f", remaining))
|
castbar.text:SetFormattedText("%.2f", remaining)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+7
-3
@@ -418,8 +418,13 @@ pfUI:RegisterModule("panel", function()
|
|||||||
local repPercent = floor(cur / max * 100)
|
local repPercent = floor(cur / max * 100)
|
||||||
if repPercent < 100 then
|
if repPercent < 100 then
|
||||||
local _, _, _, hex = GetColorGradient(repPercent/100)
|
local _, _, _, hex = GetColorGradient(repPercent/100)
|
||||||
|
local link = GetInventoryItemLink("player", id)
|
||||||
|
local texture = GetInventoryItemTexture("player", id)
|
||||||
|
if texture then
|
||||||
|
link = CreateSimpleTextureMarkup(texture, 24) .. " " .. link
|
||||||
|
end
|
||||||
itemLines[table.getn(itemLines)+1] = {
|
itemLines[table.getn(itemLines)+1] = {
|
||||||
GetInventoryItemLink("player", id),
|
link,
|
||||||
string.format("%s%s%%|r", hex, repPercent)
|
string.format("%s%s%%|r", hex, repPercent)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
@@ -428,8 +433,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
if totalRep > 0 then
|
if totalRep > 0 then
|
||||||
GameTooltip:ClearLines()
|
GameTooltip:ClearLines()
|
||||||
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
||||||
GameTooltip:SetText("|cff555555"..(string.gsub(REPAIR_COST,":","")).."|r")
|
GameTooltip:AddLine(REPAIR_COST.." " .. CreateGoldString(totalRep), 0.3333, 0.3333, 0.3333)
|
||||||
SetTooltipMoney(GameTooltip, totalRep)
|
|
||||||
for _,line in ipairs(itemLines) do
|
for _,line in ipairs(itemLines) do
|
||||||
GameTooltip:AddDoubleLine(line[1],line[2])
|
GameTooltip:AddDoubleLine(line[1],line[2])
|
||||||
end
|
end
|
||||||
|
|||||||
+27
-3
@@ -4,7 +4,9 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
|
|
||||||
-- tell RaidFrame.lua pfUI replaces party frames
|
-- tell RaidFrame.lua pfUI replaces party frames
|
||||||
HookAddonOrVariable("Blizzard_RaidUI", function()
|
HookAddonOrVariable("Blizzard_RaidUI", function()
|
||||||
GROUP_REPLACE_PARTY = "1"
|
-- must reach _G: RaidFrame.lua reads this global, and pfUI.env has
|
||||||
|
-- __index but no __newindex, so a bare assignment stays in the sandbox
|
||||||
|
_G.GROUP_REPLACE_PARTY = "1"
|
||||||
end)
|
end)
|
||||||
|
|
||||||
pfUI.uf.raid = CreateFrame("Frame", "pfRaidUpdater", UIParent)
|
pfUI.uf.raid = CreateFrame("Frame", "pfRaidUpdater", UIParent)
|
||||||
@@ -123,6 +125,7 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
local grid = self.petgrid
|
local grid = self.petgrid
|
||||||
|
|
||||||
local function place(pet, cell, id)
|
local function place(pet, cell, id)
|
||||||
|
pet.label = "raidpet"
|
||||||
pet.id = id
|
pet.id = id
|
||||||
local r, g = SlotToCoord(cell, grid.fill, grid.x, grid.y)
|
local r, g = SlotToCoord(cell, grid.fill, grid.x, grid.y)
|
||||||
pet:ClearAllPoints()
|
pet:ClearAllPoints()
|
||||||
@@ -138,6 +141,22 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Party shown as a raid grid: mirror slots 1..5 (player + party members)
|
||||||
|
-- into fixed cells. UpdateVisibility maps each slot to pet / partypet<N>.
|
||||||
|
if not IsInRaid() and IsInGroup() and C.unitframes.raidforgroup == "1" then
|
||||||
|
for id = 1, maxraid do
|
||||||
|
if self.pets[id] then
|
||||||
|
if id <= 5 then
|
||||||
|
place(self.pets[id], id, id)
|
||||||
|
else
|
||||||
|
self.pets[id].id = 0
|
||||||
|
self.pets[id]:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if C.unitframes.raidpet.collapse == "1" then
|
if C.unitframes.raidpet.collapse == "1" then
|
||||||
-- Pack the pets that exist into the leading cells, no gaps.
|
-- Pack the pets that exist into the leading cells, no gaps.
|
||||||
local k = 0
|
local k = 0
|
||||||
@@ -211,8 +230,13 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
this.tick = GetTime() + 1.0
|
this.tick = GetTime() + 1.0
|
||||||
this.pendingUpdate = nil
|
this.pendingUpdate = nil
|
||||||
|
|
||||||
-- don't proceed without raid
|
-- Without a raid there is nothing to sort, but a party shown as a raid
|
||||||
if not IsInRaid() then return end
|
-- grid still needs its pet frames placed and mapped to the party pets.
|
||||||
|
if not IsInRaid() then
|
||||||
|
this:LayoutPets()
|
||||||
|
this:Hide()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- clear all existing frames
|
-- clear all existing frames
|
||||||
for i=1, maxraid do SetRaidIndex(pfUI.uf.raid[i], 0) end
|
for i=1, maxraid do SetRaidIndex(pfUI.uf.raid[i], 0) end
|
||||||
|
|||||||
+7
-2
@@ -7,8 +7,12 @@ pfUI:RegisterModule("roll", function ()
|
|||||||
local LOOT_ROLL_NEED = string.gsub(LOOT_ROLL_NEED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
local LOOT_ROLL_NEED = string.gsub(LOOT_ROLL_NEED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
||||||
local LOOT_ROLL_PASSED = string.gsub(LOOT_ROLL_PASSED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
local LOOT_ROLL_PASSED = string.gsub(LOOT_ROLL_PASSED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
||||||
|
|
||||||
-- try to detect the everyone string
|
-- detect the "everyone passed" subject exactly as the loot scanner will capture
|
||||||
local _, _, everyone, _ = strfind(LOOT_ROLL_ALL_PASSED, LOOT_ROLL_PASSED)
|
-- it: feed a dummy item into LOOT_ROLL_ALL_PASSED and run the same LOOT_ROLL_PASSED
|
||||||
|
-- match. (The old strfind had no captures, so `everyone` was always nil and
|
||||||
|
-- "Everyone has passed on: X" got counted as a fake roller.)
|
||||||
|
local everyoneSample = string.gsub(LOOT_ROLL_ALL_PASSED, "%%s", "x")
|
||||||
|
local everyone = cmatch(everyoneSample, LOOT_ROLL_PASSED)
|
||||||
pfUI.roll.blacklist = { YOU, everyone }
|
pfUI.roll.blacklist = { YOU, everyone }
|
||||||
|
|
||||||
pfUI.roll.cache = {}
|
pfUI.roll.cache = {}
|
||||||
@@ -43,6 +47,7 @@ pfUI:RegisterModule("roll", function ()
|
|||||||
|
|
||||||
local _, _, itemLink = string.find(hyperlink, "(item:%d+:%d+:%d+:%d+)")
|
local _, _, itemLink = string.find(hyperlink, "(item:%d+:%d+:%d+:%d+)")
|
||||||
local itemName = C_Item.GetItemInfo(itemLink)
|
local itemName = C_Item.GetItemInfo(itemLink)
|
||||||
|
if not itemName then return end -- uncached item: avoid cache[nil] "table index is nil"
|
||||||
|
|
||||||
-- delete obsolete tables
|
-- delete obsolete tables
|
||||||
if pfUI.roll.cache[itemName] and pfUI.roll.cache[itemName]["TIMESTAMP"] < GetTime() - 60 then
|
if pfUI.roll.cache[itemName] and pfUI.roll.cache[itemName]["TIMESTAMP"] < GetTime() - 60 then
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ pfUI:RegisterModule("screenshot", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function pfUI.screenshot:CHAT_MSG_SYSTEM()
|
function pfUI.screenshot:CHAT_MSG_SYSTEM()
|
||||||
local _,_, standing, rep = string.find(arg1, FACTION_STANDING_CHANGEDregex)
|
local standing, rep = string.match(arg1, FACTION_STANDING_CHANGEDregex)
|
||||||
if standing and rep then
|
if standing and rep then
|
||||||
local dt = date("%a, %b %d, %Y %X")
|
local dt = date("%a, %b %d, %Y %X")
|
||||||
local loc = string.format("%s - %s",GetRealZoneText(),GetSubZoneText())
|
local loc = string.format("%s - %s",GetRealZoneText(),GetSubZoneText())
|
||||||
@@ -150,13 +150,13 @@ pfUI:RegisterModule("screenshot", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function pfUI.screenshot:CHAT_MSG_LOOT()
|
function pfUI.screenshot:CHAT_MSG_LOOT()
|
||||||
local _,_, item, amount = string.find(arg1, LOOT_ITEM_SELF_MULTIPLEregex)
|
local item, amount = string.match(arg1, LOOT_ITEM_SELF_MULTIPLEregex)
|
||||||
if amount then -- ignore stacks
|
if amount then -- ignore stacks
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
_,_, item = string.find(arg1, LOOT_ITEM_SELFregex)
|
item = string.match(arg1, LOOT_ITEM_SELFregex)
|
||||||
if item then
|
if item then
|
||||||
local _, _, itemColor, itemString, itemName = string.find(item, "^(|c%x+)|H(.+)|h(%[.+%])")
|
local itemColor, itemString, itemName = string.match(item, "^(|c%x+)|H(.+)|h(%[.+%])")
|
||||||
local quality = color2quality[itemColor]
|
local quality = color2quality[itemColor]
|
||||||
if quality and quality >= tonumber(C.screenshot.loot) then
|
if quality and quality >= tonumber(C.screenshot.loot) then
|
||||||
local dt = date("%a, %b %d, %Y %X")
|
local dt = date("%a, %b %d, %Y %X")
|
||||||
|
|||||||
+10
-10
@@ -4,7 +4,7 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM")
|
pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM")
|
||||||
pfUI.socialmod:SetScript("OnEvent", function()
|
pfUI.socialmod:SetScript("OnEvent", function()
|
||||||
local name = cmatch(arg1, _G.ERR_FRIEND_ONLINE_SS)
|
local name = cmatch(arg1, _G.ERR_FRIEND_ONLINE_SS)
|
||||||
name = cmatch(arg1, _G.ERR_FRIEND_OFFLINE_S)
|
name = name or cmatch(arg1, _G.ERR_FRIEND_OFFLINE_S)
|
||||||
if name and playerdb[name] and playerdb[name].cname then
|
if name and playerdb[name] and playerdb[name].cname then
|
||||||
playerdb[name].lastseen = date("%a %d-%b-%Y")
|
playerdb[name].lastseen = date("%a %d-%b-%Y")
|
||||||
end
|
end
|
||||||
@@ -97,20 +97,20 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
|
|
||||||
if friendName then
|
if friendName then
|
||||||
friendName:SetText(cname)
|
friendName:SetText(cname)
|
||||||
friendLoc:SetText(format(TEXT(FRIENDS_LIST_TEMPLATE), zone, status))
|
friendLoc:SetFormattedText(TEXT(FRIENDS_LIST_TEMPLATE), zone, status)
|
||||||
else
|
else
|
||||||
friendLoc:SetText(format(TEXT(FRIENDS_LIST_TEMPLATE), cname, zone, status))
|
friendLoc:SetFormattedText(TEXT(FRIENDS_LIST_TEMPLATE), cname, zone, status)
|
||||||
end
|
end
|
||||||
|
|
||||||
friendInfo:SetText(format(TEXT(FRIENDS_LEVEL_TEMPLATE), info.level, info.className))
|
friendInfo:SetFormattedText(TEXT(FRIENDS_LEVEL_TEMPLATE), info.level, info.className)
|
||||||
caption:SetVertexColor(1,1,1,.9)
|
caption:SetVertexColor(1,1,1,.9)
|
||||||
friendInfo:SetVertexColor(1,1,1,.9)
|
friendInfo:SetVertexColor(1,1,1,.9)
|
||||||
else
|
else
|
||||||
if playerdb[name] and playerdb[name].cname and playerdb[name].level and playerdb[name].lastseen then
|
if playerdb[name] and playerdb[name].cname and playerdb[name].level and playerdb[name].lastseen then
|
||||||
caption:SetText(format(TEXT(FRIENDS_LIST_OFFLINE_TEMPLATE), playerdb[name].cname))
|
caption:SetFormattedText(TEXT(FRIENDS_LIST_OFFLINE_TEMPLATE), playerdb[name].cname)
|
||||||
friendInfo:SetText(format(TEXT(FRIENDS_LEVEL_TEMPLATE), playerdb[name].level, playerdb[name].lastseen))
|
friendInfo:SetFormattedText(TEXT(FRIENDS_LEVEL_TEMPLATE), playerdb[name].level, playerdb[name].lastseen)
|
||||||
else
|
else
|
||||||
caption:SetText(format(TEXT(FRIENDS_LIST_OFFLINE_TEMPLATE), name.."|r"))
|
caption:SetFormattedText(TEXT(FRIENDS_LIST_OFFLINE_TEMPLATE), name.."|r")
|
||||||
friendInfo:SetText(TEXT(UNKNOWN))
|
friendInfo:SetText(TEXT(UNKNOWN))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -131,9 +131,9 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
local playerguild = GetGuildInfo("player")
|
local playerguild = GetGuildInfo("player")
|
||||||
|
|
||||||
if num + 1 >= MAX_WHOS_FROM_SERVER then
|
if num + 1 >= MAX_WHOS_FROM_SERVER then
|
||||||
WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), max).." |cffaaaaaa"..format(WHO_FRAME_SHOWN_TEMPLATE, MAX_WHOS_FROM_SERVER))
|
WhoFrameTotals:SetFormattedText("|cffffffff" .. GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num) .. " |cffaaaaaa" .. WHO_FRAME_SHOWN_TEMPLATE, max, MAX_WHOS_FROM_SERVER)
|
||||||
else
|
else
|
||||||
WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), num).." |cffaaaaaa"..format(WHO_FRAME_SHOWN_TEMPLATE, num))
|
WhoFrameTotals:SetFormattedText("|cffffffff" .. GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num) .. " |cffaaaaaa" .. WHO_FRAME_SHOWN_TEMPLATE, num, num)
|
||||||
end
|
end
|
||||||
|
|
||||||
for i=1, WHOS_TO_DISPLAY do
|
for i=1, WHOS_TO_DISPLAY do
|
||||||
@@ -142,7 +142,7 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
-- filename is the class token, so no L["class"] reversal is needed
|
-- filename is the class token, so no L["class"] reversal is needed
|
||||||
local class = info.filename
|
local class = info.filename
|
||||||
|
|
||||||
_G["WhoFrameButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b)
|
_G["WhoFrameButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR:GetRGB())
|
||||||
|
|
||||||
if (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 1) then
|
if (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 1) then
|
||||||
if (info.area == playerzone) then
|
if (info.area == playerzone) then
|
||||||
|
|||||||
@@ -75,7 +75,10 @@ pfUI:RegisterModule("superwow", function ()
|
|||||||
DEFAULT_CHAT_FRAME:AddMessage("-> https://github.com/balakethelock/SuperWoW/releases/")
|
DEFAULT_CHAT_FRAME:AddMessage("-> https://github.com/balakethelock/SuperWoW/releases/")
|
||||||
end
|
end
|
||||||
|
|
||||||
if SUPERWOW_VERSION == "1.5" then
|
-- compare numerically: an exact string match silently drops this on any
|
||||||
|
-- SuperWoW release past 1.5
|
||||||
|
local swVersion = tonumber(SUPERWOW_VERSION)
|
||||||
|
if swVersion and swVersion >= 1.5 then
|
||||||
QueueFunction(function()
|
QueueFunction(function()
|
||||||
local pfCombatText_AddMessage = _G.CombatText_AddMessage
|
local pfCombatText_AddMessage = _G.CombatText_AddMessage
|
||||||
_G.CombatText_AddMessage = function(message, a, b, c, d, e, f)
|
_G.CombatText_AddMessage = function(message, a, b, c, d, e, f)
|
||||||
|
|||||||
+11
-9
@@ -284,7 +284,9 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
UpdateMovable(pfUI.swingtimer.ranged)
|
UpdateMovable(pfUI.swingtimer.ranged)
|
||||||
|
|
||||||
-- OH weapon detection
|
-- OH weapon detection
|
||||||
local OH_WEAPON_TYPES = { [13]=true, [21]=true }
|
-- OH weapon detection: slot 17 (off hand) accepts one-hand (13) and off-hand
|
||||||
|
-- weapons (22); main-hand-only (21) can never sit there.
|
||||||
|
local OH_WEAPON_TYPES = { [13]=true, [22]=true }
|
||||||
local function HasOffhandWeapon()
|
local function HasOffhandWeapon()
|
||||||
local l = GetInventoryItemLink("player", 17)
|
local l = GetInventoryItemLink("player", 17)
|
||||||
if not l then return false end
|
if not l then return false end
|
||||||
@@ -590,10 +592,10 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
end
|
end
|
||||||
pfUI.swingtimer.mainhand:SetStatusBarColor(curR, curG, curB, mhA)
|
pfUI.swingtimer.mainhand:SetStatusBarColor(curR, curG, curB, mhA)
|
||||||
if sw_showtext then
|
if sw_showtext then
|
||||||
pfUI.swingtimer.mainhand.text:SetText(string.format("%.1f", math.floor(S.mhTimer * 10) / 10))
|
pfUI.swingtimer.mainhand.text:SetFormattedText("%.1f", math.floor(S.mhTimer * 10) / 10)
|
||||||
end
|
end
|
||||||
if sw_showspeed and S.mhSpeed > 0 then
|
if sw_showspeed and S.mhSpeed > 0 then
|
||||||
pfUI.swingtimer.mainhand.speed:SetText(string.format("%.2f", S.mhSpeed))
|
pfUI.swingtimer.mainhand.speed:SetFormattedText("%.2f", S.mhSpeed)
|
||||||
end
|
end
|
||||||
anyActive = true
|
anyActive = true
|
||||||
end
|
end
|
||||||
@@ -624,10 +626,10 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if sw_showtext then
|
if sw_showtext then
|
||||||
pfUI.swingtimer.offhand.text:SetText(string.format("%.1f", math.floor(S.ohTimer * 10) / 10))
|
pfUI.swingtimer.offhand.text:SetFormattedText("%.1f", math.floor(S.ohTimer * 10) / 10)
|
||||||
end
|
end
|
||||||
if sw_showspeed and S.ohSpeed > 0 then
|
if sw_showspeed and S.ohSpeed > 0 then
|
||||||
pfUI.swingtimer.offhand.speed:SetText(string.format("%.2f", S.ohSpeed))
|
pfUI.swingtimer.offhand.speed:SetFormattedText("%.2f", S.ohSpeed)
|
||||||
end
|
end
|
||||||
anyActive = true
|
anyActive = true
|
||||||
elseif not sw_showoh then
|
elseif not sw_showoh then
|
||||||
@@ -666,9 +668,9 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
end
|
end
|
||||||
if sw_showtext then
|
if sw_showtext then
|
||||||
if remaining <= 0.5 then
|
if remaining <= 0.5 then
|
||||||
pfUI.swingtimer.ranged.text:SetText(string.format("%.1f", math.floor(remaining * 10) / 10))
|
pfUI.swingtimer.ranged.text:SetFormattedText("%.1f", math.floor(remaining * 10) / 10)
|
||||||
else
|
else
|
||||||
pfUI.swingtimer.ranged.text:SetText(string.format("%.1f", math.floor((remaining - 0.5) * 10) / 10))
|
pfUI.swingtimer.ranged.text:SetFormattedText("%.1f", math.floor((remaining - 0.5) * 10) / 10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -681,11 +683,11 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
pfUI.swingtimer.ranged.right:Hide()
|
pfUI.swingtimer.ranged.right:Hide()
|
||||||
pfUI.swingtimer.ranged.warn:Hide()
|
pfUI.swingtimer.ranged.warn:Hide()
|
||||||
if sw_showtext then
|
if sw_showtext then
|
||||||
pfUI.swingtimer.ranged.text:SetText(string.format("%.1f", math.floor(remaining * 10) / 10))
|
pfUI.swingtimer.ranged.text:SetFormattedText("%.1f", math.floor(remaining * 10) / 10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if sw_showspeed and S.raSpeed > 0 then
|
if sw_showspeed and S.raSpeed > 0 then
|
||||||
pfUI.swingtimer.ranged.speed:SetText(string.format("%.2f", S.raSpeed))
|
pfUI.swingtimer.ranged.speed:SetFormattedText("%.2f", S.raSpeed)
|
||||||
end
|
end
|
||||||
local raProgress = 1 - (S.raTimer / S.raTimerMax)
|
local raProgress = 1 - (S.raTimer / S.raTimerMax)
|
||||||
local raMarkerX = raProgress * sw_width
|
local raMarkerX = raProgress * sw_width
|
||||||
|
|||||||
@@ -277,6 +277,103 @@ pfUI:RegisterModule("thirdparty", function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- GreedMeter Damage Meter
|
||||||
|
-- Vanilla: https://github.com/iGreed/GreedMeter
|
||||||
|
-- GreedMeter builds its windows lazily and supports several of them, so the
|
||||||
|
-- frames are resolved at call time. The primary window takes the "damage"
|
||||||
|
-- dock slot; a second window (GreedMeter.UI.frames[2]) takes the "threat"
|
||||||
|
-- slot so the two tile the panel side-by-side. Docking triggers a
|
||||||
|
-- LayoutBars/RefreshFrame so the bars refit the new width.
|
||||||
|
HookAddonOrVariable("GreedMeter", function()
|
||||||
|
local UI = GreedMeter.UI
|
||||||
|
|
||||||
|
local function frameAt(i)
|
||||||
|
return UI and UI.frames and UI.frames[i]
|
||||||
|
end
|
||||||
|
local function primary()
|
||||||
|
return (UI and UI.mainFrame) or getglobal("GreedMeterFrame1")
|
||||||
|
end
|
||||||
|
local function relayout(frame)
|
||||||
|
if not UI then return end
|
||||||
|
if UI.LayoutBars then UI:LayoutBars(frame) end
|
||||||
|
if UI.RefreshFrame then UI:RefreshFrame(frame) end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Builds a docktable for a window resolved through getframe(). left picks
|
||||||
|
-- the left half in split mode; the primary window uses the right half.
|
||||||
|
local function BuildDock(name, getframe, left)
|
||||||
|
return { "greedmeter", "GreedMeter", name,
|
||||||
|
function() -- single: fill the panel
|
||||||
|
local frame = getframe()
|
||||||
|
if not frame then return end
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
frame:SetAllPoints(pfUI.chat.right)
|
||||||
|
frame:SetWidth(pfUI.chat.right:GetWidth())
|
||||||
|
relayout(frame)
|
||||||
|
end,
|
||||||
|
function() -- dual: take one half
|
||||||
|
local frame = getframe()
|
||||||
|
if not frame then return end
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
if left then
|
||||||
|
frame:SetPoint("TOPLEFT", pfUI.chat.right, "TOPLEFT", 0, 0)
|
||||||
|
frame:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOM", 0, 0)
|
||||||
|
else
|
||||||
|
frame:SetPoint("TOPLEFT", pfUI.chat.right, "TOP", 0, 0)
|
||||||
|
frame:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOMRIGHT", 0, 0)
|
||||||
|
end
|
||||||
|
frame:SetWidth(pfUI.chat.right:GetWidth() / 2)
|
||||||
|
relayout(frame)
|
||||||
|
end,
|
||||||
|
function() -- show
|
||||||
|
local frame = getframe()
|
||||||
|
if frame then frame:Show() relayout(frame) end
|
||||||
|
end,
|
||||||
|
function() -- hide
|
||||||
|
local frame = getframe()
|
||||||
|
if frame then frame:Hide() end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local threatdock = BuildDock("GreedMeterFrame2", function() return frameAt(2) end, true)
|
||||||
|
pfUI.thirdparty.meters:RegisterMeter("damage", BuildDock("GreedMeterFrame1", primary, false))
|
||||||
|
|
||||||
|
-- pfUI's dock decides fill-vs-split by whether the threat slot is filled,
|
||||||
|
-- not by counting windows, so reconcile that slot whenever GreedMeter adds
|
||||||
|
-- or removes one. Only the first two windows fit; any beyond that float.
|
||||||
|
local function SyncSecond()
|
||||||
|
if not pfUI.thirdparty.meters.damage then return end -- dock disabled
|
||||||
|
local has2 = frameAt(2) ~= nil
|
||||||
|
if has2 and not pfUI.thirdparty.meters.threat then
|
||||||
|
pfUI.thirdparty.meters.threat = threatdock
|
||||||
|
elseif not has2 and pfUI.thirdparty.meters.threat == threatdock then
|
||||||
|
pfUI.thirdparty.meters.threat = nil
|
||||||
|
end
|
||||||
|
pfUI.thirdparty.meters:Resize()
|
||||||
|
|
||||||
|
-- match the second window's visibility to the panel (the primary tracks it)
|
||||||
|
local f1, f2 = primary(), frameAt(2)
|
||||||
|
if f2 then
|
||||||
|
if f1 and f1:IsShown() then f2:Show() relayout(f2) else f2:Hide() end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- AddFrame and the login-time layout restore both go through
|
||||||
|
-- CreateMeterFrame; RemoveFrame handles closing a window.
|
||||||
|
local origCreate = UI.CreateMeterFrame
|
||||||
|
UI.CreateMeterFrame = function(self, isPrimary, copyFrom)
|
||||||
|
local frame = origCreate(self, isPrimary, copyFrom)
|
||||||
|
SyncSecond()
|
||||||
|
return frame
|
||||||
|
end
|
||||||
|
local origRemove = UI.RemoveFrame
|
||||||
|
UI.RemoveFrame = function(self, frame)
|
||||||
|
origRemove(self, frame)
|
||||||
|
SyncSecond()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
-- DPSMate Damage Meter
|
-- DPSMate Damage Meter
|
||||||
-- Vanilla: https://github.com/Geigerkind/DPSMate
|
-- Vanilla: https://github.com/Geigerkind/DPSMate
|
||||||
-- TBC: https://github.com/Geigerkind/DPSMateTBC
|
-- TBC: https://github.com/Geigerkind/DPSMateTBC
|
||||||
|
|||||||
+119
-9
@@ -166,9 +166,9 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if C.tooltip.alwaysperc == "0" and ( estimated or hpmax > 100 or round(hpmax/100*hp) ~= hp ) then
|
if C.tooltip.alwaysperc == "0" and ( estimated or hpmax > 100 or round(hpmax/100*hp) ~= hp ) then
|
||||||
pfUI.tooltipStatusBar.HP:SetText(string.format("%s / %s", Abbreviate(rhp), Abbreviate(rhpmax)))
|
pfUI.tooltipStatusBar.HP:SetFormattedText("%s / %s", Abbreviate(rhp), Abbreviate(rhpmax))
|
||||||
elseif hpmax > 0 then
|
elseif hpmax > 0 then
|
||||||
pfUI.tooltipStatusBar.HP:SetText(string.format("%s%%", ceil(hp/hpmax*100)))
|
pfUI.tooltipStatusBar.HP:SetFormattedText("%s%%", ceil(hp/hpmax*100))
|
||||||
else
|
else
|
||||||
pfUI.tooltipStatusBar.HP:SetText("")
|
pfUI.tooltipStatusBar.HP:SetText("")
|
||||||
end
|
end
|
||||||
@@ -185,14 +185,102 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
GameTooltipStatusBar.SetStatusBarColor_orig = GameTooltipStatusBar.SetStatusBarColor
|
GameTooltipStatusBar.SetStatusBarColor_orig = GameTooltipStatusBar.SetStatusBarColor
|
||||||
GameTooltipStatusBar.SetStatusBarColor = function() return end
|
GameTooltipStatusBar.SetStatusBarColor = function() return end
|
||||||
|
|
||||||
|
-- A row of buff icons anchored above the tooltip for mouseover units.
|
||||||
|
-- Icons come from a ClassicAPI object pool: ReleaseAll hides the whole
|
||||||
|
-- set each refresh, then we Acquire and re-anchor left-to-right.
|
||||||
|
local BUFF_SIZE, BUFF_SPACING, BUFF_MAX = 20, 2, 32
|
||||||
|
pfUI.tooltip.buffs = CreateFrame("Frame", "pfTooltipBuffs", GameTooltip)
|
||||||
|
pfUI.tooltip.buffs:SetPoint("BOTTOMLEFT", GameTooltipStatusBar, "TOPLEFT", 0, default_border + 2)
|
||||||
|
pfUI.tooltip.buffs:SetHeight(BUFF_SIZE)
|
||||||
|
|
||||||
|
local function CreateBuffIcon()
|
||||||
|
local icon = CreateFrame("Frame", nil, pfUI.tooltip.buffs)
|
||||||
|
icon:SetSize(BUFF_SIZE, BUFF_SIZE)
|
||||||
|
icon.texture = icon:CreateTexture(nil, "BACKGROUND")
|
||||||
|
icon.texture:SetTexCoord(.07, .93, .07, .93)
|
||||||
|
icon.texture:SetAllPoints(icon)
|
||||||
|
CreateBackdrop(icon)
|
||||||
|
|
||||||
|
icon.stacks = icon:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
icon.stacks:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 1, 0)
|
||||||
|
icon.stacks:SetFont(C.tooltip.font_tooltip, C.tooltip.font_tooltip_size, "OUTLINE")
|
||||||
|
icon.stacks:SetTextColor(1, 1, 1, 1)
|
||||||
|
|
||||||
|
icon.timer = icon:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
icon.timer:SetPoint("CENTER", icon, "CENTER", 0, 0)
|
||||||
|
icon.timer:SetFont(C.tooltip.font_tooltip, C.tooltip.font_tooltip_size, "OUTLINE")
|
||||||
|
icon.timer:SetTextColor(1, 1, 1, 1)
|
||||||
|
return icon
|
||||||
|
end
|
||||||
|
|
||||||
|
pfUI.tooltip.buffpool = CreateObjectPool(CreateBuffIcon, function(_, icon)
|
||||||
|
icon:Hide()
|
||||||
|
icon:ClearAllPoints()
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Tick the remaining-time text on the visible icons. OnUpdate only fires
|
||||||
|
-- while the row is shown, so it stops as soon as the tooltip hides.
|
||||||
|
pfUI.tooltip.buffs:SetScript("OnUpdate", function()
|
||||||
|
local now = GetTime()
|
||||||
|
if (this.tick or 0) > now then return end
|
||||||
|
this.tick = now + 0.1
|
||||||
|
for icon in pfUI.tooltip.buffpool:EnumerateActive() do
|
||||||
|
local timeleft = icon.expirationTime and icon.expirationTime > 0 and (icon.expirationTime - now) or 0
|
||||||
|
icon.timer:SetText(timeleft > 0 and GetColoredTimeString(timeleft) or "")
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
function pfUI.tooltip:UpdateBuffs(unit)
|
||||||
|
pfUI.tooltip.buffpool:ReleaseAll()
|
||||||
|
|
||||||
|
if C.tooltip.showbuffs ~= "1" or not unit or unit == "none" then
|
||||||
|
pfUI.tooltip.buffs:Hide()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local prev, count = nil, 0
|
||||||
|
for i = 1, BUFF_MAX do
|
||||||
|
local aura = C_UnitAuras.GetBuffDataByIndex(unit, i)
|
||||||
|
if not aura then break end
|
||||||
|
|
||||||
|
count = count + 1
|
||||||
|
local icon = pfUI.tooltip.buffpool:Acquire()
|
||||||
|
icon.texture:SetTexture(aura.icon)
|
||||||
|
icon.stacks:SetText(aura.applications and aura.applications > 1 and aura.applications or "")
|
||||||
|
|
||||||
|
icon.expirationTime = aura.expirationTime
|
||||||
|
local timeleft = aura.expirationTime and aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or 0
|
||||||
|
icon.timer:SetText(timeleft > 0 and GetColoredTimeString(timeleft) or "")
|
||||||
|
|
||||||
|
if prev then
|
||||||
|
icon:SetPoint("LEFT", prev, "RIGHT", BUFF_SPACING, 0)
|
||||||
|
else
|
||||||
|
icon:SetPoint("BOTTOMLEFT", pfUI.tooltip.buffs, "BOTTOMLEFT", 0, 0)
|
||||||
|
end
|
||||||
|
icon:Show()
|
||||||
|
prev = icon
|
||||||
|
end
|
||||||
|
|
||||||
|
if count > 0 then
|
||||||
|
pfUI.tooltip.buffs:SetWidth(count * BUFF_SIZE + (count - 1) * BUFF_SPACING)
|
||||||
|
pfUI.tooltip.buffs:Show()
|
||||||
|
else
|
||||||
|
pfUI.tooltip.buffs:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function pfUI.tooltip:Update()
|
function pfUI.tooltip:Update()
|
||||||
local unit = pfUI.tooltip:GetUnit()
|
local unit = pfUI.tooltip:GetUnit()
|
||||||
|
pfUI.tooltip:UpdateBuffs(unit)
|
||||||
if unit == "none" then
|
if unit == "none" then
|
||||||
-- process item tooltips
|
|
||||||
if C.tooltip.itemid == "1" and GameTooltip:HasItem() then
|
if C.tooltip.itemid == "1" and GameTooltip:HasItem() then
|
||||||
local _, _, itemID = GameTooltip:GetItem()
|
local _, _, itemID = GameTooltip:GetItem()
|
||||||
GameTooltip:AddLine(T["ItemID"] .. ": " .. itemID, .25,.5,1)
|
GameTooltip:AddLine(T["ItemID"] .. ": " .. itemID, .25,.5,1)
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
|
elseif C.tooltip.spellid == "1" and GameTooltip:HasSpell() then
|
||||||
|
local _, _, spellID = GameTooltip:GetSpell()
|
||||||
|
GameTooltip:AddLine(T["SpellID"] .. ": " .. spellID, .25,.5,1)
|
||||||
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -259,6 +347,13 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if C.tooltip.unitid == "1" and not UnitIsPlayer(unit) then
|
||||||
|
local npcID = C_CreatureInfo.GetCreatureID(UnitGUID(unit))
|
||||||
|
if npcID then
|
||||||
|
GameTooltip:AddLine(T["UnitID"] .. ": " .. npcID, .25,.5,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if hp and hpm then
|
if hp and hpm then
|
||||||
if hp >= 1000 then hp = round(hp / 1000, 1) .. "k" end
|
if hp >= 1000 then hp = round(hp / 1000, 1) .. "k" end
|
||||||
if hpm >= 1000 then hpm = round(hpm / 1000, 1) .. "k" end
|
if hpm >= 1000 then hpm = round(hpm / 1000, 1) .. "k" end
|
||||||
@@ -267,16 +362,31 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
if C.tooltip.aurasource == "1" then
|
if C.tooltip.aurasource == "1" or C.tooltip.spellid == "1" then
|
||||||
hooksecurefunc(GameTooltip, "SetUnitAura", function(self, ...)
|
hooksecurefunc(GameTooltip, "SetUnitAura", function(self, ...)
|
||||||
local aura = C_UnitAuras.GetAuraDataByIndex(unpack(arg))
|
local aura = C_UnitAuras.GetAuraDataByIndex(unpack(arg))
|
||||||
if not aura then return end
|
if not aura then return end
|
||||||
local caster = aura.sourceUnit and UnitName(aura.sourceUnit)
|
if C.tooltip.aurasource == "1" then
|
||||||
if not caster and aura.sourceGUID then
|
local caster = aura.sourceUnit and UnitName(aura.sourceUnit)
|
||||||
caster = UnitNameFromGUID(aura.sourceGUID)
|
if not caster and aura.sourceGUID then
|
||||||
|
caster = UnitNameFromGUID(aura.sourceGUID)
|
||||||
|
end
|
||||||
|
if caster and caster ~= "" then
|
||||||
|
local classToken
|
||||||
|
if aura.sourceUnit and UnitIsPlayer(aura.sourceUnit) then
|
||||||
|
classToken = UnitClassBase(aura.sourceUnit)
|
||||||
|
elseif aura.sourceGUID then
|
||||||
|
classToken = select(2, GetPlayerInfoByGUID(aura.sourceGUID))
|
||||||
|
end
|
||||||
|
if classToken then
|
||||||
|
caster = PFUI_CLASS_COLORS[classToken]:WrapTextInColorCode(caster)
|
||||||
|
end
|
||||||
|
self:AddLine(T["Cast by"] .. ": " .. caster, .25,.5,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if C.tooltip.spellid == "1" then
|
||||||
|
self:AddLine(T["SpellID"] .. ": " .. aura.spellId, .25,.5,1)
|
||||||
end
|
end
|
||||||
if not caster or caster == "" then return end
|
|
||||||
self:AddLine(T["Cast by"] .. ": " .. caster, .7, .7, 1)
|
|
||||||
self:Show()
|
self:Show()
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|||||||
+23
-90
@@ -3,56 +3,15 @@ pfUI:RegisterModule("tracking", function ()
|
|||||||
MINIMAP_TRACKING_FRAME:UnregisterAllEvents()
|
MINIMAP_TRACKING_FRAME:UnregisterAllEvents()
|
||||||
MINIMAP_TRACKING_FRAME:Hide()
|
MINIMAP_TRACKING_FRAME:Hide()
|
||||||
|
|
||||||
local function HasEntries(tbl)
|
|
||||||
for _ in pairs(tbl) do
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
local rawborder, border = GetBorderSize()
|
local rawborder, border = GetBorderSize()
|
||||||
local size = tonumber(C.appearance.minimap.tracking_size)
|
local size = tonumber(C.appearance.minimap.tracking_size)
|
||||||
local pulse = C.appearance.minimap.tracking_pulse == "1"
|
local pulse = C.appearance.minimap.tracking_pulse == "1"
|
||||||
|
|
||||||
-- Tracking spells identified by SpellID + expected icon path.
|
-- Tracking spells come from ClassicAPI's native GetNumTrackingTypes /
|
||||||
-- SpellID is the primary identifier (stable, locale-independent).
|
-- GetTrackingInfo (see the DLL's docs/API.md "Tracking"). The DLL
|
||||||
-- Icon path is used as secondary confirmation when scanning the spellbook.
|
-- enumerates them straight from the spellbook by tracking-aura effect,
|
||||||
local knownTrackingSpells = {
|
-- so there is no spell table to maintain here and server-custom trackers
|
||||||
any = {
|
-- (e.g. Turtle's Find Trees) are picked up automatically.
|
||||||
{ id = 2481, icon = "Racial_Dwarf_FindTreasure" }, -- Find Treasure
|
|
||||||
{ id = 2580, icon = "Spell_Nature_Earthquake" }, -- Find Minerals
|
|
||||||
{ id = 2383, icon = "INV_Misc_Flower_02" }, -- Find Herbs (Rank 1)
|
|
||||||
{ id = 8387, icon = "INV_Misc_Flower_02" }, -- Find Herbs (Rank 2)
|
|
||||||
{ id = 52917, icon = "INV_TradeSkillItem_03" }, -- Find Trees (TurtleWow)
|
|
||||||
},
|
|
||||||
HUNTER = {
|
|
||||||
{ id = 1494, icon = "Ability_Tracking" }, -- Track Beasts
|
|
||||||
{ id = 19883, icon = "Spell_Holy_PrayerOfHealing" }, -- Track Humanoids
|
|
||||||
{ id = 19884, icon = "Spell_Shadow_DarkSummoning" }, -- Track Undead
|
|
||||||
{ id = 19885, icon = "Ability_Stealth" }, -- Track Hidden
|
|
||||||
{ id = 19880, icon = "Spell_Frost_SummonWaterElemental" }, -- Track Elementals
|
|
||||||
{ id = 19878, icon = "Spell_Shadow_SummonFelHunter" }, -- Track Demons
|
|
||||||
{ id = 19882, icon = "Ability_Racial_Avatar" }, -- Track Giants
|
|
||||||
{ id = 19879, icon = "INV_Misc_Head_Dragon_01" }, -- Track Dragonkin
|
|
||||||
},
|
|
||||||
PALADIN = {
|
|
||||||
{ id = 5502, icon = "Spell_Holy_SenseUndead" }, -- Sense Undead
|
|
||||||
},
|
|
||||||
WARLOCK = {
|
|
||||||
{ id = 5500, icon = "Spell_Shadow_Metamorphosis" }, -- Sense Demons
|
|
||||||
},
|
|
||||||
DRUID = {
|
|
||||||
{ id = 5225, icon = "Ability_Tracking" }, -- Track Humanoids (Cat Form only)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Build a flat lookup: spellId -> entry, for fast spellbook matching
|
|
||||||
local spellIdLookup = {}
|
|
||||||
for _, entries in pairs(knownTrackingSpells) do
|
|
||||||
for _, entry in ipairs(entries) do
|
|
||||||
spellIdLookup[entry.id] = entry
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local state = {
|
local state = {
|
||||||
texture = nil,
|
texture = nil,
|
||||||
@@ -128,50 +87,24 @@ pfUI:RegisterModule("tracking", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
function pfUI.tracking:RefreshSpells()
|
function pfUI.tracking:RefreshSpells()
|
||||||
local playerClass = UnitClassBase("player")
|
state.spells = {}
|
||||||
local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(playerClass)
|
if not GetNumTrackingTypes then return end
|
||||||
|
|
||||||
-- Build set of valid SpellIDs for this class
|
-- Druid Track Humanoids (5225) only casts in Cat Form. Hide it out of
|
||||||
local validIds = {}
|
-- form so the menu never offers a tracker that would fail to cast.
|
||||||
for _, entry in ipairs(knownTrackingSpells.any) do
|
local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(UnitClassBase("player"))
|
||||||
validIds[entry.id] = true
|
|
||||||
end
|
|
||||||
if knownTrackingSpells[playerClass] then
|
|
||||||
for _, entry in ipairs(knownTrackingSpells[playerClass]) do
|
|
||||||
validIds[entry.id] = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Druids only get Track Humanoids in Cat Form
|
for i = 1, GetNumTrackingTypes() do
|
||||||
if playerClass == "DRUID" and not isCatForm then
|
local name, texture, _, _, spellId = GetTrackingInfo(i)
|
||||||
validIds[5225] = nil
|
local castable = not (spellId == 5225 and not isCatForm)
|
||||||
end
|
if name and texture and castable
|
||||||
|
and not pfUI.tracking.invalidSpells[name] then
|
||||||
-- Scan spellbook: match by icon path, confirm SpellID is valid for this class
|
state.spells[i] = {
|
||||||
for tabIndex = 1, GetNumSpellTabs() do
|
index = i, -- tracking index, passed to SetTracking()
|
||||||
local _, _, offset, numSpells = GetSpellTabInfo(tabIndex)
|
name = name,
|
||||||
for spellIndex = offset + 1, offset + numSpells do
|
texture = texture,
|
||||||
local spellTexture = GetSpellTexture(spellIndex, BOOKTYPE_SPELL)
|
spellId = spellId,
|
||||||
local spellName = GetSpellName(spellIndex, BOOKTYPE_SPELL)
|
}
|
||||||
|
|
||||||
if pfUI.tracking.invalidSpells[spellName] then
|
|
||||||
spellTexture = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
if spellTexture then
|
|
||||||
local lowerTexture = string.lower(spellTexture)
|
|
||||||
for spellId, entry in pairs(spellIdLookup) do
|
|
||||||
if validIds[spellId] and not state.spells[spellId]
|
|
||||||
and strfind(lowerTexture, string.lower(entry.icon)) then
|
|
||||||
state.spells[spellId] = {
|
|
||||||
index = spellIndex,
|
|
||||||
name = spellName,
|
|
||||||
texture = spellTexture,
|
|
||||||
spellId = spellId,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -187,7 +120,7 @@ pfUI:RegisterModule("tracking", function ()
|
|||||||
elseif not texture then
|
elseif not texture then
|
||||||
state.texture = nil
|
state.texture = nil
|
||||||
|
|
||||||
if pulse and HasEntries(state.spells) then
|
if pulse and next(state.spells) ~= nil then
|
||||||
pfUI.tracking.pulse = true
|
pfUI.tracking.pulse = true
|
||||||
pfUI.tracking.icon:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark")
|
pfUI.tracking.icon:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark")
|
||||||
pfUI.tracking.icon:SetVertexColor(1,1,1,1)
|
pfUI.tracking.icon:SetVertexColor(1,1,1,1)
|
||||||
@@ -217,7 +150,7 @@ pfUI:RegisterModule("tracking", function ()
|
|||||||
checked = spell.texture == state.texture,
|
checked = spell.texture == state.texture,
|
||||||
arg1 = spell,
|
arg1 = spell,
|
||||||
func = function (arg1)
|
func = function (arg1)
|
||||||
CastSpell(arg1.index, BOOKTYPE_SPELL)
|
SetTracking(arg1.index)
|
||||||
CloseDropDownMenus()
|
CloseDropDownMenus()
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|||||||
+12
-3
@@ -134,7 +134,7 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
this.text:SetTextColor(r, g, b, 1)
|
this.text:SetTextColor(r, g, b, 1)
|
||||||
this.text:SetText(string.format("%.1f%s", distance, suffix))
|
this.text:SetFormattedText("%.1f%s", distance, suffix)
|
||||||
this.text:Show()
|
this.text:Show()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -169,6 +169,9 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
|
|
||||||
local throttle = 0
|
local throttle = 0
|
||||||
local scanner = CreateFrame("Frame")
|
local scanner = CreateFrame("Frame")
|
||||||
|
-- expose the poller frame so PLAYER_LOGOUT can stop its UnitXP OnUpdate
|
||||||
|
-- (it lives on this separate frame, not on distanceIndicator) -> crash 132
|
||||||
|
pfUI.uf.target.distanceScanner = scanner
|
||||||
scanner:SetScript("OnUpdate", function()
|
scanner:SetScript("OnUpdate", function()
|
||||||
throttle = throttle + arg1
|
throttle = throttle + arg1
|
||||||
if throttle < 0.05 then return end
|
if throttle < 0.05 then return end
|
||||||
@@ -203,7 +206,7 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
f.text:SetTextColor(r, g, b, 1)
|
f.text:SetTextColor(r, g, b, 1)
|
||||||
f.text:SetText(string.format("%.1f%s", distance, suffix))
|
f.text:SetFormattedText("%.1f%s", distance, suffix)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
pfUI.uf.target.distanceIndicator = pfRangeDisplay
|
pfUI.uf.target.distanceIndicator = pfRangeDisplay
|
||||||
@@ -236,6 +239,10 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
if pfUI.uf.target.distanceIndicator then
|
if pfUI.uf.target.distanceIndicator then
|
||||||
pfUI.uf.target.distanceIndicator:SetScript("OnUpdate", nil)
|
pfUI.uf.target.distanceIndicator:SetScript("OnUpdate", nil)
|
||||||
end
|
end
|
||||||
|
-- free-frame mode polls from its own scanner frame, not the indicator
|
||||||
|
if pfUI.uf.target.distanceScanner then
|
||||||
|
pfUI.uf.target.distanceScanner:SetScript("OnUpdate", nil)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -268,7 +275,9 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
-- Also notify on BG queue pop
|
-- Also notify on BG queue pop
|
||||||
local origBattlefieldPortShow = BattlefieldFrame_Show
|
local origBattlefieldPortShow = BattlefieldFrame_Show
|
||||||
if origBattlefieldPortShow then
|
if origBattlefieldPortShow then
|
||||||
BattlefieldFrame_Show = function()
|
-- pfUI.env has __index but no __newindex, so a bare global assignment
|
||||||
|
-- inside a RegisterModule closure never leaves the sandbox
|
||||||
|
_G.BattlefieldFrame_Show = function()
|
||||||
pcall(UnitXP, "notify", "taskbarIcon")
|
pcall(UnitXP, "notify", "taskbarIcon")
|
||||||
pcall(UnitXP, "notify", "systemSound")
|
pcall(UnitXP, "notify", "systemSound")
|
||||||
return origBattlefieldPortShow()
|
return origBattlefieldPortShow()
|
||||||
|
|||||||
+3
-3
@@ -236,7 +236,7 @@ end
|
|||||||
local xpperc = round(xp / xpmax * 100)
|
local xpperc = round(xp / xpmax * 100)
|
||||||
local experc = ex and round(ex / xpmax * 100) or 0
|
local experc = ex and round(ex / xpmax * 100) or 0
|
||||||
if ex then text = "%s: %s%% (%s%% %s)" end
|
if ex then text = "%s: %s%% (%s%% %s)" end
|
||||||
self.bar.text:SetText(string.format(text, T["Experience"], xpperc, experc, T["Rested"]))
|
self.bar.text:SetFormattedText(text, T["Experience"], xpperc, experc, T["Rested"])
|
||||||
|
|
||||||
self.tick = GetTime() + self.timeout
|
self.tick = GetTime() + self.timeout
|
||||||
if event == "UPDATE_EXHAUSTION" and GameTooltip:IsOwned(self) then
|
if event == "UPDATE_EXHAUSTION" and GameTooltip:IsOwned(self) then
|
||||||
@@ -254,7 +254,7 @@ end
|
|||||||
|
|
||||||
local text = "%s: %s%%"
|
local text = "%s: %s%%"
|
||||||
local xpperc = nextXP and nextXP ~= 0 and round(currXP / nextXP * 100) or 0
|
local xpperc = nextXP and nextXP ~= 0 and round(currXP / nextXP * 100) or 0
|
||||||
self.bar.text:SetText(string.format(text, T["Pet Experience"], xpperc))
|
self.bar.text:SetFormattedText(text, T["Pet Experience"], xpperc)
|
||||||
|
|
||||||
self.tick = GetTime() + self.timeout
|
self.tick = GetTime() + self.timeout
|
||||||
return
|
return
|
||||||
@@ -282,7 +282,7 @@ end
|
|||||||
local text = "%s: %s%% (%s)"
|
local text = "%s: %s%% (%s)"
|
||||||
local perc = round(barValue / barMax * 100)
|
local perc = round(barValue / barMax * 100)
|
||||||
local standing = GetText("FACTION_STANDING_LABEL"..standingID, gender)
|
local standing = GetText("FACTION_STANDING_LABEL"..standingID, gender)
|
||||||
self.bar.text:SetText(string.format(text, name, perc, standing))
|
self.bar.text:SetFormattedText(text, name, perc, standing)
|
||||||
|
|
||||||
self.tick = GetTime() + self.timeout
|
self.tick = GetTime() + self.timeout
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ do
|
|||||||
-- ClassicAPI dependency check.
|
-- ClassicAPI dependency check.
|
||||||
-- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus
|
-- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus
|
||||||
-- API surface that ClassicAPI polyfills, so presence is required.
|
-- API surface that ClassicAPI polyfills, so presence is required.
|
||||||
local PFUI_CLASSIC_API_MIN = 10906 -- (X*10000 + Y*100 + Z)
|
local PFUI_CLASSIC_API_MIN = 11204 -- (X*10000 + Y*100 + Z)
|
||||||
local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN
|
local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN
|
||||||
local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI"
|
local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI"
|
||||||
local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest"
|
local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest"
|
||||||
@@ -86,14 +86,13 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- initialize saved variables
|
pfUI_playerDB = pfUI_playerDB or {}
|
||||||
pfUI_playerDB = {}
|
pfUI_config = pfUI_config or {}
|
||||||
pfUI_config = {}
|
pfUI_init = pfUI_init or {}
|
||||||
pfUI_init = {}
|
pfUI_profiles = pfUI_profiles or {}
|
||||||
pfUI_profiles = {}
|
pfUI_addon_profiles = pfUI_addon_profiles or {}
|
||||||
pfUI_addon_profiles = {}
|
pfUI_cache = pfUI_cache or {}
|
||||||
pfUI_cache = {}
|
pfUI_throttle = pfUI_throttle or {}
|
||||||
pfUI_throttle = {}
|
|
||||||
|
|
||||||
-- localization
|
-- localization
|
||||||
pfUI_locale = {}
|
pfUI_locale = {}
|
||||||
@@ -110,6 +109,14 @@ pfUI.movables = {}
|
|||||||
pfUI.version = {}
|
pfUI.version = {}
|
||||||
pfUI.env = {}
|
pfUI.env = {}
|
||||||
|
|
||||||
|
-- Capability flag: this fork's pfActionBar buttons correctly handle the modern
|
||||||
|
-- HookScript widget method, so ClassicAPI's AddOnCompat shim must NOT shadow
|
||||||
|
-- HookScript during actionbar load (older forks branch on `if button.HookScript`
|
||||||
|
-- and take a modern path they were never written for). This describes behavior,
|
||||||
|
-- not identity: a fork that keeps the HookScript-correct actionbar code keeps
|
||||||
|
-- the flag; one that lacks it should drop the flag and get the safe fallback.
|
||||||
|
pfUI.handlesHookScript = true
|
||||||
|
|
||||||
if not pfUI.disabled then
|
if not pfUI.disabled then
|
||||||
pfUI.events = Mixin({}, CallbackRegistryMixin)
|
pfUI.events = Mixin({}, CallbackRegistryMixin)
|
||||||
pfUI.events:OnLoad()
|
pfUI.events:OnLoad()
|
||||||
@@ -293,6 +300,20 @@ function pfUI:GetEnvironment()
|
|||||||
pfUI.env.pfUI_throttle = _G.pfUI_throttle
|
pfUI.env.pfUI_throttle = _G.pfUI_throttle
|
||||||
pfUI.env.L = (pfUI_locale[GetLocale()] or pfUI_locale["enUS"])
|
pfUI.env.L = (pfUI_locale[GetLocale()] or pfUI_locale["enUS"])
|
||||||
pfUI.env.L["class"] = pfUI.env.L["class"] or tInvert(LOCALIZED_CLASS_NAMES_MALE)
|
pfUI.env.L["class"] = pfUI.env.L["class"] or tInvert(LOCALIZED_CLASS_NAMES_MALE)
|
||||||
|
if not pfUI.env.L["race"] then
|
||||||
|
pfUI.env.L["race"] = {}
|
||||||
|
local i = 1
|
||||||
|
local raceInfo = C_CreatureInfo.GetRaceInfo(i)
|
||||||
|
while raceInfo ~= nil do
|
||||||
|
pfUI.env.L["race"][raceInfo.clientFileString] = {
|
||||||
|
raceName = raceInfo.raceName,
|
||||||
|
raceID = raceInfo.raceID,
|
||||||
|
faction = C_CreatureInfo.GetFactionInfo(i).groupTag,
|
||||||
|
}
|
||||||
|
i = i + 1
|
||||||
|
raceInfo = C_CreatureInfo.GetRaceInfo(i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return pfUI.env
|
return pfUI.env
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
## Version: @project-version@
|
## Version: @project-version@
|
||||||
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache, pfUI_throttle
|
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache, pfUI_throttle
|
||||||
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
||||||
## Dependencies: !!!ClassicAPI
|
|
||||||
## X-Website: https://github.com/brues-code/pfUI
|
## X-Website: https://github.com/brues-code/pfUI
|
||||||
|
|
||||||
pfUI.lua
|
pfUI.lua
|
||||||
|
|||||||
@@ -295,9 +295,8 @@ pfUI:RegisterSkin("Character", function ()
|
|||||||
if faction and faction.reaction and faction.reaction < 8 then
|
if faction and faction.reaction and faction.reaction < 8 then
|
||||||
local repLeft = faction.nextReactionThreshold - faction.currentStanding
|
local repLeft = faction.nextReactionThreshold - faction.currentStanding
|
||||||
if repLeft > 1 then
|
if repLeft > 1 then
|
||||||
local text = standing:GetText() .. string.format(" (%d)", repLeft)
|
standing:SetFormattedText("%s (%d)", standing:GetText(), repLeft)
|
||||||
standing:SetText(text)
|
standing:GetParent().standingText = standing:GetText()
|
||||||
standing:GetParent().standingText = text
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ pfUI:RegisterSkin("Inspect", function ()
|
|||||||
local guild, title = GetGuildInfo(InspectFrame.unit)
|
local guild, title = GetGuildInfo(InspectFrame.unit)
|
||||||
if guild then
|
if guild then
|
||||||
InspectGuildText:SetPoint("TOP", InspectLevelText, "BOTTOM", 0, -1)
|
InspectGuildText:SetPoint("TOP", InspectLevelText, "BOTTOM", 0, -1)
|
||||||
InspectGuildText:SetText(format(TEXT(GUILD_TITLE_TEMPLATE), title, guild))
|
InspectGuildText:SetFormattedText(TEXT(GUILD_TITLE_TEMPLATE), title, guild)
|
||||||
InspectGuildText:Show()
|
InspectGuildText:Show()
|
||||||
else
|
else
|
||||||
InspectGuildText:SetText("")
|
InspectGuildText:SetText("")
|
||||||
|
|||||||
Reference in New Issue
Block a user