您当前位置: 天堂123 > 天堂架設 > 私服如何出生送道具物品

私服如何出生送道具物品

2022/6/14

接續前人物出生道具分析/修改 (一)文章。

1.分析資料表:

beginner的表內欄位分析。
根據翻譯大概可以猜測每個欄位的用途。
id:此表的流水號
item_id:物品對應的流水號
count:物品數量設定
charge_count:收費數量<暫時不確定>
enchantlvl:附魔等級,猜測是武器防具+成。
item_name:物品名稱
activate:職業對應
bless:祝福/非祝福

驗證beginner欄位用途
count:物品數量不用特別驗證,在前一篇有修改成功。
charge_count:目前尚不知其用途,先行忽略。
enchantlvl:預期是武器防具的+成。
將法師人物建立後的象牙塔魔杖,enchantlvl的值修改成9
執行下方SQL語法,更新資料。
UPDATE `beginner` SET `enchantlvl` = 9 WHERE `id` = 21;

確認beginner,象牙塔魔杖的enchantlvl是否 = 9。

進入天堂並建立新的人物(法師)。
使用鑑定卷軸,鑑定象牙塔魔杖。
可見象牙塔魔杖是+9。

item_name:稍微做測試就知道沒有效果,基本上物品名稱還是綁定各個物品(etcitem)`武器(weapon)、防具(armor)表內的名稱。
註:修改物品名稱後,需要重新啟動模擬器;因為這些資料是預先載入放到程式內。

bless:預期是設定該物品是否是祝福的。透過0和1來做註記(0 = 祝福, 1 = 一般)
將法師人物建立後的象牙塔魔杖,bless的值修改成0
執行下方SQL語法,更新資料。
UPDATE `beginner` SET `bless` = 0 WHERE `id` = 21;

確認beginner,象牙塔魔杖的enchantlvl是否 = 9。

進入天堂並建立新的人物(法師)。
使用鑑定卷軸,鑑定象牙塔魔杖。
可見象牙塔魔杖是+9,但是並不是祝福的?

2.分析程式碼:

開啟程式碼分析此程式。
src/l1j/server/server/model/Beginner.java
關注程式碼的部分76~100行。
注意82行,這邊是將beginner取得的item_id結果當做值做寫入。
說明:beginner.item_id = character_items.item_id。

注意84行,這邊是將beginner取得的item_name結果當做值做寫入。
說明:beginner.item_name = character_items.item_name。

注意85行,這邊是將beginner取得的count結果當做值做寫入。
說明:beginner.count = character_items.count。

注意87行,這邊是將beginner取得的enchantlvl結果當做值做寫入。
說明:beginner.enchantlvl = character_items.enchantlvl。

注意90行,這邊是將beginner取得的charge_count結果當做值做寫入。
說明:beginner.charge_count = character_items.charge_count。

注意93行,這邊我預期是將beginner取得的bless結果當做值做寫入,但是這邊並沒有!
說明:所以我初步判定這邊是一個Bug,當初沒有寫完善。


分析結論
資料表:
beginner.enchantlvl設定人物建立後所給的基本物品的+成。
beginner.bless設定人物建立後所給的基本物品的祝福狀態。
程式碼:
src/l1j/server/server/model/Beginner.java用於讀取人物建立基本物品/並寫入人物擁有物品的資料。
修改
修復「人物建立後設定物品為祝福但是未生效的Bug」

開啟程式碼。
src/l1j/server/server/model/Beginner.java
修改第93行程式碼。
將原本塞入bless預設為1的程式碼,將beginner取得的bless結果當做值做寫入。
pstm2.setInt(13, rs.getInt("bless"));

修改完畢後,儲存。
點擊Build Project,綠色鐵槌按鈕,快捷鍵為Ctrl + F9。
確認沒任何錯誤。
確認模擬器是已經關閉的狀態。
接續重新編譯jar檔。
重新啟動模擬器。
登入人物建立人物(法師)
使用鑑定卷軸,鑑定象牙塔魔杖。
可見象牙塔魔杖是+9,而且是祝福的。

註:其實聰明的你,如果去看character_items的bless欄位就知道其效果了。

新增金幣

於etcitem找尋金幣對應的item_id
item_id = 40308
SELECT * FROM etcitem WHERE name = '金幣';

於beginner內新增一筆資料對應為全部職業 activate = A
執行下方SQL語法,新增資料。
INSERT INTO `beginner` (`item_id`, `count`, `charge_count`, `enchantlvl`, `item_name`, `activate`, `bless`) VALUES (40308, 10000, 0, 0, '金幣', 'A', 1);

確認beginner是否新增了一筆金幣的資料。

進入天堂並建立新的人物(法師)。
可以看到身上已經有金幣一萬了。

新增加速藥水

於etcitem找尋名稱內有加速對應的物品清單。
找尋我們想要的物品item_id,這邊選擇象牙塔加速藥水。
item_id = 40030
SELECT * FROM etcitem WHERE name LIKE '%加速%';

於beginner內新增一筆資料對應為全部職業 activate = A
執行下方SQL語法,新增資料。
INSERT INTO `beginner` (`item_id`, `count`, `charge_count`, `enchantlvl`, `item_name`, `activate`, `bless`) VALUES (40030, 10, 0, 0, '象牙塔加速藥水', 'A', 1);

確認beginner是否新增了一筆象牙塔加速藥水的資料。

進入天堂並建立新的人物(法師)。
可以看到身上已經有象牙塔加速藥水十罐了。