What 1.12 withholds here is a framework, not a verb. Its world map is a fixed 1002x668 frame showing one zone — twelve tiles, a hit button, POI buttons, two dropdowns — with no canvas, no pan, no zoom, no pins and no notion of where one map sits on another. Every map addon written after 4.0 drives the canvas framework instead, and there is no stock file to migrate from because there is no stock feature. The constraint that shaped every decision: `WorldMapFrame` already has eight 1.12 consumers on this install, all anchoring icons to `WorldMapDetailFrame` and `WorldMapButton`. So nothing is replaced. The canvas is added, and those two frames are reparented INTO it — at rest the rect they had, at scale 1 with no pan, so the stock window is pixel-identical, and the payoff is that the 1.12 art and every icon on it now pan and scale WITH the canvas for free. Clipping comes from a real ScrollFrame: this client clips a scroll child and every descendant of it from one source, in the draw pass and the hit-test, so drawing and hitting agree. The base-art layer a canvas addon hides is a proxy that switches draw layers rather than the frame, because hiding the frame would take the POI buttons and every addon's icons with it. Three regressions, each found by measurement, each pinned: the anchor cycle (container to detail frame to canvas to container — a cycle resolves to nothing, and the symptom was `GetCenter()` nil inside the stock hover pass); the base scale (a minScale below 1 opens the map zoomed out of its own window); and `dataProviders` being a set rather than an array, because callers iterate it with `pairs` and bind the key — an array handed that loop the number 1. `CreateLine` is a Texture carrying two endpoints, drawn through the explicit-corner quad path the cooldown wedge already uses. Nothing stands in for it: a line between two moving points is a rotated quad whose angle and length both change. `C_Texture.GetAtlasInfo` answers nil for every name, and the nil is the answer — but the getter's presence is what makes the common atlas guard take its fallback branch instead of raising. The harness grew a second surface, and the finding is worth keeping: the full screen map hides `UIParent`, so opening it in the ordinary render probe dropped the corpus's draw column from 37/86 to 18/86 — nineteen unrelated addons. As its own pass: no addon lost a quad and nineteen gained, pfQuest 374 -> 911, pfUI 1063 -> 2259. OpenMapClassic now reads 1/1 on all five columns, stitching 74 of the realm's own zones. Corpus roster unchanged at 85 ok / 1 fail; the 12 data-half reds byte-identical to HEAD's. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
380 lines
24 KiB
TeX
380 lines
24 KiB
TeX
# The built-in interface, in load order: a bare filename is ours, from `assets/ui`; a path is
|
|
# the reference's own file, off the player's patch chain. Entry 0, Fonts.xml, loads alone into
|
|
# every boot VM, from Startup on; the rest loads on entering the world, then third-party addons.
|
|
# The font objects thus exist before the login screen; the reference loads Fonts.xml with the
|
|
# rest of FrameXML.
|
|
# `inherits=`, `parent=` and a named `relativeTo=` resolve only against names declared above; a
|
|
# missing one only warns (the template is skipped, the parent falls back to the enclosing frame).
|
|
# A later Lua global or template replaces an earlier one; a named frame publishes its global
|
|
# only while the name is free.
|
|
# A stock `.xml` that does not `<Script file=>` its own `.lua` needs both rows, `.lua` first.
|
|
# LoadOnDemand addons have no row, as in the reference; they load off the chain on first use.
|
|
|
|
## Interface: 11200
|
|
## Title: benilla
|
|
|
|
Interface\FrameXML\Fonts.xml
|
|
|
|
# Second, not first as in the reference, because entry 0 must be Fonts.xml.
|
|
Interface\FrameXML\GlobalStrings.lua
|
|
# OctoWoW's own seven rows between GlobalStrings and Globals (its `FrameXML.toc` 4-10). Each
|
|
# `OctoLocale_*` file is one `if GetLocale() == "xxXX"` block of GlobalStrings overrides and is
|
|
# inert on an enUS chain, but they load as the reference loads them, so a client started in
|
|
# another locale reads the realm's own strings rather than ours. `OctoToolReqData.lua` is the
|
|
# realm's 40 KB recipe -> required-tool-item table and `OctoToolReqTip.lua` wraps
|
|
# `GetTradeSkillTools` over it: a recipe whose tool OctoWoW changed (the jeweler's kits, the
|
|
# Whittle) reads its real tool in the trade-skill window, and the universal knife (item 50006)
|
|
# satisfies any of them. The wrap is engine-level (`GetTradeSkillTools` is a binding, not
|
|
# FrameXML), so its place this early is the reference's and costs nothing.
|
|
Interface\FrameXML\OctoLocale\OctoLocale_deDE.lua
|
|
Interface\FrameXML\OctoLocale\OctoLocale_esES.lua
|
|
Interface\FrameXML\OctoLocale\OctoLocale_ptBR.lua
|
|
Interface\FrameXML\OctoLocale\OctoLocale_ruRU.lua
|
|
Interface\FrameXML\OctoLocale\OctoLocale_zhCN.lua
|
|
Interface\FrameXML\OctoToolReqTip\OctoToolReqData.lua
|
|
Interface\FrameXML\OctoToolReqTip\OctoToolReqTip.lua
|
|
# TurtleWoW's own two rows after GlobalStrings (its `FrameXML.toc` 11-12), both the client half of
|
|
# server-side systems. `Globals.lua` publishes `print`, `TURTLE_WOW_VERSION`, `TW_CLASS_TOKEN`,
|
|
# `Turtle_AvailableChallenges`, `GAME_YELLOW` and the three `ADDON_MSG_*_DELIMITER`s that every
|
|
# `CHAT_MSG_ADDON` protocol on this realm splits on; it also re-declares `sizeof`/`explode`/`wipe`/
|
|
# `trim`, which our UI stdlib seeds for a chain that lacks the file, and the chain's own copy wins
|
|
# here, as in the reference. `Overrides.lua` is Turtle's two-continent map: `CONTINENTS_LENGTH = 2`
|
|
# and a `GetMapContinents` wrapper that returns exactly Kalimdor and Azeroth, dropping any further
|
|
# row the chain's `WorldMapContinent.dbc` carries.
|
|
Interface\FrameXML\Globals.lua
|
|
Interface\FrameXML\Overrides.lua
|
|
# The chain's row 14, immediately after its own Fonts.xml (our entry 0): it repoints the ~50
|
|
# FrameXML font objects at `Fonts\FZLBJW.TTF` for ruRU and zhCN only, so on an enUS client every
|
|
# `GetFont`/`SetFont` pair it runs is a no-op. Faithful and inert, and the one row that makes a
|
|
# Cyrillic or CJK login legible.
|
|
Interface\FrameXML\OctoLocale\OctoLocale_Fonts.lua
|
|
# `Localize()` runs at load and overwrites GlobalStrings keys, so this follows them.
|
|
Interface\FrameXML\Localization.xml
|
|
# `GetText` is a Lua global, not an engine binding: the client's `0x703bf0` calls it.
|
|
Interface\FrameXML\LocaleProperties.lua
|
|
Interface\FrameXML\BasicControls.xml
|
|
# Before UIParent.xml, whose `LowHealthFrame` has `parent="WorldFrame"`.
|
|
Interface\FrameXML\WorldFrame.xml
|
|
# Above every file that names `parent="UIParent"` or adds a `UIPanelWindows` row at load.
|
|
Interface\FrameXML\UIParent.xml
|
|
Interface\FrameXML\ItemButtonTemplate.xml
|
|
# Before GameTooltip.xml and StaticPopup.xml, whose money rows inherit `SmallMoneyFrameTemplate`.
|
|
Interface\FrameXML\MoneyFrame.lua
|
|
Interface\FrameXML\MoneyFrame.xml
|
|
Interface\FrameXML\MoneyInputFrame.lua
|
|
Interface\FrameXML\MoneyInputFrame.xml
|
|
Interface\FrameXML\GameTooltip.xml
|
|
Interface\FrameXML\UIDropDownMenu.xml
|
|
Interface\FrameXML\UIMenu.xml
|
|
# Before the unit frames, whose dropdowns' OnLoad reaches `UnitPopup_ShowMenu`.
|
|
Interface\FrameXML\UnitPopup.xml
|
|
Interface\FrameXML\ItemRef.xml
|
|
# The `TextStatusBar` template and verbs, which the unit bars and `MainMenuExpBar` inherit.
|
|
Interface\FrameXML\TextStatusBar.lua
|
|
Interface\FrameXML\TextStatusBar.xml
|
|
# Before PartyFrame.xml, whose rows reach `RefreshBuffs` from their OnLoad.
|
|
Interface\FrameXML\BuffFrame.xml
|
|
# Function-only kits the unit windows below call from their OnLoad.
|
|
Interface\FrameXML\UnitFrame.xml
|
|
Interface\FrameXML\CombatFeedback.xml
|
|
Interface\FrameXML\PlayerFrame.xml
|
|
Interface\FrameXML\PartyFrame.xml
|
|
Interface\FrameXML\TargetFrame.xml
|
|
Interface\FrameXML\PetFrame.xml
|
|
# Anchors `relativeTo="TargetFrame"`.
|
|
Interface\FrameXML\ComboFrame.xml
|
|
# Ours: the scroll parts of our options window and script log.
|
|
ScrollTemplates.xml
|
|
|
|
# The ClassicAPI-era templates addons inherit by name (Ace3 names two of them unguarded).
|
|
# Templates only, so anywhere above the addon load is correct; here, beside our other one.
|
|
CompatTemplates.xml
|
|
|
|
Interface\FrameXML\UIPanelTemplates.lua
|
|
|
|
Interface\FrameXML\UIPanelTemplates.xml
|
|
# The reference's three options windows, loaded hidden so addons find their frames by name.
|
|
# Deviation: the player opens our own options window, `OptionsFrame.xml` below, because 1.12's
|
|
# settings screens are much worse to use; the stock one holds `OptionsFrame`.
|
|
Interface\FrameXML\OptionsFrame.xml
|
|
# Ours: the six `OptionsFrame_*` enable/disable helpers stock 1.12 keeps in its own
|
|
# `OptionsFrame.lua`, which the realm's rewrite of that file dropped. The two stock windows below
|
|
# are the callers, and this client is the only thing that loads them.
|
|
OptionsFrameAdapters.lua
|
|
Interface\FrameXML\SoundOptionsFrame.xml
|
|
# The action bars, lifted above the stock options window on purpose. Stock 1.12 patched the five
|
|
# multibar rows of `UIOptionsFrameCheckButtons` from `MultiActionBarFrame_OnLoad`, under a comment
|
|
# calling itself a "Hack to get around load order dependencies", so the window could load first.
|
|
# The realm gutted that function (`MultiActionBars.lua:7-12`) and wrote the readers straight into
|
|
# the table literal (`UIOptionsFrame.lua:58-62`, `func = MultiBar1_IsVisible` and friends), which
|
|
# captures whatever those globals are at the window's own load. Loaded below the bars they capture
|
|
# nil, the five rows fall through `UIOptionsFrame_Save`'s arms to `SetCVar(nil, ...)`, and the
|
|
# reference's `SetCVar` raises on a non-string name — `0x488c10` checks `lua_isstring(1)` and takes
|
|
# `luaL_error("Usage: SetCVar(\"cvar\", value [, \"scriptCvar\")")` — so pressing Okay abandoned
|
|
# the rest of the save. The realm's own toc never faces this: it drops the stock options windows
|
|
# entirely, and this client is the only thing that loads them.
|
|
# `MainMenuBar`, `MainMenuBarArtFrame` and `MainMenuExpBar`, which later files read at load.
|
|
Interface\FrameXML\MainMenuBar.xml
|
|
|
|
Interface\FrameXML\Cooldown.xml
|
|
# `ActionButtonTemplate`, which ActionBarFrame.xml's `ActionBarButtonTemplate` inherits.
|
|
Interface\FrameXML\ActionButtonTemplate.xml
|
|
Interface\FrameXML\ActionBarFrame.xml
|
|
# The four optional bars, action slots 25-72. All four parent to `UIParent`.
|
|
Interface\FrameXML\MultiActionBars.xml
|
|
|
|
# Declares `UIOptionsFrameCheckButtons`, whose multibar rows the block above arms.
|
|
Interface\FrameXML\UIOptionsFrame.xml
|
|
# StaticPopup.lua starts `StaticPopupDialogs` empty: a file that adds a dialog at load follows it.
|
|
Interface\FrameXML\StaticPopup.xml
|
|
Interface\FrameXML\CoinPickupFrame.xml
|
|
|
|
# Ours: the Keybindings page's templates and script, which OptionsFrame.xml uses at load.
|
|
KeyBindingsPage.xml
|
|
|
|
# Ours: `BenillaOptionsFrame`; its rows read the option globals the stock windows above set.
|
|
OptionsFrame.xml
|
|
|
|
Interface\FrameXML\PetActionBarFrame.xml
|
|
# `UpdateMicroButtons` reads CharacterFrame, SpellBookFrame, QuestLogFrame, GameMenuFrame, the
|
|
# three stock options windows, FriendsFrame, WorldMapFrame, HelpFrame and KeyRingButton
|
|
# unguarded, so each must be on this list.
|
|
Interface\FrameXML\MainMenuBarMicroButtons.xml
|
|
# Before Minimap.xml, whose queue dropdown's OnLoad calls `MiniMapBattlefieldDropDown_OnLoad`.
|
|
Interface\FrameXML\BattlefieldFrame.xml
|
|
# GameTime.xml, DurabilityFrame.xml and QuestTimerFrame.xml name `MinimapCluster` at load.
|
|
Interface\FrameXML\Minimap.xml
|
|
Interface\FrameXML\GameTime.xml
|
|
# Before ZoneText.xml, whose frames call `FadingFrame_OnLoad` in their OnLoad.
|
|
Interface\FrameXML\FadingFrame.xml
|
|
Interface\FrameXML\ZoneText.xml
|
|
Interface\FrameXML\ColorPickerFrame.xml
|
|
Interface\FrameXML\WorldMapFrame.xml
|
|
# Ours: the Era map-canvas framework (`MapCanvasMixin` and friends), bolted onto the stock window
|
|
# above — which is why it sits immediately after it, and why the file reads `WorldMapFrame`,
|
|
# `WorldMapDetailFrame` and `WorldMapButton` by name. 1.12's map is a fixed 1002x668 frame showing
|
|
# one zone with no canvas, no pan, no zoom and no pins; every map addon written after 4.0 drives
|
|
# the canvas framework instead, and there is no stock file to migrate from because 1.12 has no
|
|
# such thing. Nothing here replaces anything: the canvas is added, and the stock art and its mouse
|
|
# surface are reparented INTO it, so a 1.12 addon's icons pan and zoom with the map for free.
|
|
MapCanvas.lua
|
|
Interface\FrameXML\CastingBarFrame.xml
|
|
Interface\FrameXML\MirrorTimer.xml
|
|
Interface\FrameXML\DurabilityFrame.xml
|
|
Interface\FrameXML\UIErrorsFrame.xml
|
|
# Anchors `relativeTo="UIErrorsFrame"`.
|
|
Interface\FrameXML\RaidWarning.xml
|
|
Interface\FrameXML\ContainerFrame.xml
|
|
# `CharacterFrameTabButtonTemplate`, which `CharacterFrame.xml`'s own tabs (and TurtleWoW's LFT
|
|
# group finder) inherit; the reference's toc lists it apart, so bring it in ahead of its users.
|
|
Interface\FrameXML\CharacterFrameTemplates.xml
|
|
# `CharacterFrame` parents every tab page below, and its OnLoad reads `PlayerFrameHealthBar`,
|
|
# `PlayerFrameManaBar` and `MainMenuExpBar`; PaperDollFrame.xml declares templates the pet page
|
|
# and the bag bar inherit.
|
|
Interface\FrameXML\CharacterFrame.xml
|
|
Interface\FrameXML\PaperDollFrame.xml
|
|
Interface\FrameXML\PetPaperDollFrame.xml
|
|
Interface\FrameXML\MainMenuBarBagButtons.xml
|
|
Interface\FrameXML\StackSplitFrame.xml
|
|
# Ours: wraps the stock bag verbs; the keyring is a container (id -2).
|
|
ContainerFrameAdapters.xml
|
|
Interface\FrameXML\ReputationFrame.xml
|
|
Interface\FrameXML\SkillFrame.xml
|
|
# Brings HonorFrameTemplates.xml, whose row templates `Blizzard_InspectUI` inherits.
|
|
Interface\FrameXML\HonorFrame.xml
|
|
Interface\FrameXML\DressUpFrame.xml
|
|
# Deliberately absent, the chain's `StatsFrame.xml` would sit here (its `FrameXML.toc` 60): the
|
|
# debug-build frame-stat overlay, `hidden="true"` with an OnUpdate that is the only reader of
|
|
# `GetDebugStats()` — a binding 5875 has and benilla does not, and whose readout is a debug
|
|
# build's own, not something a player sees. Loading the row would publish a `ToggleStats` that
|
|
# raises twice a second once pressed; leaving it out leaves `ToggleStats` nil, which is what an
|
|
# unbound key already does. Build `GetDebugStats` and this row costs nothing.
|
|
Interface\FrameXML\SpellBookFrame.xml
|
|
# Ours: the pet page's autocast widgets in the pet action button's proportions.
|
|
SpellBookAdapters.xml
|
|
# RaidFrame.xml names `parent="FriendsFrame"` and MailFrame.xml inherits `FriendsFrameTabTemplate`.
|
|
Interface\FrameXML\FriendsFrame.xml
|
|
Interface\FrameXML\RaidFrame.xml
|
|
Interface\FrameXML\GossipFrame.xml
|
|
Interface\FrameXML\MerchantFrame.xml
|
|
Interface\FrameXML\MailFrame.xml
|
|
Interface\FrameXML\TradeFrame.xml
|
|
Interface\FrameXML\ItemTextFrame.xml
|
|
Interface\FrameXML\BankFrame.xml
|
|
Interface\FrameXML\TaxiFrame.xml
|
|
Interface\FrameXML\PetStable.xml
|
|
Interface\FrameXML\LootFrame.xml
|
|
# Brings QuestFrameTemplates.xml, whose templates the guild registrar and quest log inherit; the
|
|
# quest log's OnLoad also calls `QuestMoneyFrame_OnLoad` from QuestFrame.lua.
|
|
Interface\FrameXML\QuestFrame.xml
|
|
Interface\FrameXML\GuildRegistrarFrame.xml
|
|
Interface\FrameXML\PetitionFrame.xml
|
|
Interface\FrameXML\QuestLogFrame.xml
|
|
Interface\FrameXML\QuestTimerFrame.xml
|
|
# ChatFrame.lua starts `SlashCmdList` empty: a file that registers slash commands at load follows.
|
|
Interface\FrameXML\ChatFrame.xml
|
|
Interface\FrameXML\FloatingChatFrame.xml
|
|
|
|
# `ShapeshiftBar_OnLoad` can reach `UIParent_ManageFramePositions`, which reads the frames above
|
|
# unguarded.
|
|
Interface\FrameXML\BonusActionBarFrame.xml
|
|
# `WorldStateAlwaysUpFrame`'s OnLoad runs the same pass, which also reads
|
|
# `ShapeshiftBarLeft/Middle/Right`, so this follows BonusActionBarFrame.xml.
|
|
Interface\FrameXML\WorldStateFrame.xml
|
|
# `ClassTrainerListScrollFrameTemplate`, which on-demand addons inherit.
|
|
Interface\FrameXML\ClassTrainerFrameTemplates.xml
|
|
# TurtleWoW's Looking-For-Turtle group finder (`/lft`, and the minimap eye): the reference's own
|
|
# toc lists LFT_Data.lua, LFT.lua, LFTTemplates.xml and LFT.xml in that order, and OctoWoW's
|
|
# blink-pause overlay rides last. `json.lua` is the codec the group payloads decode through.
|
|
Interface\FrameXML\json.lua
|
|
Interface\FrameXML\LFT\LFT_Data.lua
|
|
Interface\FrameXML\LFT\LFT.lua
|
|
Interface\FrameXML\LFT\LFTTemplates.xml
|
|
Interface\FrameXML\LFT\LFT.xml
|
|
# `OctoTurtleBridge` is Turtle_General's addon-message dispatcher, baked into FrameXML: it answers
|
|
# the realm's `TW_CHAT_MSG_WHISPER` inspect replies and `RESPONSE_PLAYER_CHALLENGES`, loading
|
|
# `Blizzard_InspectUI` and `Blizzard_TalentUI` on demand and seeding `Turtle_ChallengesCache`.
|
|
Interface\FrameXML\OctoTurtleBridge\OctoTurtleBridge.lua
|
|
# TurtleWoW's compact group/raid frames (`GroupClusterFrame1..8` + `GroupPetsClusterFrame`); the
|
|
# one row pulls `Turtle_GroupUI.lua` and `Turtle_GroupUITemplates.xml` through its own
|
|
# `<Script>`/`<Include>`. `OctoGroupUIFix` must stay immediately after it, as the chain's toc has
|
|
# it: it patches that module in place (saved position, a frame left stuck to the cursor, and the
|
|
# `PLAYER_ENTERING_WORLD` setup appending its lists on every loading screen).
|
|
Interface\FrameXML\Turtle_GroupUI\Turtle_GroupUI.xml
|
|
Interface\FrameXML\OctoGroupUIFix\OctoGroupUIFix.lua
|
|
# OctoWoW's seven baked single-file extensions (its `FrameXML.toc` 143-149), all Lua over verbs
|
|
# that already exist, and baked into the chain rather than shipped as AddOns precisely so a player
|
|
# cannot switch them off. In the reference's order, which puts the first of them above
|
|
# OctoLFTBlinkPause.
|
|
# `OctoWowWarModeConfirm` wraps `SlashCmdList["PVP"]`: on the War Mode challenge (spell named
|
|
# "War Mode" in the spellbook) /pvp raises a confirm popup first, because the server reads a
|
|
# /pvp from such a character as a permanent, persisted opt-out.
|
|
Interface\FrameXML\OctoWowWarModeConfirm\OctoWowWarModeConfirm.lua
|
|
Interface\FrameXML\OctoLFTBlinkPause\OctoLFTBlinkPause.lua
|
|
# `OctoRestedTooltip` wraps `GetRestState` so the exhaustion tooltip reads the realm's 175% rather
|
|
# than 1.12's baked 150%, and adds `/rested`; the multiplier is display-only in 1.12, the XP bar
|
|
# itself reads the state id.
|
|
Interface\FrameXML\OctoRestedTooltip\OctoRestedTooltip.lua
|
|
# `OctoChallengeTip` appends entries 11 and 12 to `Turtle_AvailableChallenges` (Globals.lua above),
|
|
# which is what `TargetFrame_UpdateChallenges` walks bit by bit — so the realm's own two
|
|
# challenges, Samurai and Together Forever, stop being dropped from a player's hover.
|
|
Interface\FrameXML\OctoChallengeTip\OctoChallengeTip.lua
|
|
# `OctoWarModeOffer` renders the one-shot War Mode offer the server sends as a `TW_WARMODE`
|
|
# `S2C_OFFER` addon message on arrival from the hardcore realm, and answers C2S_ACCEPT/C2S_DECLINE.
|
|
Interface\FrameXML\OctoWarModeOffer\OctoWarModeOffer.lua
|
|
# `OctoXpBoost` is `/xpboost`, the bonus-experience opt-out. Slash commands never reach the server,
|
|
# so it sends the server's `.xpboost` as a SAY, which the server runs as a command and never
|
|
# broadcasts. Nothing in it is ours; without the row the command is simply undefined, which is what
|
|
# grom's 2026-10-23 report was.
|
|
Interface\FrameXML\OctoXpBoost\OctoXpBoost.lua
|
|
# `RestoreBugCommand` rebuilds `/bug` and `/suggest`: Turtle's FrameXML dropped the BugReport frame
|
|
# altogether, so this builds its own dialog and sends the report as chunked `.bug` SAY commands.
|
|
Interface\FrameXML\RestoreBugCommand\RestoreBugCommand.lua
|
|
# TurtleWoW's own three loose rows (its `FrameXML.toc` 103-105), all Lua over verbs that already
|
|
# exist. `Hooks.lua` is the realm's tooltip layer: the guild line under a player's name (gated on
|
|
# its own `TOOLTIP_GUILD_NAMES` CVar), the shift-click hint while a trade, auction or mail window
|
|
# is up, and `FixSetInspect`, which recolours an inspected or transmogrified item's set lines by
|
|
# what the unit actually wears — the reason a set bonus reads gray on this realm without it.
|
|
# `ChronoboonTimers.lua` adds the Chronoboon Displacer's stored-buff lines to its bag tooltip;
|
|
# `SpellChatLinks.lua` answers the realm's `TW_CHAT_MSG_WHISPER` spell/talent link protocol, so a
|
|
# linked spell in chat opens a tooltip instead of nothing.
|
|
Interface\FrameXML\Hooks.lua
|
|
Interface\FrameXML\ChronoboonTimers.lua
|
|
Interface\FrameXML\SpellChatLinks.lua
|
|
# Turtle's `# Arena` block (its `FrameXML.toc` 108-112), in its own order. `Turtle_ArenaUI.lua`
|
|
# is the whole client half of the realm's arena: the `TW_ARENA` addon-message protocol, the team
|
|
# roster and the queue. `Turtle_ArenaUITemplates.xml` carries `ArenaTeamTemplate`, which
|
|
# `Blizzard_InspectUI`'s own `InspectArenaFrame.xml` inherits for its three team buttons before
|
|
# reading `$parentText`, `$parentDetails` and nine `$parentDetails*` children by name — without
|
|
# that row the inspect window raised four times per inspect, three OnLoads and
|
|
# `InspectArenaFrame_OnShow`.
|
|
#
|
|
# `Turtle_ArenaFrame.xml` is also the sixth page the realm's `CharacterFrame.lua` appends to
|
|
# `CHARACTERFRAME_SUBFRAMES` (`ArenaFrame`, `id="5"`, sharing the PvP tab), which the window's own
|
|
# sweep hides unguarded. We shipped an empty stand-in for that name until 2026-10-31; the realm's
|
|
# file defines it, so the stand-in only shadowed the real window.
|
|
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaUI.lua
|
|
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaUITemplates.xml
|
|
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaFrame.xml
|
|
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaQueueFrame.xml
|
|
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaRegistrarFrame.xml
|
|
# Turtle's barbershop, one row that scripts its own `Turtle_Barbershop.lua`: the window opens on a
|
|
# `TW_BARBERSHOP` addon message (no gossip hook — it watches CHAT_MSG_ADDON, PLAYER_MONEY and
|
|
# UNIT_MODEL_CHANGED) and drives a live 3-D preview, zooming the world camera out two yards at the
|
|
# open (`Turtle_Barbershop.lua:211`). `CameraZoomOut` was the one verb these three windows call
|
|
# that we did not have; it is built now, with `CameraZoomIn`.
|
|
Interface\FrameXML\Turtle_BarbershopUI\Turtle_Barbershop.xml
|
|
# TurtleWoW's own FrameXML additions, in the reference `FrameXML.toc` order (patch-3.mpq). These
|
|
# are the client half of Turtle's custom systems: `Turtle_TransmogUI` hooks `GOSSIP_SHOW`, hides
|
|
# the stock gossip frame for its NPCs and drives the transmog window over `TW_TRANSMOG` addon
|
|
# messages; `Turtle_ShopUI` (prefix `TW_SHOP`) is the custom merchant/shop. Without these rows the
|
|
# server's trigger gossip text (`TRANSMOG_TRIGGER`, `CUSTOM_MERCHANT_TRIGGER`) is what the stock
|
|
# gossip window shows, and neither custom window exists.
|
|
Interface\FrameXML\Turtle_TransmogUI\Turtle_TransmogSets.lua
|
|
# The slot buttons in Turtle_TransmogUI.xml inherit TransmogPlayerSlotTemplate, and the look grid
|
|
# and new-transmog alert inherit TransmogFrameLookTemplate/TransmogWonItemTemplate; without this
|
|
# file they materialize bare and the UI's `_G[slot.."BorderSelected"]`-style reads raise on nil.
|
|
Interface\FrameXML\Turtle_TransmogUI\Turtle_TransmogUITemplates.xml
|
|
Interface\FrameXML\Turtle_TransmogUI\Turtle_TransmogUI.xml
|
|
Interface\FrameXML\Turtle_ShopUI\Turtle_ShopUITemplates.xml
|
|
Interface\FrameXML\Turtle_ShopUI\Turtle_ShopUI.xml
|
|
# Turtle's guild bank (its `FrameXML.toc` 126-127): the templates first, then the window, which
|
|
# scripts its own 60 KB `Turtle_GuildBankUI.lua` — a `GOSSIP_SHOW` hook for the banker NPCs over
|
|
# `TW_GUILDBANK` messages, with the tab rights read off `GuildControlGetNumRanks`/`GetRankName`
|
|
# and so a `GUILD_ROSTER_UPDATE`/`PLAYER_GUILD_UPDATE` listener too.
|
|
Interface\FrameXML\Turtle_GuildBankUI\Turtle_GuildBankUITemplates.xml
|
|
Interface\FrameXML\Turtle_GuildBankUI\Turtle_GuildBankUI.xml
|
|
# Turtle's honour/arena merchant (Stormwind armoury PvP gear, the Custom_Merchant NPCs): it hooks
|
|
# `GOSSIP_SHOW`, hides the gossip frame for an NPC whose greeting is `CUSTOM_MERCHANT_TRIGGER` and
|
|
# fills over `TW_Merchant` addon messages. Without it that trigger text is what the stock gossip
|
|
# window shows. The `.xml` scripts its own `.lua`, and it inherits SmallAlterateCurrencyFrameTemplate
|
|
# (MoneyFrame.xml) and uses `json` (json.lua above), both already on the chain.
|
|
Interface\FrameXML\Custom_Merchant\CustomMerchantFrame.xml
|
|
# The realm's in-game radio, two baked files in the chain's own order (its FrameXML.toc 129 then
|
|
# 146). `EverlookBroadcastingCo` builds the `EBC_Minimap` boombox button; `OctoRadioPlaceholder`
|
|
# hangs the station menu off it and bails at its first line without it
|
|
# (`if not EBC_Minimap then return end`), so the order is load-bearing, not cosmetic.
|
|
#
|
|
# A station click sends `.radio <n>` as a SAY chat command; the server answers with
|
|
# `SMSG_PLAY_MUSIC` naming a `SoundEntries.dbc` row whose file is a live HTTP stream URL.
|
|
Interface\FrameXML\EverlookBroadcastingCo\EverlookBroadcastingCo.xml
|
|
Interface\FrameXML\OctoRadioPlaceholder\OctoRadioPlaceholder.lua
|
|
# `OctoGhostGate`, last of the realm's six baked extensions: it post-hooks
|
|
# `GameTooltip:SetUnitDebuff` and, when the hovered debuff is titled exactly "Ghost", rewrites
|
|
# line 2 with the hardcore afterlife line — gated at PLAYER_LOGIN on `GetRealmName() == "C'Thun"`,
|
|
# because Spell.dbc loads before a realm is chosen and the realm wants the line on C'Thun only.
|
|
Interface\FrameXML\OctoGhostGate\OctoGhostGate.lua
|
|
# AIO, the realm's client<->server transport (its FrameXML.toc bakes it so no AddOn is needed).
|
|
# Before OctoCalendar, which feeds from it: the calendar registers an AIO handler at load and
|
|
# queues its guild-permission request until AIO is up (`OctoCalendar.lua:919-920`).
|
|
Interface\FrameXML\AIO\Dep_LibWindow-1.1\LibStub.lua
|
|
Interface\FrameXML\AIO\Dep_LibWindow-1.1\LibWindow-1.1\LibWindow-1.1.lua
|
|
Interface\FrameXML\AIO\Dep_Smallfolk\smallfolk.lua
|
|
Interface\FrameXML\AIO\lualzw-zeros\lualzw.lua
|
|
Interface\FrameXML\AIO\queue.lua
|
|
Interface\FrameXML\AIO\AIO.lua
|
|
# `OctoTurtleStore` keeps `TransmogOutfits` and `LFTPresets` on the realm through AIO's
|
|
# `OctoUIStore` handler, FrameXML having no SavedVariables of its own. After AIO, which it needs at
|
|
# load: it returns early without `AIO.Handle`, `AIO.AddHandlers` and `Smallfolk`.
|
|
Interface\FrameXML\OctoTurtleStore\OctoTurtleStore.lua
|
|
# The realm's event calendar: `/cal`, `/calendar`, `/octocal` (`OctoCalendar.lua:925-928`).
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar_Holidays.lua
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar.lua
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar.xml
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar_Create.lua
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar_Create.xml
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar_Mail.lua
|
|
Interface\FrameXML\OctoCalendar\OctoCalendar_GuildPerms.lua
|
|
# Ours: a no-op for each AIO block this client has no feature for. After AIO, which defines the
|
|
# registration verb, and after the Octo files, so a real handler always wins the name.
|
|
AIOHandlers.lua
|
|
# Ours: the `/errors` script error log and our slash commands.
|
|
ScriptLogFrame.xml
|
|
Interface\FrameXML\HelpFrame.xml
|
|
Interface\FrameXML\CinematicFrame.xml
|
|
Interface\FrameXML\TabardFrame.xml
|
|
Interface\FrameXML\TutorialFrame.xml
|
|
# Ours: the ESC game menu. Last: it wraps `ToggleGameMenu`, `IsOptionFrameOpen` and
|
|
# `UpdateMicroButtons` to count `BenillaOptionsFrame`.
|
|
GameMenuFrame.xml
|