Class EventScriptManager


public class EventScriptManager extends AbstractScriptManager
  • Constructor Details

  • Method Details

    • getNewInstanceMapId

      public static final int getNewInstanceMapId()
    • discoverEventScripts

      public static String[] discoverEventScripts()
      掃描 scripts/event/ 目錄,回傳所有事件腳本的基底名稱(去掉 .js 副檔名)。

      自 2026-06-04 起,要載入哪些活動/PQ 腳本改由本目錄掃描決定,不再讀 settings.ininet.sf.odinms.channel.events(該鍵已移除)。目錄即「開關」: 要停用某活動,移除或更名其 .js,或將它移進子資料夾(掃描不遞迴,僅取目錄直屬的 *.js)即可。

      掃描結果以不分大小寫排序回傳以求穩定;解析失敗或語法錯誤的腳本(如既有的 BossQuest.js)由 EventScriptManager(ChannelServer, String[]) 載入時優雅略過 (getInvocable 回傳 null → 不加入),不會中斷其餘腳本載入。

      Returns:
      事件腳本基底名稱陣列(已排序);找不到 scripts/event 目錄時回傳空陣列
    • logLoadSummary

      public static void logLoadSummary()
      彙整所有頻道的活動腳本載入結果並輸出精簡日誌。

      開服(ChannelServer.startChannel_Main())與 !reloadevents!reloadall 都會「每個頻道各建一個 EventScriptManager」,各頻道讀的是同一份 scripts/event/ 目錄、結果通常完全一致。本方法須在所有頻道都建立完成後呼叫:

      • 各頻道結果一致 → 只印一行摘要(與舊版逐頻道輸出的格式相同,但不再重複 channel.count 次)。
      • 有頻道載入結果與多數頻道不同(代表該頻道載入異常)→ 該頻道另外以警告單獨印出,並列出失敗檔名。
      以「出現次數最多的簽章」為基準(而非第一個完成的頻道),避免少數異常頻道恰好先完成時把正常頻道誤判為異常。
    • getEventManager

      public final EventManager getEventManager(String event)
    • reloadEvent

      public final boolean reloadEvent(String requested)
      只重新載入單一活動腳本(scripts/event/<名稱>.js),不影響其他已載入的活動。

      對應 GM 指令 !reloadevent <副本名稱>;相對於 ChannelServer.reloadEvents() (重建整個 EventScriptManager)只動目標一支,正在進行中的其他活動/PQ 實例不受波及。

      名稱以 discoverEventScripts() 的掃描結果做不分大小寫比對,採用磁碟上的正規檔名大小寫 (故 !reloadevent pirate 也能命中 Pirate.js);找不到對應檔即回傳 false。 event 引擎不快取(getInvocable 每次讀磁碟),故重載必拿到最新檔內容。流程刻意採「先建後換」: 先讀檔、new EventManagerinit 完成,再以 put 換掉舊項、最後 cancel 舊項, 使併發的 getEventManager(String) 永遠看得到舊或新其一、不會出現短暫缺漏。

      Parameters:
      requested - GM 輸入的副本名稱(大小寫不拘;對應 scripts/event/ 下的檔名)
      Returns:
      true 表已重載成功;false 表找不到該腳本或其解析/載入失敗(語法錯)
    • init

      public final void init()
    • cancel

      public final void cancel()