Like Share Discussion Bookmark Smile

J.J. Huang   2021-10-17   天堂私服   瀏覽次數:

天堂私服 | GM指令分析 (創立套裝)「L1J版」

章節用意

itemset的指令,此指令是生成套裝的物品,且分析XML設定檔的分析與使用。

核心版本

  • L1J-3.80c

分析

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

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

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

    • 先進入commands表,找到itemset的指令。
    • class_nameL1CreateItemSet
  • 2.分析程式碼:

    • 透過搜尋L1CreateItemSet開啟程式碼。
      1
      src/l1j/server/server/command/executor/L1CreateItemSet.java
    • 啟動模擬器除錯模式,並啟動天堂遊戲登入。
    • 使用創立套裝的GM指令。(由於不知道套裝設定的名稱,先帶入1)
      1
      .imteset 1
    • 會顯示1 是未定義的套裝內容
    • 回到IDEA,斷點於43
    • 回到天堂遊戲內,再次執行創立套裝的GM指令。
      1
      .imteset 1
    • 使用評估表達式Evaluate Expression來分析GMCommandsConfig.ITEM_SETS
    • 可發現抓取的keydkset
    • 點擊Mute Breakpoints將所有斷點先關閉,Resume Program恢復程式
    • 回到天堂遊戲內,再次執行創立套裝的GM指令,將1改為dkset
      1
      .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操作,點擊跳轉。
      1
      src/l1j/server/server/GMCommandsConfig.java
    • 可以看到程式碼,繼承了抽象類ListLoaderAdapter
    • OverrideloadElement方法。
    • 注意到103行就是操作ITEM_SETS的地方,傳入的值為list
    • list是在99行被add,而add的值使用了loadItem(elem)方法與傳入的elem
    • loadItem方法只是單純建立一個物件存放一些資訊。
    • elem94行,方法傳入的值loadElement(Element element)
    • 針對loadElement方法上面按右鍵選擇Find Usages
    • 會跳轉到58行,此段為繼承的抽象類ListLoaderAdapter
    • 可以看到Overrideload方法。
    • 直接在load方法上面按右鍵選擇Find Usages
    • 會跳轉到133行。
    • 這邊注意到127行,他有開啟一個xml檔。
      1
      ./data/xml/GmCommands/GMCommands.xml
    • 直接在核心的資料夾內找到GMCommands.xml並開啟。
    • 可以看到在GMCommands.xml內容,有ItemSetListRoomList兩個大區塊。
    • 目前我們只要注意到ItemSetList就好。
    • 可以發現剛剛使用的dkset就在這邊設定。
      1
      2
      3
      4
      5
      6
      7
      8
      		<!-- +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內容。

結語

創建套裝的指令,分析過後,可以初步了解到XML的使用與對應,在後面如果要開發新功能或是將較為複雜的設定,都可以透過XML來做開發。

原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章結目錄,此處會不定時更新。

免責聲明

  • 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
  • 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有
  • 本部落格文章為研究SQL資料庫與修改JAVA語法使用,非商業用途,亦無做營運事實等任何一切商業行為
  • 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容