Package scripting
scripts/ 下的 NPC/任務/傳送門/反應爐/活動 JavaScript。
本 package 是「Java 伺服器」與「約 2,700 支第一方遊戲內容腳本」之間的橋接層。所有腳本引擎
皆由單一接縫 ScriptEngines 建立:它把 GraalJS 配置成與 Nashorn 對齊(nashorn-compat、
allowAllAccess,加上兩條 load-bearing 的「JS 數字 → Java String/Boolean」隱式
強制映射),並提供 event 引擎所需的序列化進入代理。8→25 升級的 Track B(Nashorn → GraalJS)遷移
完成後,正式環境已 Nashorn-free。
各類腳本由對應的 ScriptManager 載入並驅動,皆繼承共用基底 AbstractScriptManager
(負責解析路徑、取得引擎、eval 檔案並回傳 Invocable、per-MapleClient 快取):
NPC 對話由 NPCScriptManager → NPCConversationManager(於 JS 中即全域 cm);
傳送門由 PortalScriptManager → PortalScript/PortalPlayerInteraction;
反應爐由 ReactorScriptManager → ReactorActionManager;
活動/組隊任務/王怪則由 EventScriptManager → EventManager → EventInstanceManager。
AbstractPlayerInteraction 是所有腳本類型共用的腳本 API 基底,封裝對角色與地圖等子系統的操作。
腳本以名稱參照 src/ 的類別(封包 builder、cm/pi API 等),故跨 package
的移動或改名可能在執行期使腳本拋 PolyglotException 而被進入點靜默吞掉;MapleClient
持有 per-client 的引擎快取,因此編輯腳本後需以重載指令清除快取方能生效。
-
ClassDescription所有腳本類型共用的玩家互動 API 基底類別。單一事件(PQ/副本/Boss 挑戰)執行中的實例管理器,負責維護參與角色、怪物、地圖與計時器的生命週期。事件腳本的頻道級管理器,負責載入、排程並驅動
scripts/event/<名稱>.js的執行。Track B(Nashorn → GraalJS)— C7 rollout⑤:event 類別黃金參考 differ(最高風險、最後一棒)。錄製式EventInstanceManagerstub(腳本參數eim)。Track B — C0 SPIKE 事件執行緒序列化 gate(R8/R9/R10/R13)。host 探針:統計同時在引擎內的執行緒數(maxInFlight 揭露任何並發)。Track B(Nashorn → GraalJS)— C0 SPIKE 黃金參考 differ / 接縫驗證。Track B(Nashorn → GraalJS)— C8 收尾:map/ 與 special/ 兩類別的黃金參考 differ。錄製式msstub —— 忠實鏡射 map/special 實際打到的「陣列型 / 多載 / Point」host 簽章 (AbstractPlayerInteraction.lockUI ×3、NPCConversationManager.getEventEffect/forcedAction/sendOthersTalk ×2/sendStyle/getSearchData),使多載解析/marshalling/數值強制的差異只會來自引擎而非 stub 缺方法。Phase-2 Track-A smoke test for the standalone Nashorn bridge (org.openjdk.nashorn:nashorn-core:15.7), the drop-in replacement for the built-in jdk.scripting.nashorn module that disappears on JDK 17+.SAM interface used by idiom (e) via Invocable.getInterface.單一 NPC 對話階段的狀態與 API 介面,於腳本中以全域cm暴露。Track B(Nashorn → GraalJS)— C5 rollout③:npc 類別黃金參考 differ。受信任第一方腳本以HostAccess.ALL直呼本物件的 public 方法 —— 與線上cm(NPCConversationManager)同樣的 host-interop 路徑。NPC 對話腳本的生命週期管理器,採單例(instance)。回歸測試:EventInstanceManager.playerDisconnected的「回傳值型別強制」(R14 類別)。傳送門腳本的玩家互動 API,將AbstractPlayerInteraction綁定至特定MaplePortal。Track B(Nashorn → GraalJS)— C3 rollout①:portal 類別黃金參考 differ。受信任第一方腳本以HostAccess.ALL直呼本物件的 public 方法 —— 與線上pi(PortalPlayerInteraction)同樣的 host-interop 路徑。傳送門腳本的 Java 接口,由 GraalJS 引擎從scripts/portal/<名稱>.js解析並實作。傳送門腳本的全域單例管理器,負責載入、快取並執行scripts/portal/<名稱>.js。Track B(Nashorn → GraalJS)— C6 rollout④:quest 類別黃金參考 differ。受信任第一方腳本以HostAccess.ALL直呼本物件的 public 方法 —— 與線上qm(NPCConversationManager,extends AbstractPlayerInteraction)同樣的 host-interop 路徑。反應爐腳本的玩家互動 API,將AbstractPlayerInteraction綁定至特定MapleReactor。Track B(Nashorn → GraalJS)— C4 rollout②:reactor 類別黃金參考 differ。受信任第一方腳本以HostAccess.ALL直呼本物件的 public 方法 —— 與線上rm(ReactorActionManager)同樣的 host-interop 路徑。反應爐腳本的全域單例管理器,負責執行scripts/reactor/<ID>.js並快取掉寶清單。集中式腳本引擎工廠 —— Track B(Nashorn → GraalJS)遷移的「引擎接縫」。