自己測試私服,直接改exe的IP就夠了。但如果要開放給其他玩家,就需要一個「登入器」,負責三件事:自動比對玩家的檔案版本、設定好連線後直接啟動遊戲、以及防止玩家用改過的 WZ 檔案繞過遊戲內容(例如商城道具、地圖邊界)。

三種方案比較

方案難度WZ驗證方式適合情境
Simple Launcher⭐⭐客戶端hash比對中小型伺服器,快速上手
MapleLauncher(Fraysa)⭐⭐⭐⭐伺服器端封包驗證正式伺服器,安全性要求高
MaplePatcher⭐⭐⭐CRC32全檔案掃描需要完整自動補丁功能

方案一:Simple Launcher(hash 比對,最快上手)

原理很單純:登入器從你的網站讀取官方 hash 清單,跟玩家本機的 WZ / exe 比對,有差異就自動下載更新,沒有差異就直接啟動遊戲。

設定流程

  1. Simple Launcher 附帶的 CalculaHash 工具,把你的客戶端資料夾拖進去,產生 hash 清單檔案
  2. 把 hash 清單上傳到你的網站(例如 https://你的網址/launcher/hash.txt
  3. 在登入器設定檔指定 hash 清單網址、下載伺服器網址、要啟動的執行檔名稱
  4. 用 Visual Studio 開啟 .sln 編譯出 .exe 發布

這個方案的比對發生在玩家端,理論上玩家可以直接繞過(刪掉檢查邏輯)。如果需要防止玩家用修改版 WZ,要用下面的伺服器端驗證方案。

方案二:MapleLauncher(伺服器端驗證,安全性最高)

MapleLauncher 把 WZ 驗證移到伺服器端:登入器連線後送出一個包含所有 WZ hash 值的 WZ_CHECKSUM 封包,伺服器比對過了才允許登入,玩家端無法繞過。

登入器設定重點UseMapleEncryption 一定要設為 true(v83 使用自訂加密,設 false 會導致封包解密失敗)。

伺服器端實作步驟(以 Java 架構為例)

java
📋 複製
// 1. 在 RecvOpcode.java 新增(挑一個未使用的opcode值,登入器設定要一致)
WZ_CHECKSUM(0xEC);

// 2. 建立 Handler
public class WzChecksumHandler extends AbstractMaplePacketHandler {
    @Override
    public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
        // 讀取登入器送來的hash清單,與伺服器官方hash比對
        // 通過:c.setAuthenticated(true);不通過:c.disconnect()
    }
}

// 3. 在 PacketProcessor 註冊
registerHandler(RecvOpcode.WZ_CHECKSUM, new WzChecksumHandler());

// 4. 加入逾時保護:連線建立後10秒內未收到checksum封包就斷線

Login Server 和 Channel Server 是分開的連線,WZ驗證只需要在第一次連上Login Server時做一次,切換頻道不用重複驗證。

方案三:MaplePatcher(自動補丁系統)

如果你需要更完整的自動補丁功能(不只是「發現版本不同就整包重下載」),MaplePatcher 提供 CRC32 逐檔案掃描、只下載有差異的檔案,並用輕量 JSON API 取代資料庫:

json
📋 複製
{
  "patchInfo": {
    "version": "83.1.0",
    "files": [
      { "name": "Map.wz", "crc32": "a1b2c3d4", "url": "https://patch.example.com/files/Map.wz" }
    ]
  }
}

登入器設定檔(config.json)大致包含伺服器資訊、補丁行為、啟動畫面三個區塊:

json
📋 複製
{
  "server": { "name": "MyMapleServer", "gameServerIp": "127.0.0.1", "gameServerPort": 8585 },
  "patcher": { "checkCrc32": true, "maxConcurrentDownloads": 3, "retryAttempts": 3 },
  "launcher": { "showAnnouncement": true, "announcementUrl": "https://myserver.com/announcements.html" }
}

還內建遠端旗標控制,可以在不重新發布登入器的情況下,遠端切換維護模式、強制更新、封禁特定 IP:

json
📋 複製
{
  "serverFlags": { "maintenance": false, "ban_ips": ["203.0.113.45"], "force_update": false }
}

截至最近一次資料更新,MaplePatcher 完成度約九成、仍在測試階段,建議先在測試伺服器評估過再用於正式環境。

整合 Redirector

實務上登入器通常還會順便幫玩家設定好連線方式,不用玩家自己跑 Redirector 的 netsh 指令:登入器啟動時以管理員身份設定好連線 → 完成 WZ 驗證 → 啟動遊戲 → 遊戲結束後清除設定。netsh 指令需要管理員權限,登入器的 exe 要設定 manifest 要求 requireAdministrator

常見問題

防毒軟體一直誤判登入器是病毒:這是私服登入器的通病,因為登入器通常需要管理員權限、可能呼叫 netsh、又會自動下載並執行檔案,容易觸發行為偵測。實際可行的做法:申請代碼簽署憑證(最有效,但需付費)、把登入器提交到 VirusTotal 公開清白讓玩家自行判斷、或請玩家手動把登入器加入防毒軟體白名單。

玩家繞過驗證用修改版WZ:改用方案二(MapleLauncher)的伺服器端驗證,客戶端無法繞過。

WZ_CHECKSUM opcode要用哪個值:挑一個你的伺服器版本裡沒被使用過的opcode即可,重點是登入器設定和伺服器端handler要用同一個值。