Like Share Discussion Bookmark Smile

J.J. Huang   2021-10-24   天堂私服 05.核心分析/修改   瀏覽次數:次   DMCA.com Protection Status

天堂私服 | GM指令分析 (前往怪物)「L1J版」

章節用意

tospawn的指令,此指令用於傳送到特定的怪物、NPC旁,主要用於觀看怪物出生點;或許可以運用在BOSS的傳送卷軸。

核心版本

  • L1J-3.80c

前言

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

分析

效果:傳送到指定spawnid的坐標。
範例:

1
2
3
.tospawn ${spawnid}
.tospawn +
.tospawn -
  • 1.分析資料表:

    • 先進入commands表,找到tospawn的指令。
    • class_nameL1ToSpawn
    • 再進入spawnlist表,看到id = 1,此編號為青蛙
    • 注意到count = 1,表示怪物量為1;如為0表示不會生怪。
    • 以下是資料欄位的用途分析:
      • id = 編號
      • location = 名稱
      • count = 數量
      • npc_templateid = 對應npc的編號
      • group_id = 群怪代碼(例:精銳 黑騎士)
      • locx = 中心點X座標
      • locy = 中心點Y座標
      • randomx = 隨機X座標
      • randomy = 隨機Y座標
      • locx1 = 誤差座標X,請設定地圖的最左上角(↖)的座標(參照mapids.startX)
      • locy1 = 誤差座標Y,請設定地圖的最左上角(↖)的座標(參照mapids.startY)
      • locx2 = 誤差座標X,請設定地圖的最右下角(↘)的座標(參照mapids.endX)
      • locy2 = 誤差座標Y,請設定地圖的最右下角(↘)的座標(參照mapids.endY)
      • heading = 面向
      • min_respawn_delay = 最小出生時間 (單位/秒)
      • max_respawn_delay = 最大出生時間 (單位/秒)
      • mapid = 地圖編號
      • respawn_screen = 人物在畫面內是否生怪 (0 = 是, 1 = 否)
      • movement_distance = 離開出生點多遠會自動順移回原地
      • rest = 不清楚
      • near_spawn = 不清楚
    • 這邊我們多注意一張資料表spawnlist_npc
    • 這張表為創建的所有一般的NPC的清單;例:初級傳送師, 商店..等等。
    • 注意,理論上這兩張表的id不應該有重複的。
  • 2.指令的分析:

    • 啟動模擬器除錯模式,並啟動天堂遊戲登入。
    • 使用前往怪物的GM指令,參數帶入1 = 青蛙 的位置。
      1
      .tospawn 1
  • 3.分析程式碼:

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

      註:程式碼內的L1Teleportteleport方法,已於GM指令分析 (移動)分析完畢,此處將不再分析。

    • 41~54行,用於取得記憶上次所使用的id與分析指令的參數。
      • 如參數為 + 則將上次的 id 加上 1
      • 如參數為 - 則將上次的 id 減去 1

        註:這邊可以方便使用.r的方式來執行上次的指令並加上參數。例:.r +.r -
        註:如果忘記.r怎麼來的,可以參考此篇GM指令的程式碼邏輯分析

    • 55~58行,根據取得的id取得spawn資料。
    • 注意到取得spawn資料有一個先後順序,如為null,才繼續取。
      • 首先取得NCP的資料。
      • 次要取得怪物的資料。

        註:這就是為什麼上面說,理論上兩張表的id不該重複。

    • 後續會繼續分析NpcSpawnTableSpawnTable是如何取得的和一些條件判斷。
    • 59~65行,就是單純的使用teleport方法傳送,這邊就不在特別分析。
    • 66行,記憶所使用的id
  • 4.分析程式碼:

    • 首先我們分析NpcSpawnTable
    • 可以知道資料是由資料表spawnlist_npc取得的。
    • 下方還有一些條件判斷和使用的參數式由config取得
      • Config.ALT_GMSHOP = 設定是否開啟GM商店… True=開啟, False=關閉
      • Config.ALT_GMSHOP_MIN_ID = 設定GM商店編號最小值設定,可查看在spawnlist_npc內的編號進行設定
      • Config.ALT_GMSHOP_MAX_ID = 設定GM商店編號最大值設定,可查看在spawnlist_npc內的編號進行設定
      • Config.ALT_HALLOWEENIVENT = 南瓜怪任務開關設置… True=開, False=關
      • Config.ALT_JPPRIVILEGED = 日本特典道具NPC開關設置… True=開, False=關
      • Config.ALT_TALKINGSCROLLQUEST = 說話卷軸任務開關設置… True=開,False=關
    • 分析過後可以知道這些參數於altsettings.properties做設定。
    • 首先我們分析SpawnTable
    • 可以知道資料是由資料表spawnlist取得的。
    • 下方還有一些條件判斷和使用的參數式由config取得
    • Config.ALT_HALLOWEENIVENT = 南瓜怪任務開關設置… True=開, False=關

結論

  • 資料表:

    • 資料表及欄位,可於上方分析中有說明。
  • 程式碼:

    • src/l1j/server/server/command/executor/L1ToSpawn.java
      • 處理客戶端來的GM指令tospawn的處理。
    • src/l1j/server/server/datatables/NpcSpawnTable.java
      • 世界的產生NPC對應表。
    • src/l1j/server/server/datatables/SpawnTable.java
      • 世界的產生怪物對應表。

結語

分析後發現,不管是創怪、創NPC後,都會需要去觀看位置;但這不是此次分析得到的重點;
我認為重點應該是新增一些活動任務的時候,像是要創什麼怪物或是創什麼NPC可以透過設定檔去做設定,方便開關。

例如:節慶任務、限時任務…等等。

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

免責聲明

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