mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-01 03:19:59 +00:00
Load pfUI through ClassicAPI's flavor TOCs
ClassicAPI redirects the read of pfUI\pfUI.toc to a flavored file whenever
the DLL is installed, so which TOC the client opens already answers whether
ClassicAPI is there. Split the manifest three ways and let that do the work:
pfUI.toc fallback, reached only when ClassicAPI is missing;
loads API_Check.lua and nothing else
pfUI_ClassicAPI.toc full addon, every non-Turtle client
pfUI_Turtle.toc full addon plus init\turtle.xml, on Turtle
The fallback TOC declares no SavedVariables. It used to, while API_Check.lua
reset pfUI_profiles to an empty table on the disabled path -- which truncated
the player's profiles on logout.
With the missing-DLL case handled by TOC selection, API_Check.lua drops the
null object stub that kept the other ~140 files quiet, along with
pfUI_disabled and the now unreachable early return in pfUI.lua. It keeps the
version gate, which still matters: the flavor redirect landed in ClassicAPI
v1.11.0, below the v1.13.1 pfUI needs, so an old DLL still gets served a
flavor TOC. pfUI.lua also loses a verbatim duplicate of the whole check.
Turtle-only files move to init\turtle.xml: modules\turtle-wow.lua (its
TURTLE_WOW_VERSION guard is now redundant) and the lft, turtle_shop,
barbershop, transmog and ebc skins. turtle-wow registers last instead of
75th of 84; the only ordering it relies on is pfUI.chat, registered 8th.
pfSellData moves to env\selldata.lua, listed only in pfUI_ClassicAPI.toc,
since turtle-wow.lua replaces the table wholesale on Turtle. env\tables.lua
keeps an empty declaration so sellvalue.lua has something to index when the
turtle-wow module is disabled.
The release workflow pinned PFUI_CLASSIC_API_LATEST in pfUI.lua, which has
not held that constant since it moved to API_Check.lua, so the pin was
silently doing nothing. It also switches to brues-code/packager@vCAPI, which
recognizes the _ClassicAPI and _Turtle suffixes and applies the TOC build
type filters to them.
This commit is contained in:
@@ -23,12 +23,12 @@ jobs:
|
||||
IFS=. read -r MAJOR MINOR PATCH <<<"$LATEST"
|
||||
PACKED=$((MAJOR * 10000 + MINOR * 100 + PATCH))
|
||||
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
|
||||
grep 'local PFUI_CLASSIC_API_' 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_' API_Check.lua
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Package and release to GitHub
|
||||
uses: BigWigsMods/packager@v2
|
||||
uses: brues-code/packager@vCAPI
|
||||
env:
|
||||
GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
+25
-51
@@ -1,7 +1,18 @@
|
||||
do
|
||||
-- ClassicAPI dependency check.
|
||||
-- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus
|
||||
-- API surface that ClassicAPI polyfills, so presence is required.
|
||||
-- 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 = 11301 -- (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"
|
||||
@@ -12,57 +23,20 @@ do
|
||||
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
|
||||
pfUI_locale = {}
|
||||
pfUI_profiles = {}
|
||||
pfUI_translation = {}
|
||||
|
||||
-- ClassicAPI is required. Rather than let the ~140 files that follow flood
|
||||
-- errors as they load, stand up an inert stub so everything no-ops:
|
||||
-- * modules/skins register their body into a no-op, so it never runs;
|
||||
-- * the setfenv'd api/lib files run inside `env`, where CreateFrame and
|
||||
-- any missing global (C_*, SuperWoW, ...) resolve to a null object --
|
||||
-- so no real frames or live OnUpdate/OnEvent handlers get created and
|
||||
-- missing API calls just return null instead of erroring.
|
||||
local null -- forward declaration so the metamethods can return it
|
||||
local nullmt = {
|
||||
__index = function() return null end,
|
||||
__newindex = function() end,
|
||||
__call = function() return null end,
|
||||
__concat = function() return "" end,
|
||||
__tostring = function() return "" end,
|
||||
}
|
||||
for _, op in ipairs({ "__add","__sub","__mul","__div","__mod","__pow","__unm" }) do
|
||||
nullmt[op] = function() return null end
|
||||
end
|
||||
for _, op in ipairs({ "__lt","__le","__eq" }) do nullmt[op] = function() return false end end
|
||||
null = setmetatable({}, nullmt)
|
||||
|
||||
local realG = getfenv(0)
|
||||
pfUI = setmetatable({}, { __index = function() return null end })
|
||||
pfUI.env = setmetatable({}, {
|
||||
__index = function(_, k)
|
||||
if k == "CreateFrame" then return function() return null end end
|
||||
local v = realG[k]
|
||||
if v ~= nil then return v end
|
||||
return null
|
||||
end,
|
||||
})
|
||||
function pfUI:RegisterModule(_, _, _) end
|
||||
function pfUI:RegisterSkin(_, _, _) end
|
||||
function pfUI:GetEnvironment() return pfUI.env end
|
||||
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 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 cannot run on this ClassicAPI."
|
||||
detail = "ClassicAPI " .. 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 = "|cff33ffccpf|cffffffffUI|r has been disabled.\n\n" .. detail,
|
||||
text = headline .. "\n\n" .. detail,
|
||||
button1 = OKAY,
|
||||
hasEditBox = 1,
|
||||
editBoxWidth = 280,
|
||||
@@ -81,7 +55,7 @@ do
|
||||
}
|
||||
StaticPopup_Show("PFUI_CLASSICAPI_REQUIRED")
|
||||
DEFAULT_CHAT_FRAME:AddMessage(
|
||||
"|cff33ffccpf|cffffffffUI|r disabled: " .. detail .. " " .. PFUI_CLASSIC_API_LATEST_URL,
|
||||
headline .. " " .. detail .. " " .. PFUI_CLASSIC_API_LATEST_URL,
|
||||
1, 0.3, 0.3
|
||||
)
|
||||
end
|
||||
|
||||
Vendored
+2342
File diff suppressed because it is too large
Load Diff
Vendored
+5
-2343
File diff suppressed because it is too large
Load Diff
@@ -72,7 +72,6 @@
|
||||
<Include file="..\modules\totems.lua"/>
|
||||
<Include file="..\modules\macrotweak.lua"/>
|
||||
<Include file="..\modules\macroicons.lua"/>
|
||||
<Include file="..\modules\turtle-wow.lua"/>
|
||||
<Include file="..\modules\superwow.lua"/>
|
||||
<Include file="..\modules\innervatecall.lua"/>
|
||||
<Include file="..\modules\nampower.lua"/>
|
||||
|
||||
+1
-7
@@ -35,12 +35,6 @@
|
||||
<Include file="..\skins\blizzard\tooltips.lua"/>
|
||||
<Include file="..\skins\blizzard\tabard.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>
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
<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="..\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>
|
||||
@@ -1,6 +1,4 @@
|
||||
-- skip module initialization on every other client than turtle-wow
|
||||
if not TURTLE_WOW_VERSION then return end
|
||||
|
||||
-- Turtle WoW only: loaded from init\turtle.xml, which only pfUI_Turtle.toc pulls in.
|
||||
pfUI:RegisterModule("turtle-wow", function ()
|
||||
-- Manage Turtle WoW's GroupUI (Turtle_GroupUI addon) vs pfUI frames.
|
||||
--
|
||||
|
||||
@@ -3,8 +3,6 @@ function SlashCmdList.RELOAD(msg, editbox)
|
||||
ReloadUI()
|
||||
end
|
||||
|
||||
if pfUI_disabled then return end
|
||||
|
||||
local addonName = ...
|
||||
|
||||
SLASH_PFUI1 = '/pfui'
|
||||
@@ -23,73 +21,6 @@ pfUI:RegisterEvent("ADDON_LOADED")
|
||||
-- setup bootvar
|
||||
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 = 11301 -- (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_config = pfUI_config or {}
|
||||
pfUI_init = pfUI_init or {}
|
||||
|
||||
@@ -8,13 +8,9 @@
|
||||
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
||||
## X-Website: https://github.com/brues-code/pfUI
|
||||
|
||||
# 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.
|
||||
|
||||
API_Check.lua
|
||||
|
||||
pfUI.lua
|
||||
|
||||
init\env.xml
|
||||
init\compat.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 every non-Turtle client. Turtle clients get
|
||||
# pfUI_Turtle.toc instead, which trades env\selldata.lua for init\turtle.xml.
|
||||
|
||||
API_Check.lua
|
||||
|
||||
pfUI.lua
|
||||
|
||||
init\env.xml
|
||||
env\selldata.lua
|
||||
init\compat.xml
|
||||
init\api.xml
|
||||
init\libs.xml
|
||||
init\skins.xml
|
||||
init\modules.xml
|
||||
@@ -0,0 +1,26 @@
|
||||
## 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, except it adds init\turtle.xml -- the modules and skins that only
|
||||
# have anything to bind to on a Turtle client -- and drops env\selldata.lua,
|
||||
# whose vendor prices modules\turtle-wow.lua supplies for this server instead.
|
||||
|
||||
API_Check.lua
|
||||
|
||||
pfUI.lua
|
||||
|
||||
init\env.xml
|
||||
init\compat.xml
|
||||
init\api.xml
|
||||
init\libs.xml
|
||||
init\skins.xml
|
||||
init\modules.xml
|
||||
init\turtle.xml
|
||||
Reference in New Issue
Block a user