天堂123分類:天堂123新手區 天堂123玩家分享 天堂123私服技巧 天堂123架設教學 返回天堂123首頁
您当前位置: 天堂123 > 天堂架設 > 私服用GM指令創建怪物血條

私服用GM指令創建怪物血條

2022/6/12

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

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

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

先進入commands表,找到hpbar的指令。
class_name是L1HpBar。

2.分析程式碼:

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

開啟後分析程式碼。
36如果為啟動on則進入。
37設定一個輔助技能為GMSTATUS_HPBAR的在身上。
39如果為啟動off則進入。
40移除身上輔助技能為GMSTATUS_HPBAR。
42~46針對可視的物件進行建立血條的數據包。
註:所謂的物件,是在天堂遊戲畫面內的怪物、NPC、門、物品..等等之類的。

3.分析程式碼

根據關鍵字GMSTATUS_HPBAR找尋程式碼。
可以發現有兩個地方做判斷,都在同一支程式內。

開啟該程式位置。
src/l1j/server/server/model/Instance/L1PcInstance.java

開啟後分析程式碼。
479~481是針對一般地圖做判斷,判斷是否有此輔助狀態在身上和物件是否為可顯示血條的物件。
488~492是針對旅館內的;這邊不做分析。
註:所謂的物件,是在天堂遊戲畫面內的怪物、NPC、門、物品..等等之類的。

斷點於480。
啟動模擬器除錯模式,並啟動天堂遊戲登入。
找尋一個完全沒有怪物和物件的地方。
可以發現目前還沒有進入斷點。
使用召喚怪物的GM指令,召喚出一支食人妖精,並攻擊他,讓怪物持續攻擊你。(為了持續讓怪物保持在畫面內)
.spawn 45223 1 1
使用.hpbar on的指令。
可以發現進入斷點,此時使用Resume Program恢復程式。
會發現斷點一直重複進入;可以斷定這邊是不斷的一直在判斷和更新畫面上的物件。
點擊Mute Breakpoints將所有斷點先關閉,Resume Program恢復程式
回到天堂遊戲內,擊殺怪物。
再次點擊Mute Breakpoints將所有斷點啟用。
可以發現斷點還是進入了;這是因為怪物屍體尚未消失,這個物件依舊在判斷是否要顯示血條。
最後怪物消失後,就沒再進入斷點。(因為畫面內無任何物件)

此時針對S_HPMeter做分析。
將斷點所有斷點先行移除,在S_HPMeter的30新增斷點。
src/l1j/server/server/serverpackets/S_HPMeter.java

再次召喚怪物。
.spawn 45223 1 1
進入斷點後,開始使用Step Over:步過來分析。
可以發現cha這個物件內有name的變數,寫著食人妖精;這邊可以確定該物件就是食人妖精的相關資訊物件。
繼續Step Over:步過。
取得該物件的最大血量,判斷是否有大於零。
進入判斷後,計算目前物件100 * 當前的血量 / 最大血量得出百分比。
最後將物件資訊傳送數據回客戶端。
此處將會不斷循環,一直更新血條。
註:至於為什麼會一直循環?這可能是使用Runnable或是ScheduledFuture.ScheduleAtFixedRate,這邊暫時不深入分析。


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

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