您当前位置: 天堂123 > 天堂架設 > 天堂私服召喚寵物指令分析

天堂私服召喚寵物指令分析

2021/12/7

在開始分析前,請務必先將以下文章閱讀完畢。

GM指令分析 (召喚怪物)
了解L1SpawnUtil的spawn方法行為,有助於了解這邊的分析。
分析
效果:召喚一個馴服的NPC。如果您指定名稱,則將設置找到的第一個名稱。
範例:

.summon ${怪物編號 或 怪物名稱} ${數量}
1.分析資料表:

先進入commands表,找到summon的指令。
class_name是L1Summon。

再進入npc表,找到安塔瑞斯的編號 = 45682,用於待會召喚用。
SELECT * FROM `npc` WHERE `name` = '安塔瑞斯';

2.指令的分析:

啟動模擬器除錯模式,並啟動天堂遊戲登入。
使用召喚寵物的GM指令,參數帶入45682 = 安塔瑞斯,數量 = 5。
.summon 45682 5

3.分析程式碼:

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

36~52行,判斷輸入的參數並去取得NPC的id和數量。
並判斷是否有找到npcid,如無則傳送數據回客戶端做顯示找不到符合條件的NPC。。
53行,根據取得的id取得NpcTable資料。
NpcTable中的資料來源為,資料表npc,對應的SQL語法如下。
SELECT * FROM npc
54~57行,根據輸入的參數次數執行迴圈,主要是new L1SummonInstance(npc, pc);。
56行,這個summonInst.setPetcost(0);參數,初步了解應該是寵物所占用的魅力值。
後續的語法較為簡單就不在特別分析。
4.分析程式碼:

分析L1SummonInstance的建構子方法。
首先L1SummonInstance繼承了L1NpcInstance。
傳入的參數為L1Npc template與L1Character master。
127~128行,是父層的建構與設定該物件的id。
130行,建立一個schedule計時器SummonTimer,並設定為3600秒。
註:SummonTimer下面再另外分析。

132~137行,設定取得主人的位置,計算並寫入寵物的位置、面向..等等。
139行,_currentPetStatus,設定寵物狀態。
1 = 攻撃狀態
2 = 防禦狀態
3 = 休息狀態
4 = 裝備
5 = 警戒
6 = 解散
7 = 前往主人身邊並休息
註:以上分析可能有誤,可能需要再參考自行嘗試。

140行,_tamed,設定該寵物是否為迷魅術或造屍術產生的。(主要是針對時間到的時候解散會有不一樣的處理。)
142~143這邊兩行特別在前一篇提到:
將this,也就是這個L1SummonInstance物件塞入到世界L1World的_allObjects裡面。
註:基本上在遊戲看到的所有物件都會塞入到這裡面。

將剛剛塞入的this變成可視。
註:此行跑過以後,在遊戲畫面中就可以看到寵物出現了。

144~146行,依寵物為中心,針對畫面的所有玩家更新寵物感知?(應該就是讓玩家可以識別的物件)
147行,最後就是把這寵物新增給該角色下,並顯示寵物控制圖形介面。(為您的角色添加新寵物、召喚怪物、馴服怪物或製造殭屍。)

5.分析程式碼:

分析SummonTimer的建構子方法。
主要實作的是Runnable,當計時器3600秒後觸發。
判斷分為三個:
判斷它是否已經被銷毀。
如已經銷毀則不做事。
釋放馴服怪物並創造殭屍。
如為馴服的怪物則執行liberate方法。
解除召喚。
如上述都不是就是召喚的方式,執行Death方法。
後續接著分析兩個方法。

分析liberate方法。
大致分析就是會將被迷魅的怪物的物件做刪除。
再次重新建立一個這個怪物出現。

分析Death方法。
大致分析就是會將召喚出來的怪物物件做刪除。
會判斷召喚的怪物身上是否有物品,如果有的話給主人。(會判斷負重..等等)

上方方法中呼叫的deleteMe這方法,滿有趣的,判斷怪物是否是迷魅的還有一個是否要回歸自然的參數。來決定怪物的消失方式。
沒有特別深入去分析,有興趣可以慢慢追。
註:測試方式可以迷魅個怪物來解散、召喚寵物來解散就可以看到不同的行為了。


結論
程式碼:
src/l1j/server/server/command/executor/L1Summon.java
處理客戶端來的GM指令summon的處理。
src/l1j/server/server/model/Instance/L1SummonInstance.java
世界的產生寵物的實例。
內部包含很多寵物的一些方法和Class。