Class AbstractScriptManager

java.lang.Object
scripting.AbstractScriptManager
Direct Known Subclasses:
EventScriptManager, NPCScriptManager, ReactorScriptManager

public abstract class AbstractScriptManager extends Object
  • Constructor Details

    • AbstractScriptManager

      public AbstractScriptManager()
  • Method Details

    • getInvocable

      protected Invocable getInvocable(String path, MapleClient c)
      解析並載入 scripts/<path> 腳本,回傳可供呼叫其函式的 Invocable

      等同於 getInvocable(String, MapleClient, boolean) 並將 npc 設為 false(非 NPC 腳本,不參與 npcs 全域快取)。

      Parameters:
      path - 相對於 scripts/ 的腳本路徑(例如 "quest/1000.js"
      c - 觸發此腳本的連線(可為 null;用於取出/寫回 per-client 引擎快取)
      Returns:
      已 eval 完成的腳本 Invocable;若腳本檔不存在或 eval 失敗則為 null
    • getInvocable

      protected Invocable getInvocable(String path, MapleClient c, boolean npc)
      解析並載入 scripts/<path> 腳本,回傳可供呼叫其函式的 Invocable

      解析流程:先嘗試從連線的 per-client 引擎快取取出(MapleClient.getScriptEngine(String)); 若無,則檢查腳本檔是否存在,再向引擎接縫 ScriptEngines.fresh(String) 索取一個全新的 GraalJS 引擎(C8 收尾後一律 GraalJS、正式環境 Nashorn-free),以偵測到的編碼 (StringUtil.codeString(String))讀入並 eval 整個檔案,最後將引擎寫回連線快取。

      快取語意:引擎以 MapleClient 為單位快取,因此在執行期間編輯 .js 檔 在快取清除(重載指令或重新連線)前不會生效。當 npctrue 時,引擎另會登記進 靜態 npcs 對應表(注意此 HashMap 非同步化)。

      失敗模式與副作用:腳本內含的 ScriptExceptionIOException 會被攔截、寫入 AbstractScriptManager.txt 並回傳 null(即「靜默失能」—— 呼叫端通常會吞掉而不向玩家報錯)。當 c.getPlayer().getDebugMessage() 為真時,會於各階段 對玩家送出 "getInvocable - PartN" 除錯訊息(封包送出)。對已存在 NPC 引擎的重入會向玩家送出 「請打 @ea 解除異常狀態」提示。

      Parameters:
      path - 相對於 scripts/ 的腳本路徑(例如 "npc/9010000.js"
      c - 觸發此腳本的連線(可為 null;為 null 時略過快取與除錯訊息)
      npc - 是否為 NPC 腳本:為 true 時參與靜態 npcs 快取與重入提示
      Returns:
      已 eval 完成的腳本 Invocable;若腳本檔不存在或 eval 失敗則為 null
    • cleanNpc

      public static void cleanNpc(int id)
      將指定 NPC 的快取引擎自靜態 npcs 對應表移除。

      路徑由 id 組成 "scripts/npc/<id>.js";若該項不存在則為無作用。注意此處 僅清除全域 npcs 快取,並不影響各 MapleClient 內的 per-client 引擎快取。

      Parameters:
      id - 要清除快取的 NPC 編號
    • cleanNpcs

      public static void cleanNpcs()
      清空整個靜態 npcs NPC 引擎快取。

      僅清除全域 npcs 對應表;各 MapleClient 的 per-client 引擎快取不受影響。