Like Share Discussion Bookmark Smile

J.J. Huang   2021-10-25   天堂私服   瀏覽次數:

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

章節用意

spawn的指令,此指令用於召喚怪物。

註:該指令只是純粹召喚出野生怪物,並不是設定怪物或是NPC的出生點,在伺服器重啟後就會消失。

核心版本

  • L1J-3.80c

分析

效果:召喚指定數量的NPC到現場。 如果指定了隨機範圍,則會在該範圍內隨機召喚。如果您指定名稱,則將設置找到的第一個名稱。
範例:

1
.spawn ${怪物編號 或 怪物名稱} ${範圍}
  • 1.分析資料表:

    • 先進入commands表,找到spawn的指令。
    • class_nameL1SpawnCmd
    • 再進入npc表,找到食人妖精的編號 = 45223,用於待會創怪用。
      1
      SELECT * FROM `npc` WHERE `name` = '食人妖精';
    • 看到普通の編號為`45223``。
  • 2.指令的分析:

    • 啟動模擬器除錯模式,並啟動天堂遊戲登入。
    • 使用召喚怪物的GM指令,參數帶入45223 = 食人妖精,數量與範圍都先帶入1
      1
      .spawn 45223 1 1
    • 使用召喚怪物的GM指令,參數帶入45223 = 食人妖精,數量 = 9,範圍 = 2
      1
      .spawn 45223 9 2
  • 3.分析程式碼:

    • 透過搜尋L1SpawnCmd開啟程式碼。
      1
      src/l1j/server/server/command/executor/L1SpawnCmd.java
    • 56~66行,判斷輸入的參數並去取得NPCid
    • 68~72行,根據取得的id取得NpcTable資料。
    • 並判斷是否有找到NPC,如無則傳送數據回客戶端做顯示找不到符合條件的NPC。
    • NpcTable中的資料來源為,資料表npc,對應的SQL語法如下。
      1
      SELECT * FROM npc
    • 73~75行,根據輸入的參數次數執行迴圈,執行的方法為L1SpawnUtilspawn方法。
    • 後續的語法較為簡單就不在特別分析。
  • 4.分析程式碼:

    • 分析L1SpawnUtilspawn方法。
    • 接下來會比稍微複雜一點點,如果不能夠理解沒關係。
    • 39行,利用_constructorCache建立L1NpcInstance的物件,並用名為npcL1NpcInstance物件接<下方都稱為npc實例>。
    • 接下來都是對這個npc實例做一些值得塞入。
    • 44~66行,塞入該npc實例id、座標(如有設定範圍,會隨機計算出位置)、面向。
    • 67~90行,初步分析為特定怪物為副本所有,所以建立的時候會做一些副本的重置。

      註:這邊沒有特別深入分析,所以可能有誤。

    • 這邊找尋npcid可以看到分別為:
      • 龍之門扉(安塔瑞斯副本)
      • 龍之門扉(法利昂副本)
      • 龍之門扉(林德拜爾副本)
      • 龍之門扉(巴拉卡斯副本)
    • 看來並沒有被實裝完全。

    • 91~92這邊兩行算是這邊最重要的部分。
      • npc實例塞入到世界L1World_allObjects裡面。

        註:基本上在遊戲看到的所有物件都會塞入到這裡面。

      • 將剛剛塞入的npc實例變成可視。

        註:此行跑過以後,在遊戲畫面中就可以看到怪物出現了。

    • 94~110行,就是對應副本的特定變身的怪物處理。

      註:這邊沒有特別深入分析,所以可能有誤。

    • 至於145行那段就是針對史巴托這怪物的處理(遁地)。
    • gfxid取出來對應一下。
    • 119行,怪物是否施放日光術
    • 120行,怪物是否開始說話。
    • 121~125行,怪物的存在時間。

      註:以上三個是初步分析,可能分析錯誤。

結論

  • 程式碼:
    • src/l1j/server/server/command/executor/L1SpawnCmd.java
      • 處理客戶端來的GM指令spawn的處理。
    • src/l1j/server/server/utils/L1SpawnUtil.java
      • 產生怪物的時候提供的方法工具。

結語

這邊分析後可以知道再創建的時候,基本上都是去_constructorCache取得實例,在對此實例做修改;
最後要記得將實例放回L1World_allObjects裡面,並將其變成可視。

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

免責聲明

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