Like Share Discussion Bookmark Smile

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

天堂私服 | GM指令分析 (贈送)「L1J版」

章節用意

present的指令,此指令用於贈送指定的物品給指定帳號或是全部的帳號,該操作可以思考套用在推廣、首次加入Line..等等,給客服人員操作給予特定玩家帳號獎勵。

核心版本

  • L1J-3.80c

分析

在開始分析前,要知道GM指令的指令效果與使用方式,才方便開啟除錯(Debug)進行分析。

效果:創建一個物品並將其放入個人倉庫;對於無法強化的物品,指定強化的數值將被忽略。
範例:

1
.present ${帳號} ${道具編號} ${強化等級} ${數量}

註:帳號填入*等於所有帳號,另外程式碼中提示的參數順序是錯誤的,上方為正確的。

  • 1.分析資料表:

    • 先進入commands表,找到present的指令。
    • class_nameL1Present
  • 2.指令的分析:

    • 啟動模擬器除錯模式,並啟動天堂遊戲登入兩個帳號。
      1
      2
      線上GM
      路人甲
    • 首先確認路人甲道具欄倉庫的內容。
    • 倉庫無任何物品、身上無歐西斯匕首
    • 線上GM使用贈送的GM指令,指定送一把+10 歐西斯匕首MoroseJJ的(路人甲)帳號。
      1
      .present MoroseJJ 1 10 1
    • 再次確認路人甲道具欄倉庫的內容。
    • 倉庫依舊無任何物品、身上無歐西斯匕首
    • 路人甲重新登入。
    • 再次確認路人甲道具欄倉庫的內容。
    • 倉庫已經有歐西斯匕首
    • 歐西斯匕首領取並鑑定。
    • 至此可以確認贈送指令,是將物品放置倉庫內。
  • 3.分析程式碼:

    • 透過搜尋L1Present開啟程式碼。
      1
      src/l1j/server/server/command/executor/L1Present.java
    • 36~46行,在取得傳入的指令參數,再用itemId查找物品是否存在。

      註:這段程式碼不再特別說明,基本上不難。

    • 48行,為主要的邏輯操作,可見使用的是L1DwarfInventorypresent方法。

      註:Dwarf = 侏儒,表示是個人倉庫的物件。

    • Ctrl鍵壓住,再左鍵點擊present方法即會開啟跳轉到物件與方法位置。
    • 197~208行,根據指令參數,判斷是否為*做不同的SQL語法查詢,最後將取得的account存放在一個accountList物件內。
    • 注意到210行,在呼叫了一個present方法。
    • Ctrl鍵壓住,再左鍵點擊present方法即會開啟跳轉到物件與方法位置。
    • 該段程式碼過長,直接講述內容行為:
      • 判斷itemId查找物品是否存在。
      • 判斷物品是否為可堆疊的物品。
      • 寫入資料表character_warehouse內。
    • SQL語法:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      INSERT INTO character_warehouse 
      SET id = ?,
      account_name = ?,
      item_id = ?,
      item_name = ?,
      count = ?,
      is_equipped = 0,
      enchantlvl = ?,
      is_id = ?,
      durability = ?,
      charge_count = ?,
      remaining_time = ?,
      last_used = ?,
      bless = ?,
      attr_enchant_kind = ?,
      attr_enchant_level = ?,
      firemr = ?,
      watermr = ?,
      earthmr = ?,
      windmr = ?,
      addsp = ?,
      addhp = ?,
      addmp = ?,
      hpr = ?,
      mpr = ?,
      m_def = ?
    • 對於每個欄位的用處:< ? 表示目前不確定用處 >
      • id = 流水號
      • account_name = 遊戲帳號
      • item_id = 物品號
      • item_name = 物品名
      • count = 數量
      • is_equipped = 物品是否已裝備。
      • enchantlvl = 強化等級
      • is_id = 是否已鑑定
      • durability = 耐久度(損壞度)
      • charge_count = ?
      • remaining_time = 剩餘時間
      • last_used = ?
      • bless = 祝福
      • attr_enchant_kind = 屬性強化種類(1 = 地, 2 = 火, 4 = 水, 8 = 風)
      • attr_enchant_level = 屬性強化等級(1~3)
      • firemr = ?
      • watermr = ?
      • earthmr = ?
      • windmr = ?
      • addsp = ?
      • addhp = ?
      • addmp = ?
      • hpr = ?
      • mpr = ?
      • m_def = ?
    • 部分欄位尚未確認功能,所以用?表示。
    • 到此基本上就對贈送的指令分析完成。

結論

  • 程式碼:
    • src/l1j/server/server/command/executor/L1Present.java
      • 處理客戶端來的GM指令present的處理。
    • src/l1j/server/server/model/L1DwarfInventory.java
      • 提供針對倉庫操作的一些方法。

結語

贈送的指令,分析過後,可以初步了解操作玩家倉庫的方法,之後要節日贈送或是客服使用,甚至是自動化每天登入送贈品都可以參考使用。
另外remaining_time這個欄位,可以用運在限時使用的物品,就像是蠟燭,當被使用時,可使用時間將會慢慢扣除。

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

免責聲明

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