mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-10 15:40:01 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4eab494a01 | ||
|
|
bb8ce8fd63 | ||
|
|
75c4657ab9 | ||
|
|
5815b9e81e |
@@ -23,12 +23,12 @@ jobs:
|
|||||||
IFS=. read -r MAJOR MINOR PATCH <<<"$LATEST"
|
IFS=. read -r MAJOR MINOR PATCH <<<"$LATEST"
|
||||||
PACKED=$((MAJOR * 10000 + MINOR * 100 + PATCH))
|
PACKED=$((MAJOR * 10000 + MINOR * 100 + PATCH))
|
||||||
echo "Pinning PFUI_CLASSIC_API_LATEST to $LATEST ($PACKED)"
|
echo "Pinning PFUI_CLASSIC_API_LATEST to $LATEST ($PACKED)"
|
||||||
sed -i "s/^\([[:space:]]*\)local PFUI_CLASSIC_API_LATEST = .*/\1local PFUI_CLASSIC_API_LATEST = $PACKED/" pfUI.lua
|
sed -i "s/^\([[:space:]]*\)local PFUI_CLASSIC_API_LATEST = .*/\1local PFUI_CLASSIC_API_LATEST = $PACKED/" API_Check.lua
|
||||||
grep 'local PFUI_CLASSIC_API_' pfUI.lua
|
grep 'local PFUI_CLASSIC_API_' API_Check.lua
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Package and release to GitHub
|
- name: Package and release to GitHub
|
||||||
uses: BigWigsMods/packager@v2
|
uses: brues-code/packager@vCAPI
|
||||||
env:
|
env:
|
||||||
GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
do
|
||||||
|
-- ClassicAPI dependency gate.
|
||||||
|
--
|
||||||
|
-- Which TOC the client opened already answers "is ClassicAPI here?". Whenever
|
||||||
|
-- the DLL is loaded it redirects the read of `pfUI\pfUI.toc` to
|
||||||
|
-- `pfUI_Turtle.toc` (Turtle clients) or `pfUI_ClassicAPI.toc` (everything
|
||||||
|
-- else). Reaching this file from the plain `pfUI.toc` therefore means
|
||||||
|
-- ClassicAPI is absent -- and that TOC deliberately loads nothing but this
|
||||||
|
-- file, so there is nothing to disable, only a notice to show.
|
||||||
|
--
|
||||||
|
-- The flavor TOCs still need a version gate of their own: the redirect has
|
||||||
|
-- existed since ClassicAPI v1.11.0, well below the API surface pfUI relies
|
||||||
|
-- on. There pfUI does load, and will throw wherever it reaches for something
|
||||||
|
-- the installed DLL doesn't have yet -- the popup names the cause so those
|
||||||
|
-- errors aren't a mystery.
|
||||||
|
local PFUI_CLASSIC_API_MIN = 11304 -- (X*10000 + Y*100 + Z)
|
||||||
|
local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN
|
||||||
|
local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI"
|
||||||
|
local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest"
|
||||||
|
local function FormatVersion(packed)
|
||||||
|
local x = math.floor(packed / 10000)
|
||||||
|
local y = math.floor(math.mod(packed, 10000) / 100)
|
||||||
|
local z = math.mod(packed, 100)
|
||||||
|
return string.format("v%d.%d.%d", x, y, z)
|
||||||
|
end
|
||||||
|
|
||||||
|
local headline, detail
|
||||||
|
if not CLASSIC_API_VERSION then
|
||||||
|
headline = "|cff33ffccpf|cffffffffUI|r has been disabled."
|
||||||
|
detail = "The ClassicAPI DLL isn't loaded. Download the latest release from:"
|
||||||
|
elseif CLASSIC_API_VERSION < PFUI_CLASSIC_API_MIN then
|
||||||
|
headline = "|cff33ffccpf|cffffffffUI|r will not work correctly on ClassicAPI " .. FormatVersion(CLASSIC_API_VERSION) .. "."
|
||||||
|
detail = FormatVersion(PFUI_CLASSIC_API_MIN) .. " or newer is required -- any errors alongside this one are the APIs it is missing. Download the latest release from:"
|
||||||
|
end
|
||||||
|
|
||||||
|
if detail then
|
||||||
|
local function ShowRequiredPopup()
|
||||||
|
StaticPopupDialogs["PFUI_CLASSICAPI_REQUIRED"] = {
|
||||||
|
text = headline .. "\n\n" .. detail,
|
||||||
|
button1 = OKAY,
|
||||||
|
hasEditBox = 1,
|
||||||
|
editBoxWidth = 280,
|
||||||
|
timeout = 0,
|
||||||
|
whileDead = 1,
|
||||||
|
hideOnEscape = 1,
|
||||||
|
preferredIndex = 3,
|
||||||
|
OnShow = function()
|
||||||
|
local editBox = getglobal(this:GetName().."EditBox")
|
||||||
|
if editBox then
|
||||||
|
editBox:SetText(PFUI_CLASSIC_API_LATEST_URL)
|
||||||
|
editBox:HighlightText()
|
||||||
|
editBox:SetFocus()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
StaticPopup_Show("PFUI_CLASSICAPI_REQUIRED")
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage(
|
||||||
|
headline .. " " .. detail .. " " .. PFUI_CLASSIC_API_LATEST_URL,
|
||||||
|
1, 0.3, 0.3
|
||||||
|
)
|
||||||
|
end
|
||||||
|
local loginFrame = CreateFrame("Frame")
|
||||||
|
loginFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
loginFrame:SetScript("OnEvent", function()
|
||||||
|
loginFrame:UnregisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
ShowRequiredPopup()
|
||||||
|
end)
|
||||||
|
elseif CLASSIC_API_VERSION < PFUI_CLASSIC_API_LATEST then
|
||||||
|
EventUtil.ContinueOnPlayerLogin(function()
|
||||||
|
C_Timer.After(8, function()
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage(
|
||||||
|
"|cff33ffccpf|rUI: ClassicAPI " .. FormatVersion(PFUI_CLASSIC_API_LATEST) .. " is available — " .. PFUI_CLASSIC_API_LATEST_URL,
|
||||||
|
1, 0.85, 0.3
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
+59
@@ -204,6 +204,26 @@ 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
|
||||||
|
|
||||||
|
-- [ ScanAuraSlots ]
|
||||||
|
-- Fills `buf` with the slot ids of the auras on `unit` that match `filter` and
|
||||||
|
-- returns how many (buf[1..n]; entries past n are cleared), so a module can
|
||||||
|
-- keep one buffer and refill it every refresh. Read each aura with
|
||||||
|
-- C_UnitAuras.UnitAuraBySlot(unit, buf[i]) (positional, no table) or
|
||||||
|
-- GetAuraDataBySlot. One enumeration walks the aura array once, where a
|
||||||
|
-- by-index loop (UnitAura(unit, i)) re-walks it from the start for every i.
|
||||||
|
-- Uses GetAuraSlots' fill-a-table form (table as the 5th argument) instead of
|
||||||
|
-- its vararg return: Lua 5.0 builds an `arg` table for every vararg call, so
|
||||||
|
-- collecting the returns in a Lua helper would allocate once per scan.
|
||||||
|
-- unit [string] unit token
|
||||||
|
-- filter [string] aura filter ("HELPFUL", "HARMFUL|PLAYER", ...)
|
||||||
|
-- buf [table] reusable buffer, filled in place
|
||||||
|
-- max [number] optional cap on the slot count (nil = all)
|
||||||
|
-- return: [number] count of slot ids written to buf
|
||||||
|
function pfUI.api.ScanAuraSlots(unit, filter, buf, max)
|
||||||
|
local _, n = C_UnitAuras.GetAuraSlots(unit, filter, max, nil, buf)
|
||||||
|
return n
|
||||||
|
end
|
||||||
|
|
||||||
-- [ IsPlayerGuid ]
|
-- [ IsPlayerGuid ]
|
||||||
-- Returns whether a GUID or unit token refers to the local player.
|
-- Returns whether a GUID or unit token refers to the local player.
|
||||||
-- guid [string] A unit GUID (or unitID) to test.
|
-- guid [string] A unit GUID (or unitID) to test.
|
||||||
@@ -242,6 +262,45 @@ function pfUI.api.GetUnitColor(unitstr)
|
|||||||
return classColor:GenerateHexColorMarkup(), classColor:GetRGB()
|
return classColor:GenerateHexColorMarkup(), classColor:GetRGB()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- [ GetRaceIcon ]
|
||||||
|
-- Builds an inline race icon texture from the shared races atlas.
|
||||||
|
-- 'raceKey' [string] englishRace key (e.g. "NightElf")
|
||||||
|
-- 'sex' [int] unit sex (3 = female)
|
||||||
|
-- return: [string] inline texture escape, or an empty string
|
||||||
|
function pfUI.api.GetRaceIcon(raceKey, sex)
|
||||||
|
if not raceKey then return "" end
|
||||||
|
local gender = sex == 3 and "FEMALE" or "MALE"
|
||||||
|
local coords = RACE_ICON_TCOORDS[strupper(raceKey) .. "_" .. gender]
|
||||||
|
if not coords then return "" end
|
||||||
|
return string.format(
|
||||||
|
"|TInterface\\Glues\\CharacterCreate\\UI-CharacterCreate-Races:0:0:0:0:512:512:%d:%d:%d:%d|t",
|
||||||
|
coords[1] * 512, coords[2] * 512, coords[3] * 512, coords[4] * 512)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- inline faction emblems (cropped from the target-frame PvP banners)
|
||||||
|
local FACTION_ICON = {
|
||||||
|
Alliance = "|TInterface\\TargetingFrame\\UI-PVP-Alliance:0:0:0:0:64:64:5:37:3:35|t",
|
||||||
|
Horde = "|TInterface\\TargetingFrame\\UI-PVP-Horde:0:0:0:0:64:64:5:37:3:35|t",
|
||||||
|
}
|
||||||
|
|
||||||
|
-- [ GetFactionIcon ]
|
||||||
|
-- Resolves an inline faction emblem from the englishRace key stored in L["race"].
|
||||||
|
-- 'raceKey' [string] englishRace key (e.g. "Orc")
|
||||||
|
-- return: [string] inline texture escape, or an empty string
|
||||||
|
function pfUI.api.GetFactionIcon(raceKey)
|
||||||
|
local info = raceKey and L["race"][raceKey]
|
||||||
|
if not info then return "" end
|
||||||
|
return FACTION_ICON[info.faction] or ""
|
||||||
|
end
|
||||||
|
|
||||||
|
-- [ GetPlayerRaceIcons ]
|
||||||
|
-- Returns the faction and race emblems of the player character.
|
||||||
|
-- return: [string] both inline textures, or an empty string
|
||||||
|
function pfUI.api.GetPlayerRaceIcons()
|
||||||
|
local _, raceKey = UnitRace("player")
|
||||||
|
return pfUI.api.GetFactionIcon(raceKey) .. pfUI.api.GetRaceIcon(raceKey, UnitSex("player"))
|
||||||
|
end
|
||||||
|
|
||||||
-- [ strvertical ]
|
-- [ strvertical ]
|
||||||
-- Creates vertical text using linebreaks. Multibyte char friendly.
|
-- Creates vertical text using linebreaks. Multibyte char friendly.
|
||||||
-- 'str' [string] String to columnize.
|
-- 'str' [string] String to columnize.
|
||||||
|
|||||||
@@ -817,6 +817,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("chat", "text", "playerlinks", "1")
|
pfUI:UpdateConfig("chat", "text", "playerlinks", "1")
|
||||||
pfUI:UpdateConfig("chat", "text", "detecturl", "1")
|
pfUI:UpdateConfig("chat", "text", "detecturl", "1")
|
||||||
pfUI:UpdateConfig("chat", "text", "classcolor", "1")
|
pfUI:UpdateConfig("chat", "text", "classcolor", "1")
|
||||||
|
pfUI:UpdateConfig("chat", "text", "playericons", "0")
|
||||||
pfUI:UpdateConfig("chat", "text", "whosearchunknown", "0")
|
pfUI:UpdateConfig("chat", "text", "whosearchunknown", "0")
|
||||||
pfUI:UpdateConfig("chat", "text", "playerlevel", "0")
|
pfUI:UpdateConfig("chat", "text", "playerlevel", "0")
|
||||||
pfUI:UpdateConfig("chat", "left", "width", "380")
|
pfUI:UpdateConfig("chat", "left", "width", "380")
|
||||||
|
|||||||
+51
-30
@@ -4,6 +4,17 @@ setfenv(1, pfUI:GetEnvironment())
|
|||||||
pfUI.uf = CreateFrame("Frame", nil, UIParent)
|
pfUI.uf = CreateFrame("Frame", nil, UIParent)
|
||||||
pfUI.uf.frames = {}
|
pfUI.uf.frames = {}
|
||||||
|
|
||||||
|
-- Reusable buffer for C_UnitAuras.GetAuraSlots slot ids (filled by
|
||||||
|
-- ScanAuraSlots, api.lua). Each aura scan in RefreshUnit fills it once, then
|
||||||
|
-- reads every aura by slot id: one array walk per scan instead of one per index.
|
||||||
|
-- Scans run back to back and consume the buffer before the next refill.
|
||||||
|
local auraSlots = {}
|
||||||
|
|
||||||
|
-- Separate buffer for the tooltip handlers. They run from OnEnter, which can
|
||||||
|
-- fire while RefreshUnit is showing/hiding icons under the cursor, so they must
|
||||||
|
-- not share the refresh buffer.
|
||||||
|
local tooltipSlots = {}
|
||||||
|
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
-- GUID-based Roster Tracking for Smart Updates
|
-- GUID-based Roster Tracking for Smart Updates
|
||||||
-- Only updates frames where the unit actually changed, not ALL 40 frames
|
-- Only updates frames where the unit actually changed, not ALL 40 frames
|
||||||
@@ -88,16 +99,21 @@ local function DebuffOnEnter()
|
|||||||
local parent = this:GetParent()
|
local parent = this:GetParent()
|
||||||
|
|
||||||
-- selfdebuff filters the displayed list to player-cast harmful auras, but
|
-- selfdebuff filters the displayed list to player-cast harmful auras, but
|
||||||
-- SetUnitAura's index has to be into the engine's full HARMFUL list. Look
|
-- SetUnitAura's index has to be into the unfiltered HARMFUL list. Look up
|
||||||
-- up the displayed aura via the PLAYER filter, then scan engine slots for
|
-- the displayed aura via the PLAYER filter, then find its position in the
|
||||||
-- one whose name + sourceGUID match.
|
-- unfiltered list by name + sourceGUID.
|
||||||
|
--
|
||||||
|
-- The unfiltered list is NOT capped at 16: once a unit's 16 debuff slots
|
||||||
|
-- are full the server parks further debuffs in buff slots, and C_UnitAuras
|
||||||
|
-- reports those as harmful too. So enumerate however many the unit has.
|
||||||
if parent.config and parent.config.selfdebuff == "1" then
|
if parent.config and parent.config.selfdebuff == "1" then
|
||||||
local ownAura = C_UnitAuras.GetAuraDataByIndex(unitstr, this.id, "HARMFUL|PLAYER")
|
local ownAura = C_UnitAuras.GetAuraDataByIndex(unitstr, this.id, "HARMFUL|PLAYER")
|
||||||
if ownAura then
|
if ownAura then
|
||||||
for gameSlot = 1, 16 do
|
local n = ScanAuraSlots(unitstr, "HARMFUL", tooltipSlots)
|
||||||
local check = C_UnitAuras.GetDebuffDataByIndex(unitstr, gameSlot)
|
for i = 1, n do
|
||||||
|
local check = C_UnitAuras.GetAuraDataBySlot(unitstr, tooltipSlots[i])
|
||||||
if check and check.name == ownAura.name and check.sourceGUID == ownAura.sourceGUID then
|
if check and check.name == ownAura.name and check.sourceGUID == ownAura.sourceGUID then
|
||||||
GameTooltip:SetUnitAura(unitstr, gameSlot, "HARMFUL")
|
GameTooltip:SetUnitAura(unitstr, i, "HARMFUL")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -761,7 +777,7 @@ function pfUI.uf:UpdateConfig()
|
|||||||
if not f.buffs[i].cd then
|
if not f.buffs[i].cd then
|
||||||
if cooldown_anim == 1 then
|
if cooldown_anim == 1 then
|
||||||
-- Animation enabled: Use Model frame with CooldownFrameTemplate
|
-- Animation enabled: Use Model frame with CooldownFrameTemplate
|
||||||
f.buffs[i].cd = CreateFrame(COOLDOWN_FRAME_TYPE, f.buffs[i]:GetName() .. "Cooldown", f.buffs[i], "CooldownFrameTemplate")
|
f.buffs[i].cd = CreateFrame("Model", f.buffs[i]:GetName() .. "Cooldown", f.buffs[i], "CooldownFrameTemplate")
|
||||||
else
|
else
|
||||||
-- Animation disabled: Use regular Frame with dummy functions
|
-- Animation disabled: Use regular Frame with dummy functions
|
||||||
f.buffs[i].cd = CreateFrame("Frame", f.buffs[i]:GetName() .. "Cooldown", f.buffs[i])
|
f.buffs[i].cd = CreateFrame("Frame", f.buffs[i]:GetName() .. "Cooldown", f.buffs[i])
|
||||||
@@ -834,7 +850,7 @@ function pfUI.uf:UpdateConfig()
|
|||||||
if not f.debuffs[i].cd then
|
if not f.debuffs[i].cd then
|
||||||
if cooldown_anim == 1 then
|
if cooldown_anim == 1 then
|
||||||
-- Animation enabled: Use Model frame with CooldownFrameTemplate
|
-- Animation enabled: Use Model frame with CooldownFrameTemplate
|
||||||
f.debuffs[i].cd = CreateFrame(COOLDOWN_FRAME_TYPE, f.debuffs[i]:GetName() .. "Cooldown", f.debuffs[i], "CooldownFrameTemplate")
|
f.debuffs[i].cd = CreateFrame("Model", f.debuffs[i]:GetName() .. "Cooldown", f.debuffs[i], "CooldownFrameTemplate")
|
||||||
else
|
else
|
||||||
-- Animation disabled: Use regular Frame with dummy functions
|
-- Animation disabled: Use regular Frame with dummy functions
|
||||||
f.debuffs[i].cd = CreateFrame("Frame", f.debuffs[i]:GetName() .. "Cooldown", f.debuffs[i])
|
f.debuffs[i].cd = CreateFrame("Frame", f.debuffs[i]:GetName() .. "Cooldown", f.debuffs[i])
|
||||||
@@ -1635,11 +1651,13 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
|
|
||||||
-- buffs
|
-- buffs
|
||||||
if unit.buffs and ( component == "all" or component == "aura" ) then
|
if unit.buffs and ( component == "all" or component == "aura" ) then
|
||||||
|
-- one GetAuraSlots enumeration per refresh, then a positional read per
|
||||||
|
-- slot id: allocates nothing and never re-walks the aura array per icon
|
||||||
|
ScanAuraSlots(unitstr, "HELPFUL", auraSlots, unit.config.bufflimit)
|
||||||
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
|
||||||
|
|
||||||
-- positional UnitBuff allocates nothing (vs a table per icon per refresh)
|
local name, icon, count, _, duration, expirationTime, _, _, _, spellId = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
local name, icon, count, _, duration, expirationTime, _, _, _, spellId = C_UnitAuras.UnitBuff(unitstr, i)
|
|
||||||
|
|
||||||
if name then
|
if name then
|
||||||
unit.buffs[i].texture:SetTexture(icon)
|
unit.buffs[i].texture:SetTexture(icon)
|
||||||
@@ -1723,6 +1741,13 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
reposition = true
|
reposition = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- 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
|
||||||
|
-- effects on you). One GetAuraSlots enumeration per refresh; the i-th slot
|
||||||
|
-- is the i-th aura of the filtered list, so `i` stays the tooltip index.
|
||||||
|
local filter = (unit.label ~= "player" and selfdebuff == "1") and "HARMFUL|PLAYER" or "HARMFUL"
|
||||||
|
ScanAuraSlots(unitstr, filter, auraSlots, unit.config.debufflimit)
|
||||||
|
|
||||||
for i=1, unit.config.debufflimit do
|
for i=1, unit.config.debufflimit do
|
||||||
if not unit.debuffs[i] then break end
|
if not unit.debuffs[i] then break end
|
||||||
|
|
||||||
@@ -1739,12 +1764,8 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
invert_h * ((row+buffrow)*(multiply*default_border + unit.config.debuffsize + 1) + (multiply*default_border + 1)))
|
invert_h * ((row+buffrow)*(multiply*default_border + unit.config.debuffsize + 1) + (multiply*default_border + 1)))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- selfdebuff narrows to player-cast harmful auras via the PLAYER filter.
|
-- positional read by slot id allocates nothing
|
||||||
-- Player-frame debuffs aren't gated on it (it'd hide most party-applied
|
local name, icon, count, dispelType, duration, expirationTime = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
-- effects on you).
|
|
||||||
-- positional UnitDebuff allocates nothing; PLAYER predicate honored for selfdebuff
|
|
||||||
local filter = (unit.label ~= "player" and selfdebuff == "1") and "PLAYER" or nil
|
|
||||||
local name, icon, count, dispelType, duration, expirationTime = C_UnitAuras.UnitDebuff(unitstr, i, filter)
|
|
||||||
if name then
|
if name then
|
||||||
texture, stacks, dtype = icon, count, dispelType
|
texture, stacks, dtype = icon, count, dispelType
|
||||||
else
|
else
|
||||||
@@ -1834,8 +1855,9 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
local present = pfUI.uf.dispelPresent or {}
|
local present = pfUI.uf.dispelPresent or {}
|
||||||
pfUI.uf.dispelPresent = present
|
pfUI.uf.dispelPresent = present
|
||||||
for k in pairs(present) do present[k] = nil end
|
for k in pairs(present) do present[k] = nil end
|
||||||
for i=1,16 do
|
local n = ScanAuraSlots(unitstr, "HARMFUL", auraSlots)
|
||||||
local name, _, _, dispelType = C_UnitAuras.UnitDebuff(unitstr, i)
|
for i=1,n do
|
||||||
|
local name, _, _, dispelType = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
if name and dispelType and dispelType ~= "" then present[dispelType] = true end
|
if name and dispelType and dispelType ~= "" then present[dispelType] = true end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1925,9 +1947,9 @@ 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
|
||||||
local i = 1
|
local n = ScanAuraSlots(unitstr, "HELPFUL", auraSlots)
|
||||||
while true do
|
for i=1,n do
|
||||||
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitBuff(unitstr, i)
|
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
if not name then break end
|
if not name then break end
|
||||||
local texLower = string.lower(icon)
|
local texLower = string.lower(icon)
|
||||||
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
||||||
@@ -1948,14 +1970,13 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
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
|
||||||
local ai = 1
|
local n = ScanAuraSlots(unitstr, "HELPFUL", auraSlots)
|
||||||
while true do
|
for i=1,n do
|
||||||
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitBuff(unitstr, ai)
|
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
if not name then break end
|
if not name then break end
|
||||||
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
local timeleft = expirationTime > 0 and (expirationTime - GetTime()) or nil
|
||||||
local lowerName = string.lower(name)
|
local lowerName = string.lower(name)
|
||||||
@@ -1966,12 +1987,12 @@ function pfUI.uf:RefreshUnit(unit, component)
|
|||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ai = ai + 1
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local debuffFilter = unit.config.selfdebuff == "1" and "PLAYER" or nil
|
local debuffFilter = unit.config.selfdebuff == "1" and "HARMFUL|PLAYER" or "HARMFUL"
|
||||||
for i=1,16 do -- scan for custom debuffs
|
n = ScanAuraSlots(unitstr, debuffFilter, auraSlots)
|
||||||
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitDebuff(unitstr, i, debuffFilter)
|
for i=1,n do -- scan for custom debuffs
|
||||||
|
local name, icon, count, _, _, expirationTime = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
if name then
|
if name then
|
||||||
local timeleft = expirationTime > 0 and (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
|
||||||
@@ -2233,7 +2254,7 @@ function pfUI.uf:AddIcon(frame, pos, icon, timeleft, stacks, start, duration)
|
|||||||
-- Check if parent frame has cooldown animation enabled
|
-- Check if parent frame has cooldown animation enabled
|
||||||
local parent_cooldown_anim = frame.config and tonumber(frame.config.cooldown_anim) or 1
|
local parent_cooldown_anim = frame.config and tonumber(frame.config.cooldown_anim) or 1
|
||||||
if parent_cooldown_anim == 1 then
|
if parent_cooldown_anim == 1 then
|
||||||
frame.icon[pos].cd = CreateFrame(COOLDOWN_FRAME_TYPE, nil, frame.icon[pos])
|
frame.icon[pos].cd = CreateFrame("Model", nil, frame.icon[pos])
|
||||||
else
|
else
|
||||||
frame.icon[pos].cd = CreateFrame("Frame", nil, frame.icon[pos])
|
frame.icon[pos].cd = CreateFrame("Frame", nil, frame.icon[pos])
|
||||||
frame.icon[pos].cd.AdvanceTime = DoNothing
|
frame.icon[pos].cd.AdvanceTime = DoNothing
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
-- load pfUI environment
|
|
||||||
setfenv(1, pfUI:GetEnvironment())
|
|
||||||
|
|
||||||
-- [[ Constants ]]--
|
|
||||||
EVENTS_MINIMAP_ZONE_UPDATE = {"PLAYER_ENTERING_WORLD", "MINIMAP_ZONE_CHANGED"}
|
|
||||||
|
|
||||||
MICRO_BUTTONS = {
|
|
||||||
'CharacterMicroButton', 'SpellbookMicroButton', 'TalentMicroButton',
|
|
||||||
'QuestLogMicroButton', 'SocialsMicroButton', 'WorldMapMicroButton',
|
|
||||||
'MainMenuMicroButton', 'HelpMicroButton',
|
|
||||||
}
|
|
||||||
|
|
||||||
NAMEPLATE_OBJECTORDER = { "border", "glow", "name", "level", "levelicon", "raidicon" }
|
|
||||||
|
|
||||||
NAMEPLATE_FRAMETYPE = "Button"
|
|
||||||
|
|
||||||
MINIMAP_TRACKING_FRAME = _G.MiniMapTrackingFrame
|
|
||||||
|
|
||||||
FRIENDS_NAME_LOCATION = "ButtonTextNameLocation"
|
|
||||||
|
|
||||||
COOLDOWN_FRAME_TYPE = "Model"
|
|
||||||
LOOT_BUTTON_FRAME_TYPE = "LootButton"
|
|
||||||
|
|
||||||
PLAYER_BUFF_START_ID = -1
|
|
||||||
|
|
||||||
ACTIONBAR_SECURE_TEMPLATE_BAR = nil
|
|
||||||
ACTIONBAR_SECURE_TEMPLATE_BUTTON = nil
|
|
||||||
|
|
||||||
--[[ Vanilla API Extensions ]]--
|
|
||||||
|
|
||||||
do -- RunMacroText
|
|
||||||
local obj = { ["GetText"] = function(self) return self.text end }
|
|
||||||
obj = setmetatable(obj, {__index = function(tab,key)
|
|
||||||
local value = function() return end
|
|
||||||
rawset(tab,key,value)
|
|
||||||
return value
|
|
||||||
end})
|
|
||||||
|
|
||||||
function RunMacroText(text)
|
|
||||||
obj.text = text
|
|
||||||
ChatEdit_ParseText(obj, 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
Vendored
-2358
File diff suppressed because it is too large
Load Diff
Vendored
+2377
File diff suppressed because it is too large
Load Diff
Vendored
+2991
File diff suppressed because it is too large
Load Diff
@@ -72,7 +72,6 @@
|
|||||||
<Include file="..\modules\totems.lua"/>
|
<Include file="..\modules\totems.lua"/>
|
||||||
<Include file="..\modules\macrotweak.lua"/>
|
<Include file="..\modules\macrotweak.lua"/>
|
||||||
<Include file="..\modules\macroicons.lua"/>
|
<Include file="..\modules\macroicons.lua"/>
|
||||||
<Include file="..\modules\turtle-wow.lua"/>
|
|
||||||
<Include file="..\modules\superwow.lua"/>
|
<Include file="..\modules\superwow.lua"/>
|
||||||
<Include file="..\modules\innervatecall.lua"/>
|
<Include file="..\modules\innervatecall.lua"/>
|
||||||
<Include file="..\modules\nampower.lua"/>
|
<Include file="..\modules\nampower.lua"/>
|
||||||
|
|||||||
+1
-7
@@ -35,12 +35,6 @@
|
|||||||
<Include file="..\skins\blizzard\tooltips.lua"/>
|
<Include file="..\skins\blizzard\tooltips.lua"/>
|
||||||
<Include file="..\skins\blizzard\tabard.lua"/>
|
<Include file="..\skins\blizzard\tabard.lua"/>
|
||||||
<Include file="..\skins\blizzard\itemtext.lua"/>
|
<Include file="..\skins\blizzard\itemtext.lua"/>
|
||||||
<Include file="..\skins\blizzard\lft.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\turtle_shop.lua"/>
|
|
||||||
|
|
||||||
<!-- Turtle WoW -->
|
|
||||||
<Include file="..\skins\blizzard\barbershop.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\transmog.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\ebc.lua"/>
|
|
||||||
|
|
||||||
|
<!-- Turtle WoW skins live in init\turtle.xml (pfUI_Turtle.toc only). -->
|
||||||
</Ui>
|
</Ui>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
<Include file="..\compat\vanilla.lua"/>
|
<Include file="..\env\tables_stock.lua"/>
|
||||||
</Ui>
|
</Ui>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<!-- Turtle WoW only: pulled in by pfUI_Turtle.toc, which ClassicAPI selects
|
||||||
|
when it detects a Turtle client. Everything in here targets frames that
|
||||||
|
only a Turtle client ever creates. -->
|
||||||
|
<Include file="..\env\tables_turtle.lua"/>
|
||||||
|
|
||||||
|
<Include file="..\skins\blizzard\lft.lua"/>
|
||||||
|
<Include file="..\skins\blizzard\turtle_shop.lua"/>
|
||||||
|
<Include file="..\skins\blizzard\barbershop.lua"/>
|
||||||
|
<Include file="..\skins\blizzard\transmog.lua"/>
|
||||||
|
<Include file="..\skins\blizzard\ebc.lua"/>
|
||||||
|
|
||||||
|
<Include file="..\modules\turtle-wow.lua"/>
|
||||||
|
</Ui>
|
||||||
@@ -1016,7 +1016,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
|
|
||||||
local id = (bar-1)*12+button
|
local id = (bar-1)*12+button
|
||||||
local exists = _G[button_name] and true or nil
|
local exists = _G[button_name] and true or nil
|
||||||
local f = _G[button_name] or CreateFrame("Button", button_name, parent, ACTIONBAR_SECURE_TEMPLATE_BUTTON)
|
local f = _G[button_name] or CreateFrame("Button", button_name, parent)
|
||||||
|
|
||||||
-- no button available, create a new one
|
-- no button available, create a new one
|
||||||
if not exists then
|
if not exists then
|
||||||
@@ -1042,7 +1042,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
f.slot = id
|
f.slot = id
|
||||||
|
|
||||||
-- cooldown
|
-- cooldown
|
||||||
f.cd = CreateFrame(COOLDOWN_FRAME_TYPE, f:GetName() .. "Cooldown", f, "CooldownFrameTemplate")
|
f.cd = CreateFrame("Model", f:GetName() .. "Cooldown", f, "CooldownFrameTemplate")
|
||||||
f.cd.pfCooldownStyleAnimation = 1
|
f.cd.pfCooldownStyleAnimation = 1
|
||||||
f.cd.pfCooldownType = "NOGCD"
|
f.cd.pfCooldownType = "NOGCD"
|
||||||
f.cd.pfCooldownSize = cd_size
|
f.cd.pfCooldownSize = cd_size
|
||||||
@@ -1233,7 +1233,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
|
|
||||||
-- create frame
|
-- create frame
|
||||||
local init = not bars[i]
|
local init = not bars[i]
|
||||||
bars[i] = bars[i] or CreateFrame("Frame", "pfActionBar" .. barnames[i], UIParent, ACTIONBAR_SECURE_TEMPLATE_BAR)
|
bars[i] = bars[i] or CreateFrame("Frame", "pfActionBar" .. barnames[i], UIParent)
|
||||||
bars[i]:SetID(i)
|
bars[i]:SetID(i)
|
||||||
|
|
||||||
-- autohide
|
-- autohide
|
||||||
|
|||||||
+1
-1
@@ -396,7 +396,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
if tpl == "BankItemButtonGenericTemplate" then
|
if tpl == "BankItemButtonGenericTemplate" then
|
||||||
local bankslot = pfUI.bags[bag].slots[slot].frame
|
local bankslot = pfUI.bags[bag].slots[slot].frame
|
||||||
local name = "pfBag" .. bag .. "item" .. slot .. "Cooldown"
|
local name = "pfBag" .. bag .. "item" .. slot .. "Cooldown"
|
||||||
bankslot.cd = CreateFrame(COOLDOWN_FRAME_TYPE, name, bankslot, "CooldownFrameTemplate")
|
bankslot.cd = CreateFrame("Model", name, bankslot, "CooldownFrameTemplate")
|
||||||
bankslot.cd:SetAllPoints(bankslot)
|
bankslot.cd:SetAllPoints(bankslot)
|
||||||
bankslot.cd.pfCooldownStyleAnimation = 1
|
bankslot.cd.pfCooldownStyleAnimation = 1
|
||||||
bankslot.cd.pfCooldownType = "ALL"
|
bankslot.cd.pfCooldownType = "ALL"
|
||||||
|
|||||||
+16
-1
@@ -7,6 +7,15 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
|
|
||||||
local br, bg, bb, ba = GetStringColor(pfUI_config.appearance.border.color)
|
local br, bg, bb, ba = GetStringColor(pfUI_config.appearance.border.color)
|
||||||
|
|
||||||
|
-- Player aura slot ids, enumerated once per refresh pass (ScanPlayerAuraSlots)
|
||||||
|
-- and read per button by its aura index: one GetAuraSlots walk per range
|
||||||
|
-- instead of a by-index walk per button.
|
||||||
|
local helpfulSlots, harmfulSlots = {}, {}
|
||||||
|
local function ScanPlayerAuraSlots()
|
||||||
|
ScanAuraSlots("player", "HELPFUL", helpfulSlots, 32)
|
||||||
|
ScanAuraSlots("player", "HARMFUL", harmfulSlots, 16)
|
||||||
|
end
|
||||||
|
|
||||||
local function RefreshBuffButton(buff)
|
local function RefreshBuffButton(buff)
|
||||||
if buff.btype == "HELPFUL" then
|
if buff.btype == "HELPFUL" then
|
||||||
if C.buffs.separateweapons == "1" then
|
if C.buffs.separateweapons == "1" then
|
||||||
@@ -23,7 +32,8 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
CreateBackdropShadow(buff)
|
CreateBackdropShadow(buff)
|
||||||
end
|
end
|
||||||
|
|
||||||
local name, icon, count, dispelType, _, expirationTime, _, _, _, spellId = C_UnitAuras.UnitAura("player", buff.id, buff.btype)
|
local slots = buff.btype == "HELPFUL" and helpfulSlots or harmfulSlots
|
||||||
|
local name, icon, count, dispelType, _, expirationTime, _, _, _, spellId = C_UnitAuras.UnitAuraBySlot("player", slots[buff.id])
|
||||||
|
|
||||||
--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
|
||||||
@@ -166,6 +176,8 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
pfUI.buff.wepbuffs.count = 0
|
pfUI.buff.wepbuffs.count = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ScanPlayerAuraSlots()
|
||||||
|
|
||||||
for i=1,32 do
|
for i=1,32 do
|
||||||
RefreshBuffButton(pfUI.buff.buffs.buttons[i])
|
RefreshBuffButton(pfUI.buff.buffs.buttons[i])
|
||||||
end
|
end
|
||||||
@@ -246,6 +258,9 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- CreateBuffButton refreshes each new button from the slot buffers
|
||||||
|
ScanPlayerAuraSlots()
|
||||||
|
|
||||||
-- Weapon Buffs
|
-- Weapon Buffs
|
||||||
pfUI.buff.wepbuffs = CreateFrame("Frame", "pfWepBuffFrame", UIParent)
|
pfUI.buff.wepbuffs = CreateFrame("Frame", "pfWepBuffFrame", UIParent)
|
||||||
pfUI.buff.wepbuffs.count = 0
|
pfUI.buff.wepbuffs.count = 0
|
||||||
|
|||||||
+28
-10
@@ -73,9 +73,16 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
return anchor
|
return anchor
|
||||||
end
|
end
|
||||||
|
|
||||||
local function GetBuffData(unit, id, type, selfdebuff)
|
-- reusable GetAuraSlots buffer, filled once per RefreshBuffBarFrame
|
||||||
local filter = (selfdebuff and type == "HARMFUL") and "HARMFUL|PLAYER" or type
|
local auraSlots = {}
|
||||||
local name, icon, count, dispelType, _, expirationTime = C_UnitAuras.UnitAura(unit, id, filter)
|
|
||||||
|
-- Separate buffer for the tooltip handler: OnEnter can fire while a refresh
|
||||||
|
-- is showing/hiding bars under the cursor, so it must not share the above.
|
||||||
|
local tooltipSlots = {}
|
||||||
|
|
||||||
|
-- Reads one aura by the slot id GetAuraSlots returned (nil slot -> nil).
|
||||||
|
local function GetBuffData(unit, slot)
|
||||||
|
local name, icon, count, dispelType, _, expirationTime = C_UnitAuras.UnitAuraBySlot(unit, slot)
|
||||||
if not name then return end
|
if not name then return end
|
||||||
local remaining = expirationTime > 0 and (expirationTime - GetTime()) or 0
|
local remaining = expirationTime > 0 and (expirationTime - GetTime()) or 0
|
||||||
return remaining, icon, name, count, dispelType
|
return remaining, icon, name, count, dispelType
|
||||||
@@ -113,17 +120,22 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
GameTooltip:SetUnitAura("player", this.id, this.type)
|
GameTooltip:SetUnitAura("player", this.id, this.type)
|
||||||
elseif this.type == "HARMFUL" then
|
elseif this.type == "HARMFUL" then
|
||||||
-- selfdebuff filters the displayed list to player-cast harmful auras, but
|
-- selfdebuff filters the displayed list to player-cast harmful auras, but
|
||||||
-- SetUnitAura's index has to be into the engine's full HARMFUL list. Look
|
-- SetUnitAura's index has to be into the unfiltered HARMFUL list. Look up
|
||||||
-- up the displayed aura via the PLAYER filter, then scan engine slots for
|
-- the displayed aura via the PLAYER filter, then find its position in the
|
||||||
-- one whose name + sourceGUID match.
|
-- unfiltered list by name + sourceGUID.
|
||||||
|
--
|
||||||
|
-- The unfiltered list is NOT capped at 16: once a unit's 16 debuff slots
|
||||||
|
-- are full the server parks further debuffs in buff slots, and
|
||||||
|
-- C_UnitAuras reports those as harmful too. So enumerate what it has.
|
||||||
local config = this.parent and this.parent.config
|
local config = this.parent and this.parent.config
|
||||||
if config and config.selfdebuff == "1" then
|
if config and config.selfdebuff == "1" then
|
||||||
local ownAura = C_UnitAuras.GetAuraDataByIndex(this.unit, this.id, "HARMFUL|PLAYER")
|
local ownAura = C_UnitAuras.GetAuraDataByIndex(this.unit, this.id, "HARMFUL|PLAYER")
|
||||||
if ownAura then
|
if ownAura then
|
||||||
for gameSlot = 1, 16 do
|
local n = ScanAuraSlots(this.unit, "HARMFUL", tooltipSlots)
|
||||||
local check = C_UnitAuras.GetDebuffDataByIndex(this.unit, gameSlot)
|
for i = 1, n do
|
||||||
|
local check = C_UnitAuras.GetAuraDataBySlot(this.unit, tooltipSlots[i])
|
||||||
if check and check.name == ownAura.name and check.sourceGUID == ownAura.sourceGUID then
|
if check and check.name == ownAura.name and check.sourceGUID == ownAura.sourceGUID then
|
||||||
GameTooltip:SetUnitAura(this.unit, gameSlot, "HARMFUL")
|
GameTooltip:SetUnitAura(this.unit, i, "HARMFUL")
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -234,9 +246,15 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
local function RefreshBuffBarFrame(frame)
|
local function RefreshBuffBarFrame(frame)
|
||||||
-- reinitialize all active buffs
|
-- reinitialize all active buffs
|
||||||
local selfdebuff = frame.config.selfdebuff == "1"
|
local selfdebuff = frame.config.selfdebuff == "1"
|
||||||
|
local filter = (selfdebuff and frame.type == "HARMFUL") and "HARMFUL|PLAYER" or frame.type
|
||||||
|
|
||||||
|
-- one GetAuraSlots enumeration per refresh instead of a by-index walk per
|
||||||
|
-- bar; the i-th slot is the i-th aura of the filtered list, so `i` stays
|
||||||
|
-- the index the tooltip / cancel handlers pass to the by-index API
|
||||||
|
ScanAuraSlots(frame.unit, filter, auraSlots, 32)
|
||||||
|
|
||||||
for i=1,32 do
|
for i=1,32 do
|
||||||
local timeleft, texture, name, stacks, dtype = GetBuffData(frame.unit, i, frame.type, selfdebuff)
|
local timeleft, texture, name, stacks, dtype = GetBuffData(frame.unit, auraSlots[i])
|
||||||
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
|
||||||
|
|||||||
+40
-21
@@ -63,6 +63,23 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
return pfUI_cache["chathistory"][realm][player][id]
|
return pfUI_cache["chathistory"][realm][player][id]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- [ Chat Panel Colors ]
|
||||||
|
-- The panels normally inherit pfUI's global appearance theme; custom colors let chat
|
||||||
|
-- deviate from it. CreateBackdrop is re-run first to restore the theme, so toggling
|
||||||
|
-- custom colors back off doesn't leave the previous override behind.
|
||||||
|
local function ApplyPanelColors(panel)
|
||||||
|
if not panel then return end
|
||||||
|
|
||||||
|
CreateBackdrop(panel, default_border, nil, .8)
|
||||||
|
if C.chat.global.custombg ~= "1" then return end
|
||||||
|
|
||||||
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
|
panel.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
|
panel.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
end
|
||||||
|
|
||||||
pfUI.chat = CreateFrame("Frame",nil,UIParent)
|
pfUI.chat = CreateFrame("Frame",nil,UIParent)
|
||||||
|
|
||||||
pfUI.chat.left = CreateFrame("Frame", "pfChatLeft", UIParent)
|
pfUI.chat.left = CreateFrame("Frame", "pfChatLeft", UIParent)
|
||||||
@@ -76,19 +93,11 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
pfUI.chat.left:SetPoint("BOTTOMLEFT", 2*default_border,2*default_border)
|
pfUI.chat.left:SetPoint("BOTTOMLEFT", 2*default_border,2*default_border)
|
||||||
pfUI.chat.left:SetScript("OnShow", function() pfUI.chat:RefreshChat() end)
|
pfUI.chat.left:SetScript("OnShow", function() pfUI.chat:RefreshChat() end)
|
||||||
UpdateMovable(pfUI.chat.left)
|
UpdateMovable(pfUI.chat.left)
|
||||||
CreateBackdrop(pfUI.chat.left, default_border, nil, .8)
|
ApplyPanelColors(pfUI.chat.left)
|
||||||
if C.chat.global.frameshadow == "1" then
|
if C.chat.global.frameshadow == "1" then
|
||||||
CreateBackdropShadow(pfUI.chat.left)
|
CreateBackdropShadow(pfUI.chat.left)
|
||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.global.custombg == "1" then
|
|
||||||
local r, g, b, a = GetStringColor(C.chat.global.background)
|
|
||||||
pfUI.chat.left.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
|
||||||
|
|
||||||
local r, g, b, a = GetStringColor(C.chat.global.border)
|
|
||||||
pfUI.chat.left.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
|
||||||
end
|
|
||||||
|
|
||||||
pfUI.chat.left.panelTop = CreateFrame("Frame", "leftChatPanelTop", pfUI.chat.left)
|
pfUI.chat.left.panelTop = CreateFrame("Frame", "leftChatPanelTop", pfUI.chat.left)
|
||||||
pfUI.chat.left.panelTop:ClearAllPoints()
|
pfUI.chat.left.panelTop:ClearAllPoints()
|
||||||
pfUI.chat.left.panelTop:SetHeight(C.global.font_size+default_border*2)
|
pfUI.chat.left.panelTop:SetHeight(C.global.font_size+default_border*2)
|
||||||
@@ -251,19 +260,11 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
pfUI.chat.right:SetPoint("BOTTOMRIGHT", -2*default_border,2*default_border)
|
pfUI.chat.right:SetPoint("BOTTOMRIGHT", -2*default_border,2*default_border)
|
||||||
pfUI.chat.right:SetScript("OnShow", function() pfUI.chat:RefreshChat() end)
|
pfUI.chat.right:SetScript("OnShow", function() pfUI.chat:RefreshChat() end)
|
||||||
UpdateMovable(pfUI.chat.right)
|
UpdateMovable(pfUI.chat.right)
|
||||||
CreateBackdrop(pfUI.chat.right, default_border, nil, .8)
|
ApplyPanelColors(pfUI.chat.right)
|
||||||
if C.chat.global.frameshadow == "1" then
|
if C.chat.global.frameshadow == "1" then
|
||||||
CreateBackdropShadow(pfUI.chat.right)
|
CreateBackdropShadow(pfUI.chat.right)
|
||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.global.custombg == "1" then
|
|
||||||
local r, g, b, a = GetStringColor(C.chat.global.background)
|
|
||||||
pfUI.chat.right.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
|
||||||
|
|
||||||
local r, g, b, a = GetStringColor(C.chat.global.border)
|
|
||||||
pfUI.chat.right.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
|
||||||
end
|
|
||||||
|
|
||||||
pfUI.chat.right.panelTop = CreateFrame("Frame", "rightChatPanelTop", pfUI.chat.right)
|
pfUI.chat.right.panelTop = CreateFrame("Frame", "rightChatPanelTop", pfUI.chat.right)
|
||||||
pfUI.chat.right.panelTop:ClearAllPoints()
|
pfUI.chat.right.panelTop:ClearAllPoints()
|
||||||
pfUI.chat.right.panelTop:SetHeight(C.global.font_size+default_border*2)
|
pfUI.chat.right.panelTop:SetHeight(C.global.font_size+default_border*2)
|
||||||
@@ -300,7 +301,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
-- Blizzard's per-window transparency slider drives FCF_SetWindowAlpha, which only
|
-- Blizzard's per-window transparency slider drives FCF_SetWindowAlpha, which only
|
||||||
-- touches the ChatFrame*Background textures that pfUI hides on docked frames. Mirror
|
-- 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
|
-- 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.
|
-- controls it directly.
|
||||||
local function ApplyChatBackgroundAlpha(panel, frame)
|
local function ApplyChatBackgroundAlpha(panel, frame)
|
||||||
if not (panel and panel.backdrop and frame) then return end
|
if not (panel and panel.backdrop and frame) then return end
|
||||||
local _, _, _, _, _, alpha = GetChatWindowInfo(frame:GetID())
|
local _, _, _, _, _, alpha = GetChatWindowInfo(frame:GetID())
|
||||||
@@ -311,6 +312,12 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function pfUI.chat:RefreshBackgroundAlpha()
|
function pfUI.chat:RefreshBackgroundAlpha()
|
||||||
|
-- Custom colors own the alpha. C.chat.global.background carries its own alpha, is
|
||||||
|
-- set by profiles and is shared with the meter skins, so the native slider must not
|
||||||
|
-- overwrite it -- doing so reverted the configured opacity on every refresh. The
|
||||||
|
-- slider only drives the panel when the user hasn't opted into pfUI's chat colors.
|
||||||
|
if C.chat.global.custombg == "1" then return end
|
||||||
|
|
||||||
-- left panel follows the currently selected docked tab
|
-- left panel follows the currently selected docked tab
|
||||||
local selected = SELECTED_CHAT_FRAME
|
local selected = SELECTED_CHAT_FRAME
|
||||||
if not (selected and selected:GetParent() == pfUI.chat.left) then
|
if not (selected and selected:GetParent() == pfUI.chat.left) then
|
||||||
@@ -323,6 +330,14 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- live config apply, resolved by the gui as U["chat"]. Lets the color pickers
|
||||||
|
-- take effect on the spot instead of waiting for a /reload.
|
||||||
|
function pfUI.chat:UpdateConfig()
|
||||||
|
ApplyPanelColors(pfUI.chat.left)
|
||||||
|
ApplyPanelColors(pfUI.chat.right)
|
||||||
|
pfUI.chat:RefreshBackgroundAlpha()
|
||||||
|
end
|
||||||
|
|
||||||
function pfUI.chat:MigrateBackgroundAlpha()
|
function pfUI.chat:MigrateBackgroundAlpha()
|
||||||
-- Runs once per character. The previous SetupPositions default stored a hard 0 window
|
-- 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
|
-- alpha, which now renders the pfUI backdrop fully transparent. Restore the historical
|
||||||
@@ -812,7 +827,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
local real, _ = strsplit(":", name)
|
local real, _ = strsplit(":", name)
|
||||||
local color = unknowncolorhex
|
local color = unknowncolorhex
|
||||||
local match = false
|
local match = false
|
||||||
local _, class = C_PlayerCache.GetPlayerInfoByName(real)
|
local _, class, _, raceKey, sex = C_PlayerCache.GetPlayerInfoByName(real)
|
||||||
-- local guid = GetCurrentChatGUID()
|
-- local guid = GetCurrentChatGUID()
|
||||||
-- if guid then
|
-- if guid then
|
||||||
-- _, class = GetPlayerInfoByGUID(guid)
|
-- _, class = GetPlayerInfoByGUID(guid)
|
||||||
@@ -830,8 +845,12 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.text.tintunknown == "1" or match then
|
if C.chat.text.tintunknown == "1" or match then
|
||||||
|
local icon = ""
|
||||||
|
if match and C.chat.text.playericons == "1" then
|
||||||
|
icon = GetFactionIcon(raceKey) .. GetRaceIcon(raceKey, sex)
|
||||||
|
end
|
||||||
text = string.gsub(text, "|Hplayer:"..name.."|h%["..real.."%]|h(.-:-)",
|
text = string.gsub(text, "|Hplayer:"..name.."|h%["..real.."%]|h(.-:-)",
|
||||||
left..color.."|Hplayer:"..name.."|h" .. color .. real .. "|h|r"..right.."%1")
|
left..icon..color.."|Hplayer:"..name.."|h" .. color .. real .. "|h|r"..right.."%1")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+4
-3
@@ -2867,6 +2867,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Generate Playerlinks"], C.chat.text, "playerlinks", "checkbox")
|
CreateConfig(nil, T["Generate Playerlinks"], C.chat.text, "playerlinks", "checkbox")
|
||||||
CreateConfig(nil, T["Enable URL Detection"], C.chat.text, "detecturl", "checkbox")
|
CreateConfig(nil, T["Enable URL Detection"], C.chat.text, "detecturl", "checkbox")
|
||||||
CreateConfig(nil, T["Enable Class Colors"], C.chat.text, "classcolor", "checkbox")
|
CreateConfig(nil, T["Enable Class Colors"], C.chat.text, "classcolor", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Faction & Race Icons"] .. " " .. GetPlayerRaceIcons(), C.chat.text, "playericons", "checkbox")
|
||||||
CreateConfig(nil, T["Enable Player Levels"], C.chat.text, "playerlevel", "checkbox")
|
CreateConfig(nil, T["Enable Player Levels"], C.chat.text, "playerlevel", "checkbox")
|
||||||
CreateConfig(nil, T["Who Search Unknown Classes (|cffffaaaaExperimental|r)"], C.chat.text, "whosearchunknown", "checkbox")
|
CreateConfig(nil, T["Who Search Unknown Classes (|cffffaaaaExperimental|r)"], C.chat.text, "whosearchunknown", "checkbox")
|
||||||
CreateConfig(nil, T["Colorize Unknown Classes"], C.chat.text, "tintunknown", "checkbox")
|
CreateConfig(nil, T["Colorize Unknown Classes"], C.chat.text, "tintunknown", "checkbox")
|
||||||
@@ -2880,9 +2881,9 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Only Show Chat Dock On Mouseover"], C.chat.global, "tabmouse", "checkbox")
|
CreateConfig(nil, T["Only Show Chat Dock On Mouseover"], C.chat.global, "tabmouse", "checkbox")
|
||||||
CreateConfig(nil, T["Enable Chat Tab Flashing"], C.chat.global, "chatflash", "checkbox")
|
CreateConfig(nil, T["Enable Chat Tab Flashing"], C.chat.global, "chatflash", "checkbox")
|
||||||
CreateConfig(nil, T["Enable Frame Shadow"], C.chat.global, "frameshadow", "checkbox")
|
CreateConfig(nil, T["Enable Frame Shadow"], C.chat.global, "frameshadow", "checkbox")
|
||||||
CreateConfig(nil, T["Enable Custom Colors"], C.chat.global, "custombg", "checkbox")
|
CreateConfig(U["chat"], T["Enable Custom Colors"], C.chat.global, "custombg", "checkbox")
|
||||||
CreateConfig(nil, T["Chat Background Color"], C.chat.global, "background", "color")
|
CreateConfig(U["chat"], T["Chat Background Color"], C.chat.global, "background", "color")
|
||||||
CreateConfig(nil, T["Chat Border Color"], C.chat.global, "border", "color")
|
CreateConfig(U["chat"], T["Chat Border Color"], C.chat.global, "border", "color")
|
||||||
CreateConfig(nil, T["Enable Custom Incoming Whispers Layout"], C.chat.global, "whispermod", "checkbox")
|
CreateConfig(nil, T["Enable Custom Incoming Whispers Layout"], C.chat.global, "whispermod", "checkbox")
|
||||||
CreateConfig(nil, T["Incoming Whispers Color"], C.chat.global, "whisper", "color")
|
CreateConfig(nil, T["Incoming Whispers Color"], C.chat.global, "whisper", "color")
|
||||||
CreateConfig(nil, T["Enable Sticky Chat"], C.chat.global, "sticky", "checkbox")
|
CreateConfig(nil, T["Enable Sticky Chat"], C.chat.global, "sticky", "checkbox")
|
||||||
|
|||||||
+1
-1
@@ -511,7 +511,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function pfUI.loot:CreateSlot(id)
|
function pfUI.loot:CreateSlot(id)
|
||||||
local frame = CreateFrame(LOOT_BUTTON_FRAME_TYPE, 'pfLootButton'..id, pfUI.loot)
|
local frame = CreateFrame("LootButton", 'pfLootButton'..id, pfUI.loot)
|
||||||
frame:RegisterForClicks('LeftButtonUp', 'RightButtonUp')
|
frame:RegisterForClicks('LeftButtonUp', 'RightButtonUp')
|
||||||
frame:SetPoint("LEFT", border*2, 0)
|
frame:SetPoint("LEFT", border*2, 0)
|
||||||
frame:SetPoint("RIGHT", -border*2, 0)
|
frame:SetPoint("RIGHT", -border*2, 0)
|
||||||
|
|||||||
+26
-34
@@ -116,6 +116,7 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
-- Reusable per-plate debuff display buffer (avoid GC churn from per-call table creation)
|
-- Reusable per-plate debuff display buffer (avoid GC churn from per-call table creation)
|
||||||
local debuffDisplayBuf = {} -- [i] = { effect, texture, stacks, dtype, duration, timeleft }
|
local debuffDisplayBuf = {} -- [i] = { effect, texture, stacks, dtype, duration, timeleft }
|
||||||
for i = 1, 16 do debuffDisplayBuf[i] = {} end
|
for i = 1, 16 do debuffDisplayBuf[i] = {} end
|
||||||
|
local auraSlots = {} -- reusable GetAuraSlots buffer for the per-plate aura scan
|
||||||
local threatMemory = {} -- guid -> true if mob had player targeted
|
local threatMemory = {} -- guid -> true if mob had player targeted
|
||||||
-- local debuffSeen = {} -- reusable table for debuff tracking (avoid GC churn)
|
-- local debuffSeen = {} -- reusable table for debuff tracking (avoid GC churn)
|
||||||
|
|
||||||
@@ -296,18 +297,23 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
return plate.creatureType
|
return plate.creatureType
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Totem icon, read straight from the game:
|
-- Totem icon: UnitCreatedBySpell returns the totem-drop spell, whose icon IS
|
||||||
-- * Passive totems self-cast their provided buff, so they carry exactly one
|
-- the totem's icon. It's a broadcast descriptor field the client has for every
|
||||||
-- aura whose icon IS the totem's icon (Totem::Summon TOTEM_PASSIVE).
|
-- summoned unit in range, so it resolves immediately for passive and active
|
||||||
-- * Active totems (Searing/Magma/Fire Nova) cast at enemies and hold no
|
-- totems alike -- no self-aura read or attack-cast capture needed.
|
||||||
-- self-aura, so their icon arrives via UNIT_SPELLCAST_SUCCEEDED (cached
|
--
|
||||||
-- into plate.totemIcon by the event handler); nil here until then.
|
-- Re-read the spell every call rather than caching the icon outright: a shaman
|
||||||
|
-- can swap the totem in place (same unit, new drop spell) with no plate re-add
|
||||||
|
-- to invalidate a cache, so key the cached texture on the spell id and refresh
|
||||||
|
-- it only when the spell changes.
|
||||||
local function TotemPlate(plate)
|
local function TotemPlate(plate)
|
||||||
if C.nameplates.totemicons ~= "1" then return nil end
|
if C.nameplates.totemicons ~= "1" then return nil end
|
||||||
if CreatureType(plate) ~= 11 then return nil end
|
if CreatureType(plate) ~= 11 then return nil end
|
||||||
if plate.totemIcon then return plate.totemIcon end
|
local spellId = UnitCreatedBySpell(plate.cachedGuid)
|
||||||
local aura = C_UnitAuras.GetBuffDataByIndex(plate.cachedGuid, 1)
|
if spellId ~= plate.totemSpell then
|
||||||
if aura then plate.totemIcon = aura.icon end
|
plate.totemSpell = spellId
|
||||||
|
plate.totemIcon = spellId and C_Spell.GetSpellTexture(spellId) or nil
|
||||||
|
end
|
||||||
return plate.totemIcon
|
return plate.totemIcon
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -427,7 +433,7 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
plate.debuffs[index].cd.SetSequenceTime = DoNothing
|
plate.debuffs[index].cd.SetSequenceTime = DoNothing
|
||||||
else
|
else
|
||||||
-- Use CooldownFrameTemplate for animation
|
-- Use CooldownFrameTemplate for animation
|
||||||
plate.debuffs[index].cd = CreateFrame(COOLDOWN_FRAME_TYPE, plate.platename.."Debuff"..index.."Cooldown", plate.debuffs[index], "CooldownFrameTemplate")
|
plate.debuffs[index].cd = CreateFrame("Model", plate.platename.."Debuff"..index.."Cooldown", plate.debuffs[index], "CooldownFrameTemplate")
|
||||||
plate.debuffs[index].cd:SetAllPoints(plate.debuffs[index])
|
plate.debuffs[index].cd:SetAllPoints(plate.debuffs[index])
|
||||||
plate.debuffs[index].cd:SetFrameLevel(6)
|
plate.debuffs[index].cd:SetFrameLevel(6)
|
||||||
end
|
end
|
||||||
@@ -499,7 +505,6 @@ nameplates:RegisterEvent("UNIT_SPELLCAST_START")
|
|||||||
nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
|
nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
|
||||||
nameplates:RegisterEvent("UNIT_SPELLCAST_STOP")
|
nameplates:RegisterEvent("UNIT_SPELLCAST_STOP")
|
||||||
nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
|
nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
|
||||||
nameplates:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
|
|
||||||
nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
||||||
|
|
||||||
nameplates:SetScript("OnEvent", function()
|
nameplates:SetScript("OnEvent", function()
|
||||||
@@ -588,6 +593,7 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
plate.nameplate.unit = arg1
|
plate.nameplate.unit = arg1
|
||||||
plate.nameplate.creatureType = nil -- recompute for the new unit
|
plate.nameplate.creatureType = nil -- recompute for the new unit
|
||||||
plate.nameplate.totemIcon = nil
|
plate.nameplate.totemIcon = nil
|
||||||
|
plate.nameplate.totemSpell = nil
|
||||||
if guid then
|
if guid then
|
||||||
plateByGuid[guid] = plate.nameplate
|
plateByGuid[guid] = plate.nameplate
|
||||||
-- Seed: the unit may already be mid-cast (its UNIT_SPELLCAST_START
|
-- Seed: the unit may already be mid-cast (its UNIT_SPELLCAST_START
|
||||||
@@ -665,22 +671,6 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
|
|
||||||
-- Active totems (Searing/Magma/Fire Nova) carry no self-aura, so their
|
|
||||||
-- attack cast is the only icon source. Capture it once per totem, gated on
|
|
||||||
-- creature type so a normal caster's spell never styles it as a totem.
|
|
||||||
if arg1 and strfind(arg1, "^nameplate") then
|
|
||||||
local guid = UnitGUID(arg1)
|
|
||||||
local plate = guid and plateByGuid[guid]
|
|
||||||
if plate and not plate.totemIcon and arg3 and CreatureType(plate) == 11 then
|
|
||||||
local tex = C_Spell.GetSpellTexture(arg3)
|
|
||||||
if tex then
|
|
||||||
plate.totemIcon = tex
|
|
||||||
plate.castUpdate = true -- re-render now so the icon shows
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif event == "UNIT_AURA" then
|
elseif event == "UNIT_AURA" then
|
||||||
-- ClassicAPI: fires with arg1 == "nameplateN" when a unit's aura set
|
-- ClassicAPI: fires with arg1 == "nameplateN" when a unit's aura set
|
||||||
-- changes (add/remove/modify). Flag the matching plate so OnUpdate does a
|
-- changes (add/remove/modify). Flag the matching plate so OnUpdate does a
|
||||||
@@ -781,6 +771,8 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
DisableObject(nameplate.original.healthbar)
|
DisableObject(nameplate.original.healthbar)
|
||||||
DisableObject(nameplate.original.castbar)
|
DisableObject(nameplate.original.castbar)
|
||||||
|
|
||||||
|
local NAMEPLATE_OBJECTORDER = { "border", "glow", "name", "level", "levelicon", "raidicon" }
|
||||||
|
|
||||||
for i, object in pairs({parent:GetRegions()}) do
|
for i, object in pairs({parent:GetRegions()}) do
|
||||||
if NAMEPLATE_OBJECTORDER[i] and NAMEPLATE_OBJECTORDER[i] == "raidicon" then
|
if NAMEPLATE_OBJECTORDER[i] and NAMEPLATE_OBJECTORDER[i] == "raidicon" then
|
||||||
nameplate[NAMEPLATE_OBJECTORDER[i]] = object
|
nameplate[NAMEPLATE_OBJECTORDER[i]] = object
|
||||||
@@ -1119,7 +1111,7 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
local TotemIcon = TotemPlate(plate)
|
local TotemIcon = TotemPlate(plate)
|
||||||
|
|
||||||
if TotemIcon then
|
if TotemIcon then
|
||||||
-- icon resolved from the totem's aura / attack cast (already a full path)
|
-- icon resolved from the totem-drop spell (already a full path)
|
||||||
plate.totem.icon:SetTexture(TotemIcon)
|
plate.totem.icon:SetTexture(TotemIcon)
|
||||||
|
|
||||||
plate.glow:Hide()
|
plate.glow:Hide()
|
||||||
@@ -1323,11 +1315,12 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
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 now = GetTime()
|
local now = GetTime()
|
||||||
-- positional UnitAura writes straight into the reusable buffer, so the
|
-- one GetAuraSlots enumeration, then positional by-slot reads straight
|
||||||
-- per-plate scan allocates nothing (no per-aura table, no result array)
|
-- into the reusable buffer: the per-plate scan allocates nothing (no
|
||||||
local i = 1
|
-- per-aura table, no result array) and walks the aura array once
|
||||||
while debuffCount < 16 do
|
local n = ScanAuraSlots(unitstr, filter, auraSlots, 16)
|
||||||
local aname, icon, count, dispelType, duration, expirationTime = C_UnitAuras.UnitAura(unitstr, i, filter)
|
for i = 1, n do
|
||||||
|
local aname, icon, count, dispelType, duration, expirationTime = C_UnitAuras.UnitAuraBySlot(unitstr, auraSlots[i])
|
||||||
if not aname then break end
|
if not aname then break end
|
||||||
debuffCount = debuffCount + 1
|
debuffCount = debuffCount + 1
|
||||||
local b = debuffDisplayBuf[debuffCount]
|
local b = debuffDisplayBuf[debuffCount]
|
||||||
@@ -1337,7 +1330,6 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|||||||
b.dtype = dispelType
|
b.dtype = dispelType
|
||||||
b.duration = duration
|
b.duration = duration
|
||||||
b.timeleft = (expirationTime and expirationTime > 0) and (expirationTime - now) or nil
|
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
|
||||||
|
|||||||
+10
-4
@@ -457,7 +457,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
|
|
||||||
do -- Zone
|
do -- Zone
|
||||||
local widget = CreateFrame("Frame", "pfPanelWidgetZone", UIParent)
|
local widget = CreateFrame("Frame", "pfPanelWidgetZone", UIParent)
|
||||||
for _,event in pairs(EVENTS_MINIMAP_ZONE_UPDATE) do
|
for _,event in pairs({"PLAYER_ENTERING_WORLD", "MINIMAP_ZONE_CHANGED"}) do
|
||||||
widget:RegisterEvent(event)
|
widget:RegisterEvent(event)
|
||||||
end
|
end
|
||||||
widget.Tooltip = function()
|
widget.Tooltip = function()
|
||||||
@@ -777,9 +777,15 @@ pfUI:RegisterModule("panel", function()
|
|||||||
pfUI.panel.microbutton:SetSize(145, 23)
|
pfUI.panel.microbutton:SetSize(145, 23)
|
||||||
pfUI.panel.microbutton:SetFrameStrata("MEDIUM")
|
pfUI.panel.microbutton:SetFrameStrata("MEDIUM")
|
||||||
|
|
||||||
for i=1,table.getn(MICRO_BUTTONS) do
|
local microButtons = {
|
||||||
local anchor = _G[MICRO_BUTTONS[i-1]] or pfUI.panel.microbutton
|
'CharacterMicroButton', 'SpellbookMicroButton', 'TalentMicroButton',
|
||||||
local button = _G[MICRO_BUTTONS[i]]
|
'QuestLogMicroButton', 'SocialsMicroButton', 'WorldMapMicroButton',
|
||||||
|
'MainMenuMicroButton', 'HelpMicroButton',
|
||||||
|
}
|
||||||
|
|
||||||
|
for i=1,table.getn(microButtons) do
|
||||||
|
local anchor = _G[microButtons[i-1]] or pfUI.panel.microbutton
|
||||||
|
local button = _G[microButtons[i]]
|
||||||
button:ClearAllPoints()
|
button:ClearAllPoints()
|
||||||
button:SetParent(pfUI.panel.microbutton)
|
button:SetParent(pfUI.panel.microbutton)
|
||||||
if i == 1 then
|
if i == 1 then
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
if not info or not info.name or info.name == _G.UNKNOWN then break end
|
if not info or not info.name or info.name == _G.UNKNOWN then break end
|
||||||
local name = info.name
|
local name = info.name
|
||||||
local friendName = _G["FriendsFrameFriendButton"..i.."ButtonTextName"]
|
local friendName = _G["FriendsFrameFriendButton"..i.."ButtonTextName"]
|
||||||
local friendLoc = _G["FriendsFrameFriendButton"..i..FRIENDS_NAME_LOCATION]
|
local friendLoc = _G["FriendsFrameFriendButton"..i.."ButtonTextNameLocation"]
|
||||||
local friendInfo = _G["FriendsFrameFriendButton"..i.."ButtonTextInfo"]
|
local friendInfo = _G["FriendsFrameFriendButton"..i.."ButtonTextInfo"]
|
||||||
local caption = friendName or friendLoc
|
local caption = friendName or friendLoc
|
||||||
|
|
||||||
|
|||||||
+11
-7
@@ -189,6 +189,7 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
-- Icons come from a ClassicAPI object pool: ReleaseAll hides the whole
|
-- Icons come from a ClassicAPI object pool: ReleaseAll hides the whole
|
||||||
-- set each refresh, then we Acquire and re-anchor left-to-right.
|
-- set each refresh, then we Acquire and re-anchor left-to-right.
|
||||||
local BUFF_SIZE, BUFF_SPACING, BUFF_MAX = 20, 2, 32
|
local BUFF_SIZE, BUFF_SPACING, BUFF_MAX = 20, 2, 32
|
||||||
|
local auraSlots = {} -- reusable GetAuraSlots buffer for UpdateBuffs
|
||||||
pfUI.tooltip.buffs = CreateFrame("Frame", "pfTooltipBuffs", GameTooltip)
|
pfUI.tooltip.buffs = CreateFrame("Frame", "pfTooltipBuffs", GameTooltip)
|
||||||
pfUI.tooltip.buffs:SetPoint("BOTTOMLEFT", GameTooltipStatusBar, "TOPLEFT", 0, default_border + 2)
|
pfUI.tooltip.buffs:SetPoint("BOTTOMLEFT", GameTooltipStatusBar, "TOPLEFT", 0, default_border + 2)
|
||||||
pfUI.tooltip.buffs:SetHeight(BUFF_SIZE)
|
pfUI.tooltip.buffs:SetHeight(BUFF_SIZE)
|
||||||
@@ -239,17 +240,20 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local prev, count = nil, 0
|
local prev, count = nil, 0
|
||||||
for i = 1, BUFF_MAX do
|
-- one GetAuraSlots enumeration + positional by-slot reads: no per-aura
|
||||||
local aura = C_UnitAuras.GetBuffDataByIndex(unit, i)
|
-- table and no per-index re-walk of the aura array
|
||||||
if not aura then break end
|
local n = ScanAuraSlots(unit, "HELPFUL", auraSlots, BUFF_MAX)
|
||||||
|
for i = 1, n do
|
||||||
|
local name, texture, applications, _, _, expirationTime = C_UnitAuras.UnitAuraBySlot(unit, auraSlots[i])
|
||||||
|
if not name then break end
|
||||||
|
|
||||||
count = count + 1
|
count = count + 1
|
||||||
local icon = pfUI.tooltip.buffpool:Acquire()
|
local icon = pfUI.tooltip.buffpool:Acquire()
|
||||||
icon.texture:SetTexture(aura.icon)
|
icon.texture:SetTexture(texture)
|
||||||
icon.stacks:SetText(aura.applications and aura.applications > 1 and aura.applications or "")
|
icon.stacks:SetText(applications and applications > 1 and applications or "")
|
||||||
|
|
||||||
icon.expirationTime = aura.expirationTime
|
icon.expirationTime = expirationTime
|
||||||
local timeleft = aura.expirationTime and aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or 0
|
local timeleft = expirationTime and expirationTime > 0 and (expirationTime - GetTime()) or 0
|
||||||
icon.timer:SetText(timeleft > 0 and GetColoredTimeString(timeleft) or "")
|
icon.timer:SetText(timeleft > 0 and GetColoredTimeString(timeleft) or "")
|
||||||
|
|
||||||
if prev then
|
if prev then
|
||||||
|
|||||||
+1
-1
@@ -113,7 +113,7 @@ pfUI:RegisterModule("totems", function ()
|
|||||||
self.bar[i].cdbg = self.bar[i].cdbg or CreateFrame("Frame", nil, self.bar[i])
|
self.bar[i].cdbg = self.bar[i].cdbg or CreateFrame("Frame", nil, self.bar[i])
|
||||||
self.bar[i].cdbg:SetSize(self.iconsize - 3, self.iconsize - 3)
|
self.bar[i].cdbg:SetSize(self.iconsize - 3, self.iconsize - 3)
|
||||||
self.bar[i].cdbg:SetPoint("CENTER", self.bar[i], "CENTER", 0, 0)
|
self.bar[i].cdbg:SetPoint("CENTER", self.bar[i], "CENTER", 0, 0)
|
||||||
self.bar[i].cd = self.bar[i].cd or CreateFrame(COOLDOWN_FRAME_TYPE, "pfTotemsBar"..i.."Cooldown", self.bar[i].cdbg, "CooldownFrameTemplate")
|
self.bar[i].cd = self.bar[i].cd or CreateFrame("Model", "pfTotemsBar"..i.."Cooldown", self.bar[i].cdbg, "CooldownFrameTemplate")
|
||||||
self.bar[i].cd.pfCooldownStyleAnimation = 1
|
self.bar[i].cd.pfCooldownStyleAnimation = 1
|
||||||
self.bar[i].cd.pfCooldownType = "ALL"
|
self.bar[i].cd.pfCooldownType = "ALL"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
pfUI:RegisterModule("tracking", function ()
|
pfUI:RegisterModule("tracking", function ()
|
||||||
|
|
||||||
MINIMAP_TRACKING_FRAME:UnregisterAllEvents()
|
_G.MiniMapTrackingFrame:UnregisterAllEvents()
|
||||||
MINIMAP_TRACKING_FRAME:Hide()
|
_G.MiniMapTrackingFrame:Hide()
|
||||||
|
|
||||||
local rawborder, border = GetBorderSize()
|
local rawborder, border = GetBorderSize()
|
||||||
local size = tonumber(C.appearance.minimap.tracking_size)
|
local size = tonumber(C.appearance.minimap.tracking_size)
|
||||||
|
|||||||
+1
-2958
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,8 @@ function SlashCmdList.RELOAD(msg, editbox)
|
|||||||
ReloadUI()
|
ReloadUI()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local addonName = ...
|
||||||
|
|
||||||
SLASH_PFUI1 = '/pfui'
|
SLASH_PFUI1 = '/pfui'
|
||||||
function SlashCmdList.PFUI(msg, editbox)
|
function SlashCmdList.PFUI(msg, editbox)
|
||||||
pfUI.gui:SetShown(not pfUI.gui:IsShown())
|
pfUI.gui:SetShown(not pfUI.gui:IsShown())
|
||||||
@@ -13,79 +15,12 @@ function SlashCmdList.GM(msg, editbox)
|
|||||||
ToggleHelpFrame(1)
|
ToggleHelpFrame(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
pfUI = CreateFrame("Frame", nil, UIParent)
|
local pfUI = CreateFrame("Frame", addonName, UIParent)
|
||||||
pfUI:RegisterEvent("ADDON_LOADED")
|
pfUI:RegisterEvent("ADDON_LOADED")
|
||||||
|
|
||||||
-- setup bootvar
|
-- setup bootvar
|
||||||
pfUI.bootup = true
|
pfUI.bootup = true
|
||||||
|
|
||||||
do
|
|
||||||
-- ClassicAPI dependency check.
|
|
||||||
-- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus
|
|
||||||
-- API surface that ClassicAPI polyfills, so presence is required.
|
|
||||||
local PFUI_CLASSIC_API_MIN = 11204 -- (X*10000 + Y*100 + Z)
|
|
||||||
local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN
|
|
||||||
local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI"
|
|
||||||
local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest"
|
|
||||||
local function FormatVersion(packed)
|
|
||||||
local x = math.floor(packed / 10000)
|
|
||||||
local y = math.floor(math.mod(packed, 10000) / 100)
|
|
||||||
local z = math.mod(packed, 100)
|
|
||||||
return string.format("v%d.%d.%d", x, y, z)
|
|
||||||
end
|
|
||||||
if not CLASSIC_API_VERSION or CLASSIC_API_VERSION < PFUI_CLASSIC_API_MIN then
|
|
||||||
local minVersion = FormatVersion(PFUI_CLASSIC_API_MIN)
|
|
||||||
pfUI.disabled = true
|
|
||||||
local detail
|
|
||||||
if not CLASSIC_API_VERSION then
|
|
||||||
detail = "The ClassicAPI DLL isn't loaded. The |cff33ffcc!!!ClassicAPI|r addon ships bundled with it -- delete your |cff33ffcc!!!ClassicAPI|r folder and install the latest release from:"
|
|
||||||
else
|
|
||||||
detail = "ClassicAPI " .. minVersion .. " or newer is required. Delete your |cff33ffcc!!!ClassicAPI|r folder and reinstall the latest release from:"
|
|
||||||
end
|
|
||||||
|
|
||||||
local function ShowRequiredPopup()
|
|
||||||
StaticPopupDialogs["PFUI_CLASSICAPI_REQUIRED"] = {
|
|
||||||
text = "|cff33ffccpf|cffffffffUI|r has been disabled.\n\n" .. detail,
|
|
||||||
button1 = OKAY,
|
|
||||||
hasEditBox = 1,
|
|
||||||
editBoxWidth = 280,
|
|
||||||
timeout = 0,
|
|
||||||
whileDead = 1,
|
|
||||||
hideOnEscape = 1,
|
|
||||||
preferredIndex = 3,
|
|
||||||
OnShow = function()
|
|
||||||
local editBox = getglobal(this:GetName().."EditBox")
|
|
||||||
if editBox then
|
|
||||||
editBox:SetText(PFUI_CLASSIC_API_LATEST_URL)
|
|
||||||
editBox:HighlightText()
|
|
||||||
editBox:SetFocus()
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
StaticPopup_Show("PFUI_CLASSICAPI_REQUIRED")
|
|
||||||
DEFAULT_CHAT_FRAME:AddMessage(
|
|
||||||
"|cff33ffccpf|cffffffffUI|r disabled: " .. detail .. " " .. PFUI_CLASSIC_API_LATEST_URL,
|
|
||||||
1, 0.3, 0.3
|
|
||||||
)
|
|
||||||
end
|
|
||||||
local loginFrame = CreateFrame("Frame")
|
|
||||||
loginFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
||||||
loginFrame:SetScript("OnEvent", function()
|
|
||||||
loginFrame:UnregisterEvent("PLAYER_ENTERING_WORLD")
|
|
||||||
ShowRequiredPopup()
|
|
||||||
end)
|
|
||||||
elseif CLASSIC_API_VERSION < PFUI_CLASSIC_API_LATEST then
|
|
||||||
EventUtil.ContinueOnPlayerLogin(function()
|
|
||||||
C_Timer.After(8, function()
|
|
||||||
DEFAULT_CHAT_FRAME:AddMessage(
|
|
||||||
"|cff33ffccpf|rUI: ClassicAPI " .. FormatVersion(PFUI_CLASSIC_API_LATEST) .. " is available — " .. PFUI_CLASSIC_API_LATEST_URL,
|
|
||||||
1, 0.85, 0.3
|
|
||||||
)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
pfUI_playerDB = pfUI_playerDB or {}
|
pfUI_playerDB = pfUI_playerDB or {}
|
||||||
pfUI_config = pfUI_config or {}
|
pfUI_config = pfUI_config or {}
|
||||||
pfUI_init = pfUI_init or {}
|
pfUI_init = pfUI_init or {}
|
||||||
@@ -117,35 +52,24 @@ pfUI.env = {}
|
|||||||
-- the flag; one that lacks it should drop the flag and get the safe fallback.
|
-- the flag; one that lacks it should drop the flag and get the safe fallback.
|
||||||
pfUI.handlesHookScript = true
|
pfUI.handlesHookScript = true
|
||||||
|
|
||||||
if not pfUI.disabled then
|
pfUI.events = Mixin({}, CallbackRegistryMixin)
|
||||||
pfUI.events = Mixin({}, CallbackRegistryMixin)
|
pfUI.events:OnLoad()
|
||||||
pfUI.events:OnLoad()
|
pfUI.events:SetUndefinedEventsAllowed(true)
|
||||||
pfUI.events:SetUndefinedEventsAllowed(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- check if macro addons are loaded (disables macrotweak/macroscan)
|
-- check if macro addons are loaded (disables macrotweak/macroscan)
|
||||||
function pfUI:MacroAddonsLoaded()
|
function pfUI:MacroAddonsLoaded()
|
||||||
return IsAddOnLoaded("Supermacro") or IsAddOnLoaded("SuperCleveRoidMacros") or IsAddOnLoaded("UltimaMacros")
|
return IsAddOnLoaded("Supermacro") or IsAddOnLoaded("SuperCleveRoidMacros") or IsAddOnLoaded("UltimaMacros")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- detect current addon path
|
pfUI.name = addonName
|
||||||
local tocs = { "", "-master", "-tbc", "-wotlk" }
|
pfUI.path = "Interface\\AddOns\\" .. addonName
|
||||||
for _, name in pairs(tocs) do
|
|
||||||
local current = string.format("pfUI%s", name)
|
|
||||||
local title = C_AddOns.GetAddOnName(current)
|
|
||||||
if title then
|
|
||||||
pfUI.name = current
|
|
||||||
pfUI.path = "Interface\\AddOns\\" .. current
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- handle/convert media dir paths
|
-- handle/convert media dir paths
|
||||||
pfUI.media = setmetatable({}, { __index = function(tab,key)
|
pfUI.media = setmetatable({}, { __index = function(tab,key)
|
||||||
local value = tostring(key)
|
local value = tostring(key)
|
||||||
if strfind(value, "img:") then
|
if value:find("img:") then
|
||||||
value = string.gsub(value, "img:", pfUI.path .. "\\img\\")
|
value = string.gsub(value, "img:", pfUI.path .. "\\img\\")
|
||||||
elseif strfind(value, "font:") then
|
elseif value:find("font:") then
|
||||||
value = string.gsub(value, "font:", pfUI.path .. "\\fonts\\")
|
value = string.gsub(value, "font:", pfUI.path .. "\\fonts\\")
|
||||||
else
|
else
|
||||||
value = string.gsub(value, "Interface\\AddOns\\pfUI\\", pfUI.path .. "\\")
|
value = string.gsub(value, "Interface\\AddOns\\pfUI\\", pfUI.path .. "\\")
|
||||||
@@ -154,9 +78,7 @@ pfUI.media = setmetatable({}, { __index = function(tab,key)
|
|||||||
return value
|
return value
|
||||||
end})
|
end})
|
||||||
|
|
||||||
-- cache client version
|
pfUI.client = INTERFACE_VERSION
|
||||||
local _, _, _, client = GetBuildInfo()
|
|
||||||
pfUI.client = client or 11200
|
|
||||||
|
|
||||||
-- setup pfUI namespace
|
-- setup pfUI namespace
|
||||||
setmetatable(pfUI.env, {__index = getfenv(0)})
|
setmetatable(pfUI.env, {__index = getfenv(0)})
|
||||||
@@ -390,14 +312,13 @@ function pfUI:CheckNewModules()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function BackwardsCompatRegister(func, arg3)
|
local function BackwardsCompatRegister(func, arg3)
|
||||||
if arg3 and type(func) == "string" and type(arg3) == "function" and string.find(func, "vanilla") then
|
if arg3 and type(func) == "string" and type(arg3) == "function" and func:find("vanilla") then
|
||||||
return arg3
|
return arg3
|
||||||
end
|
end
|
||||||
return func
|
return func
|
||||||
end
|
end
|
||||||
|
|
||||||
function pfUI:RegisterModule(name, func, arg3)
|
function pfUI:RegisterModule(name, func, arg3)
|
||||||
if pfUI.disabled then return end
|
|
||||||
if pfUI.module[name] then return end
|
if pfUI.module[name] then return end
|
||||||
func = BackwardsCompatRegister(func, arg3)
|
func = BackwardsCompatRegister(func, arg3)
|
||||||
pfUI.module[name] = func
|
pfUI.module[name] = func
|
||||||
@@ -408,7 +329,6 @@ function pfUI:RegisterModule(name, func, arg3)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function pfUI:RegisterSkin(name, func, arg3)
|
function pfUI:RegisterSkin(name, func, arg3)
|
||||||
if pfUI.disabled then return end
|
|
||||||
if pfUI.skin[name] then return end
|
if pfUI.skin[name] then return end
|
||||||
func = BackwardsCompatRegister(func, arg3)
|
func = BackwardsCompatRegister(func, arg3)
|
||||||
pfUI.skin[name] = func
|
pfUI.skin[name] = func
|
||||||
@@ -429,7 +349,6 @@ function pfUI:LoadSkin(s)
|
|||||||
end
|
end
|
||||||
|
|
||||||
pfUI:SetScript("OnEvent", function()
|
pfUI:SetScript("OnEvent", function()
|
||||||
if pfUI.disabled then return end
|
|
||||||
|
|
||||||
-- make sure to initialize and set our fonts
|
-- make sure to initialize and set our fonts
|
||||||
-- each time an addon got loaded but only
|
-- each time an addon got loaded but only
|
||||||
@@ -443,7 +362,7 @@ pfUI:SetScript("OnEvent", function()
|
|||||||
-- "@project-version@" until release tooling substitutes it — mark those
|
-- "@project-version@" until release tooling substitutes it — mark those
|
||||||
-- explicitly as "dev" instead of pretending they're a real numbered build.
|
-- explicitly as "dev" instead of pretending they're a real numbered build.
|
||||||
local raw = tostring(GetAddOnMetadata(pfUI.name, "Version"))
|
local raw = tostring(GetAddOnMetadata(pfUI.name, "Version"))
|
||||||
if strfind(raw, "@") then
|
if raw:find("@") then
|
||||||
pfUI.version.major, pfUI.version.minor, pfUI.version.fix = 0, 0, 0
|
pfUI.version.major, pfUI.version.minor, pfUI.version.fix = 0, 0, 0
|
||||||
pfUI.version.string = "dev"
|
pfUI.version.string = "dev"
|
||||||
else
|
else
|
||||||
@@ -577,3 +496,20 @@ function pfUI.SetupCVars()
|
|||||||
end
|
end
|
||||||
UIParentLoadAddOn("Blizzard_CombatText")
|
UIParentLoadAddOn("Blizzard_CombatText")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do -- RunMacroText
|
||||||
|
local obj = setmetatable({ ["GetText"] = function(self) return self.text end }, {
|
||||||
|
__index = function(tab,key)
|
||||||
|
local value = function() return end
|
||||||
|
rawset(tab,key,value)
|
||||||
|
return value
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
function RunMacroText(text)
|
||||||
|
obj.text = text
|
||||||
|
ChatEdit_ParseText(obj, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
_G.PLAYER_BUFF_START_ID = -1
|
||||||
|
|||||||
@@ -8,11 +8,9 @@
|
|||||||
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
||||||
## X-Website: https://github.com/brues-code/pfUI
|
## X-Website: https://github.com/brues-code/pfUI
|
||||||
|
|
||||||
pfUI.lua
|
# ClassicAPI-less fallback. ClassicAPI redirects this read to pfUI_Turtle.toc
|
||||||
|
# (Turtle clients) or pfUI_ClassicAPI.toc (everything else), so the client only
|
||||||
|
# ever reaches THIS file when the DLL is missing. Load the notice and nothing
|
||||||
|
# else.
|
||||||
|
|
||||||
init\env.xml
|
API_Check.lua
|
||||||
init\compat.xml
|
|
||||||
init\api.xml
|
|
||||||
init\libs.xml
|
|
||||||
init\skins.xml
|
|
||||||
init\modules.xml
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
## Interface: 11200
|
||||||
|
## Title: |cff33ffccpf|cffffffffUI
|
||||||
|
## Author: Shagu - modified by me0wg4ming & brues
|
||||||
|
## Notes: A complete user interface replacement.
|
||||||
|
## Notes-ruRU: Полная замена пользовательского интерфейса.
|
||||||
|
## Version: @project-version@
|
||||||
|
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache, pfUI_throttle
|
||||||
|
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
||||||
|
## X-Website: https://github.com/brues-code/pfUI
|
||||||
|
|
||||||
|
# Selected by ClassicAPI on every non-Turtle client. Turtle clients get
|
||||||
|
# pfUI_Turtle.toc instead, which trades init\stock.xml for init\turtle.xml.
|
||||||
|
|
||||||
|
API_Check.lua
|
||||||
|
|
||||||
|
pfUI.lua
|
||||||
|
|
||||||
|
init\env.xml
|
||||||
|
init\stock.xml
|
||||||
|
init\api.xml
|
||||||
|
init\libs.xml
|
||||||
|
init\skins.xml
|
||||||
|
init\modules.xml
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
## Interface: 11200
|
||||||
|
## Title: |cff33ffccpf|cffffffffUI
|
||||||
|
## Author: Shagu - modified by me0wg4ming & brues
|
||||||
|
## Notes: A complete user interface replacement.
|
||||||
|
## Notes-ruRU: Полная замена пользовательского интерфейса.
|
||||||
|
## Version: @project-version@
|
||||||
|
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache, pfUI_throttle
|
||||||
|
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
||||||
|
## X-Website: https://github.com/brues-code/pfUI
|
||||||
|
|
||||||
|
# Selected by ClassicAPI on Turtle WoW, where it wins over pfUI_ClassicAPI.toc.
|
||||||
|
# Same list with init\stock.xml swapped for init\turtle.xml: the modules, skins
|
||||||
|
# and vendor prices that only mean anything on a Turtle client.
|
||||||
|
|
||||||
|
API_Check.lua
|
||||||
|
|
||||||
|
pfUI.lua
|
||||||
|
|
||||||
|
init\env.xml
|
||||||
|
init\api.xml
|
||||||
|
init\libs.xml
|
||||||
|
init\skins.xml
|
||||||
|
init\modules.xml
|
||||||
|
init\turtle.xml
|
||||||
Reference in New Issue
Block a user