除了登入連線本身,架私服過程中還會遇到幾個常見的客戶端行為問題:EXP 進度條跟伺服器對不上、高倍率伺服器傷害或 EXP 數值溢位、每次改地圖資源都要重新打包 WZ 太慢。這幾個都能用輕量的 DLL 注入或 Hex 修改處理,難度比登入器原始碼開發低一些,但仍需要一定的動手能力。
EXP 表不同步:客戶端顯示跟伺服器對不上
v83 客戶端內建的升等 EXP 需求遠高於 v62。多數 HeavenMS 系列伺服器預設使用 v62 的 EXP 曲線,但客戶端仍是原生 v83 表——伺服器說「升級需要5000 EXP」,客戶端卻認為需要80000 EXP,進度條就會顯示異常(卡在某個百分比、跳不過去)。
解法:用開源的 CustomExpTable DLL,透過 MaplePNP(DLL注入器)在客戶端啟動時把記憶體內的 EXP 表換成 v62 版本:
- 下載
CustomExpTable.dll - 在 MaplePNP 設定中新增這個 DLL 路徑,勾選自動注入
- 用 MaplePNP 啟動客戶端(必須在角色登入前完成注入,登入後注入可能無效)
- 進入遊戲後用 GM 指令測試(例如
@setexp 0再@setexp 99,觀察進度條是否合理跳動)
只改客戶端還不夠,伺服器端的 EXP 表(通常在 ExpTable.java 或類似檔案)也要用同一套 v62 數值,兩邊才會一致。
EXP 顯示溢位:高倍率伺服器的 32-bit 問題
v83 客戶端用 32-bit 有號整數儲存 EXP,最大約 21 億。EXP 倍率開很高(常見於 1000x~50000x 的「樂趣型」私服)時,玩家很快就會超過這個值,導致 EXP 條顯示負數或歸零。
概念上的解法是用 DLL Hook 攔截客戶端讀取/顯示 EXP 的函數,把 32-bit 轉成 64-bit 再顯示。這個修改不改變EXP表的曲線,純粹是顯示層的溢位修正,跟上面「EXP表不同步」是兩件不同的事。
這部分原本社群提供的範本專案原始碼連結已經失效,確切的 Hook 地址需要自己用 IDA 或 OllyDbg 在客戶端裡定位,屬於進階 DIY 範疇。如果你的伺服器倍率不算誇張(EXP 條在正常玩法下不會顯示到21億),可以先不處理這個問題。伺服器端如果資料庫的 EXP 欄位是
INT,記得也要改成BIGINT,否則存進資料庫時一樣會溢位。
傷害上限(2b Cap):類似的溢位問題
同樣道理,傷害數值也以 32-bit 整數儲存,上限約 21 億(俗稱 2b cap)。超過時會整數溢位,顯示負數或異常值。有三種處理方式:
| 方案 | 做法 | 適合情境 |
|---|---|---|
| 只改客戶端顯示上限 | 修改地址 00AFE8A0 的 double 值(預設 2147483648.0),改成更大的值 | 只想調整顯示上限,不追求真正突破 |
| 伺服器端 int→long | 把傷害計算相關變數從 int 改為 long(如 MapleCharacter.java、MapleMonster.java) | 需要真正支援超過2b的傷害 |
| 傷害顯示縮放 | 伺服器內部用long計算真實傷害,發送封包前先除以1000等比例縮放 | 想要極高傷害但不想大動客戶端 |
只改客戶端的
00AFE8A0只解決「畫面顯示」,如果伺服器端傷害計算還是int,超過2b一樣會在伺服器溢位。另外,v83的傷害封包本身以4 bytes(int)傳輸,伺服器若改用long計算,封包格式可能也要跟著調整或改用縮放方案,這是「完整突破2b cap」被認為是v83所有客戶端修改中最複雜項目之一的原因。
實務上,多數私服並不真的追求突破2b cap,而是把傷害公式(武器攻擊力、技能倍率)控制在合理範圍,只有GM測試或特殊活動才可能碰到上限。
IMG 直讀取代 WZ:加速開發期迭代
修改地圖、怪物、角色外觀等資源時,傳統流程是「解包WZ → 修改 → 重新打包 → 重啟客戶端」,每次迭代要花好幾分鐘。開發期間可以用 ClientImageLoader(支援v62~v92)讓客戶端優先從本機 data/ 資料夾讀取未打包的 .img 檔案:
- 用 HaRepacker 把要修改的 WZ 節點匯出成
.img,放進客戶端根目錄的data/資料夾(路徑需對應WZ內部結構,例如data/Map/Map0/100000000.img) - 把原本的
Version.dll改名備份為Version_orig.dll,再把ClientImageLoader.dll複製並命名為Version.dll - 之後修改
data/裡的.img檔案,重啟客戶端即可看到效果,不需要重新打包WZ
這個做法能把單次迭代時間從幾分鐘縮短到幾秒,但只建議在開發期間使用——正式對外發布時,還是應該把所有修改重新打包進 WZ,減少對客戶端額外資料夾的依賴。