模式完整指南(附四步實(shí)操))
【免費(fèi)下載鏈接】sona基于Pengu loader的英雄聯(lián)盟客戶端增強(qiáng)插件LOL助手sona助手LOL插件A LOL plugin base on Pengu loader; sona plugin;項(xiàng)目地址https://gitcode.com/gh_mirrors/sona4/sona點(diǎn)擊查看免費(fèi)下載Sona 是一款基于 Pengu Loader 的英雄聯(lián)盟客戶端增強(qiáng)插件LOL 助手內(nèi)置自動(dòng)接受對(duì)局、秒搶英雄、牛馬檢測(cè)器等幾十個(gè)可開關(guān)的功能。本文將用「隱藏賽事直播彈窗」這個(gè)真實(shí)功能作為范例帶你完整走一遍 Sona 的功能注冊(cè)模式——從定義配置項(xiàng)、編寫功能模塊、注冊(cè)開關(guān)到接入設(shè)置面板四步即可為自己的插件新增一個(gè)功能模塊。Sona 的面板集成戰(zhàn)績(jī)查詢、秒搶英雄、隊(duì)友分析等豐富功能所有功能都可以通過一個(gè)開關(guān)即開即關(guān)功能注冊(cè)模式Sona 插件的架構(gòu)精髓先建立整體認(rèn)知。Sona 的每個(gè)功能都遵循同一套生命周期store 配置項(xiàng)定義 默認(rèn)值 ↓ 功能模塊文件updateXxx(enabled) 開關(guān)函數(shù) ↓ features.ts 注冊(cè)中心初始化 監(jiān)聽變化 ↓ 設(shè)置面板 UI開關(guān)控件核心思想可以用一句話概括每個(gè)功能就是一個(gè)獨(dú)立模塊文件對(duì)外只暴露一個(gè)開關(guān)函數(shù)注冊(cè)中心負(fù)責(zé)在啟動(dòng)時(shí)按當(dāng)前配置調(diào)用它、并在配置變化時(shí)再次調(diào)用它。好處非常直接開關(guān)注入、關(guān)斷注入——功能未啟用時(shí)完全不占資源配置自動(dòng)持久化——開關(guān)狀態(tài)隨賬號(hào)保存重啟客戶端自動(dòng)恢復(fù)互不干擾——模塊間只通過store和injector兩個(gè)單例通信刪掉任何單個(gè)模塊都不影響其他功能。支撐這套模式的三大基礎(chǔ)設(shè)施基礎(chǔ)設(shè)施文件作用store配置中心src/lib/store.ts類型安全的配置讀寫 持久化 變化監(jiān)聽injector注入管理器src/lib/InjectorManager.ts全局 MutationObserver 守護(hù)DOM 被客戶端刷新后自動(dòng)補(bǔ)回自愈features.ts注冊(cè)中心src/lib/features.ts統(tǒng)一初始化所有功能的開關(guān)與監(jiān)聽第一步在 store 中定義配置項(xiàng)所有配置項(xiàng)集中定義在 src/lib/store.ts 的SonaConfig接口和DEFAULT_CONFIG默認(rèn)值表中基于 Pengu Loader 的 DataStore API 實(shí)現(xiàn)持久化。以hideEsportsPopup關(guān)閉賽事直播彈窗為例只需要兩處// SonaConfig 接口中定義類型 /** 關(guān)閉右下角賽事直播彈窗 */ hideEsportsPopup: boolean // DEFAULT_CONFIG 中給出默認(rèn)值 hideEsportsPopup: truestore提供的三個(gè)核心方法貫穿整個(gè)功能生命周期見 store 使用注釋const value store.get(hideEsportsPopup) // 讀取 store.set(hideEsportsPopup, true) // 寫入自動(dòng)持久化 store.onChange(hideEsportsPopup, (value) { /* ... */ }) // 監(jiān)聽變化這樣定義后你在功能模塊里調(diào)用的每一個(gè)store.set都會(huì)自動(dòng)落盤用戶下次啟動(dòng)客戶端時(shí)狀態(tài)自動(dòng)恢復(fù)完全不用關(guān)心存儲(chǔ)細(xì)節(jié)。第二步編寫功能模塊文件功能模塊統(tǒng)一放在 src/lib/features/ 目錄一個(gè)功能一個(gè)文件用 kebab-case 命名如auto-accept.ts、bench-no-cooldown.ts。我們以最精簡(jiǎn)的 hide-esports-popup.ts 為模板。一個(gè)合格的功能模塊包含兩部分注入任務(wù)開關(guān)函數(shù)。import { logger } from /index import { injector } from /lib/InjectorManager /** 注入任務(wù)返回 true 表示注入成功/已存在false 表示還沒找到位置 */ function tryRemoveEsportsPopup(): boolean { const popup document.querySelector(iframe#tv-official-pop) if (popup) { popup.remove() logger.info([HideEsportsPopup] 已移除右下角賽事彈窗) } return true } let registered false /** 功能開關(guān)由 features.ts 在初始化與配置變化時(shí)調(diào)用 */ export function updateHideEsportsPopup(enabled: boolean) { if (enabled !registered) { registered true injector.register(tryRemoveEsportsPopup) } else if (!enabled registered) { registered false injector.unregister(tryRemoveEsportsPopup) } }這里有三個(gè)關(guān)鍵設(shè)計(jì)約定tryInjectXxx必須是冪等函數(shù)——它會(huì)被全局 MutationObserver 在每幀 DOM 變化時(shí)反復(fù)調(diào)用所以用已存在就提前返回 true的方式防重復(fù)注入。被客戶端刷掉的 DOM 會(huì)在下一幀自動(dòng)補(bǔ)回這就是 Sona 的DOM 自愈機(jī)制實(shí)現(xiàn)見 InjectorManager.start()開關(guān)函數(shù)只管理生命周期——開啟時(shí)injector.register(task)關(guān)閉時(shí)injector.unregister(task)并用registered標(biāo)志防止重復(fù)注冊(cè)需要 LCU 數(shù)據(jù)時(shí)走單例——若功能要調(diào)接口或監(jiān)聽游戲階段變化用 src/lib/lcu.ts 的lcu單例REST WebSocket 雙通道例如監(jiān)聽階段變化lcu.observe(LcuEventUri.GAMEFLOW_PHASE_CHANGE, cb)參考 features.ts 中的階段監(jiān)聽寫法。第三步在注冊(cè)中心登記功能src/lib/features.ts 是全插件的總調(diào)度臺(tái)其initFeatures()由插件入口load()調(diào)用一次見 src/index.tsx 的 load 生命周期。initFeatures()內(nèi)部對(duì)每個(gè)功能都是同一對(duì)兩行代碼——先按當(dāng)前配置執(zhí)行一次再掛上變化監(jiān)聽updateHideEsportsPopup(store.get(hideEsportsPopup)) // 啟動(dòng)時(shí)按持久化值開/關(guān) store.onChange(hideEsportsPopup, updateHideEsportsPopup) // 之后開關(guān)變化時(shí)自動(dòng)響應(yīng)可參考 initFeatures 完整注冊(cè)列表。你的新功能只需要在這里追加同樣的兩行就完成了注冊(cè)——以后用戶在面板上撥動(dòng)開關(guān)store.set觸發(fā)onChangeupdateXxx被自動(dòng)調(diào)用注入隨之掛載或卸載全程無需手動(dòng)干預(yù)。 小技巧如果功能依賴其他配置例如rankQueue、rankTier影響段位偽裝效果可以對(duì)它們?cè)賿煲粋€(gè)store.onChange在變化時(shí)重新應(yīng)用當(dāng)前功能參考 段位偽裝的多鍵監(jiān)聽。第四步接入設(shè)置面板 UI最后讓用戶能摸到開關(guān)。Sona 的 React 面板由 src/components/ 下的頁面組成功能開關(guān)通常放在 ToolsPage.tsx 的工具頁。接入一個(gè)開關(guān)需要三處以賽事直播彈窗開關(guān)為例見 ToolsPage 中的 SettingCard 用法讀取初始值 掛監(jiān)聽保持 UI 與 store 同步const [hideEsportsPopup, setHideEsportsPopup] useState(store.get(hideEsportsPopup)) // 組件卸載時(shí)統(tǒng)一 store.onChange(hideEsportsPopup, setHideEsportsPopup)添加 SettingCard SonaSwitch 控件SettingCard title{t(tools.hideEsportsPopup.title)} description{t(tools.hideEsportsPopup.description)} SonaSwitch checked{hideEsportsPopup} onChange{(v) { setHideEsportsPopup(v); store.set(hideEsportsPopup, v) }} / /SettingCard補(bǔ)充多語言詞條——在 src/i18n/locales.ts 中為tools.xxx.title與tools.xxx.description添加中英文條目保證面板支持簡(jiǎn)體中文/英文/跟隨客戶端三種語言。功能生效后客戶端實(shí)際呈現(xiàn)的效果類似下圖圖中為組隊(duì)界面增強(qiáng)功能展示戰(zhàn)績(jī)分析類模塊的注入效果四步清單快速回顧步驟文件做什么① 定義配置src/lib/store.tsSonaConfig加類型 DEFAULT_CONFIG加默認(rèn)值② 功能模塊src/lib/features/ 新建文件寫冪等的tryInjectXxx 導(dǎo)出updateXxx(enabled)③ 注冊(cè)開關(guān)src/lib/features.tsinitFeatures()中追加 get onChange 兩行④ 面板開關(guān)ToolsPage.tsx locales.tsSettingCard/SonaSwitch 控件 中英文詞條完成以上四步你就拿到了一個(gè)隨配置自動(dòng)啟停、被刷掉能自愈、重啟后狀態(tài)自動(dòng)恢復(fù)的完整功能模塊——這正是 Sona 能穩(wěn)定承載幾十個(gè)增強(qiáng)功能的底層原因。結(jié)語Sona 的功能注冊(cè)模式本質(zhì)上是一種配置驅(qū)動(dòng)的生命周期管理store管狀態(tài)與持久化injector管 DOM 自愈features.ts管開關(guān)調(diào)度UI 只管展示。理解并遵循這套模式無論你想給 Sona 這類英雄聯(lián)盟增強(qiáng)插件添加隱藏某個(gè)入口這樣的小功能還是隊(duì)友戰(zhàn)績(jī)分析這樣的大功能套路都是這同樣的四步。動(dòng)手試試吧 贊分享【免費(fèi)下載鏈接】sona基于Pengu loader的英雄聯(lián)盟客戶端增強(qiáng)插件LOL助手sona助手LOL插件A LOL plugin base on Pengu loader; sona plugin;項(xiàng)目地址https://gitcode.com/gh_mirrors/sona4/sona點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Typora插件完整教程終極功能增強(qiáng)指南Typora插件完整教程終極功能增強(qiáng)指南 Typora作為廣受歡迎的Markdown編輯器其簡(jiǎn)潔的界面和實(shí)時(shí)預(yù)覽功能深受技術(shù)文檔編寫者和內(nèi)容創(chuàng)作者的喜愛。通開發(fā)工具插件系統(tǒng)戴森球計(jì)劃終極藍(lán)圖庫3000精選工廠設(shè)計(jì)讓你的太空帝國(guó)快速成型戴森球計(jì)劃終極藍(lán)圖庫3000精選工廠設(shè)計(jì)讓你的太空帝國(guó)快速成型 還在為戴森球計(jì)劃中復(fù)雜的工廠布局而煩惱嗎面對(duì)空蕩蕩的星球和錯(cuò)綜復(fù)雜的生產(chǎn)鏈?zhǔn)遣皇歉械綗o從數(shù)據(jù)集Solar2D多平臺(tái)發(fā)布指南從Android到iOS的完整流程Solar2D多平臺(tái)發(fā)布指南從Android到iOS的完整流程 Solar2D原Corona SDK是一款功能強(qiáng)大的跨平臺(tái)游戲引擎讓開發(fā)者能夠輕松構(gòu)建同游戲開發(fā)跨平臺(tái)圖形學(xué)上一篇Swagger UI 擴(kuò)展新 OAS 版本支持完整指南從規(guī)范分析到插件實(shí)現(xiàn)的 17 步實(shí)戰(zhàn)下一篇終極指南如何選擇LLM模型部署方案 - 本地運(yùn)行vs云端服務(wù)完全對(duì)比創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考