mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-20 03:20:49 +00:00
Compare commits
25
Commits
9daf6165fd
...
v9.0.20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
+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")
|
||||||
|
|||||||
+60
-20
@@ -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" )
|
||||||
@@ -2141,6 +2178,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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
+1
-1
@@ -1222,7 +1222,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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+7
-5
@@ -810,23 +810,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
|
||||||
|
|||||||
@@ -263,7 +263,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 +283,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 +305,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)
|
||||||
|
|||||||
+7
-1
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
+66
-26
@@ -1154,12 +1154,21 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
plate.level:SetText(string.format("%s%s", level, (elitestrings[elite] or "")))
|
plate.level:SetText(string.format("%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
|
||||||
@@ -1251,9 +1260,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
|
||||||
@@ -1521,33 +1553,41 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
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
|
||||||
if r + g + b ~= nameplate.cache.namecolor or (cfg.namefightcolor and nameplate.cache.inCombat ~= inCombatWithPlayer) then
|
local r, g, b = original.name:GetTextColor()
|
||||||
nameplate.cache.namecolor = r + g + b
|
local inCombatWithPlayer = cfg.namefightcolor and UnitAffectingCombat(nameplate.unit) and UnitAffectingCombat("player")
|
||||||
nameplate.cache.inCombat = inCombatWithPlayer
|
|
||||||
|
|
||||||
if cfg.namefightcolor then
|
if r + g + b ~= nameplate.cache.namecolor or (cfg.namefightcolor and nameplate.cache.inCombat ~= inCombatWithPlayer) then
|
||||||
if (r > .9 and g < .2 and b < .2) or inCombatWithPlayer then
|
nameplate.cache.namecolor = r + g + b
|
||||||
nameplate.name:SetTextColor(1,0.4,0.2,1)
|
nameplate.cache.inCombat = inCombatWithPlayer
|
||||||
|
|
||||||
|
if cfg.namefightcolor then
|
||||||
|
if (r > .9 and g < .2 and b < .2) or inCombatWithPlayer then
|
||||||
|
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
|
||||||
|
|||||||
+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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+117
-7
@@ -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
|
||||||
|
|||||||
+10
-1
@@ -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
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -110,6 +110,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 +301,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
|
||||||
|
|||||||
Reference in New Issue
Block a user