天堂私服 | GM指令分析 (創立道具)「L1J版」
章節用意
item的指令,此指令是生成物品,對於無法附魔的物品,指定數量的附魔將被忽略。進而了解到物品的一些屬性和程式碼,加以學習用於兌換物品…等等。
核心版本
- L1J-3.80c
分析
在開始分析前,要知道GM指令的指令效果與使用方式,才方便開啟除錯(Debug)進行分析。
效果:創建一個項目;對於無法強化的物品,指定強化等級的數值將被忽略;如果您指定名稱,則將設置找到的第一個物品名稱。
範例:
1 | .item ${物品名稱} ${數量} ${強化等級} ${鑑定狀態} ${武器屬性} ${屬性等級} |
1.分析資料表:
- 先進入
commands表,找到item的指令。 class_name是L1CreateItem。
- 先進入
2.分析程式碼:
- 透過搜尋
L1CreateItem開啟程式碼。1
src/l1j/server/server/command/executor/L1CreateItem.java

45~66行可以看到取得傳入的arg去解析對應的參數 -nameid= 物品名稱。count= 數量。enchant= 強化等級。isId= 鑑定狀態。attr= 武器屬性。attLevel= 屬性等級。
67~77行,針對傳入的nameid,- 看是否為數字(轉型)。
- 如果不為數字則從
ItemTable中找尋是否有存在的資料庫Item的相關資料,取得itemId。
etcitemweaponarmor
- 如果不為數字則從
- 判斷是否有找到物品,如無則傳送數據回客戶端做顯示
找不到符合條件項目。。
- 判斷是否有找到物品,如無則傳送數據回客戶端做顯示
- 透過搜尋
3.分析程式碼:(針對可堆疊物品分析)

78行,將物品資料取出。79行,物品是否存在,如無則傳送數據回客戶端做顯示指定的道具編號不存在。80行,判斷該物品是否是可以堆疊的物品。81行,去建立一個L1ItemInstance。註:可以深入
createItem方法,大致了解物件的Id產生方式,還有對L1World的更新。83~84行,針對物品設定為沒有強化、數量。註:堆疊物品基本上是沒有強化的。
85~87行,判斷是否要將物品設定為鑑定狀態。88行,用於檢查物品是否可以新增在物品欄內。- 容量確認。(不可超過
180樣物品) - 重量卻認。(不可超過負重上限<角色能力/裝備>皆會影響)
- 數量確認。(不可超過2000000000<主要避免金弊大於
Integer上限>)
- 容量確認。(不可超過
89行,產生物品於物品欄內。- 此
storeItem方法,還有判斷物品是否為競賽票、旅館鑰匙、松木魔杖、烏木魔杖、楓木魔杖、軍馬頭盔…等等做一些處理。 - 對資料庫中的
character_items資料表寫入。
- 此
- 最後傳送數據回客戶端做顯示
獲得 xxx。
3.分析程式碼:(針對不可堆疊物品分析)
- 基本上行為差不多與可堆疊的分析差不多,這邊只會把一些重點分析列出來:
Type2的定義:0=L1EtcItem1=L1Weapon2=L1Armor
Type的定義:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[etcitem]
0:arrow, 1:wand, 2:light, 3:gem, 4:totem, 5:firecracker,
6:potion, 7:food, 8:scroll, 9:questitem, 10:spellbook,
11:petitem, 12:other, 13:material, 14:event, 15:sting,
16:treasure_box, 17:magic_doll, 18:spellscroll, 19:spellwand,
20:spellicon, 21:protect_scroll
[weapon]
1:sword, 2:twohandsword, 3:dagger, 4:bow, 5:arrow, 6:spear,
7:blunt, 8:staff, 9:claw, 10:dualsword, 11:gauntlet, 12:sting,
13:chainsword, 14:kiringku
[armor]
1:helm, 2:t_shirts, 3:armor, 4:cloak, 5:glove, 6:boots, 7:shield,
8:guarder, 10:amulet, 11:ring, 12:earring, 13:belt,
14:pattern_back, 15:pattern_left, 16:pattern_right,
17:talisman_left, 18:talisman_right註:該定義與資料庫的對應轉換是在
src/l1j/server/server/datatables/ItemTable.java內66~213行定義的。
4.分析程式碼:(針對飾品類)
99~142行,程式碼如下: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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46if ((item.getItem().getType2() == 2) &&
(item.getItem().getType() >= 8 && item.getItem().getType() <= 12)) { // 飾品類
boolean award = false;
for (int i = 0; i < enchant; i++) {
if (i == 5) {
award = true;
} else {
award = false;
}
switch (item.getItem().getGrade()) {
case 0: // 上等
// 四屬性 +1
item.setFireMr(item.getFireMr() + 1);
item.setWaterMr(item.getWaterMr() + 1);
item.setEarthMr(item.getEarthMr() + 1);
item.setWindMr(item.getWindMr() + 1);
// LV6 額外獎勵:體力與魔力回復量 +1
if (award) {
item.setHpr(item.getHpr() + 1);
item.setMpr(item.getMpr() + 1);
}
break;
case 1: // 中等
// HP +2
item.setaddHp(item.getaddHp() + 2);
// LV6 額外獎勵:魔防 +1
if (award) {
item.setM_Def(item.getM_Def() + 1);
}
break;
case 2: // 初等
// MP +1
item.setaddMp(item.getaddMp() + 1);
// LV6 額外獎勵:魔攻 +1
if (award) {
item.setaddSp(item.getaddSp() + 1);
}
break;
case 3: // 特等
// 功能台版未實裝。
break;
default:
break;
}
}
}- 主要是判斷物品的
Grade,來決定物品的飾品級別,並做不一樣的強化處理。 - 主要是強化多
+1,不同飾品級別的裝備會額外增加一些屬性。 - 另外當強化到
+6,也會有不同的額外獎勵屬性。 - 下面附上產生出來
+0~+9的屬性差異的圖。註:為何要特別提到這個部分的程式碼?因為這段程式碼就可以運用在很多特殊裝備的強化,給予額外的屬性獎勵。

5.分析程式碼:(針對武器類)
144~166行,程式碼如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23if (item.getItem().getType2() == 1) { // 武器類
if (attr.equalsIgnoreCase("地") || attr.equalsIgnoreCase("1")) {
if (attLevel > 0 && attLevel <= 3) {
item.setAttrEnchantKind(1);
item.setAttrEnchantLevel(attLevel);
}
} else if (attr.equalsIgnoreCase("火") || attr.equalsIgnoreCase("2")) {
if (attLevel > 0 && attLevel <= 3) {
item.setAttrEnchantKind(2);
item.setAttrEnchantLevel(attLevel);
}
} else if (attr.equalsIgnoreCase("水") || attr.equalsIgnoreCase("4")) {
if (attLevel > 0 && attLevel <= 3) {
item.setAttrEnchantKind(4);
item.setAttrEnchantLevel(attLevel);
}
} else if (attr.equalsIgnoreCase("風") || attr.equalsIgnoreCase("8")) {
if (attLevel > 0 && attLevel <= 3) {
item.setAttrEnchantKind(8);
item.setAttrEnchantLevel(attLevel);
}
}
}- 這邊是針對武器去設定
武器屬性與武器等級。 - 這邊測試過等級
1~3名稱上並沒有變化。
6.分析程式碼:
- 最後的一些程式碼,就不特別提出來了。就是簡單的創建物品的部分。
結論
- 程式碼:
src/l1j/server/server/command/executor/L1CreateItem.java- 處理客戶端來的
GM指令item的處理。
- 處理客戶端來的
src/l1j/server/server/model/L1PcInventory.java- 物品欄的相關資訊與方法。
src/l1j/server/server/datatables/ItemTable.java- 物品的歸類設定值與名稱的對應表。
結語
這個創建物品真的分析起來滿花時間的,因為他關聯的東西滿多的,所以這邊只把一些重點點出來。
最主要是針對飾品和武器,有一些額外的屬性設定的程式碼,是非常值得去分析了解的。
原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章節目錄。
免責聲明
- 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
- 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有。
- 本部落格文章為研究SQL資料庫與修改JAVA語法使用,並非商業用途,亦無做營運事實等任何一切商業行為。
- 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容!
