Like Share Discussion Bookmark Smile

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

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

章節用意

summon的指令,此指令用於召喚寵物,或許可以實裝更多道具召喚特別的NPC寵物。

核心版本

  • L1J-3.80c

前言

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

分析

效果:召喚一個馴服的NPC。如果您指定名稱,則將設置找到的第一個名稱。
範例:

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

    • 先進入commands表,找到summon的指令。
    • class_nameL1Summon
    • 再進入npc表,找到安塔瑞斯的編號 = 45682,用於待會召喚用。
      1
      SELECT * FROM `npc` WHERE `name` = '安塔瑞斯';
  • 2.指令的分析:

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

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

    • 分析L1SummonInstance建構子方法。
    • 首先L1SummonInstance繼承了L1NpcInstance
    • 傳入的參數為L1Npc templateL1Character 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

結語

分析過後可以對召喚、寵物,有一些基本的了解。其實跟召喚怪物是差不多的。
主要是多了寵物的一些控制,還有解散的時候的一些處理。

當然其中可以知道寵物死掉或是解散的時候的一些額外判斷和操作,像是寵物身上物品的處理。

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

免責聲明

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