本文件記錄EventAlertMod正式服重寫開發過程中遇到的瓶頸、限制、錯誤、工具失敗、API不確定性與有效解法。目的在於減少日後重複試錯,並讓未來的人工智慧代理人能夠用最少的上下文/token繼續理解問題。
### yyyy-mm-dd 標題
- 狀態:已解決 / 未解決 / 待實機驗證
- 情境:
- 症狀:
- 原因判斷:
- 已嘗試方法:
- 有效解法:
- 後續注意事項:
ziyuefan/EventAlertMod_Remake 的 main 路徑。EventAlertModAll;ScreenShot fragment 也使用本 README 不存在的 #screenshot-2。github.com/github.io 連結,再核對實際 ##命令列 與 ## 截圖 標題,避免只更換 repo 名稱。main/changelog.txt;CommandLine 與 ScreenShot 分別連到本 repo README 的 #命令列 與 #截圖。https://ziyuefan.github.io/EventAlertMod_Remake/。docs_html/README.md.html 已包含 12.1 Alpha、Native Aura 與 Tooltip 監控說明,但根 readme.html 最後更新於 2026-06-11;標準包會收錄後者。docs_html/README.md.html,打包器卻讀取根 readme.html,兩份生成檔沒有同步契約。batch_convert_docs.py 每次轉換根 README.md 後,將 Pages 產物同步到根 readme.html;封裝指南同步指定該唯一來源。Tools/Build-CurseForgePackage.ps1 時,TOC 一致性閘門回報 Services/ShadowHostService.lua 未列入 TOC,拒絕產生 ZIP。Services/。標準打包器會複製整個服務目錄;若只放寬檢查,死碼仍會進入正式包。-SkipLuaCheck 或修改白名單繞過。另遇到桌面端 sandbox helper setup refresh had errors,內建補丁工具無法啟動;WindowsApps 的 patch 啟動器又被拒絕執行,最後改用本機 npm Codex 套件內相同的 --codex-run-as-apply-patch 入口。git mv 將 ShadowHost 完整封存到 LegacyReference/Services/ShadowHostService.lua;同步把模組契約改成封存參考。正式包既不載入也不收錄該檔,研究歷史仍可追溯。41/41 語法通過;離線 all suite 24/24 通過;敏感資訊掃描通過;產物為 Dist/EventAlertMod_MN_20260728_123720.zip。LegacyReference/,且文件不可再把它列為執行期契約。D:\World of Warcraft 為 WoW 根目錄,並補充 _ptr_ 為至暗之夜 12.1.0、_xptr_ 為至暗之夜 12.0.7;各版本 AddOns 可能以 Windows 連結指向實體專案 D:\EventAlertMod。Interface\AddOns\EventAlertMod 當成一般插件副本進行刪除、覆蓋、解壓縮或鏡像同步,可能破壞 SymbolicLink,甚至讓遞迴工具誤作用到實體專案。LinkType/Target/ReparsePoint。foreach { } | Format-Table 的寫法而在解析期停止;第二次誤假設 PTR 使用 Wow.exe,因實際檔名是 WowT.exe 而停止。兩次都沒有修改檔案。最終一致性檢查又因以 Tools/Test-... 正斜線字串搜尋 Windows 文件中的 .\Tools\Test-... 反斜線命令而產生假陰性;改以檔名本身與語意欄位檢查。第二版又把完整版本字串錯套到只負責流程命令的 SKILL,形成責任範圍假陰性;最終改為按文件責任分層斷言。_retail_ 為 12.0.7.68256、_ptr_ 為 12.1.0.68209、_xptr_ 為 12.0.7.68182;前三者 EventAlertMod 均為指向 D:\EventAlertMod 的 SymbolicLink。另確認 _classic_、_classic_ptr_ 為同目標 SymbolicLink,_classic_era_ 為實體目錄,_classic_era_ptr_ 不存在該插件路徑。 已新增 Tools/Test-LocalWoWEnvironment.ps1,以 patch train 與 Reparse Point/Target 作為實機測試前置斷言並產生 JSON/Markdown 證據。_retail_、_ptr_、_xptr_ 的 AddOns 連結禁止刪除、搬移、覆蓋、解壓縮、robocopy /MIR 或重建。任何連結維護必須另行說明風險並取得明確授權。luac -p、RuntimeProbe 與人工測試清單,無法重播 EventRouter、Scheduler、SavedVariables 與報告匯出流程,也沒有 Mock/實機共用案例或 WTF 回灌格式。FlowTestRunner、FlowTestPanel、Lua 5.1 Offline Harness、PowerShell runner/importer、獨立 SavedVariable 與 eam-flow-validation SKILL。工具過程另遇到桌面端 sandbox helper 無法初始化,需在已授權專案範圍內改用具唯一命中檢查的 PowerShell 精確寫入;第一次替代雙引號時誤用反斜線轉義,造成 Slash.lua 出現 unexpected symbol near '\',經 luac -p 定位後改用 PowerShell 單引號常值修復;此外遇到 skill short description 24 字元不足、JavaScript 編排反引號/PowerShell suite 插值衝突、Windows PowerShell 5.1 對無 BOM UTF-8 的 cp950 誤讀,以及報告工具漏初始化 $utf8。HTML 轉換器另會產生含 CR 的純空白行,初版清理規則未涵蓋 CR,經 git diff --check 定位後改以行尾 lookahead 清除。.ps1 使用 UTF-8 BOM;明確初始化輸出 UTF-8 encoding。離線 all suite 共 7 案例全數通過,JSON、Markdown 與 importer round-trip 成功。Lua syntax OK: 35 files;passed=7, failed=0, skipped=0, pending=0;回灌來源正確保留 offline-mock。/eam test all,確認面板 template、複製按鈕、Scheduler callback、WTF 寫回、taint/Lua error 與 ReloadUI。Mock 通過不得宣稱實機通過。SEC 與 AURA121 分別負責安全終審及 Aura 遷移,但缺少跨版本追蹤 TOC、revision、官方公告、UI source diff 與遷移窗口的唯一問責角色。API_change_summaries 與 12.0.0、12.0.1、12.0.5、12.0.7、12.1.0 頁面 revision;建立 eam-retail-api-change-intelligence SKILL。init_skill.py 首次因 23 字元的 short_description 未達 25 字元而只建立骨架;generate_openai_yaml.py 又先遇到 cmd 引號拆解與 Windows Python cp950 無法解碼 UTF-8;Codex 編排層兩次 Base64 嘗試因缺少 TextEncoder 與 btoa 而在命令送出前停止;apply_patch 亦受 setup refresh had errors 阻斷。APICHG(EAM_API_Change_Intelligence_Expert)並設為第 13 個 RACI 領域唯一 A/R;以至少 25 字元的說明重新產生介面,改用 PowerShell 單引號保留參數,並以本次程序限定的 PYTHONUTF8=1 成功建立 agents/openai.yaml;文件修改使用已授權、目標明確的非互動 PowerShell UTF-8 寫入。APICHG 不取代 SEC 安全終審、AURA121 Aura 遷移或 RQA 客戶端簽收。本次未修改 Lua。Tools/Build-CurseForgePackage.ps1執行流程中,呼叫Scan-SensitiveInfo掃描敏感資訊時推送MethodNotFound: [System.Char]不包含名為'Trim'的方法致命崩潰,導致備用流程中斷。Get-Content 讀取到單行檔案(如 changelog.txt)時,PowerShell 集合傳回值最佳化為單一 [System.String],而不是 [System.String[]] 陣列。
2.此時在 for ($i = 0; $i -lt $lines.Count; $i++) 迴圈中,使用下標 $lines[$i] 會進行 String 自行字符格式處理,導出其中的單個字符(其他類型為 [System.Char])。[System.Char] 沒有 .Trim() 方法,呼叫時會引發 MethodNotFound 異常。Scan-SensitiveInfo 函數中,將 $lines = Get-Content ... 修改為以 @() 強制包裝的 $lines = @(Get-Content ...),確保有檔案有幾行,傳回結果必然是梯度,從而使 $lines[$i] 始終傳回字串。Constants.lua中的BOUNDARY_SECRET_VALUE = "secretValue"與ClassPowerService.lua中除錯日誌內字符串拼接的"Secret"為敏感資訊洩露,強行中斷資源。secret 單字進行了無腦匹配,這會誤配到 EAM 核心 Secrecy(結構/安全)防衛機製本身的常規變數與字符串。Tools/Build-CurseForgePackage.ps1中的$patterns正則,將寬泛的secret替換為精確搜尋client_secret與app_secret等具體金鑰或推理字樣。Media/Images/ 底下所有的貼圖與按鈕背景(如 Seed1.blp、UI-Panel-Backdrop.blp)全部被跳過,統計的 ZIP 壓縮包內缺少這些貼圖。Tools/Build-CurseForgePackage.ps1中的$allowedExtensions白色名單變數中,缺少了魔獸世界中世紀專用的貼圖副檔名.blp。.blp 正式加入白名單副檔名列中(即 $allowedExtensions = @(".lua", ".xml", ".tga", ".blp", ...))。EAM_Addon_Architect (ARCH) 與 EAM_Lua_VM_Expert (LUA) 重點報告(包含了對 JIT Trace Compiler 致命 __EAMCODE_5 以及 Abort 的要因分析releaseFunc 的重大 Bug診斷),擬定最新的JIT優化實施計畫。/eam opt)中拖曳曳引滑桿(Sliders)調整「圖示大小(iconSize)」或「圖示距離(iconSpacing)」時,雖然設定值空間儲存至 SavedVariables 1745 時,大小與 6)尺寸),調整完全無效。config.iconSize = 73,config.iconSpacing = -33,表示使用者確實修改了設定,且設定已寫入。
2.然而,在實體渲染的 runtimeStats.renderer.frameIcons 刺激屬性中,所有 Icon 的 layoutSize 仍然是預設的 40。Core/SavedVariables.lua 的 defaults 表與 UI Slider 的綁定中,使用者設定分別儲存在 EAM.db.config.iconSize 和 EAM.db.config.iconSpacing。
4.然而,在負責渲染調度版的 UI/Renderer.lua 中,ensureParent 函數與 layout 調度版算法均只去讀取了 EAMDE_FCO__7 欄位演算法均只去讀取了 EAMDE_CO__7 欄位。這導致變數呼叫不穩定,使渲染器永遠只能回退讀取預設值。UI/Renderer.lua 至 backup/Renderer.lua__20260607222900。ensureParent 內,將 Renderer.iconSize 和 Renderer.spacing 欄位的賦值改為優先從 EAM.db.config.iconSize 和 EAM.db.config.iconSpacing 讀取,並相容於舊版本 db.layout 與後備預設值。layout 排版函數中,將 local size 和 localpacing 改為優先從 EAM.db.config.iconSize 和 EAM.db.config.iconSpacing 讀取,並相容於 db.layout 預設欄位與 Renderer 本機預設值。
3.靜態luac -p檢定語法100%通過。DurationObject 進行渲染,當我們在 OnUpdate (例如 Renderer.lua 的 onLegacyTimerUpdate) 中調用 durationObj:__EAMCODE_5 工件/ a Secret boolean value (execution tainted by) 'EventAlertMod') 致命錯誤,首先導致 Taint 崩潰並阻塞 UI 的 OnUpdate 執行鏈。DurationObject:IsZero()的傳回值是Secret Boolean,在Lua中直接做if val then條件判斷會直接觸發Metamethod崩潰崩潰。
2.這是因為暴雪的保密保護機制限制了對Secret Boolean做布林值判斷。
3.要安全訪問,我們不能對Secret Boolean進行布爾測試。但是,我們可以透過issecretvalue(val)來先檢驗傳回值是否為Secret。如果是Secret,我們直接跳過對它的布林測試以策安全。如果不是Secret,我們才可以安全地做布林判斷。UI/Renderer.lua 至 backup/Renderer.lua__20260607222500。safeCheckIsZero(durationObj) 防禦性包裹函數:durationObj 不是 nil,有 IsZero 函數,且 durationObj 本身不是 Secret。pcall 傳參方式呼叫:local ok, val = pcall(durationObj.IsZero, durationObj),深圳市在 OnUpdate 熱路徑上產生堆垃圾。val 後,使用 Util.isSecretValue(val) 檢查其是否為 Secret。如果是 Secret,則回傳 false(此處不進行布林測試);若不是 Secret,則可以安全地回傳 val == true。onLegacyTimerUpdate 中對於 activeDurationObjects 的遍歷,改用 safeCheckIsZero(durationObj) 進行條件判斷。C_UnitAuras.GetAuraDuration 所傳回的 DurationObject 雖然被保護(秘密),但原生 UI 本身可以進行綁定渲染。
2.由於 DurationObject 無法在 Lua 中讀取剩餘時間,原有的 EAM 調度器 (Scheduler) 與退彈機制無法獲知此時即將到來,只能完全依賴 UNIT_AURA 光環移除事件。然而戰鬥中事件經常被官方優化、節流甚至部分延遲。DurationObject 與 IsZero() 方法相比,這在 Secret 狀態下是安全、可安全呼叫的謂詞(回傳普通 boolean)。Services/AuraService.lua 和 UI/Renderer.lua 至 backup/ 目錄。AuraService.lua中的readAuraIntoState。當isSecret為true時,優先抓取繪圖說明的持續時間(scrapedDur)。若抓到,即用其手動建立一個非秘密的普通DurationObject,此時它可以走一般的數位繪圖索引。UI/Renderer.lua,實施 activeDurationObjects 管理。對於任何包含 durationObject 的啟動圖示(不管是暫時的還是手動建立的),在統一的 onLegacyTimerUpdate 中每幀都進行 IsZero() 替代。 durationObj:IsZero() 返回 true,立即主動呼叫 Renderer.render(..., shown=false) 隱藏與 IconPool 恢復,主動釋放框架。spellCooldown 框架下喘顯示了 15 個技能圖示(包括冰槍、喚醒、火球等),但這些技能當時均處於非冷卻狀態且無倒數秒數位文字。CooldownService.lua 傳導的 shouldShow 邏輯是:如果為非充能技能,則當 infoSafe 為 false 時預設shouldShow = true(防禦讀取中受保密而限制的異常)。C_Spell.GetSpellCooldown 可能會返回一個有效的有效冷卻屬性的結構,甚至可能為空;或者是因為該技能不在冷卻中而使 cooldownInfo 為 nil。
3.此時,infoSafe因為拿不到安全冷卻事實而保持為false,這導致在判定時錯誤地落入了else shouldShow = true的防禦性分支!
4.結果是:所有被監控且目前沒有在冷卻中的技能均被強制設定為shouldShow = true。它們被顯示到畫面上,但由於完全沒有冷卻時間數據,完全不會有倒數秒數與冷卻螺旋黑幕。Services/CooldownService.lua 到 backup/ 目錄。shouldShow 邏輯:
僅在 cooldownInfo 不為 nil 時(代表該液化確實具有冷卻資料或在冷卻中),且在 infoSafe 為 false 的基礎狀態下,才進行防禦性 `shouldShow = 7_7__ 的判斷;若 EAM 6_6__9 則直接顯示關係。:IsShown() 属性。Debug/PromptExport.lua 到 backup/ 目錄。memoryKB統計,並探索5大服務(靈氣、冷卻、ItemCooldown、GroundEffect、圖騰、ClassPower)的狀態,收集目前活躍的武器ID清單。glowSpells中目前正一個Proc高亮發光的spellID清單。id、isParasite、layoutX、layoutY、layoutSize與魔獸世界中的實體layoutY`、`layoutSize`與魔獸世界中的實體layoutSize5__4CODE_4__。
4.靜態luac -p` 全案語法檢驗,順利通過。/eam debug 複製出的 JSON,檢查是否包含上述新增的陣列與物品。visibleIcons 恆為 0,且 alertFrame.exists 恆為 false,第一判斷為沒有任何圖示顯示。_G["EAM_AlertFrame_" .. fName]),原本的單一全域框架 EAM_RetailAlertFrame 已被廢棄。renderer.orderCount 各也已拆分封裝至框架的剖面佈局狀態 fState.orderCount 中。
3.然而除錯統計工具 Debug/PromptExport.lua 與 Debug/DebugState.lua 在統計 visibleIcons 與 exists 時,依然嘗試讀取舊版的 renderer.orderCount 與 _G["EAM_RetailAlertFrame"]。這導致統計工具總是回傳 0 與false,產生了「圖示完全未顯示」的統計資料假象。事實上,渲染器渲染日誌正常,實體圖示已成功渲染並顯示在畫面上。Debug/PromptExport.lua 和 Debug/DebugState.lua 到 backup/ 目錄。Debug/PromptExport.lua與Debug/DebugState.lua,將visibleIcons改為加7大Alert Frame的orderCount;把layoutDirty改為檢查若有任何一個fState.layoutDirty6。PromptExport.lua 內對 7 大警報框架(如 selfAura、targetAura 等)進行格式化偵測與格式化輸出,只要至少有一個框架存在,即判定 alertFrame.exists 為 true,並精確呈現每個隱座狀態。
3.靜態 luac -p 全案語法安全性驗證,修改之文件 100% 通過語法安全性檢查。visibleIcons數值是否已與實體圖示渲染完全一致(顯示大於0的正確數量),並且聊天視窗不再噴出錯誤。/reload載入外掛程式時,魔獸世界直接推送大紅字錯誤:`EAM Init Error on [AlertManager]: Frame:RegisterEvent(): Attempt to registerknown event __EAMCODE_411,導致__EAUIAlertManager 初始化時,會呼叫 EventRouter.register 註冊多個內部自訂事件(如 EAM_AURA_STATE_CHANGED)。EventRouter.register的實踐是無論任何事件均調用 frame:RegisterEvent(event) 往前暴雪框架註冊。RegisterEvent API 嚴格只能註冊暴雪系統定義的事件,一旦確定未知的自訂事件名稱,會立即引發致命錯誤併中斷執行鏈。Core/EventRouter.lua 到 backup/ 目錄。EventRouter.register(event, handler) 中引入自編輯事件過濾機制:
判斷事件名稱是否以"EAM_"為外接。如果是,屬於內部通訊自訂事件,跳過呼叫內部frame:RegisterEvent(event)。/reload載入後,聊天視窗是否不再噴出任何RegisterEvent錯誤紅字,且EAM警報在各服務自訂事件觸發下能正常渲染。EA_Items、EA_AltItems等)的全新安裝環境下(或WTF資料夾被清除),重寫後的EAM登錄後一個ICON沒有出現。SavedVariables.lua 在初始化時,除了執行 importLegacyTables 嘗試從舊版本全域變數遷移設定之外,沒有將 EAM.Data.SpellArray 中目前職業的預設監控寫入 EAM_DB.alerts 中。
2.當全新載入時,舊版變數不存在,因此alerts清單完全為空。
3.各個監控服務(AuraService、CooldownService等)均使用EAM_DB.alerts進行篩選,若警報為空則直接返回,不引發任何更新事件與進行UI危險,故畫面上一個ICON都沒有出現。Core/SavedVariables.lua 到 backup/ 目錄。Core/SavedVariables.lua 的 SavedVariables.initialize() 中,加入全新載入(即 playerAuras/targetAuras/spellCooldowns/itemCooldowns 四者個數為 0 時)防空機制:
自動偵測目前玩家職業,讀取EAM.Data.SpellArray中對應的通用及各專精預設監控人力,並呼叫SavedVariables.addAlert自動寫入資料庫。/run EAM_DB = nil ReloadUI() 在全新清空 SavedVariables 測試後,是否會自動讀取目前職業(如法師)的預設閘道並顯示對應的圖示,且不再空白。DurationObject指針、或多或少不支援12.0.7原生綁定的降級計時環境下,EAM的獨立框架不知只進行了陰影旋轉,而完全不顯示倒數秒數字文字。另外,若未來Cooldown啟用,會造成短暫的小數字與EAM自訂大文字重疊。Renderer.lua僅實作了useNativeBinding模式下的文字綁定,降級模式下直接將timerText清空,導致一般計時不顯示剩餘秒數。CooldownFrame 預設可以顯示倒數數字,造成與 EAM 本身的 timerText 重疊,不美觀。UI/Renderer.lua 和 UI/IconPool.lua 至 backup/ 目錄。UI/Renderer.lua中實施一個全域共享、基於單一OnUpdate框架的legacyTimer系統,提供registerLegacyTimer和unregisterLegacyTimer。只有在降級圖示啟動時該計時才會啟動。2.4、0.8),大約 3 秒整數,提供了幾乎完美顯示的高級體驗。IconPool.release 與 Renderer.render 過渡時,確實調用 unregisterLegacyTimer 清除定時,防止殘影或洩密。UI/IconPool.lua的createIcon中,對新烘焙的冷卻框架呼叫cooldown:SetHideCountdownNumbers(true),徹底消除文字重疊。DurationObject降級情況下大字倒數是否流暢,且3秒以下的小數點顯示是否精準無卡頓。Services/ShadowHostService.lua, UI/Renderer.lua 和 Core/SavedVariables.lua 至 backup/ 目錄。ShadowHostService.lua中註解底部的initShadowHost()調用,不進行任何Hook,也不隱形官方UI;同時簡化ShadowHostService.GetHostIcon產生直接回傳nil。UI/Renderer.lua的Renderer.render中,將useCDM寫死為false,徹底斷開與CDM掛勾的判斷路徑。所有圖示100%走EAM將手機排版路線(dx, dy方向定位)。Core/SavedVariables.lua 中,將預設值的 enableCDM 設為 false。
4.靜態 luac -p 全案語法檢查編譯通過。DurationObject 的 API 以進行高可用性、0-GC 和 Secret-Safe 的時間渲染。DurationObject 扭轉指標傳遞(Pointer-Pass)輕鬆地重構 Widget,同時需要完整的磁碟點所有可用的 API 以便模組化重構。C_Spell.GetSpellCooldownDuration、C_Spell.GetSpellChargeDuration、C_SpellBook.GetSpellBookItemCooldownDuration、C_SpellBook.GetSpellBookItemChargeDuration、C_ActionBar.GetActionCooldownDuration、C_ActionBar.GetActionChargeDuration。C_UnitAuras.GetAuraDuration、C_UnitAuras.GetAuraBaseDuration 與 C_UnitAuras.GetRefreshExtendedDuration。C_DurationUtil.CreateDuration、C_DurationUtil.CreateManualClock。self:GetTimerDuration()。IsZero()、GetRemainingDuration()、GetClockTime()、EvaluateTotalDuration()、FormatRemainingDuration(formatter)、FormatElapsedDuration(formatter)、FormatTotalDuration(formatter)等成員函數,並完成其操作Secrecy安全性屬性(如 IsZero 為 NeverSecret 可安全做為較檢測)。Services/GroundEffectService.lua中補齊state.timer.durationObject = api.C_DurationUtil.CreateDuration(duration),使地面效果完美對接雙軌原生綁定倒數通道,消除最後的__EAMCODE_44__與時間對接444__4442__444。spellID或是spellName因保密(設定/加密)而無法實現,或者是在載入客戶端緩存時出現延遲,會導致EAM無法準確比對並寄生吸附官方CooldownViewer(CDM)的影子載體。spellID 和 spellName)在極端戰鬥設定下,或在多國語言系加載時,仍然存在匹配失效的機率。
2.每個冷卻或光環圖示在其渲染器或官方UI上必然對應一個唯一的紋理圖片(FileDataID),這在戰鬥中通常不是秘密,可以作為最且唯一的標識特徵。spellID成功建立鏈接,EAM渲染器即可利用非秘密的spellID靜態獲取到真實的本地化主軸名稱圖標,將其高亮渲染於蟲生中央底部,完美解決了戰鬥中官方CDM圖標因為因為保密限製而無法顯示技能名稱的重大痛點。Services/ShadowHostService.lua 和 UI/Renderer.lua 至 backup/ 目錄。ShadowHostService.lua中新增activeIconHosts表與安全取得主機圖示ID的getIconIDFromHostIcon輔助函數(支援icon.Icon、icon.icon、icon.texture的「214」欄位)以及直接讀取位元組)。ShadowHostService.GetHostIcon補充為(spellID, spellName, iconID)三軌比對。若沒有iconID,會在內部利用C_Spell.GetSpellTexture(spellID)動態取得要的監控警報圖示ID,並在activeIconHosts 中進行比對。GetHostIcon內部如果首輪查表皆未命中,會自動呼叫scanAll()重新整理所有被Hook的官方查看器池映射(防範官方在獲取時尚未設定紋理導致漏配),然後進行第二輪匹配,極限調度率。UI/Renderer.lua中,呼叫GetHostIcon時確定(alertState.spellID or alertState.id, alertState.name, alertStateicon)軌。Services/CooldownService.lua:324: attempts to call a nil value 與 Services/CooldownService.lua:328: attempts to call a nil value 錯誤。refreshAlert 時,拋出 attempt to call a nil value。EventRouter 或系統錯誤機制捕獲,中斷了冷卻警報更新流程。Core/Util.lua 裡面,第 152 行直接呼叫了本地變數 isSecretValue(value),然而在魔獸世界客戶端載入 Util.lua 時,若全域變數 issecretvalue 是 Util.lua 時,若全域變數 issecretvalue 是 __EAMCODE_4(62311212121131111113)。可能是nil。執行到這裡即發送嘗試呼叫nil值!
2.同樣地,若 issecretvalue 及其他保密計算 API 為空,EAM.API中表格的 API 參考亦為 nil,導致如 ShadowHostService.lua 呼叫崩潰。Core/Env.lua, Core/Util.lua, Services/CooldownService.lua 到 backup/ 目錄。Core/Env.lua 中,為 EAM.API 的所有保密檢查方法(issecretvalue, canaccesstable 等。 false end),確保api.issecretvalue永遠不會為nil`。Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退(isSecretValue, canAccessTable 等)補上回退定義,且將 readSafeScalar 內部的直接呼叫 __EAMCODE_4才調用Util.isSecretValue(value)`。CooldownService.lua 中對 cSpell.GetSpellCooldown 的呼叫加上 cSpell.GetSpellCooldown 和 ... 防護,避免 API 不存在時發生 nil 值呼叫。luac -p 個完整案例審查,32 個活躍 TOC 檔案全部通過。SetPoint很容易因為安全鏈污染而造成污染,或造成排版計算負擔。
2.官方的冷卻管理器(CooldownViewer / CDM)是安全框架,在戰鬥中利用定位與Show/Hide的特權,但只支援官方內建的法術。
3.同時享受避免迴避UI的戰鬥特權並Taint,我們需要一種在戰鬥中100%避免讓排版代碼的解法。EventAlertMod.toc, UI/Renderer.lua 至 backup/ 目錄。Services/ShadowHostService.lua,在脫戰狀態下對官方 EssentialCooldownViewer 和 UtilityCooldownViewer 框架設定透明度 (Alpha=0) 與系統降級(BACKGROUND, 05),並使用系統降級(CODPCODE_3__, 05),並使用 1266526222266_66 63_CO_fCO 的官方__3),並使用 __6A_CO_CO 的官方__MCO_CO__M. Acquire / Release,收集spellID到官方圖標實體之對照。UI/Renderer.lua。在 Renderer.render 中,若有官方 Icon 鏡像載體可用,則將 EAM Icon 設為 isParasite = true,以 SetParent(hostIcon) 與 SetAllPointsEAMCODE_0(EAMCODE_6)。在layout中跳過isParasite圖標,去掉戰鬥中EAM的SetPoint`及排版計算。ShadowHostService.lua 中加入對 spellName 的安全提取(支援 icon.spellName, icon.data.name 與 icon.Name:GetText())與二級查找表 activeNameHosts5__。在 GetHostIcon 介面與 Renderer.render 的吸附定位中,實現(spellID, spellName)雙軌二級比對防禦,確保武器ID消失或被秘密加密時依然能穩定命中幽靈載體。UnitPower的傳回值直接進行比較時可能會因遇到受限秘密值/秘密表而崩潰。
3.Core/EventRouter.lua與Core/Scheduler.lua的核心事件/定時任務循環,在單一子模組發生執行時出錯時會波及全域,導致整個調度或事件發送中斷癱瘓。UnicodeEncodeError4/EAMCODE_3__M 系統導致自動失效。Secret Table,如果非安全代碼直接將其與數值大小(如 currentPower > 0)比較,會觸發元方法致命錯誤。UI/Options.lua, Services/ClassPowerService.lua, Core/EventRouter.lua, Core/Scheduler.lua 至 backup/ 目錄。EAM.L(支持五大語系共144個詞條)。在取代工具中明確宣告UTF-8讀寫,並以errors='ignore'保護,避免編碼崩潰。UI/Options.lua的專精過濾下拉選單中引入CLASS_TOKEN_TO_ID映射,優先調用API GetSpecializationInfoForClassID獲取最準確的本地化專精備份名稱,並提供雙軌退防線。detectClassPower 與 updatePower 配置 pcall 隔離與 issecretvalue 防禦,防禦戰鬥中能量數值為秘密表時的大小比較造成的 Lua 崩潰。pcall 容錯,防止單一模組中斷的模組與模組中斷其他模組中斷的執行。AuraService.lua:161: 嘗試索引無法使用密鑰索引的表嚴重崩潰。GroundEffectService.lua:78 解析工具提示描述時,因為 string.match 確定了秘密字串,拋出嘗試對秘密字串值執行字串轉換(被 'EventAlertMod' 污染的執行)致命錯誤。
3.戰鬥中警報框架完全隱形不彈出。GetAuraDataByIndex回傳的spellId或是leftText都會被標記為秘密值。一旦AddOn程式碼直接使用這個spellId作為密鑰去對任何非安全的自訂表進行索引操作(例如 db[spellId] 或 SavedVariables[spellId]),EAMCODE Key __ 引擎會直接爆發並拋出錯誤!tostring)、字符串拼接戰鬥(..)或正則匹配(string.match)。最關鍵:所有的秘密值都不能在自訂參數傳遞給任何Lua時被使用函數!只要確定,函數就會被判定為污染,並在執行涉及秘密的動作時崩潰。Renderer.lua 和 IconPool.lua 中只要遇到 InCombatLockdown() 為 true,則所有 CreateFrame, SetPoint, SetPoint5__ Hide渲染作業全部延後到戰鬥結束後(PLAYER_REGEN_ENABLED)。然而,我們的警報圖示是純顯示框架,不承擔任何安全動作(如點擊、施法、定位等),也沒有繼承任何安全模板。 WoW引擎完全允許在戰鬥中對不安全框架進行定位與顯隱。過度防護反而導致了戰鬥中警報完全消失,失去了AddOn的價值。Services/AuraService.lua, Services/GroundEffectService.lua, UI/Renderer.lua, UI/Options.lua 至 backup/ 目錄。AuraService.lua 和 CooldownService.lua 等服務中,實施嚴格的表查表關聯防護。在對組態表進行索引前,必須呼叫 issecretvalue(key) 確定 key 不是受保護的秘密值,並以 canaccesstable(targetTable) 檢查表安全性。issecretvalue, canaccessvalue, canaccesstable)。issecretvalue(text) 與 canaccessvalue(text) 進行嚴格防護。一旦發現描述被加密或不可讀取,立即安靜降級,並使用原生 C_UnitAuras.GetAuraDuration 獲取黑盒 DurationObject,直接模仿渲染器雙流水線通道,利用CooldownFrame:SetCooldownFromDurationObject 安全進行轉換,徹底消除字符串轉換崩潰。"Button"降級為純"Frame"。徹底取消了所有戰鬥中定位和建立的延遲,限制讓不安全警報圖示可在戰鬥中即時、無縫地彈出和移動,100%戰鬥暢行無阻!bad argument #1 to 'SetValue' (outside of Expected range -3.402823e+38 to 3.402823e+38)及UI/IconPool.lua:102: at call value致命錯誤,進入遊戲即發送ClassPowerService.lua:85: attempts to call a nil value崩潰,導致介面與職業能量服務失效。/eam opt開啟設定頁面時滑桿SetValue錯誤,設定頁面發生中斷,導致後續所有清單重新整理(刷新)、法術增刪除、齒輪按鈕彈出設定視窗及儲存/關閉功能全部失效。IconPool.lua:102: attempts to call a nil value (以及 Renderer.lua:359 報錯),這是因為 timerBinding:Unbind() 在 12.0.7 環境下傳回nil-method呼叫崩潰,渲染器管道被硬性中斷。ClassPowerService.lua:85: attempts to call a nil value,這是因為detectClassPower呼叫了api.UnitClass和api.UnitPower,但在核心Env.lua的EAM.API表中遺漏了對這兩個WoW和API的映射中斷,導致API7__UI/Options.lua 的 createSlider 函數中,OnShow 腳本讀取 SavedVariables 中某些布林值(如 cooldownShadow = true)時,直接將 true/true/__EAMCO self:SetValue(val),而該API 嚴格要求宣告 number 類型。一旦出錯,載入中斷導致整個 UI 物件(如 scrollBox, addEditBox, condFrame 等)均未完成綁定與初始化。C_DurationUtil.CreateDurationTextBinding 回傳的綁定物品實作中沒有 Unbind 方法,直接呼叫 :Unbind() 會拋出 nil 錯誤。Core/Env.lua 中預先註冊的靜態 API 表 EAM.API 漏掉了最常用的 UnitClass 和 UnitPower,這讓職業能量服務執行時直接調用了 nil 函數而崩潰。UI/Options.lua, UI/IconPool.lua, UI/Renderer.lua, Core/Env.lua 至 backup/ 目錄。Options.lua 的 createSlider OnShow 中,加入對 val 的防禦性偵測與別型轉換。若為 boolean 轉換為 maxVal/minVal,若非數字嘗試以 tonumber 解析或後備,並以minVal/maxVal進行安全邊界劃分,確保百分之百確定合法number給number給__8888__88__882。UI/IconPool.lua 與 UI/Renderer.lua,將所有 icon.timerBinding:Unbind() 調用統一包裹於 if icon.timerBinding and type(icon.timerBinding2__3) 問題__. icon.timerBinding:Unbind() end安全條件中,完美解決12.0.7原生綁定無法解綁或方法觸發的運行時崩潰。Core/Env.lua的EAM.API中補充並匯出UnitClass = UnitClass與UnitPower = UnitPower,隨後職業安全監控服務順利與進入無線電庫。luac -p 全案審查無語法錯誤,安全無誤。table.freeze 鎖定也無法完全消除雜湊機制。要達到完全,應使用數值索引陣列(數位索引數組)做匹配模式載體,配合數字進行迴圈迭代,這樣可以消除雜湊搜尋並完全避免運行時 GC。EAM.Util.tableFreeze對整體與子對齊做深度凍結(table.freeze)。 parseTooltipDuration呼叫時自動辨識GetLocale()並降級回退至中文,然後執行數字索引數字循環。Services/GroundEffectService.lua,引入 MULTI_LOCALE_PATTERNS 凍結表,並以極簡的格式 for i = 1, #data.lines 與 for j = 1, #patterns 已完成極速匹配。透過 luac -p 靜態語法檢查。MULTI_LOCALE_PATTERNS 中的正規表示式樣式。if growDirection == "RIGHT" ...)在高階的佈局渲染中會帶來CPU分支預測與雜湊(Hash)Key查找浪費。純Hash結構即使經table.freeze鎖定,其內部仍會進行雜稠計算衝突與衝突比對,無法真正用空間換取時間。Renderer.frames[frameName],將佈局計算管理化,凍結連續數字算術索引的方向偏移對照LAYOUT_OFFSETS(陣列部分)。在排版時直接穿透LAYOUT_OFFSETS[growDirectionIdx],取出流程圖計算完成法SetPoint,消除哈希碰撞與多條件If-Else路徑,最大限度提升Lua VM指令執行效率!COMBAT_LOG_EVENT_UNFILTERED,在法術施放瞬間進行低頻C_TooltipInfo.GetSpellByID工具提示抓取解析,取得因加速、天賦動態影響後的秒數,或使用自訂時間。並以集中式Scheduler.after進行轉向釋放,運行期100%零CPU OnUpdate飢餓,展現獨特的創意。C_Totems.GetTotemInfo 直讀插槽,並支援靠攏排版。luac -p的100%語法無誤靜態檢查,並提供/eam doctor(RuntimeProbe)多框架即時事實目標性診斷功能。AuraService.lua中,於戰鬥中直接讀取文獻機密值的duration和expirationTime進行了數學減法傷害,直接引發了安全異常中斷!CooldownService.lua 中,在戰鬥中直接對被保護物件 durationObj 呼叫了 IsZero() 方法,引發了該方法呼叫沸騰!IconPool.lua 使用 "Button" 類型框架很容易在戰鬥中受到 WoW 引擎對點擊按鈕的防禦攔截。Renderer.lua中遺漏了toggleAnchors的實作,且ensureParent不支援載入SavedVariables版面配置。ItemCooldownService.lua 遺漏了 ITEM 相關 API 取得並保存 state.icon 與 state.name 資料。Data/SpellArray.lua是空的佔位符,且UI缺乏專精下拉過濾器。Util.isSecretValue防護降級;徹底取消對IsZero()的服務層調用,改由渲染器直接造成冷卻不良陰影渲染;將警報圖示框架類型從"Button"161_"Frame"140667_7_F21707___EAMCO6Renderer.toggleAnchors()中實施半透明拖曳框架,支援按住鼠標拖曳並自動將X/Y座標儲存至EAM.db.layout,於ensureParent時優先自動載入!C_Item.GetItemIconByID 和 GetItemNameByID 補齊資料填寫,完美提交物品圖示。UI/Options.lua內建弧形儀表小地圖按鈕,左鍵開啟面板,右鍵開啟系統診斷,拖曳角度自動儲存。Data/SpellArray.lua中填寫13職業各專精/通用常用法術資料;在UI列表頂部新增專精過濾下拉按鈕與單選,點選即可動態篩選,且「預設值」按鈕支援完整一鍵自動載入目前職業全部預設!UNIT_AURA、BAG_UPDATE_COOLDOWN、SPELL_UPDATE_COOLDOWN),且资料库配合正常,但渲染管道完全没有收到任何呼叫,日志内无 Renderer:render 流程图。alertsCount 正確,cooldownStates 及 auraStates 成功寫入。
2.但runtimeStats.renderer.visibleIcons與deferred均恆為0,畫面完全無警報圖示。EventAlertMod.toc 中,Services\AuraService.lua 等服務的載入順序排在 UI\Renderer.lua 的上方。local Renderer = EAM.UI and EAM.UI.Renderer。由於此時 Renderer.lua 尚未執行,EAM.UI.Renderer 為 nil,導致服務內部的局部變數 Renderer 被永久緩存為 nil。if Renderer and Renderer.render then Renderer.render(state) end因為局部變數Renderer是nil而被默默地跳過,使整個渲染管道完全癱瘓!local Renderer 改為未賦值的局部變數。initialize()方法執行時,動態將其賦值:Renderer = EAM.UI and EAM.UI.Renderer。此時.toc的所有檔案均已完整加載,Renderer可以完美取得到正確的引用,成功恢復渲染管道!Services/ItemCooldownService.lua和Debug/PromptExport.lua開頭的Lua註解解寫成-- [[(多了一個空格),導致Lua編譯器報出語法錯誤而令這兩個關鍵模組在WoW啟動時完全載入失敗,破壞了載入鏈。Renderer.lua 和 IconPool.lua 的 inCombat() 戰鬥限制防衛過當。非安全的警報圖示框架不承擔安全點擊、點擊投射,也沒有繼承SecureTemplates,所以它是完全不安全的純顯示框架。 WoW 100% 允許在戰鬥中對不安全框架進行CreateFrame、SetPoint、Show 和 Hide。先前的 AI 將這些操作在戰鬥中推遲到脫戰後(PLAYER_REGEN_ENABLED),直接導致最需要警報的「戰鬥中」圖示完全爆發,根本無法顯示!--[[改回無空格的標準-[[。UI/Renderer.lua與UI/IconPool.lua,徹底清除所有inCombat()戰鬥狀態下的延遲渲染、延遲佈局定位和拒絕獲取。UI/Options.lua中,將設定分類補充至6個紅按鈕(物品冷卻單獨分類按鈕5,特殊能量移至按鈕6),排版間距調整至32px,防止重疊,在且條件編輯彈窗中,如果是技能/物品冷卻,隱藏動態值1~4勾選。CheckLuaSyntax.ps1靜態語法檢查,28個Lua檔案全部100% OK!/eam debug 返回 JSON 日誌診斷。Services/CooldownService.lua、UI/Renderer.lua和Core/Util.lua進行全面性的垃圾恢復(GC)與安全Taint深度審查,並實施二次極限重構。Util.appendBoundaryWarning 理解採用 "code .. ":" .. tostring(field)",若在架構或秘密環境下被持續觸發,會導致執行期高頻的字符串切割 GC 流失。UI/Renderer.lua 在高度光環帶來數值變化時,tostring(alertState.stacks) 會在戰鬥中產生大量的微型字符串 GC 負擔。.. 字符串拼接與 tostring 調用,都是微型 GC 底部(GC 尖峰/stutter)的潛在來源,會導致大流量戰鬥下 FPS 微幅寬度。Core/Util.lua引入局部warningStringCache = {}。所有邊界警戒字符串在第一次生成時被緩存,後續直接O(1)重複使用已分配指針,達成邊界警戒路徑零字符串GC消耗!UI/Renderer.lua 引入 STACK_STRINGS 數組,預先將 1 至 100 的大量遷移次數為靜態字串。大量更新時,直接 O(1) 從方案取用已緩存字串,完全初始化 tostring 的執行期記憶體分配!Core/Util.lua、UI/Renderer.lua與Services/CooldownService.lua,完美封閉了所有高低頻GC漏洞與污染疑慮。SPELL_UPDATE_COOLDOWN、SPELL_UPDATE_CHARGES)所帶來的 GC 負荷、污染污染及視覺殘影。pairs 遍歷設定表會分配迭代器與臨時表;且秘密值(如冷卻時間、充能資訊)在 Lua 層做數學攻擊、format 格式化或與舊時間比較間隙時會直接觸發安全污染或執行期 Lua 錯誤。db.revision來增量更新alertList陣列,熱路徑(SPELL_UPDATE_COOLDOWN)上完全使用數值for i = 1, alertCount do迴圈歷零,達到100%歷零,達到瞬態的極限零點。table.create 預先分配:對 alertList 與 states / boundaryWarnings / timer 等子表預先分配 HashTable 與 Array 膨脹,執行期擴容與重新膨脹散列。DurationObject 黑盒指標安全傳遞給無縫 SetCooldownFromDurationObject 與 12.0.7 無縫倒數文字綁定 C_DurationUtil.CreateDurationTextBinding。state.shown 設為 false,渲染器接手將 Icon 退回池並執行 icon:Hide() 與 Unbind(),消除視窗殘影池。C_DurationUtil.CreateDurationTextBinding 測試範例。DurationTextBinding可用,EAM定時器標籤可避免使用OnUpdate自行倒數,符合低GC與Secret/Protected顯示鏈原則。DurationObject、SecondsFormatter、DurationTextBinding,並綁定到FontString。Docs/17_SUBAGENT_WORKFLOW.md,並將規則加入AGENTS.md。GameTooltip_AddMoneyLine、C_UIFileAsset、profiling API、DurationTextBinding、Aura refactor target 12.1.0、單位身分錯誤改回傳nil/default、debugstack/debuglocals秘密傳播等資訊,但本輪公開網路搜尋未找到可直接引用的相同來源頁面。GameTooltip_AddMoneyLine、DurationTextBinding、Timeline for the Aura Refactor等關鍵字;未取得穩定公開頁面後,以「提供使用者、待覆核形式」寫入Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md。GameTooltip_AddMoneyLine、C_UIFileAsset、DurationTextBinding、debugstack/1EAMCODE_4__ 的實際。Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md 與 Docs/15_DEVELOPMENT_ISSUE_LOG.md。$name__$ts,在巢狀PowerShell字串中被錯誤解析,導致指令報出The term '\$name__$ts\' is not recoize。__ 後綴容易造成插值語意不清;加上外層 powershell -Command 需要額外轉義。$name + '__' + $ts,並逐一輸出產生的備份路徑確認。backup/10_WARCRAFT_WIKI_12X_API_NOTES.md__20260529052816 和 backup/15_DEVELOPMENT_ISSUE_LOG.md__20260529052816。${name}__${ts}類型寫法。UNIT_AURA 完全更新或目標變更時對同一單位重複掃描;選項仍為偏存根,無法提供一般使用者可見的設定入口。SavedVariables 變更 API,容易繞過架構修訂與服務刷新。fullScanUnit,先清單位元光環緩存,再依玩家/target過濾掃描一次並與警報索引分派;未命中的設定警報統一標記為不活動。選項新增spellID/itemID輸入框與四類add/remove按鈕,成功後呼叫服務刷新。auraInstanceID 快取搭配 alertIndex[unit][spellID] 分派狀態;Options 只穿透SavedVariables.add/remove API 寫入狀態,直接修改服務運作時。C_UnitAuras.GetAuraDataByIndex(unit, index, filter) 在 12.0.7 的實際欄位安全性、過濾行為、戰鬥中初次建立選項框架的污染風險,以及 __EAMCO _EA Retail 12.x是否仍可直接使用。rg 與 TOC 檢查時,指令字串由外層 PowerShell 再啟動內層 PowerShell。|被錯誤讀取成表格;TOC檢查中的$missing、$line被外層提前展開,造成解析器錯誤。powershell -Command 中,正規表示式交替與 $ 變數都需要明確處理。$改用反引號轉義。rg -n 'pattern' path;若必須在 powershell -Command 中使用腳本變量,需寫成 `$variable,或改用 .ps1 工具。/eam僅除錯/選項存根,SavedVariables沒有正式添加/remove API;AuraService在UNIT_AURA時仍回退全量掃描,未使用AuraService在UNIT_AURA時仍回退全量掃描,未使用updateInfo有效負載。UNIT_AURA都掃alert/full光環,會增加熱路徑成本。SavedVariables.add/remove 系列 API、/eam add/remove/export/help、AuraService 配置修訂索引、EAM__MCOD. updatedAuraInstanceIDs / removedAuraInstanceIDs處理增量,以及偵錯快照的DB revision/cache/renderer計數器。updateInfo時走delta,無payload或完整更新才回退完整掃描。UNIT_AURA 有效負載 實際欄位、秘密光環 spellID 行為、移除實例快取 命中率與目標快速變化行為。.codex/skills/eam-retail-p0-review/SKILL.md 後,依 skill-creator 流程執行 quick_validate.py。ModuleNotFoundError: No module named 'yaml'驗證。安裝PyYAML後,第二次失敗為Windows預設cp950解碼UTF-8 Markdown失敗。quick_validate.py使用Python預設文字編碼讀取SKILL.md,在繁體中文Windows環境下會遇到cp950解碼問題。PyYAML 6.0.3,然後以 $env:PYTHONUTF8='1' 重新執行驗證。python -m pip install --user PyYAML 安裝依賴,並在 Windows 上執行驗證前設定 PYTHONUTF8=1。 eam-retail-p0-review 已通過 quick_validate.py,輸出 Skill is valid!。skill-creator 指南建立 .codex/skills/eam-retail-p0-review/SKILL.md。spellID 未確認安全前比較、冷卻/Item 冷卻安全讀取分散、調度程式排程器建立任務表、渲染器都佈局,且尚未明確延後戰鬥中的結構性 UI 變更。120007。PLAYER_REGEN_ENABLED。Patch 12.0.7/API_changes。Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md 仍記錄 12.0.7 尚未找到 API 摘要。Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md,將 12.0.7 標記為已存在,並記錄與 EAM 相關的 C_DurationUtil、CPU 用法 API 與 __EAMCODE_61 追蹤事項。AGENTS.md、Docs/02_RETAIL_API_BOUNDARIES.md、Docs/12_CODE_COMMENTARY_GUIDE.md。forceinsecure 或將不安全值傳遞到安全鏈。.md 記錄。AGENTS.md 與 Docs/12_CODE_COMMENTARY_GUIDE.md 加入記錄規則。AGENTS.md 與 Docs/12_CODE_COMMENTARY_GUIDE.md 加入專案獨有 SKILL 規則,並在本文件加入判斷提醒。COMBAT_LOG_EVENT_UNFILTERED (CLEU),導致地面技能冷卻失效;且需要將技能圖示的金色亮框高亮(Overlay Glow)與快捷列按鈕的瞬間亮框發光完全同步。SPELL_CAST_SUCCESS;光環/CD圖示的高亮也缺乏對原生動作欄金色亮框事件的即時註冊,常因手動意外出現延遲或故障;且巧切換造成技能覆蓋時冷卻圖示滯留失效。UNIT_SPELLCAST_SUCCEEDED取得玩家施法;另外需由SPELL_ACTIVATION_OVERLAY_GLOW_SHOW與SPELL_ACTIVATION_OVERLAY_GLOW_HIDE關係取得重建動作條的高亮狀態,以及COOLDOWN_VIEWER_SPELL_OVERRIDE_UPDATED監聽技能覆蓋。GroundEffectService.lua 中,全面移除 COMBAT_LOG_EVENT_UNFILTERED 的註冊,改為監聽 UNIT_SPELLCAST_SUCCEEDED 且篩選 unitTarget == "player"。ClassPowerService.lua 中,註冊 UNIT_POWER_FREQUENT 事件提供無延遲能量回饋。
3.在CooldownService.lua中,註冊COOLDOWN_VIEWER_SPELL_OVERRIDE_UPDATED,當法術ID變更時,立即刷新被覆蓋或原始技能的冷卻狀態,解決覆蓋計時失效的Bug。AlertManager.lua 中註冊 SPELL_ACTIVATION_OVERLAY_GLOW_SHOW/HIDE,維護 glowSpells 表並在 onAlertStateChanged 做模板裝飾(Decorator)屬性同步;修改 UI/Renderer.lua 的 EAM DE_EA__6: 02162__42__42__4 __EA__6 __642__42__42__42__42__4 __EA__3__3__3__m__4 的 __67_6A__EA__3__3__4A__3__3__m 的 67_6A__EA__3__A__3__A__3__A__3__4A__m 的 __EA雙軌顯示金色發光。luac -p的靜態語法安全性修改審查,後續需在魔獸服正式實機檢驗效果觸發與金色亮框同步。IsZero()導致LuaJIT __EAMCODE_終止。/eam debug 顯示的 runtimeStats 記憶體會隨著 Buff/Debuff 刷新持續攀升,物品池恢復功能完全失效,引發 GC 攪拌並與 FPS 結束。durationObj:IsZero(),觸發了 LuaJIT 2.1 Trace Abort,導致降流路徑無法被 JIT負載率過高時造成微卡頓。AuraService.lua 的 AuraStatePool 取得與釋放設計中,漏掉了將 AuraStatePool.release 綁定給 state.releaseFunc 的核心代碼。這導致 AlertManager 在隱藏光環後完全跳過了恢復邏輯。pairs 遍歷輪詢 IsZero(),該 C++ 函數在預設(秘密)下返回是戰鬥限制布林值,為預防崩潰我們使用了 pcall。不過在 JIT 編譯器下,pcall 內呼叫暴雪 C 函數會直接觸發NYI 中止,黑名單化整個 OnUpdate 渲染熱路徑。AuraService.lua、GroundEffectService.lua 與 TotemService.lua 的各自物件池的 acquire 內,統一安全地綁定 state.releaseFunc = Pool.release,並在 release 時使 __EAA__MCOD __EA __MCOD。Renderer.lua 的 OnUpdate IsZero 輪詢與 pcall 宣告。
3.實施重複使用的零令牌分配池timerTokenPool,在Renderer.render啟動計時器時,跨越Scheduler.after註冊單次延遲任務並提交令牌。onDurationTimerExpired 替代代幣的 active 與圖標主動標誌是否一致,從而隱藏準確圖標,保證整個生命週期 100% 零記憶體配置與零輪詢前鋒。AuraService.lua、GroundEffectService.lua、TotemService.lua 與 UI/Renderer.lua 皆 100% 通過 luac -p 的靜態語法安全性檢討。120007;AuraService 仍依賴逐筆 AuraData、UNIT_AURA 與 GetAuraDataByAuraInstanceID,尚無 AuraContainer/AuraButton 實作。另發現 Secret 時間回流算術、ItemCooldown 標量 Secret 檢查錯誤、IconPool 戰鬥中可能建立框架、Scheduler 任務堆積與 StatePool 懸空引用風險。luac -p 與 P0 靜態掃描,並查證 Blizzard 公告與 Warcraft Wiki 12.1.0 API changes 2026-06-20 修訂。AURA121、RQA、DOC 三位專家,將 canonical 名冊調整為 23 位,重建 RACI 並要求每領域唯一 A。本次只完成治理與風險定級,未修改 Lua。setup refresh had errors;Web 搜尋/直接開頁遭服務端 403 Forbidden;修改前取得時間戳時一度因自動授權用量上限被拒絕。apply_patch 因 Codex Windows sandbox refresh 失敗;apply_patch.bat 的 WindowsApps 執行檔在升權程序被拒絕。第一次 Harness 又引用不存在的 Core/StatePool.lua;Windows rg Locale\*.lua glob 未展開;嚴格 AuraButton mock 把允許的 eamNativeRegions 資料欄位誤判為未知 API。rg --files 確認沒有 StatePool 模組;改用 rg -g '*.lua';在 strict mock 只白名單 eamNativeRegions nil 讀取。文件轉換因原腳本可能外傳 Markdown 到 Google 而被安全審查拒絕;安裝 user-site markdown 3.10.2 後,為工具新增 EAM_DOCS_OFFLINE=1 網路前閘門並離線轉換 34 份文件。now + scrapedDuration 偽造路徑;Lua 語法 40/40,aura121 初版 7/7,最終 all 17/17。migration 測試一度因最後斷言回傳 table 而非布林 true 被誤標 fail,改成明確 ~= nil 後通過。失敗報告保留於 TestResults/,不得刪除以掩蓋試誤。HTML 轉換預設採離線模式;外部翻譯必須取得明確授權。%TEMP%\codex-apply-patch-20260726.exe。68914 sorting enum 來自 FrameXML 而非 Generated Documentation;Aura Sound 欄位、實際播放、Forbidden Aspect、candidate filter 與 taint 仍須 _ptr_ 實機驗證。tooltipShowAuraSpellIDs,但該 CVar 不跨 session 保存。apply_patch 再次因 sandbox refresh 失敗,沿用已授權的 Codex apply-patch 臨時執行檔。第一次禁用模式搜尋因 PowerShell 雙引號使正規式失效,改用 rg -F -e;第一次 boundary 為 harness 未載入 Locale 而 4/8,補載入後又因 mock 缺 Enum.PowerType 在案例前中止,補齊正式客戶端必有表後通過。失敗報告保留,不刪除。TooltipMonitorService 只保存脫戰五秒 scalar candidate;Spell/Item 僅讀安全 data.id;Macro 只接受安全 GetAction 來源,其餘降級手動輸入;UnitAura callback 完全不讀 payload。Tooltip callback 不直接開 UI,戰鬥中也不保存 candidate;後續精確 Ctrl+Alt 才開啟 TooltipMonitorMenu。提交前 action 另經安全字串與四種白名單,只有 added/updated 通知刷新,unchanged 不刷新。CVar 不可用時五語系改為手動已知 Aura ID 提示,RuntimeProbe 只輸出匿名計數。open() 取代 Popup,而是建立真 Frame/EditBox/Button,透過 button:Click() 與綁定的 OnClick 提交;載入正式 UI/Options.lua,驗證 AuraContainer/Aura/Cooldown/ItemCooldown/Renderer 五個下游。每個寫入案例使用隔離 DB 且在成功/拋錯兩路保證還原。新增 Secret scalar/action/table-key guard、callback 零 UI、focus/combat replay/type/hidden/TTL/完整 chord/latest、Macro resolved/manual、Aura player/target/CVar fallback,以及 JSON/人類報告 ID 遮蔽。OnClick;TOC 所有 Lua 路徑存在;文件 Tooltip 標題唯一、五語系鍵齊全;boundary 10/10(TestResults/EAM_FlowValidation_boundary_20260728_120708.json),all 24/24(TestResults/EAM_FlowValidation_all_20260728_120708.json)。真 Popup 初次測試因未重新產生已消耗 candidate 而 7/9,失敗報告 TestResults/EAM_FlowValidation_boundary_20260727_042850.json 保留。_ptr_ 12.1 與 _xptr_ 12.0.7 依 Docs/06_TEST_PLAN_RETAIL.md 實測 Tooltip 類型、CVar、Popup、戰鬥拒絕、原始點擊行為與 taint/blocked action/Forbidden 錯誤;離線 pass 不得宣稱實機通過。本文件記錄EventAlertMod正式服重寫開發過程中遇到的瓶頸、限制、錯誤、工具失敗、API不確定性與有效解法。目的在於減少日後重複試錯,並讓未來的人工智慧代理人能夠用最少的上下文/token繼續理解問題。
### yyyy-mm-dd 標題
- 狀態:已解決 / 未解決 / 待實機驗證
- 情境:
- 症狀:
- 原因判斷:
- 已嘗試方法:
- 有效解法:
- 後續注意事項:
ziyuefan/EventAlertMod_Remake 的 main 路徑。EventAlertModAll;ScreenShot fragment 也使用本 README 不存在的 #screenshot-2。github.com/github.io 連結,再核對實際 ##命令列 與 ## 截圖 標題,避免只更換 repo 名稱。main/changelog.txt;CommandLine 與 ScreenShot 分別連到本 repo README 的 #命令列 與 #截圖。https://ziyuefan.github.io/EventAlertMod_Remake/。docs_html/README.md.html 已包含 12.1 Alpha、Native Aura 與 Tooltip 監控說明,但根 readme.html 最後更新於 2026-06-11;標準包會收錄後者。docs_html/README.md.html,打包器卻讀取根 readme.html,兩份生成檔沒有同步契約。batch_convert_docs.py 每次轉換根 README.md 後,將 Pages 產物同步到根 readme.html;封裝指南同步指定該唯一來源。Tools/Build-CurseForgePackage.ps1 時,TOC 一致性閘門回報 Services/ShadowHostService.lua 未列入 TOC,拒絕產生 ZIP。Services/。標準打包器會複製整個服務目錄;若只放寬檢查,死碼仍會進入正式包。-SkipLuaCheck 或修改白名單繞過。另遇到桌面端 sandbox helper setup refresh had errors,內建補丁工具無法啟動;WindowsApps 的 patch 啟動器又被拒絕執行,最後改用本機 npm Codex 套件內相同的 --codex-run-as-apply-patch 入口。git mv 將 ShadowHost 完整封存到 LegacyReference/Services/ShadowHostService.lua;同步把模組契約改成封存參考。正式包既不載入也不收錄該檔,研究歷史仍可追溯。41/41 語法通過;離線 all suite 24/24 通過;敏感資訊掃描通過;產物為 Dist/EventAlertMod_MN_20260728_123720.zip。LegacyReference/,且文件不可再把它列為執行期契約。D:\World of Warcraft 為 WoW 根目錄,並補充 _ptr_ 為至暗之夜 12.1.0、_xptr_ 為至暗之夜 12.0.7;各版本 AddOns 可能以 Windows 連結指向實體專案 D:\EventAlertMod。Interface\AddOns\EventAlertMod 當成一般插件副本進行刪除、覆蓋、解壓縮或鏡像同步,可能破壞 SymbolicLink,甚至讓遞迴工具誤作用到實體專案。LinkType/Target/ReparsePoint。foreach { } | Format-Table 的寫法而在解析期停止;第二次誤假設 PTR 使用 Wow.exe,因實際檔名是 WowT.exe 而停止。兩次都沒有修改檔案。最終一致性檢查又因以 Tools/Test-... 正斜線字串搜尋 Windows 文件中的 .\Tools\Test-... 反斜線命令而產生假陰性;改以檔名本身與語意欄位檢查。第二版又把完整版本字串錯套到只負責流程命令的 SKILL,形成責任範圍假陰性;最終改為按文件責任分層斷言。_retail_ 為 12.0.7.68256、_ptr_ 為 12.1.0.68209、_xptr_ 為 12.0.7.68182;前三者 EventAlertMod 均為指向 D:\EventAlertMod 的 SymbolicLink。另確認 _classic_、_classic_ptr_ 為同目標 SymbolicLink,_classic_era_ 為實體目錄,_classic_era_ptr_ 不存在該插件路徑。 已新增 Tools/Test-LocalWoWEnvironment.ps1,以 patch train 與 Reparse Point/Target 作為實機測試前置斷言並產生 JSON/Markdown 證據。_retail_、_ptr_、_xptr_ 的 AddOns 連結禁止刪除、搬移、覆蓋、解壓縮、robocopy /MIR 或重建。任何連結維護必須另行說明風險並取得明確授權。luac -p、RuntimeProbe 與人工測試清單,無法重播 EventRouter、Scheduler、SavedVariables 與報告匯出流程,也沒有 Mock/實機共用案例或 WTF 回灌格式。FlowTestRunner、FlowTestPanel、Lua 5.1 Offline Harness、PowerShell runner/importer、獨立 SavedVariable 與 eam-flow-validation SKILL。工具過程另遇到桌面端 sandbox helper 無法初始化,需在已授權專案範圍內改用具唯一命中檢查的 PowerShell 精確寫入;第一次替代雙引號時誤用反斜線轉義,造成 Slash.lua 出現 unexpected symbol near '\',經 luac -p 定位後改用 PowerShell 單引號常值修復;此外遇到 skill short description 24 字元不足、JavaScript 編排反引號/PowerShell suite 插值衝突、Windows PowerShell 5.1 對無 BOM UTF-8 的 cp950 誤讀,以及報告工具漏初始化 $utf8。HTML 轉換器另會產生含 CR 的純空白行,初版清理規則未涵蓋 CR,經 git diff --check 定位後改以行尾 lookahead 清除。.ps1 使用 UTF-8 BOM;明確初始化輸出 UTF-8 encoding。離線 all suite 共 7 案例全數通過,JSON、Markdown 與 importer round-trip 成功。Lua syntax OK: 35 files;passed=7, failed=0, skipped=0, pending=0;回灌來源正確保留 offline-mock。/eam test all,確認面板 template、複製按鈕、Scheduler callback、WTF 寫回、taint/Lua error 與 ReloadUI。Mock 通過不得宣稱實機通過。SEC 與 AURA121 分別負責安全終審及 Aura 遷移,但缺少跨版本追蹤 TOC、revision、官方公告、UI source diff 與遷移窗口的唯一問責角色。API_change_summaries 與 12.0.0、12.0.1、12.0.5、12.0.7、12.1.0 頁面 revision;建立 eam-retail-api-change-intelligence SKILL。init_skill.py 首次因 23 字元的 short_description 未達 25 字元而只建立骨架;generate_openai_yaml.py 又先遇到 cmd 引號拆解與 Windows Python cp950 無法解碼 UTF-8;Codex 編排層兩次 Base64 嘗試因缺少 TextEncoder 與 btoa 而在命令送出前停止;apply_patch 亦受 setup refresh had errors 阻斷。APICHG(EAM_API_Change_Intelligence_Expert)並設為第 13 個 RACI 領域唯一 A/R;以至少 25 字元的說明重新產生介面,改用 PowerShell 單引號保留參數,並以本次程序限定的 PYTHONUTF8=1 成功建立 agents/openai.yaml;文件修改使用已授權、目標明確的非互動 PowerShell UTF-8 寫入。APICHG 不取代 SEC 安全終審、AURA121 Aura 遷移或 RQA 客戶端簽收。本次未修改 Lua。Tools/Build-CurseForgePackage.ps1執行流程中,呼叫Scan-SensitiveInfo掃描敏感資訊時推送MethodNotFound: [System.Char]不包含名為'Trim'的方法致命崩潰,導致備用流程中斷。Get-Content 讀取到單行檔案(如 changelog.txt)時,PowerShell 集合傳回值最佳化為單一 [System.String],而不是 [System.String[]] 陣列。
2.此時在 for ($i = 0; $i -lt $lines.Count; $i++) 迴圈中,使用下標 $lines[$i] 會進行 String 自行字符格式處理,導出其中的單個字符(其他類型為 [System.Char])。[System.Char] 沒有 .Trim() 方法,呼叫時會引發 MethodNotFound 異常。Scan-SensitiveInfo 函數中,將 $lines = Get-Content ... 修改為以 @() 強制包裝的 $lines = @(Get-Content ...),確保有檔案有幾行,傳回結果必然是梯度,從而使 $lines[$i] 始終傳回字串。Constants.lua中的BOUNDARY_SECRET_VALUE = "secretValue"與ClassPowerService.lua中除錯日誌內字符串拼接的"Secret"為敏感資訊洩露,強行中斷資源。secret 單字進行了無腦匹配,這會誤配到 EAM 核心 Secrecy(結構/安全)防衛機製本身的常規變數與字符串。Tools/Build-CurseForgePackage.ps1中的$patterns正則,將寬泛的secret替換為精確搜尋client_secret與app_secret等具體金鑰或推理字樣。Media/Images/ 底下所有的貼圖與按鈕背景(如 Seed1.blp、UI-Panel-Backdrop.blp)全部被跳過,統計的 ZIP 壓縮包內缺少這些貼圖。Tools/Build-CurseForgePackage.ps1中的$allowedExtensions白色名單變數中,缺少了魔獸世界中世紀專用的貼圖副檔名.blp。.blp 正式加入白名單副檔名列中(即 $allowedExtensions = @(".lua", ".xml", ".tga", ".blp", ...))。EAM_Addon_Architect (ARCH) 與 EAM_Lua_VM_Expert (LUA) 重點報告(包含了對 JIT Trace Compiler 致命 __EAMCODE_5 以及 Abort 的要因分析releaseFunc 的重大 Bug診斷),擬定最新的JIT優化實施計畫。/eam opt)中拖曳曳引滑桿(Sliders)調整「圖示大小(iconSize)」或「圖示距離(iconSpacing)」時,雖然設定值空間儲存至 SavedVariables 1745 時,大小與 6)尺寸),調整完全無效。config.iconSize = 73,config.iconSpacing = -33,表示使用者確實修改了設定,且設定已寫入。
2.然而,在實體渲染的 runtimeStats.renderer.frameIcons 刺激屬性中,所有 Icon 的 layoutSize 仍然是預設的 40。Core/SavedVariables.lua 的 defaults 表與 UI Slider 的綁定中,使用者設定分別儲存在 EAM.db.config.iconSize 和 EAM.db.config.iconSpacing。
4.然而,在負責渲染調度版的 UI/Renderer.lua 中,ensureParent 函數與 layout 調度版算法均只去讀取了 EAMDE_FCO__7 欄位演算法均只去讀取了 EAMDE_CO__7 欄位。這導致變數呼叫不穩定,使渲染器永遠只能回退讀取預設值。UI/Renderer.lua 至 backup/Renderer.lua__20260607222900。ensureParent 內,將 Renderer.iconSize 和 Renderer.spacing 欄位的賦值改為優先從 EAM.db.config.iconSize 和 EAM.db.config.iconSpacing 讀取,並相容於舊版本 db.layout 與後備預設值。layout 排版函數中,將 local size 和 localpacing 改為優先從 EAM.db.config.iconSize 和 EAM.db.config.iconSpacing 讀取,並相容於 db.layout 預設欄位與 Renderer 本機預設值。
3.靜態luac -p檢定語法100%通過。DurationObject 進行渲染,當我們在 OnUpdate (例如 Renderer.lua 的 onLegacyTimerUpdate) 中調用 durationObj:__EAMCODE_5 工件/ a Secret boolean value (execution tainted by) 'EventAlertMod') 致命錯誤,首先導致 Taint 崩潰並阻塞 UI 的 OnUpdate 執行鏈。DurationObject:IsZero()的傳回值是Secret Boolean,在Lua中直接做if val then條件判斷會直接觸發Metamethod崩潰崩潰。
2.這是因為暴雪的保密保護機制限制了對Secret Boolean做布林值判斷。
3.要安全訪問,我們不能對Secret Boolean進行布爾測試。但是,我們可以透過issecretvalue(val)來先檢驗傳回值是否為Secret。如果是Secret,我們直接跳過對它的布林測試以策安全。如果不是Secret,我們才可以安全地做布林判斷。UI/Renderer.lua 至 backup/Renderer.lua__20260607222500。safeCheckIsZero(durationObj) 防禦性包裹函數:durationObj 不是 nil,有 IsZero 函數,且 durationObj 本身不是 Secret。pcall 傳參方式呼叫:local ok, val = pcall(durationObj.IsZero, durationObj),深圳市在 OnUpdate 熱路徑上產生堆垃圾。val 後,使用 Util.isSecretValue(val) 檢查其是否為 Secret。如果是 Secret,則回傳 false(此處不進行布林測試);若不是 Secret,則可以安全地回傳 val == true。onLegacyTimerUpdate 中對於 activeDurationObjects 的遍歷,改用 safeCheckIsZero(durationObj) 進行條件判斷。C_UnitAuras.GetAuraDuration 所傳回的 DurationObject 雖然被保護(秘密),但原生 UI 本身可以進行綁定渲染。
2.由於 DurationObject 無法在 Lua 中讀取剩餘時間,原有的 EAM 調度器 (Scheduler) 與退彈機制無法獲知此時即將到來,只能完全依賴 UNIT_AURA 光環移除事件。然而戰鬥中事件經常被官方優化、節流甚至部分延遲。DurationObject 與 IsZero() 方法相比,這在 Secret 狀態下是安全、可安全呼叫的謂詞(回傳普通 boolean)。Services/AuraService.lua 和 UI/Renderer.lua 至 backup/ 目錄。AuraService.lua中的readAuraIntoState。當isSecret為true時,優先抓取繪圖說明的持續時間(scrapedDur)。若抓到,即用其手動建立一個非秘密的普通DurationObject,此時它可以走一般的數位繪圖索引。UI/Renderer.lua,實施 activeDurationObjects 管理。對於任何包含 durationObject 的啟動圖示(不管是暫時的還是手動建立的),在統一的 onLegacyTimerUpdate 中每幀都進行 IsZero() 替代。 durationObj:IsZero() 返回 true,立即主動呼叫 Renderer.render(..., shown=false) 隱藏與 IconPool 恢復,主動釋放框架。spellCooldown 框架下喘顯示了 15 個技能圖示(包括冰槍、喚醒、火球等),但這些技能當時均處於非冷卻狀態且無倒數秒數位文字。CooldownService.lua 傳導的 shouldShow 邏輯是:如果為非充能技能,則當 infoSafe 為 false 時預設shouldShow = true(防禦讀取中受保密而限制的異常)。C_Spell.GetSpellCooldown 可能會返回一個有效的有效冷卻屬性的結構,甚至可能為空;或者是因為該技能不在冷卻中而使 cooldownInfo 為 nil。
3.此時,infoSafe因為拿不到安全冷卻事實而保持為false,這導致在判定時錯誤地落入了else shouldShow = true的防禦性分支!
4.結果是:所有被監控且目前沒有在冷卻中的技能均被強制設定為shouldShow = true。它們被顯示到畫面上,但由於完全沒有冷卻時間數據,完全不會有倒數秒數與冷卻螺旋黑幕。Services/CooldownService.lua 到 backup/ 目錄。shouldShow 邏輯:
僅在 cooldownInfo 不為 nil 時(代表該液化確實具有冷卻資料或在冷卻中),且在 infoSafe 為 false 的基礎狀態下,才進行防禦性 `shouldShow = 7_7__ 的判斷;若 EAM 6_6__9 則直接顯示關係。:IsShown() 属性。Debug/PromptExport.lua 到 backup/ 目錄。memoryKB統計,並探索5大服務(靈氣、冷卻、ItemCooldown、GroundEffect、圖騰、ClassPower)的狀態,收集目前活躍的武器ID清單。glowSpells中目前正一個Proc高亮發光的spellID清單。id、isParasite、layoutX、layoutY、layoutSize與魔獸世界中的實體layoutY`、`layoutSize`與魔獸世界中的實體layoutSize5__4CODE_4__。
4.靜態luac -p` 全案語法檢驗,順利通過。/eam debug 複製出的 JSON,檢查是否包含上述新增的陣列與物品。visibleIcons 恆為 0,且 alertFrame.exists 恆為 false,第一判斷為沒有任何圖示顯示。_G["EAM_AlertFrame_" .. fName]),原本的單一全域框架 EAM_RetailAlertFrame 已被廢棄。renderer.orderCount 各也已拆分封裝至框架的剖面佈局狀態 fState.orderCount 中。
3.然而除錯統計工具 Debug/PromptExport.lua 與 Debug/DebugState.lua 在統計 visibleIcons 與 exists 時,依然嘗試讀取舊版的 renderer.orderCount 與 _G["EAM_RetailAlertFrame"]。這導致統計工具總是回傳 0 與false,產生了「圖示完全未顯示」的統計資料假象。事實上,渲染器渲染日誌正常,實體圖示已成功渲染並顯示在畫面上。Debug/PromptExport.lua 和 Debug/DebugState.lua 到 backup/ 目錄。Debug/PromptExport.lua與Debug/DebugState.lua,將visibleIcons改為加7大Alert Frame的orderCount;把layoutDirty改為檢查若有任何一個fState.layoutDirty6。PromptExport.lua 內對 7 大警報框架(如 selfAura、targetAura 等)進行格式化偵測與格式化輸出,只要至少有一個框架存在,即判定 alertFrame.exists 為 true,並精確呈現每個隱座狀態。
3.靜態 luac -p 全案語法安全性驗證,修改之文件 100% 通過語法安全性檢查。visibleIcons數值是否已與實體圖示渲染完全一致(顯示大於0的正確數量),並且聊天視窗不再噴出錯誤。/reload載入外掛程式時,魔獸世界直接推送大紅字錯誤:`EAM Init Error on [AlertManager]: Frame:RegisterEvent(): Attempt to registerknown event __EAMCODE_411,導致__EAUIAlertManager 初始化時,會呼叫 EventRouter.register 註冊多個內部自訂事件(如 EAM_AURA_STATE_CHANGED)。EventRouter.register的實踐是無論任何事件均調用 frame:RegisterEvent(event) 往前暴雪框架註冊。RegisterEvent API 嚴格只能註冊暴雪系統定義的事件,一旦確定未知的自訂事件名稱,會立即引發致命錯誤併中斷執行鏈。Core/EventRouter.lua 到 backup/ 目錄。EventRouter.register(event, handler) 中引入自編輯事件過濾機制:
判斷事件名稱是否以"EAM_"為外接。如果是,屬於內部通訊自訂事件,跳過呼叫內部frame:RegisterEvent(event)。/reload載入後,聊天視窗是否不再噴出任何RegisterEvent錯誤紅字,且EAM警報在各服務自訂事件觸發下能正常渲染。EA_Items、EA_AltItems等)的全新安裝環境下(或WTF資料夾被清除),重寫後的EAM登錄後一個ICON沒有出現。SavedVariables.lua 在初始化時,除了執行 importLegacyTables 嘗試從舊版本全域變數遷移設定之外,沒有將 EAM.Data.SpellArray 中目前職業的預設監控寫入 EAM_DB.alerts 中。
2.當全新載入時,舊版變數不存在,因此alerts清單完全為空。
3.各個監控服務(AuraService、CooldownService等)均使用EAM_DB.alerts進行篩選,若警報為空則直接返回,不引發任何更新事件與進行UI危險,故畫面上一個ICON都沒有出現。Core/SavedVariables.lua 到 backup/ 目錄。Core/SavedVariables.lua 的 SavedVariables.initialize() 中,加入全新載入(即 playerAuras/targetAuras/spellCooldowns/itemCooldowns 四者個數為 0 時)防空機制:
自動偵測目前玩家職業,讀取EAM.Data.SpellArray中對應的通用及各專精預設監控人力,並呼叫SavedVariables.addAlert自動寫入資料庫。/run EAM_DB = nil ReloadUI() 在全新清空 SavedVariables 測試後,是否會自動讀取目前職業(如法師)的預設閘道並顯示對應的圖示,且不再空白。DurationObject指針、或多或少不支援12.0.7原生綁定的降級計時環境下,EAM的獨立框架不知只進行了陰影旋轉,而完全不顯示倒數秒數字文字。另外,若未來Cooldown啟用,會造成短暫的小數字與EAM自訂大文字重疊。Renderer.lua僅實作了useNativeBinding模式下的文字綁定,降級模式下直接將timerText清空,導致一般計時不顯示剩餘秒數。CooldownFrame 預設可以顯示倒數數字,造成與 EAM 本身的 timerText 重疊,不美觀。UI/Renderer.lua 和 UI/IconPool.lua 至 backup/ 目錄。UI/Renderer.lua中實施一個全域共享、基於單一OnUpdate框架的legacyTimer系統,提供registerLegacyTimer和unregisterLegacyTimer。只有在降級圖示啟動時該計時才會啟動。2.4、0.8),大約 3 秒整數,提供了幾乎完美顯示的高級體驗。IconPool.release 與 Renderer.render 過渡時,確實調用 unregisterLegacyTimer 清除定時,防止殘影或洩密。UI/IconPool.lua的createIcon中,對新烘焙的冷卻框架呼叫cooldown:SetHideCountdownNumbers(true),徹底消除文字重疊。DurationObject降級情況下大字倒數是否流暢,且3秒以下的小數點顯示是否精準無卡頓。Services/ShadowHostService.lua, UI/Renderer.lua 和 Core/SavedVariables.lua 至 backup/ 目錄。ShadowHostService.lua中註解底部的initShadowHost()調用,不進行任何Hook,也不隱形官方UI;同時簡化ShadowHostService.GetHostIcon產生直接回傳nil。UI/Renderer.lua的Renderer.render中,將useCDM寫死為false,徹底斷開與CDM掛勾的判斷路徑。所有圖示100%走EAM將手機排版路線(dx, dy方向定位)。Core/SavedVariables.lua 中,將預設值的 enableCDM 設為 false。
4.靜態 luac -p 全案語法檢查編譯通過。DurationObject 的 API 以進行高可用性、0-GC 和 Secret-Safe 的時間渲染。DurationObject 扭轉指標傳遞(Pointer-Pass)輕鬆地重構 Widget,同時需要完整的磁碟點所有可用的 API 以便模組化重構。C_Spell.GetSpellCooldownDuration、C_Spell.GetSpellChargeDuration、C_SpellBook.GetSpellBookItemCooldownDuration、C_SpellBook.GetSpellBookItemChargeDuration、C_ActionBar.GetActionCooldownDuration、C_ActionBar.GetActionChargeDuration。C_UnitAuras.GetAuraDuration、C_UnitAuras.GetAuraBaseDuration 與 C_UnitAuras.GetRefreshExtendedDuration。C_DurationUtil.CreateDuration、C_DurationUtil.CreateManualClock。self:GetTimerDuration()。IsZero()、GetRemainingDuration()、GetClockTime()、EvaluateTotalDuration()、FormatRemainingDuration(formatter)、FormatElapsedDuration(formatter)、FormatTotalDuration(formatter)等成員函數,並完成其操作Secrecy安全性屬性(如 IsZero 為 NeverSecret 可安全做為較檢測)。Services/GroundEffectService.lua中補齊state.timer.durationObject = api.C_DurationUtil.CreateDuration(duration),使地面效果完美對接雙軌原生綁定倒數通道,消除最後的__EAMCODE_44__與時間對接444__4442__444。spellID或是spellName因保密(設定/加密)而無法實現,或者是在載入客戶端緩存時出現延遲,會導致EAM無法準確比對並寄生吸附官方CooldownViewer(CDM)的影子載體。spellID 和 spellName)在極端戰鬥設定下,或在多國語言系加載時,仍然存在匹配失效的機率。
2.每個冷卻或光環圖示在其渲染器或官方UI上必然對應一個唯一的紋理圖片(FileDataID),這在戰鬥中通常不是秘密,可以作為最且唯一的標識特徵。spellID成功建立鏈接,EAM渲染器即可利用非秘密的spellID靜態獲取到真實的本地化主軸名稱圖標,將其高亮渲染於蟲生中央底部,完美解決了戰鬥中官方CDM圖標因為因為保密限製而無法顯示技能名稱的重大痛點。Services/ShadowHostService.lua 和 UI/Renderer.lua 至 backup/ 目錄。ShadowHostService.lua中新增activeIconHosts表與安全取得主機圖示ID的getIconIDFromHostIcon輔助函數(支援icon.Icon、icon.icon、icon.texture的「214」欄位)以及直接讀取位元組)。ShadowHostService.GetHostIcon補充為(spellID, spellName, iconID)三軌比對。若沒有iconID,會在內部利用C_Spell.GetSpellTexture(spellID)動態取得要的監控警報圖示ID,並在activeIconHosts 中進行比對。GetHostIcon內部如果首輪查表皆未命中,會自動呼叫scanAll()重新整理所有被Hook的官方查看器池映射(防範官方在獲取時尚未設定紋理導致漏配),然後進行第二輪匹配,極限調度率。UI/Renderer.lua中,呼叫GetHostIcon時確定(alertState.spellID or alertState.id, alertState.name, alertStateicon)軌。Services/CooldownService.lua:324: attempts to call a nil value 與 Services/CooldownService.lua:328: attempts to call a nil value 錯誤。refreshAlert 時,拋出 attempt to call a nil value。EventRouter 或系統錯誤機制捕獲,中斷了冷卻警報更新流程。Core/Util.lua 裡面,第 152 行直接呼叫了本地變數 isSecretValue(value),然而在魔獸世界客戶端載入 Util.lua 時,若全域變數 issecretvalue 是 Util.lua 時,若全域變數 issecretvalue 是 __EAMCODE_4(62311212121131111113)。可能是nil。執行到這裡即發送嘗試呼叫nil值!
2.同樣地,若 issecretvalue 及其他保密計算 API 為空,EAM.API中表格的 API 參考亦為 nil,導致如 ShadowHostService.lua 呼叫崩潰。Core/Env.lua, Core/Util.lua, Services/CooldownService.lua 到 backup/ 目錄。Core/Env.lua 中,為 EAM.API 的所有保密檢查方法(issecretvalue, canaccesstable 等。 false end),確保api.issecretvalue永遠不會為nil`。Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退:在 Core/Util.lua 中,為所有的本地變數回退(isSecretValue, canAccessTable 等)補上回退定義,且將 readSafeScalar 內部的直接呼叫 __EAMCODE_4才調用Util.isSecretValue(value)`。CooldownService.lua 中對 cSpell.GetSpellCooldown 的呼叫加上 cSpell.GetSpellCooldown 和 ... 防護,避免 API 不存在時發生 nil 值呼叫。luac -p 個完整案例審查,32 個活躍 TOC 檔案全部通過。SetPoint很容易因為安全鏈污染而造成污染,或造成排版計算負擔。
2.官方的冷卻管理器(CooldownViewer / CDM)是安全框架,在戰鬥中利用定位與Show/Hide的特權,但只支援官方內建的法術。
3.同時享受避免迴避UI的戰鬥特權並Taint,我們需要一種在戰鬥中100%避免讓排版代碼的解法。EventAlertMod.toc, UI/Renderer.lua 至 backup/ 目錄。Services/ShadowHostService.lua,在脫戰狀態下對官方 EssentialCooldownViewer 和 UtilityCooldownViewer 框架設定透明度 (Alpha=0) 與系統降級(BACKGROUND, 05),並使用系統降級(CODPCODE_3__, 05),並使用 1266526222266_66 63_CO_fCO 的官方__3),並使用 __6A_CO_CO 的官方__MCO_CO__M. Acquire / Release,收集spellID到官方圖標實體之對照。UI/Renderer.lua。在 Renderer.render 中,若有官方 Icon 鏡像載體可用,則將 EAM Icon 設為 isParasite = true,以 SetParent(hostIcon) 與 SetAllPointsEAMCODE_0(EAMCODE_6)。在layout中跳過isParasite圖標,去掉戰鬥中EAM的SetPoint`及排版計算。ShadowHostService.lua 中加入對 spellName 的安全提取(支援 icon.spellName, icon.data.name 與 icon.Name:GetText())與二級查找表 activeNameHosts5__。在 GetHostIcon 介面與 Renderer.render 的吸附定位中,實現(spellID, spellName)雙軌二級比對防禦,確保武器ID消失或被秘密加密時依然能穩定命中幽靈載體。UnitPower的傳回值直接進行比較時可能會因遇到受限秘密值/秘密表而崩潰。
3.Core/EventRouter.lua與Core/Scheduler.lua的核心事件/定時任務循環,在單一子模組發生執行時出錯時會波及全域,導致整個調度或事件發送中斷癱瘓。UnicodeEncodeError4/EAMCODE_3__M 系統導致自動失效。Secret Table,如果非安全代碼直接將其與數值大小(如 currentPower > 0)比較,會觸發元方法致命錯誤。UI/Options.lua, Services/ClassPowerService.lua, Core/EventRouter.lua, Core/Scheduler.lua 至 backup/ 目錄。EAM.L(支持五大語系共144個詞條)。在取代工具中明確宣告UTF-8讀寫,並以errors='ignore'保護,避免編碼崩潰。UI/Options.lua的專精過濾下拉選單中引入CLASS_TOKEN_TO_ID映射,優先調用API GetSpecializationInfoForClassID獲取最準確的本地化專精備份名稱,並提供雙軌退防線。detectClassPower 與 updatePower 配置 pcall 隔離與 issecretvalue 防禦,防禦戰鬥中能量數值為秘密表時的大小比較造成的 Lua 崩潰。pcall 容錯,防止單一模組中斷的模組與模組中斷其他模組中斷的執行。AuraService.lua:161: 嘗試索引無法使用密鑰索引的表嚴重崩潰。GroundEffectService.lua:78 解析工具提示描述時,因為 string.match 確定了秘密字串,拋出嘗試對秘密字串值執行字串轉換(被 'EventAlertMod' 污染的執行)致命錯誤。
3.戰鬥中警報框架完全隱形不彈出。GetAuraDataByIndex回傳的spellId或是leftText都會被標記為秘密值。一旦AddOn程式碼直接使用這個spellId作為密鑰去對任何非安全的自訂表進行索引操作(例如 db[spellId] 或 SavedVariables[spellId]),EAMCODE Key __ 引擎會直接爆發並拋出錯誤!tostring)、字符串拼接戰鬥(..)或正則匹配(string.match)。最關鍵:所有的秘密值都不能在自訂參數傳遞給任何Lua時被使用函數!只要確定,函數就會被判定為污染,並在執行涉及秘密的動作時崩潰。Renderer.lua 和 IconPool.lua 中只要遇到 InCombatLockdown() 為 true,則所有 CreateFrame, SetPoint, SetPoint5__ Hide渲染作業全部延後到戰鬥結束後(PLAYER_REGEN_ENABLED)。然而,我們的警報圖示是純顯示框架,不承擔任何安全動作(如點擊、施法、定位等),也沒有繼承任何安全模板。 WoW引擎完全允許在戰鬥中對不安全框架進行定位與顯隱。過度防護反而導致了戰鬥中警報完全消失,失去了AddOn的價值。Services/AuraService.lua, Services/GroundEffectService.lua, UI/Renderer.lua, UI/Options.lua 至 backup/ 目錄。AuraService.lua 和 CooldownService.lua 等服務中,實施嚴格的表查表關聯防護。在對組態表進行索引前,必須呼叫 issecretvalue(key) 確定 key 不是受保護的秘密值,並以 canaccesstable(targetTable) 檢查表安全性。issecretvalue, canaccessvalue, canaccesstable)。issecretvalue(text) 與 canaccessvalue(text) 進行嚴格防護。一旦發現描述被加密或不可讀取,立即安靜降級,並使用原生 C_UnitAuras.GetAuraDuration 獲取黑盒 DurationObject,直接模仿渲染器雙流水線通道,利用CooldownFrame:SetCooldownFromDurationObject 安全進行轉換,徹底消除字符串轉換崩潰。"Button"降級為純"Frame"。徹底取消了所有戰鬥中定位和建立的延遲,限制讓不安全警報圖示可在戰鬥中即時、無縫地彈出和移動,100%戰鬥暢行無阻!bad argument #1 to 'SetValue' (outside of Expected range -3.402823e+38 to 3.402823e+38)及UI/IconPool.lua:102: at call value致命錯誤,進入遊戲即發送ClassPowerService.lua:85: attempts to call a nil value崩潰,導致介面與職業能量服務失效。/eam opt開啟設定頁面時滑桿SetValue錯誤,設定頁面發生中斷,導致後續所有清單重新整理(刷新)、法術增刪除、齒輪按鈕彈出設定視窗及儲存/關閉功能全部失效。IconPool.lua:102: attempts to call a nil value (以及 Renderer.lua:359 報錯),這是因為 timerBinding:Unbind() 在 12.0.7 環境下傳回nil-method呼叫崩潰,渲染器管道被硬性中斷。ClassPowerService.lua:85: attempts to call a nil value,這是因為detectClassPower呼叫了api.UnitClass和api.UnitPower,但在核心Env.lua的EAM.API表中遺漏了對這兩個WoW和API的映射中斷,導致API7__UI/Options.lua 的 createSlider 函數中,OnShow 腳本讀取 SavedVariables 中某些布林值(如 cooldownShadow = true)時,直接將 true/true/__EAMCO self:SetValue(val),而該API 嚴格要求宣告 number 類型。一旦出錯,載入中斷導致整個 UI 物件(如 scrollBox, addEditBox, condFrame 等)均未完成綁定與初始化。C_DurationUtil.CreateDurationTextBinding 回傳的綁定物品實作中沒有 Unbind 方法,直接呼叫 :Unbind() 會拋出 nil 錯誤。Core/Env.lua 中預先註冊的靜態 API 表 EAM.API 漏掉了最常用的 UnitClass 和 UnitPower,這讓職業能量服務執行時直接調用了 nil 函數而崩潰。UI/Options.lua, UI/IconPool.lua, UI/Renderer.lua, Core/Env.lua 至 backup/ 目錄。Options.lua 的 createSlider OnShow 中,加入對 val 的防禦性偵測與別型轉換。若為 boolean 轉換為 maxVal/minVal,若非數字嘗試以 tonumber 解析或後備,並以minVal/maxVal進行安全邊界劃分,確保百分之百確定合法number給number給__8888__88__882。UI/IconPool.lua 與 UI/Renderer.lua,將所有 icon.timerBinding:Unbind() 調用統一包裹於 if icon.timerBinding and type(icon.timerBinding2__3) 問題__. icon.timerBinding:Unbind() end安全條件中,完美解決12.0.7原生綁定無法解綁或方法觸發的運行時崩潰。Core/Env.lua的EAM.API中補充並匯出UnitClass = UnitClass與UnitPower = UnitPower,隨後職業安全監控服務順利與進入無線電庫。luac -p 全案審查無語法錯誤,安全無誤。table.freeze 鎖定也無法完全消除雜湊機制。要達到完全,應使用數值索引陣列(數位索引數組)做匹配模式載體,配合數字進行迴圈迭代,這樣可以消除雜湊搜尋並完全避免運行時 GC。EAM.Util.tableFreeze對整體與子對齊做深度凍結(table.freeze)。 parseTooltipDuration呼叫時自動辨識GetLocale()並降級回退至中文,然後執行數字索引數字循環。Services/GroundEffectService.lua,引入 MULTI_LOCALE_PATTERNS 凍結表,並以極簡的格式 for i = 1, #data.lines 與 for j = 1, #patterns 已完成極速匹配。透過 luac -p 靜態語法檢查。MULTI_LOCALE_PATTERNS 中的正規表示式樣式。if growDirection == "RIGHT" ...)在高階的佈局渲染中會帶來CPU分支預測與雜湊(Hash)Key查找浪費。純Hash結構即使經table.freeze鎖定,其內部仍會進行雜稠計算衝突與衝突比對,無法真正用空間換取時間。Renderer.frames[frameName],將佈局計算管理化,凍結連續數字算術索引的方向偏移對照LAYOUT_OFFSETS(陣列部分)。在排版時直接穿透LAYOUT_OFFSETS[growDirectionIdx],取出流程圖計算完成法SetPoint,消除哈希碰撞與多條件If-Else路徑,最大限度提升Lua VM指令執行效率!COMBAT_LOG_EVENT_UNFILTERED,在法術施放瞬間進行低頻C_TooltipInfo.GetSpellByID工具提示抓取解析,取得因加速、天賦動態影響後的秒數,或使用自訂時間。並以集中式Scheduler.after進行轉向釋放,運行期100%零CPU OnUpdate飢餓,展現獨特的創意。C_Totems.GetTotemInfo 直讀插槽,並支援靠攏排版。luac -p的100%語法無誤靜態檢查,並提供/eam doctor(RuntimeProbe)多框架即時事實目標性診斷功能。AuraService.lua中,於戰鬥中直接讀取文獻機密值的duration和expirationTime進行了數學減法傷害,直接引發了安全異常中斷!CooldownService.lua 中,在戰鬥中直接對被保護物件 durationObj 呼叫了 IsZero() 方法,引發了該方法呼叫沸騰!IconPool.lua 使用 "Button" 類型框架很容易在戰鬥中受到 WoW 引擎對點擊按鈕的防禦攔截。Renderer.lua中遺漏了toggleAnchors的實作,且ensureParent不支援載入SavedVariables版面配置。ItemCooldownService.lua 遺漏了 ITEM 相關 API 取得並保存 state.icon 與 state.name 資料。Data/SpellArray.lua是空的佔位符,且UI缺乏專精下拉過濾器。Util.isSecretValue防護降級;徹底取消對IsZero()的服務層調用,改由渲染器直接造成冷卻不良陰影渲染;將警報圖示框架類型從"Button"161_"Frame"140667_7_F21707___EAMCO6Renderer.toggleAnchors()中實施半透明拖曳框架,支援按住鼠標拖曳並自動將X/Y座標儲存至EAM.db.layout,於ensureParent時優先自動載入!C_Item.GetItemIconByID 和 GetItemNameByID 補齊資料填寫,完美提交物品圖示。UI/Options.lua內建弧形儀表小地圖按鈕,左鍵開啟面板,右鍵開啟系統診斷,拖曳角度自動儲存。Data/SpellArray.lua中填寫13職業各專精/通用常用法術資料;在UI列表頂部新增專精過濾下拉按鈕與單選,點選即可動態篩選,且「預設值」按鈕支援完整一鍵自動載入目前職業全部預設!UNIT_AURA、BAG_UPDATE_COOLDOWN、SPELL_UPDATE_COOLDOWN),且资料库配合正常,但渲染管道完全没有收到任何呼叫,日志内无 Renderer:render 流程图。alertsCount 正確,cooldownStates 及 auraStates 成功寫入。
2.但runtimeStats.renderer.visibleIcons與deferred均恆為0,畫面完全無警報圖示。EventAlertMod.toc 中,Services\AuraService.lua 等服務的載入順序排在 UI\Renderer.lua 的上方。local Renderer = EAM.UI and EAM.UI.Renderer。由於此時 Renderer.lua 尚未執行,EAM.UI.Renderer 為 nil,導致服務內部的局部變數 Renderer 被永久緩存為 nil。if Renderer and Renderer.render then Renderer.render(state) end因為局部變數Renderer是nil而被默默地跳過,使整個渲染管道完全癱瘓!local Renderer 改為未賦值的局部變數。initialize()方法執行時,動態將其賦值:Renderer = EAM.UI and EAM.UI.Renderer。此時.toc的所有檔案均已完整加載,Renderer可以完美取得到正確的引用,成功恢復渲染管道!Services/ItemCooldownService.lua和Debug/PromptExport.lua開頭的Lua註解解寫成-- [[(多了一個空格),導致Lua編譯器報出語法錯誤而令這兩個關鍵模組在WoW啟動時完全載入失敗,破壞了載入鏈。Renderer.lua 和 IconPool.lua 的 inCombat() 戰鬥限制防衛過當。非安全的警報圖示框架不承擔安全點擊、點擊投射,也沒有繼承SecureTemplates,所以它是完全不安全的純顯示框架。 WoW 100% 允許在戰鬥中對不安全框架進行CreateFrame、SetPoint、Show 和 Hide。先前的 AI 將這些操作在戰鬥中推遲到脫戰後(PLAYER_REGEN_ENABLED),直接導致最需要警報的「戰鬥中」圖示完全爆發,根本無法顯示!--[[改回無空格的標準-[[。UI/Renderer.lua與UI/IconPool.lua,徹底清除所有inCombat()戰鬥狀態下的延遲渲染、延遲佈局定位和拒絕獲取。UI/Options.lua中,將設定分類補充至6個紅按鈕(物品冷卻單獨分類按鈕5,特殊能量移至按鈕6),排版間距調整至32px,防止重疊,在且條件編輯彈窗中,如果是技能/物品冷卻,隱藏動態值1~4勾選。CheckLuaSyntax.ps1靜態語法檢查,28個Lua檔案全部100% OK!/eam debug 返回 JSON 日誌診斷。Services/CooldownService.lua、UI/Renderer.lua和Core/Util.lua進行全面性的垃圾恢復(GC)與安全Taint深度審查,並實施二次極限重構。Util.appendBoundaryWarning 理解採用 "code .. ":" .. tostring(field)",若在架構或秘密環境下被持續觸發,會導致執行期高頻的字符串切割 GC 流失。UI/Renderer.lua 在高度光環帶來數值變化時,tostring(alertState.stacks) 會在戰鬥中產生大量的微型字符串 GC 負擔。.. 字符串拼接與 tostring 調用,都是微型 GC 底部(GC 尖峰/stutter)的潛在來源,會導致大流量戰鬥下 FPS 微幅寬度。Core/Util.lua引入局部warningStringCache = {}。所有邊界警戒字符串在第一次生成時被緩存,後續直接O(1)重複使用已分配指針,達成邊界警戒路徑零字符串GC消耗!UI/Renderer.lua 引入 STACK_STRINGS 數組,預先將 1 至 100 的大量遷移次數為靜態字串。大量更新時,直接 O(1) 從方案取用已緩存字串,完全初始化 tostring 的執行期記憶體分配!Core/Util.lua、UI/Renderer.lua與Services/CooldownService.lua,完美封閉了所有高低頻GC漏洞與污染疑慮。SPELL_UPDATE_COOLDOWN、SPELL_UPDATE_CHARGES)所帶來的 GC 負荷、污染污染及視覺殘影。pairs 遍歷設定表會分配迭代器與臨時表;且秘密值(如冷卻時間、充能資訊)在 Lua 層做數學攻擊、format 格式化或與舊時間比較間隙時會直接觸發安全污染或執行期 Lua 錯誤。db.revision來增量更新alertList陣列,熱路徑(SPELL_UPDATE_COOLDOWN)上完全使用數值for i = 1, alertCount do迴圈歷零,達到100%歷零,達到瞬態的極限零點。table.create 預先分配:對 alertList 與 states / boundaryWarnings / timer 等子表預先分配 HashTable 與 Array 膨脹,執行期擴容與重新膨脹散列。DurationObject 黑盒指標安全傳遞給無縫 SetCooldownFromDurationObject 與 12.0.7 無縫倒數文字綁定 C_DurationUtil.CreateDurationTextBinding。state.shown 設為 false,渲染器接手將 Icon 退回池並執行 icon:Hide() 與 Unbind(),消除視窗殘影池。C_DurationUtil.CreateDurationTextBinding 測試範例。DurationTextBinding可用,EAM定時器標籤可避免使用OnUpdate自行倒數,符合低GC與Secret/Protected顯示鏈原則。DurationObject、SecondsFormatter、DurationTextBinding,並綁定到FontString。Docs/17_SUBAGENT_WORKFLOW.md,並將規則加入AGENTS.md。GameTooltip_AddMoneyLine、C_UIFileAsset、profiling API、DurationTextBinding、Aura refactor target 12.1.0、單位身分錯誤改回傳nil/default、debugstack/debuglocals秘密傳播等資訊,但本輪公開網路搜尋未找到可直接引用的相同來源頁面。GameTooltip_AddMoneyLine、DurationTextBinding、Timeline for the Aura Refactor等關鍵字;未取得穩定公開頁面後,以「提供使用者、待覆核形式」寫入Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md。GameTooltip_AddMoneyLine、C_UIFileAsset、DurationTextBinding、debugstack/1EAMCODE_4__ 的實際。Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md 與 Docs/15_DEVELOPMENT_ISSUE_LOG.md。$name__$ts,在巢狀PowerShell字串中被錯誤解析,導致指令報出The term '\$name__$ts\' is not recoize。__ 後綴容易造成插值語意不清;加上外層 powershell -Command 需要額外轉義。$name + '__' + $ts,並逐一輸出產生的備份路徑確認。backup/10_WARCRAFT_WIKI_12X_API_NOTES.md__20260529052816 和 backup/15_DEVELOPMENT_ISSUE_LOG.md__20260529052816。${name}__${ts}類型寫法。UNIT_AURA 完全更新或目標變更時對同一單位重複掃描;選項仍為偏存根,無法提供一般使用者可見的設定入口。SavedVariables 變更 API,容易繞過架構修訂與服務刷新。fullScanUnit,先清單位元光環緩存,再依玩家/target過濾掃描一次並與警報索引分派;未命中的設定警報統一標記為不活動。選項新增spellID/itemID輸入框與四類add/remove按鈕,成功後呼叫服務刷新。auraInstanceID 快取搭配 alertIndex[unit][spellID] 分派狀態;Options 只穿透SavedVariables.add/remove API 寫入狀態,直接修改服務運作時。C_UnitAuras.GetAuraDataByIndex(unit, index, filter) 在 12.0.7 的實際欄位安全性、過濾行為、戰鬥中初次建立選項框架的污染風險,以及 __EAMCO _EA Retail 12.x是否仍可直接使用。rg 與 TOC 檢查時,指令字串由外層 PowerShell 再啟動內層 PowerShell。|被錯誤讀取成表格;TOC檢查中的$missing、$line被外層提前展開,造成解析器錯誤。powershell -Command 中,正規表示式交替與 $ 變數都需要明確處理。$改用反引號轉義。rg -n 'pattern' path;若必須在 powershell -Command 中使用腳本變量,需寫成 `$variable,或改用 .ps1 工具。/eam僅除錯/選項存根,SavedVariables沒有正式添加/remove API;AuraService在UNIT_AURA時仍回退全量掃描,未使用AuraService在UNIT_AURA時仍回退全量掃描,未使用updateInfo有效負載。UNIT_AURA都掃alert/full光環,會增加熱路徑成本。SavedVariables.add/remove 系列 API、/eam add/remove/export/help、AuraService 配置修訂索引、EAM__MCOD. updatedAuraInstanceIDs / removedAuraInstanceIDs處理增量,以及偵錯快照的DB revision/cache/renderer計數器。updateInfo時走delta,無payload或完整更新才回退完整掃描。UNIT_AURA 有效負載 實際欄位、秘密光環 spellID 行為、移除實例快取 命中率與目標快速變化行為。.codex/skills/eam-retail-p0-review/SKILL.md 後,依 skill-creator 流程執行 quick_validate.py。ModuleNotFoundError: No module named 'yaml'驗證。安裝PyYAML後,第二次失敗為Windows預設cp950解碼UTF-8 Markdown失敗。quick_validate.py使用Python預設文字編碼讀取SKILL.md,在繁體中文Windows環境下會遇到cp950解碼問題。PyYAML 6.0.3,然後以 $env:PYTHONUTF8='1' 重新執行驗證。python -m pip install --user PyYAML 安裝依賴,並在 Windows 上執行驗證前設定 PYTHONUTF8=1。 eam-retail-p0-review 已通過 quick_validate.py,輸出 Skill is valid!。skill-creator 指南建立 .codex/skills/eam-retail-p0-review/SKILL.md。spellID 未確認安全前比較、冷卻/Item 冷卻安全讀取分散、調度程式排程器建立任務表、渲染器都佈局,且尚未明確延後戰鬥中的結構性 UI 變更。120007。PLAYER_REGEN_ENABLED。Patch 12.0.7/API_changes。Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md 仍記錄 12.0.7 尚未找到 API 摘要。Docs/10_WARCRAFT_WIKI_12X_API_NOTES.md,將 12.0.7 標記為已存在,並記錄與 EAM 相關的 C_DurationUtil、CPU 用法 API 與 __EAMCODE_61 追蹤事項。AGENTS.md、Docs/02_RETAIL_API_BOUNDARIES.md、Docs/12_CODE_COMMENTARY_GUIDE.md。forceinsecure 或將不安全值傳遞到安全鏈。.md 記錄。AGENTS.md 與 Docs/12_CODE_COMMENTARY_GUIDE.md 加入記錄規則。AGENTS.md 與 Docs/12_CODE_COMMENTARY_GUIDE.md 加入專案獨有 SKILL 規則,並在本文件加入判斷提醒。COMBAT_LOG_EVENT_UNFILTERED (CLEU),導致地面技能冷卻失效;且需要將技能圖示的金色亮框高亮(Overlay Glow)與快捷列按鈕的瞬間亮框發光完全同步。SPELL_CAST_SUCCESS;光環/CD圖示的高亮也缺乏對原生動作欄金色亮框事件的即時註冊,常因手動意外出現延遲或故障;且巧切換造成技能覆蓋時冷卻圖示滯留失效。UNIT_SPELLCAST_SUCCEEDED取得玩家施法;另外需由SPELL_ACTIVATION_OVERLAY_GLOW_SHOW與SPELL_ACTIVATION_OVERLAY_GLOW_HIDE關係取得重建動作條的高亮狀態,以及COOLDOWN_VIEWER_SPELL_OVERRIDE_UPDATED監聽技能覆蓋。GroundEffectService.lua 中,全面移除 COMBAT_LOG_EVENT_UNFILTERED 的註冊,改為監聽 UNIT_SPELLCAST_SUCCEEDED 且篩選 unitTarget == "player"。ClassPowerService.lua 中,註冊 UNIT_POWER_FREQUENT 事件提供無延遲能量回饋。
3.在CooldownService.lua中,註冊COOLDOWN_VIEWER_SPELL_OVERRIDE_UPDATED,當法術ID變更時,立即刷新被覆蓋或原始技能的冷卻狀態,解決覆蓋計時失效的Bug。AlertManager.lua 中註冊 SPELL_ACTIVATION_OVERLAY_GLOW_SHOW/HIDE,維護 glowSpells 表並在 onAlertStateChanged 做模板裝飾(Decorator)屬性同步;修改 UI/Renderer.lua 的 EAM DE_EA__6: 02162__42__42__4 __EA__6 __642__42__42__42__42__4 __EA__3__3__3__m__4 的 __67_6A__EA__3__3__4A__3__3__m 的 67_6A__EA__3__A__3__A__3__A__3__4A__m 的 __EA雙軌顯示金色發光。luac -p的靜態語法安全性修改審查,後續需在魔獸服正式實機檢驗效果觸發與金色亮框同步。IsZero()導致LuaJIT __EAMCODE_終止。/eam debug 顯示的 runtimeStats 記憶體會隨著 Buff/Debuff 刷新持續攀升,物品池恢復功能完全失效,引發 GC 攪拌並與 FPS 結束。durationObj:IsZero(),觸發了 LuaJIT 2.1 Trace Abort,導致降流路徑無法被 JIT負載率過高時造成微卡頓。AuraService.lua 的 AuraStatePool 取得與釋放設計中,漏掉了將 AuraStatePool.release 綁定給 state.releaseFunc 的核心代碼。這導致 AlertManager 在隱藏光環後完全跳過了恢復邏輯。pairs 遍歷輪詢 IsZero(),該 C++ 函數在預設(秘密)下返回是戰鬥限制布林值,為預防崩潰我們使用了 pcall。不過在 JIT 編譯器下,pcall 內呼叫暴雪 C 函數會直接觸發NYI 中止,黑名單化整個 OnUpdate 渲染熱路徑。AuraService.lua、GroundEffectService.lua 與 TotemService.lua 的各自物件池的 acquire 內,統一安全地綁定 state.releaseFunc = Pool.release,並在 release 時使 __EAA__MCOD __EA __MCOD。Renderer.lua 的 OnUpdate IsZero 輪詢與 pcall 宣告。
3.實施重複使用的零令牌分配池timerTokenPool,在Renderer.render啟動計時器時,跨越Scheduler.after註冊單次延遲任務並提交令牌。onDurationTimerExpired 替代代幣的 active 與圖標主動標誌是否一致,從而隱藏準確圖標,保證整個生命週期 100% 零記憶體配置與零輪詢前鋒。AuraService.lua、GroundEffectService.lua、TotemService.lua 與 UI/Renderer.lua 皆 100% 通過 luac -p 的靜態語法安全性檢討。120007;AuraService 仍依賴逐筆 AuraData、UNIT_AURA 與 GetAuraDataByAuraInstanceID,尚無 AuraContainer/AuraButton 實作。另發現 Secret 時間回流算術、ItemCooldown 標量 Secret 檢查錯誤、IconPool 戰鬥中可能建立框架、Scheduler 任務堆積與 StatePool 懸空引用風險。luac -p 與 P0 靜態掃描,並查證 Blizzard 公告與 Warcraft Wiki 12.1.0 API changes 2026-06-20 修訂。AURA121、RQA、DOC 三位專家,將 canonical 名冊調整為 23 位,重建 RACI 並要求每領域唯一 A。本次只完成治理與風險定級,未修改 Lua。setup refresh had errors;Web 搜尋/直接開頁遭服務端 403 Forbidden;修改前取得時間戳時一度因自動授權用量上限被拒絕。apply_patch 因 Codex Windows sandbox refresh 失敗;apply_patch.bat 的 WindowsApps 執行檔在升權程序被拒絕。第一次 Harness 又引用不存在的 Core/StatePool.lua;Windows rg Locale\*.lua glob 未展開;嚴格 AuraButton mock 把允許的 eamNativeRegions 資料欄位誤判為未知 API。rg --files 確認沒有 StatePool 模組;改用 rg -g '*.lua';在 strict mock 只白名單 eamNativeRegions nil 讀取。文件轉換因原腳本可能外傳 Markdown 到 Google 而被安全審查拒絕;安裝 user-site markdown 3.10.2 後,為工具新增 EAM_DOCS_OFFLINE=1 網路前閘門並離線轉換 34 份文件。now + scrapedDuration 偽造路徑;Lua 語法 40/40,aura121 初版 7/7,最終 all 17/17。migration 測試一度因最後斷言回傳 table 而非布林 true 被誤標 fail,改成明確 ~= nil 後通過。失敗報告保留於 TestResults/,不得刪除以掩蓋試誤。HTML 轉換預設採離線模式;外部翻譯必須取得明確授權。%TEMP%\codex-apply-patch-20260726.exe。68914 sorting enum 來自 FrameXML 而非 Generated Documentation;Aura Sound 欄位、實際播放、Forbidden Aspect、candidate filter 與 taint 仍須 _ptr_ 實機驗證。tooltipShowAuraSpellIDs,但該 CVar 不跨 session 保存。apply_patch 再次因 sandbox refresh 失敗,沿用已授權的 Codex apply-patch 臨時執行檔。第一次禁用模式搜尋因 PowerShell 雙引號使正規式失效,改用 rg -F -e;第一次 boundary 為 harness 未載入 Locale 而 4/8,補載入後又因 mock 缺 Enum.PowerType 在案例前中止,補齊正式客戶端必有表後通過。失敗報告保留,不刪除。TooltipMonitorService 只保存脫戰五秒 scalar candidate;Spell/Item 僅讀安全 data.id;Macro 只接受安全 GetAction 來源,其餘降級手動輸入;UnitAura callback 完全不讀 payload。Tooltip callback 不直接開 UI,戰鬥中也不保存 candidate;後續精確 Ctrl+Alt 才開啟 TooltipMonitorMenu。提交前 action 另經安全字串與四種白名單,只有 added/updated 通知刷新,unchanged 不刷新。CVar 不可用時五語系改為手動已知 Aura ID 提示,RuntimeProbe 只輸出匿名計數。open() 取代 Popup,而是建立真 Frame/EditBox/Button,透過 button:Click() 與綁定的 OnClick 提交;載入正式 UI/Options.lua,驗證 AuraContainer/Aura/Cooldown/ItemCooldown/Renderer 五個下游。每個寫入案例使用隔離 DB 且在成功/拋錯兩路保證還原。新增 Secret scalar/action/table-key guard、callback 零 UI、focus/combat replay/type/hidden/TTL/完整 chord/latest、Macro resolved/manual、Aura player/target/CVar fallback,以及 JSON/人類報告 ID 遮蔽。OnClick;TOC 所有 Lua 路徑存在;文件 Tooltip 標題唯一、五語系鍵齊全;boundary 10/10(TestResults/EAM_FlowValidation_boundary_20260728_120708.json),all 24/24(TestResults/EAM_FlowValidation_all_20260728_120708.json)。真 Popup 初次測試因未重新產生已消耗 candidate 而 7/9,失敗報告 TestResults/EAM_FlowValidation_boundary_20260727_042850.json 保留。_ptr_ 12.1 與 _xptr_ 12.0.7 依 Docs/06_TEST_PLAN_RETAIL.md 實測 Tooltip 類型、CVar、Popup、戰鬥拒絕、原始點擊行為與 taint/blocked action/Forbidden 錯誤;離線 pass 不得宣稱實機通過。