HowToAddItemsStendhal
Template:Navigation for Stendhal Extenders
您可以通過幾個非常簡單的步驟將新物品添加到遊戲中:
準備工作[編輯]
如Stendhal on Eclipse中所述設置開發環境。
編輯items.xml文件[編輯]
所有items.xml 文件在 /data/conf/items/ directory.路徑下,它們是按照「等級」(見下文)排列的,例如盾牌,劍,鑰匙,食物等。 該文件包含遊戲中所有物品的描述。 讓我們從如何做武器開始,例如在swords.xml文件中:
<item name="dagger"> <type class="sword" subclass="dagger" tileid="-1"/> <description>You see a dagger, it is little more than decorative but you can jab pretty fast with it.</description> <implementation class-name="games.stendhal.server.entity.item.Item"/> <attributes> <atk value="8"/> <rate value="3"/> </attributes> <weight value="0.2"/> <value value="8533"/> <equipable> <slot name="bag"/> <slot name="lhand"/> <slot name="rhand"/> </equipable> </item>
了解它是如何工作的很重要。
我們必須給該項目起一個名字,並在「item」標籤中完成。 然後,我們在「 type」標籤上指定類和子類。如果您檢查子畫面在客戶端的結構方式,您將意識到它的方式類似於:
sprites/ items/ class/ subclass.png
這樣,我們可以將單個GFX重新用於不同的項目。例如:小刀+1,舊刀,精靈刀... 我們在「 description」標籤中為商品提供了一個很好的描述(玩家何時進行「Look」查找)。
除非該項目是可堆疊的,否則應該從上方複製實現標籤,在這種情況下,請使用:
<implementation class-name="games.stendhal.server.entity.item.StackableItem"/>
在「屬性」標籤內,您可以指定武器具有的屬性:
- ATK - 它是與物品可能造成的傷害成比例的值。
- DEF - 是與物品可以阻擋多少傷害成正比的值。
- RATE - 是使用進攻性武器打擊的速度。
- RATE 1表示您可以打每一回合,RATE 10表示每10個回合只能打一次。
- RATE必須大於0,但沒有上限。 (在stendhal,我們擁有的最低速度武器是15)
- 只有進攻性武器才能達到目標
- RANGE-是遠距離攻擊屬性武器,例如弓箭和長矛等射彈。
- 射程越大,武器越有效。
- QUANTITY - 是箭頭和長矛等可堆疊武器的屬性(設置為1)
- LIFESTEAL - 是進攻性武器的特殊屬性。
- 它必須是介於-1和1之間的數字。
- 生命武器造成的任何攻擊傷害都會在恢復生命值時「回血」給玩家
- 吸血能力為0.2的武器會向玩家造成敵人的傷害值回復20%的生命值。
- 負面吸血會根據玩家對敵人造成的傷害來消耗其生命值。
對於食品,飲料,藥水和毒藥,其屬性為:
- AMOUNT - 該物品恢復的總HP(有毒物品為負)
- REGEN - 一次可以治癒多少水(藥水應該等於AMOUNT,毒藥應該是負數)
- FREQUENCY - 修復的速度(數字越小表示速度越快,藥水選擇1)
- QUANTITY - 應該使用(設置為1)它們都是可堆疊的項目。
請注意,飲料課上會使用藥水和毒藥(和解毒劑)。 解毒劑有:
- AMOUNT - 他們保護您免受毒藥的時間(例如,解毒劑為400,更大的為800)
- REGEN 等於0
- FREQUENCY 等於1
- QUANTITY 等於1
對於滾動(其中大多數是傳送滾動),請遵循scrolls.xml中的示例以了解要使用的實現。 標記滾動的屬性INFOSTRING是滾動的目的地,例如
<infostring value="0_nalwor_city 40 60"/>
對於召喚捲軸,INFOSTRING是生物名稱,但是實現
<implementation class-name="games.stendhal.server.entity.item.scroll.SummonScroll"/>
會處理此問題,因此您無需設置它。
那應該是所有特殊項目。 許多物品(例如藥草,鑰匙,木材,金錢)將沒有屬性,或者除了數量之外沒有屬性。
最後,您需要指定可以在哪裡裝備該物品:
- 左手(rhand)
- 右手(lhand)
- 盔甲(armor)
- 頭部(head)
- 大腿(legs)
- 披風(cloak)
- 手指(finger)
- 腳部(feet)
- 鑰匙圈(keyring)
- 背包(bag)
除非您有充分的理由玩家不必攜帶這些物品,否則所有物品都應裝在背包中。如果玩家想要拆分籌碼,則所有可堆疊的物品都應裝備在左手和右手。儘管在stendhal中,我們繪製了盾牌和劍在角色窗口上的位置圖,但我們確實允許玩家用兩隻手來裝備盾牌和武器。戒指可以戴在手指上,但在鑰匙圈和背包中也很容易攜帶。
添加GFX[編輯]
現在將32x32精靈放置在文件夾中data/sprites/items/<class>/<subclass>.png
另請參見 如何知道物品的圖形規格
如果您想讓物品的圖像動起來(例如賺錢),只需製作一個32N x 32的精靈即可。 例如。 如果動畫中有5幀,它將是160 x 32的精靈。 它將自動顯示動畫。
註冊類[編輯]
到目前為止,我們已經定義了伺服器的外觀。註冊該類將告訴客戶端該如何處理。(它是可堆疊的,應該顯示數字嗎?是否可以使用,並且應該顯示用途?)大多數類已經註冊,您可能可以忽略本節...繼續查找以查找。
默認情況下,物料將表現為客戶端不可堆疊,不可使用的物料。這包括盔甲,武器和大多數不變的物品。可堆疊但不能使用的類別按類別註冊,例如金錢,飛彈,草藥等。大多數可用物品(例如食物,飲料)都註冊為整個類。因此,如果您要添加到任何現有的類中,則很可能會忽略以下所有這些內容。如果無法解決問題,請回來...就像您期望能夠使用您的新產品而不能使用一樣。或者,如果您要添加一個全新的類。
因此,如果您有一個新類,並且希望它是可堆疊的或可使用的,或者是一個全新的客戶端對象,擴展Item,</ small>,則為您的類添加類型(項目),類和您選擇的類其餘行為在rc / games / stendhal / client / entity / factory / EntityMap.java中,例如
// flower was a new class of stackables register("item", "flower", null, StackableItem.class); // drink was a new class of Useables register("item", "drink", null, UseableItem.class); // Box is a new client side object register("item", "box", null, Box.class);
如果您的商品屬於可堆疊和不可堆疊或可使用和不可使用的類的一部分,該怎麼辦?請記住,默認值是不可堆疊和不可使用的。因此,您需要分別註冊特殊的。這是通過類型(項目),類(如前)以及子類(與xml中的子類)完成的,以指定您要指的是哪個確切項目。
// most tools don't have a Use but the sugar mill should. the subclass in xml is sugarmill register("item", "tool", "sugarmill", UseableItem.class);
最後,僅當您需要添加到上面的EntityMap時,轉到src / games / stendhal / client / gui / j2d / entity / EntityViewFactory.java並以相同的方式配置項目。例子是
// flower was a new class of stackables register("item", "flower", null, StackableItem2DView.class); // drink was a new class of Useables register("item", "drink", null, UseableItem2DView.class); // Box is a new client side object register("item", "box", null, Box2DView.class);
// most tools don't have a Use but the sugar mill should. the subclass in xml is sugarmill register("item", "tool", "sugarmill", UseableItem2DView.class);
添加語法[編輯]
項目名稱應簡短且足以識別該項目,但是在口語和書面英語中,可能會有一些額外的單詞與該項目相關。例如,卡門應該提供「100瓶藥水」而不是「100瓶」。 (在此處添加npc文本示例嗎?)
一些例子:
potion | bottle of potion |
leather legs | pair of leather legs |
wine | glass of wine |
plate armor | suit of plate armor |
meat | piece of meat |
要將這樣的語法前綴添加到NPC語音和語音識別中,請編輯src/games/stendhal/common/grammar/PrefixManager.java. Template:TODO
加入遊戲[編輯]
生物掉落[編輯]
您可以讓一個生物掉落您新製造的物品。通過在文件位置中的XML文件中編輯該生物來完成此操作projects/stendhal/data/conf/creatures.遊戲中的每個生物都位於該文件夾中,並按生物類型分類。 例如,可以在文件中找到老鼠projects/stendhal/data/conf/creatures/animal.xml.
添加到地圖或種植者[編輯]
您可能希望在地圖上添加物品(供玩家拾取或收穫)。您可以通過創建Java文件來添加區域(適用於一次性項目,例如Haizen小屋中的毒藥和Haizen桌子的滾動條),也可以使用tiled添加,這在開始時比較繁瑣,但允許您將內容添加到tileed中的對象層 將來一次又一次。(非常適合從地面,草藥等收集鐵礦石)。這需要有關生成器(也稱為種植者)的完整教程,請參閱HowToAddGrowers。
由NPC出售[編輯]
如果尚未創建NPC,則可以編碼新的NPC。然後,您將需要在NPC中添加賣方行為,這應該單獨討論。在完成此操作之前,請在原始碼中查看賣方示例,例如Semos Tavern中的Margaret。該文件是src/games/stendhal/server/maps/semos/tavern/BarMaidNPC.java.如果NPC在了解項目名稱方面有任何問題,則可能需要檢查How to test NPC Parser。
由NPC生產[編輯]
如果尚未創建NPC,則可以code a new NPC。您將需要向NPC添加生產者行為,應單獨進行介紹。在完成此操作之前,請在原始碼中查看Producer示例,例如Ados Bakery中的Arlindo。該文件是 src/games/stendhal/server/maps/ados/bakery/BakerNPC.java. 如果您對NPC理解項目名稱有任何疑問,您可能需要檢查How to test NPC Parser。
物品任務和任務獎勵[編輯]
也許您會希望NPC為玩家裝備一件物品,作為任務的一部分,請參閱HowToCreateQuests。 您還可以將您的物品添加到Daily Item quest或Weekly item quest中,這些物品與世界各地的外觀有關(例如稀有物品? )。