Like Share Discussion Bookmark Smile

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

天堂私服 | GM指令分析/修改 (怪物血條)「L1J版」

章節用意

hpbar的指令,用於顯示怪物血條,此指令是針對給GM使用,如果充分分析後,是否可以套用到所有玩家身上呢?

核心版本

  • L1J-TW_3.80c

分析

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

效果:在畫面顯示所有角色(包括Npc)的HP條(只有你能看到)。
範例:

1
.hpbar on/off
  • 1.分析資料表:

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

    • 透過搜尋L1HpBar開啟程式碼。
      1
      src/l1j/server/server/command/executor/L1HpBar.java
    • 開啟後分析程式碼。
    • 36如果為啟動on則進入。
    • 37設定一個輔助技能為GMSTATUS_HPBAR的在身上。
    • 39如果為啟動off則進入。
    • 40移除身上輔助技能為GMSTATUS_HPBAR
    • 42~46針對可視的物件進行建立血條的數據包。

      註:所謂的物件,是在天堂遊戲畫面內的怪物、NPC、門、物品..等等之類的。

  • 3.分析程式碼

    • 根據關鍵字GMSTATUS_HPBAR找尋程式碼。
    • 可以發現有兩個地方做判斷,都在同一支程式內。
    • 開啟該程式位置。
      1
      src/l1j/server/server/model/Instance/L1PcInstance.java
    • 開啟後分析程式碼。
    • 479~481是針對一般地圖做判斷,判斷是否有此輔助狀態在身上和物件是否為可顯示血條的物件。
    • 488~492是針對旅館內的;這邊不做分析。

      註:所謂的物件,是在天堂遊戲畫面內的怪物、NPC、門、物品..等等之類的。

    • 斷點於480
    • 啟動模擬器除錯模式,並啟動天堂遊戲登入。
    • 找尋一個完全沒有怪物和物件的地方。
    • 可以發現目前還沒有進入斷點。
    • 使用召喚怪物的GM指令,召喚出一支食人妖精,並攻擊他,讓怪物持續攻擊你。(為了持續讓怪物保持在畫面內)
      1
      .spawn 45223 1 1
    • 使用.hpbar on的指令。
    • 可以發現進入斷點,此時使用Resume Program恢復程式。
    • 會發現斷點一直重複進入;可以斷定這邊是不斷的一直在判斷和更新畫面上的物件。
    • 點擊Mute Breakpoints將所有斷點先關閉,Resume Program恢復程式
    • 回到天堂遊戲內,擊殺怪物。
    • 再次點擊Mute Breakpoints將所有斷點啟用。
    • 可以發現斷點還是進入了;這是因為怪物屍體尚未消失,這個物件依舊在判斷是否要顯示血條。
    • 最後怪物消失後,就沒再進入斷點。(因為畫面內無任何物件)
    • 此時針對S_HPMeter做分析。
    • 將斷點所有斷點先行移除,在S_HPMeter30新增斷點。
      1
      src/l1j/server/server/serverpackets/S_HPMeter.java
    • 再次召喚怪物。
      1
      .spawn 45223 1 1
    • 進入斷點後,開始使用Step Over:步過來分析。
    • 可以發現cha這個物件內有name的變數,寫著食人妖精;這邊可以確定該物件就是食人妖精的相關資訊物件。
    • 繼續Step Over:步過。
    • 取得該物件的最大血量,判斷是否有大於零。
    • 進入判斷後,計算目前物件100 * 當前的血量 / 最大血量得出百分比。
    • 最後將物件資訊傳送數據回客戶端。
    • 此處將會不斷循環,一直更新血條。

      註:至於為什麼會一直循環?這可能是使用Runnable或是ScheduledFuture.ScheduleAtFixedRate,這邊暫時不深入分析。

修改

修改成不需要透過GM指令才能開啟怪物血條功能,直接進入遊戲內就可以看到怪物血條。
根據上面的程式分析,可以知道主要的判斷邏輯位置為L1PcInstance.java479行。
只需要將判斷GMSTATUS_HPBAR移除,即可達到啟動怪物血條的效果。

  • 修改前
    1
    2
    3
    if (hasSkillEffect(GMSTATUS_HPBAR) && L1HpBar.isHpBarTarget(visible)) {
    sendPackets(new S_HPMeter((L1Character) visible));
    }
  • 修改後
    1
    2
    3
    if (L1HpBar.isHpBarTarget(visible)) {
    sendPackets(new S_HPMeter((L1Character) visible));
    }
  • 修改後儲存,啟動模擬器。
  • 啟動天堂登入遊戲,去找尋怪物,即會看到怪物們都有血條了。

結論

指令的處理與客戶端原生的指令處理事會有不一樣。

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

結語

針對怪物血條的分析,進行修改可以達成啟動怪物血條的功能。當然加以修改可以進行設置設定檔的開關或是資料庫內設定開關。

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

免責聲明

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