Like Share Discussion Bookmark Smile

J.J. Huang   2021-09-21   天堂私服   瀏覽次數:

天堂私服 | GM指令分析/修改 (描述)「L1J版」

章節用意

desc的指令,顯示玩家的資訊,或許可以套用在所謂的防親友道具(查看玩家資訊、裝備…等等)。

核心版本

  • L1J-3.80c

分析

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

效果:指定角色看到的額外資訊。
範例:

1
.desc ${角色名稱}
  • 1.分析資料表:

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

    • 透過搜尋L1Describe開啟程式碼。
      1
      src/l1j/server/server/command/executor/L1Describe.java
    • 基本上該指令只有針對下指令的玩家取得自身的資料(L1PcInstance)。
    • 注意到L1PcInstance繼承了L1Character
    • 這邊不特別分析可以看到多少資訊,因為太多了…自行除錯模式即可。
    • 36~44行是在取得相關的資訊,並組合成字串。
    • 45最後將物件資訊傳送數據回客戶端做顯示。

      註:如果想要顯示更多資訊,可以在L1PcInstance裡面查找資料。

修改

目前指令只有針對自己,希望將此指令修改程可以指定玩家做查詢。
可以發現帶入的參數有arg,而arg的取得,之前也分析過。

修改的方向是,針對傳入的玩家名稱,嘗試取得玩家資訊,如果玩家在線則將資訊回傳;
如果玩家不在線上,則回傳玩家不在線上。

註:這邊只是給一個思路,當然可以套用到很多地方,一般玩家可以使用指令、道具…等等,窺視其他玩家等級、素質、裝備…等等。

以下是修改後所使用的指令方式:

1
.desc ${玩家名稱}
  • 修改前
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @Override
    public void execute(L1PcInstance pc, String cmdName, String arg) {
    try {
    StringBuilder msg = new StringBuilder();
    pc.sendPackets(new S_SystemMessage("-- describe: " + pc.getName() + " --"));
    int hpr = pc.getHpr() + pc.getInventory().hpRegenPerTick();
    int mpr = pc.getMpr() + pc.getInventory().mpRegenPerTick();
    msg.append("Dmg: +" + pc.getDmgup() + " / ");
    msg.append("Hit: +" + pc.getHitup() + " / ");
    msg.append("MR: " + pc.getMr() + " / ");
    msg.append("HPR: " + hpr + " / ");
    msg.append("MPR: " + mpr + " / ");
    msg.append("Karma: " + pc.getKarma() + " / ");
    msg.append("Item: " + pc.getInventory().getSize() + " / ");
    pc.sendPackets(new S_SystemMessage(msg.toString()));
    }
    catch (Exception e) {
    pc.sendPackets(new S_SystemMessage(cmdName + " 指令錯誤"));
    }
    }
  • 修改後
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public void execute(L1PcInstance pc, String cmdName, String arg) {
    try {
    StringBuilder msg = new StringBuilder();
    L1PcInstance target = L1World.getInstance().getPlayer(arg);
    if (target != null) {
    pc.sendPackets(new S_SystemMessage("-- describe: " + target.getName() + " --"));
    int hpr = target.getHpr() + target.getInventory().hpRegenPerTick();
    int mpr = target.getMpr() + target.getInventory().mpRegenPerTick();
    msg.append("Dmg: +" + target.getDmgup() + " / ");
    msg.append("Hit: +" + target.getHitup() + " / ");
    msg.append("MR: " + target.getMr() + " / ");
    msg.append("HPR: " + hpr + " / ");
    msg.append("MPR: " + mpr + " / ");
    msg.append("Karma: " + target.getKarma() + " / ");
    msg.append("Item: " + target.getInventory().getSize() + " / ");
    pc.sendPackets(new S_SystemMessage(msg.toString()));
    } else {
    pc.sendPackets(new S_SystemMessage((new StringBuilder()).append(arg).append("不在線上。").toString()));
    }
    } catch (Exception e) {
    pc.sendPackets(new S_SystemMessage(cmdName + " 指令錯誤"));
    }
    }
  • 修改後儲存,啟動模擬器。
  • 啟動天堂登入遊戲,登入GM帳號與另一個帳號。
  • GM使用指令查詢另一位玩家,可護得該玩家資訊。

結論

  • 程式碼:
    • src/l1j/server/server/command/executor/L1Describe.java
      • 處理客戶端來的GM指令desc的處理。

結語

其實在多分析原本的程式碼後,可以自己思考該程式碼是否可以應用在別的地方。
學習程式分析程式不外乎就是耐心,加油!

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

免責聲明

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