您当前位置: 天堂123 > 天堂架設 > 天堂私服使用GM命令創建套裝

天堂私服使用GM命令創建套裝

2021/12/13

在開始分析前,要知道GM指令的指令效果與使用方式,才方便開啟除錯(Debug)進行分析。

效果:生成指定的套裝。
範例:

.itemset ${套裝名稱}
1.分析資料表:

先進入commands表,找到itemset的指令。
class_name是L1CreateItemSet。

2.分析程式碼:

透過搜尋L1CreateItemSet開啟程式碼。
src/l1j/server/server/command/executor/L1CreateItemSet.java

啟動模擬器除錯模式,並啟動天堂遊戲登入。
使用創立套裝的GM指令。(由於不知道套裝設定的名稱,先帶入1)
.imteset 1
會顯示1 是未定義的套裝內容。

回到IDEA,斷點於43。
回到天堂遊戲內,再次執行創立套裝的GM指令。
.imteset 1
使用評估表達式Evaluate Expression來分析GMCommandsConfig.ITEM_SETS。
可發現抓取的key為dkset。

點擊Mute Breakpoints將所有斷點先關閉,Resume Program恢復程式
回到天堂遊戲內,再次執行創立套裝的GM指令,將1改為dkset。
.imteset dkset
發現創立了死亡騎士套裝並且全部都是+10(請用鑑定卷軸鑑定)。

至此可以知道有設定一個死亡騎士的套裝,並且名稱為dkset且全部都是+10的。
此時我們繼續分析其他程式碼;關於GMCommandsConfig.ITEM_SETS的部分,後面會分析。
2.分析程式碼:

44~47行,如果套裝不存在,則傳送數據回客戶端做顯示xxx 是未定義的套裝。
48~60行。
取得物品並判斷該物品是否為不可堆疊、物品要強化的等級是不等於0
然後迴圈建立物品於道具欄內,跑第一圈迴圈就會將物品產生且為+1,會跑到指定的+10。
物品的Id與強化數都存放在GMCommandsConfig.ITEM_SETS內,可見下圖。

3.分析程式碼:(GMCommandsConfig.ITEM_SETS)

於ITEM_SETS上面按右鍵選擇Find Usages。
可以看到有對此物件的put操作,點擊跳轉。
src/l1j/server/server/GMCommandsConfig.java

可以看到程式碼,繼承了抽象類ListLoaderAdapter。
Override掉loadElement方法。

注意到103行就是操作ITEM_SETS的地方,傳入的值為list。
list是在99行被add,而add的值使用了loadItem(elem)方法與傳入的elem。
loadItem方法只是單純建立一個物件存放一些資訊。
elem為94行,方法傳入的值loadElement(Element element)。
針對loadElement方法上面按右鍵選擇Find Usages。
會跳轉到58行,此段為繼承的抽象類ListLoaderAdapter。

可以看到Override掉load方法。
直接在load方法上面按右鍵選擇Find Usages。
會跳轉到133行。
這邊注意到127行,他有開啟一個xml檔。
./data/xml/GmCommands/GMCommands.xml

直接在核心的資料夾內找到GMCommands.xml並開啟。

可以看到在GMCommands.xml內容,有ItemSetList和RoomList兩個大區塊。
目前我們只要注意到ItemSetList就好。
可以發現剛剛使用的dkset就在這邊設定。
<!-- +10 DKセット(定義サンプル) -->
<ItemSet Name="DKSet">
<Item Id="58" Amount="1" Enchant="10"/>
<Item Id="20010" Amount="1" Enchant="10"/>
<Item Id="20100" Amount="1" Enchant="10"/>
<Item Id="20166" Amount="1" Enchant="10"/>
<Item Id="20198" Amount="1" Enchant="10"/>
</ItemSet>
對應的是武器、防具的id、數量、強化值。

到此基本上就對創立套裝的指令分析完成。
結論
程式碼:
src/l1j/server/server/command/executor/L1CreateItemSet.java
處理客戶端來的GM指令itemset的處理。
src/l1j/server/server/GMCommandsConfig.java
GM指令相關的設定檔,透過XML欄設定提供。
./data/xml/GmCommands/GMCommands.xml
存放GM指令對應的XML內容。