天堂私服 | GM指令分析 (移動)「L1J版」
章節用意
move的指令,此指令用於移動到指定的座標地圖上,學習畫面的更新和物件的移動…等等。
核心版本
- L1J-3.80c
分析
效果:移動到指定的點。
範例:
1 | .move ${X座標} ${Y座標} ${地圖編號} |
1.分析資料表:
- 先進入
commands表,找到move的指令。 class_name是L1Move。
- 在進入
mapids表,看到mpaid=4,此地圖編號為整個大陸。 - 當然其他的
mapid有相對應的locationname地圖名稱。 - 而整張地圖的大小事由
startX、startY、endX、endY做組合的。 - 以下是資料欄位的用途分析:
mapid= 地圖編號locationname= 地圖名稱startX= 開始X座標endX= 結束X座標startY= 開始Y座標endY= 結束Y座標monster_amount= 怪物數量倍數drop_rate= 掉落機率倍數underwater= 是否為水下地圖markable= 是否可記憶作標teleportable= 是否可隨機傳送escapable= 是否可傳送到地圖之外resurrection= 是否可以復活painwand= 是否可用松木魔杖penalty= 死亡扣除經驗take_pets= 是否可以攜帶寵物recall_pets= 是否可以召喚寵物usable_item= 是否可以使用道具usable_skill= 是否可以使用魔法
- 功能欄位可以透過修改後,自行測試其效果。

- 先進入
2.指令的分析:
- 啟動模擬器除錯模式,並啟動天堂遊戲登入。
- 使用移動的
GM指令。(傳送到隱藏之谷)1
.move 32671 32836 69

- 使用移動的
GM指令。(傳送到歌唱之島)1
.move 32782 32756 68

3.分析程式碼:
- 透過搜尋
L1Move開啟程式碼。1
src/l1j/server/server/command/executor/L1Move.java

34~43行取得傳入的arg去解析對應的參數 -- locx = X座標
- locy = Y座標
- mapid = 地圖編號
44行,為主要的邏輯操作,可見使用的是L1Teleport的teleport方法。- 並將
pc, locx, locy, mapid, 5, false參數帶入。5=head- 說明:面向 0.左上 1.上 2.右上 3.右 4.右下 5.下 6.左下 7.左
false=effectable- 說明:是否要顯示傳送的光束。
Ctrl鍵壓住,再左鍵點擊teleport方法即會開啟跳轉到物件與方法位置。Ctrl鍵壓住,再左鍵點擊53行的teleport方法。58~61行,判斷是否處於交易狀態,如果是則關閉此次交易。66~82行,根據是否要顯示傳送光束,而做的一些技能效果顯示和延遲。84~87行,設定客戶端的角色位置與地圖和面向。88~90行,判斷server.properties設定檔內設定,決定是否要等待客戶端通知。92行,Teleportation的actionTeleportation方法,為處理傳送後的邏輯。
- 透過搜尋
3.分析程式碼:
Ctrl鍵壓住,再左鍵點擊actionTeleportation方法即會開啟跳轉到物件與方法位置。- 由於程式碼非常多,固直接使用中斷方式直接分析。
- 此時為示範的兩個帳號:
- 左上方為
路人甲,已經移動至隱藏之谷 - 左下方為
線上GM,目前在說話之島,並且帶著召喚怪物。 - 最右方為
Intellij IDEA中斷點在50行。1
src/l1j/server/server/utils/Teleportation.java

- 左上方為
- 使用
線上GM輸入移動指令,至路人甲的所在位置地圖。1
.move 32671 32836 69
- 開始使用

Step Over:步過,一步一步觀察。 54~57行,取得參數。59~66行,判斷所要傳送地圖是否存在是否合法座標,且不是GM角色。註:判斷表示,如果為
GM要傳去哪都沒有限制。
70~75行,這邊不是很肯定,應該是判斷是否有血盟,且是否有再使用血盟倉庫,如有則關閉。
77~80行,是在處理線上GM的畫面物件、角色位置..等等,並傳送更新客戶端。- 注意當
Step Over:步過第78或80行後- 可以看到
路人甲的遊戲畫面已經看到線上GM的角色出現。 線上GM畫面則屬於清空狀態。
- 可以看到
90行是廣播封包到畫面可視範圍的其他玩家,更新畫面。
- 注意當
Step Over:步過第92行,是屬於更新線上GM的物件。 - 此時請注意,
線上GM畫面上其他玩家、NPC、寵物…等等,都是未顯示的狀態。
- 注意當
Step Over:步過第95~96行,是屬於更新線上GM的物件。 - 此時請注意,
線上GM畫面上顯示其他玩家、NPC…等等。
101行,用於解除法師魔法 (冥想術)。102行,如剛好被盟主召喚,則召喚效果無效。- 以下的分析程式碼有點多,固沒有全部特別深入解析。
113行,判斷是否有攜帶寵物。115~140行,屬於判斷是否有攜帶寵物,如有則將寵物移動位置至角色身邊。
- 注意當
Step Over:步過第125行,是更新了寵物的位置。 - 此時請注意,兩個遊戲畫面上都顯示了寵物。
143~157行,屬於判斷是否有攜帶魔法娃娃,如有則將魔法娃娃位置至角色身邊。- 後面的就是一些畫面的更新、狀態判斷、其他判斷…等等。

- 至次基本上了解完,當使用瞬間移動後要做多少的更新和判斷。
結論
資料表:
- 資料表及欄位,可於上方分析中有說明。
程式碼:
src/l1j/server/server/command/executor/L1Move.java- 處理客戶端來的
GM指令move的處理。
- 處理客戶端來的
src/l1j/server/server/model/L1Teleport.java- 提供傳送的方法。
src/l1j/server/server/utils/Teleportation.java- 處理傳送後的人物、畫面、寵物..等等物件的更新和判斷。
結語
本來以為傳送的指令很好分析,沒想到一個傳送,需要做這麼多的事情,大致可以整理出以下:
- 角色是否再做其他事項,例如:交易、開倉庫..等等。
- 角色的輔助狀態、負面狀態、其他召喚技能的這些處理和判斷。
- 當前角色本身的位置、地圖、畫面更新。
- 目的地角色本身的位置、地圖、畫面更新;更新人物、畫面物件、寵物、魔法娃娃。
- 目的地的其他角色的畫面更新;更新人物、畫面物件、寵物、魔法娃娃。
原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章節目錄。
免責聲明
- 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
- 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有。
- 本部落格文章為研究SQL資料庫與修改JAVA語法使用,並非商業用途,亦無做營運事實等任何一切商業行為。
- 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容!
