JakDodacPrzedmiotyDoPolanieOnLine: Różnice pomiędzy wersjami

Z PolanieOnLine
Skocz do: nawigacja, szukaj
(Utworzono nową stronę "{{Navigation for Stendhal Top}} {{Navigation for Stendhal Extenders}} You can add new item to game in a few very simple steps: == Preparation == Setup a development en...")
 
 
(Nie pokazano 4 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
{{Navigation for Stendhal Top}}
+
{{Nawigacja dla PolanieOnLine Top}}
{{Navigation for Stendhal Extenders}}
+
{{Nawigacja dla PolanieOnLine Extenders}}
You can add new item to game in a few very simple steps:
+
Możesz dodać nowy przedmiot do gry w kilku bardzo prostych krokach:
  
== Preparation ==
+
== Przygotowanie ==
  
Setup a development environment as described in [[Stendhal on Eclipse]].
+
Skonfiguruj środowisko programistyczne zgodnie z opisem w [[PolanieOnLine na Eclipse]].
  
==Edit items.xml==
+
==Edycja przedmioty.xml==
All ''items''.xml files are located in the /data/conf/items/ directory. They are arranged according to ''class'' (see below) such as shields, swords, keys, food, etc.
+
Wszystkie pliki ''przedmioty''.xml zlokalizowane są w folderze ''/data/conf/items/''. Są ułożone według ''klasy'' (patrz poniżej), np: tarcze, miecze, klucze, żywność itp...
The file contains all the description of the items in game.
+
Plik zawiera wszystkie opisy przedmiotów w grze.
Lets start with how to do weapons, for example in swords.xml:
+
Zacznijmy od tego, jak robić broń, na przykład w ''daggers.xml'':
 
<pre>
 
<pre>
   <item name="dagger">
+
   <item name="sztylecik">
 
     <type class="sword" subclass="dagger" tileid="-1"/>
 
     <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>
+
     <description>Oto sztylecik. Bardziej służy za dekorację, ale możesz nim dość szybko dźgnąć.</description>
     <implementation class-name="games.stendhal.server.entity.item.Item"/>   <attributes>
+
     <implementation class-name="games.stendhal.server.entity.item.Item"/>
 +
    <attributes>
 
       <atk value="8"/>
 
       <atk value="8"/>
 
       <rate value="3"/>
 
       <rate value="3"/>
Linia 29: Linia 30:
 
</pre>
 
</pre>
  
It is important to understand how it works.
+
Ważne jest, aby zrozumieć, jak to działa.
  
We must give a name to the item and it is done in the ''item'' tag.
+
Musimy nadać przedmiotowi nazwę i jest to robione w tagu ''item''.
Then we specify the class and the subclass on the ''type'' tag. If you check the way sprites are structure at client you will realize that it is in a similar fashion to:
+
Następnie określamy klasę i podklasę w tagu ''type''. Jeśli sprawdzisz ścieżkę obrazka w kliencie, zdasz sobie sprawę, że wygląda to podobnie do:
  
 
   sprites/
 
   sprites/
 
       items/
 
       items/
           class/
+
           klasa/
               subclass.png
+
               podklasa.png
  
This way we can reuse a single GFX for different items. For example: knife+1, old knife, elvish knife, ...
+
W ten sposób możemy ponownie użyć jednego GFX dla różnych elementów. Na przykład: nóż + 1, stary nóż, elficki nóż, ...
We give the item a nice description (for when the player does '''Look''') inside the ''description'' tag.
+
Dajemy elementowi ładny opis (gdy gracz kliknie '''Zobacz''') wewnątrz tagu ''description''.
  
The implementation tag should be copied from above, unless the item is stackable, in which case use:
+
Znacznik implementacji należy skopiować z góry, chyba że element można układać w stosy, w takim przypadku użyj:
  
 
<pre>
 
<pre>
Linia 48: Linia 49:
 
</pre>
 
</pre>
  
Inside the ''attributes'' tag you can specify the attributes the weapon has:
+
Gdy status przedmiotu może zostać zmieniony np: poprzez niszczenie się jego stanu, wtedy zastosuj:
* ATK it is a value proportional to the damage the item can do.  
+
 
* DEF it is a value proportional to how much damage the item can block.
+
<pre>
* RATE is how fast you can hit with an offensive weapon.  
+
    <implementation class-name="games.stendhal.server.entity.item.BreakableItem"/>
:RATE 1 means you can hit every turn, RATE 10 means only once every 10 turns.
+
</pre>
:RATE must be greater than 0 but has no upper limit. (In stendhal the slowest rate weapon we have is 15)
+
 
:Only offensive weapons have a rate.
+
Wewnątrz tagu ''atrybuty'' możesz określić atrybuty broni:
* RANGE is an attribute of attack - from - a - distance weapons like bow and arrow, or projectiles like spears.
+
* ATK jest to wartość proporcjonalna do szkody, jaką przedmiot może wyrządzić.
: The larger the range the further the weapon is effective from.
+
* DEF (OBR) jest to wartość proporcjonalna do tego, ile uszkodzeń może zablokować przedmiot.
* QUANTITY is an attribute for stackable weapons like arrows and spears (set to 1)
+
* RATE (WAGA) to jak szybko możesz trafić bronią ofensywną.
* LIFESTEAL is a special attribute for offensive weapons.  
+
:WAGA 1 oznacza, że ​​możesz trafić w każdej turze, WAGA 10 oznacza tylko raz na 10 tur.
: It must be a number between -1 and 1.
+
:WAGA musi być większa niż 0, ale nie ma górnej granicy. (W POL najwolniejszą broń jaką mamy to 15)
: Any attack damage caused by a lifesteal weapon is 'refunded' to the player as healing HP
+
:Tylko broń ofensywna ma wagę.
: A weapon with lifesteal 0.2 returns 20% HP to player of the damage they cause their enemy.
+
* RANGE (ZASIĘG) jest atrybutem ataku broni dystansowej, takiej jak łuk i strzała, lub pocisków, takich jak włócznie oraz różdzki i magie.
: Negative lifesteal drains the HP of a player according to the damage they cause their enemy.
+
: Im większy zasięg, tym broń jest skuteczniejsza.
 +
* QUANTITY (ILOŚĆ) to atrybut broni, którą można układać w stosy, takich jak strzały i włócznie (ustawiona na 1)
 +
* LIFESTEAL (KRADZIEŻ ŻYCIA) to specjalny atrybut broni ofensywnej.
 +
: Musi to być liczba z przedziału od -1 do 1.
 +
: Wszelkie obrażenia od ataku zadane bronią kradzieży życia są „zwracane” graczowi jako leczące PŻ
 +
: Broń z kradzieżą życia 0,2 przywraca graczowi 20% PŻ obrażeń, jakie zadają wrogowi.
 +
: Ujemna kradzież życia wysysa HP gracza zgodnie z obrażeniami, jakie zadają wrogowi.
  
  
For foods, drinks, potions and poisons the attributes are:  
+
W przypadku żywności, napojów, mikstur i trucizn te atrybuty są następujące:
* AMOUNT - the total HP which the item restores (negative for poisonous items)
+
* AMOUNT - całkowite PŻ, które przywraca przedmiot (ujemne dla trujących przedmiotów)
* REGEN - how much you are healed at a time (for potions this should be equal to AMOUNT, for poisons should be negative)
+
* REGEN - ile jesteś leczony na raz (dla mikstur powinno to być równe AMOUNT, dla trucizn powinno być ujemne)
* FREQUENCY - how fast you are healed (lower number means faster, choose 1 for potions)
+
* FREQUENCY - jak szybko jesteś uzdrowiony (mniejsza liczba oznacza szybciej, wybierz 1 dla mikstur)
* QUANTITY - should be used (set to 1) they are all stackable items.
+
* QUANTITY - powinny być używane (ustawione na 1), wszystkie można układać w stosy.
Note that potions and poisons (and antidotes) go in the drinks class.
+
Zwróć uwagę, że mikstury i trucizny (i antidotum) są dostępne na klasie ''drinks''.
Antidotes have:
+
Odtrutki mają:
* AMOUNT - how long they protect you from poison (e.g. antidote is 400, greater is 800)
+
* AMOUNT - jak długo chronią cię przed trucizną (np. antidotum to 400, większe to 800)
* REGEN equal to 0
+
* REGEN równa 0
* FREQUENCY equal to 1
+
* FREQUENCY równa 1
* QUANTITY equal to 1
+
* QUANTITY równa 1
  
For scrolls, most of which are teleport scrolls, follow the examples in scrolls.xml for what implementation to use. The attribute INFOSTRING for marked scrolls is the destination of the scroll, e.g.  
+
W przypadku zwojów, z których większość to zwoje teleportacyjne, postępuj zgodnie z przykładami w scrolls.xml, aby wybrać implementację. Atrybut INFOSTRING dla zaznaczonych zwojów to miejsce docelowe zwoju, np.
 
<pre>
 
<pre>
 
  <infostring value="0_nalwor_city 40 60"/>
 
  <infostring value="0_nalwor_city 40 60"/>
 
</pre>
 
</pre>
For summon scrolls the INFOSTRING is the creature name, but the implementation 
+
W przypadku zwojów przywołania INFOSTRING to nazwa stworzenia, lecz implementacja
 
<pre>
 
<pre>
 
  <implementation class-name="games.stendhal.server.entity.item.scroll.SummonScroll"/>  
 
  <implementation class-name="games.stendhal.server.entity.item.scroll.SummonScroll"/>  
 
</pre>
 
</pre>
takes care of this, so you do not set it.  
+
dba o to, więc nie ustawiasz tego.
  
That should be all the special items dealt with. Many items (e.g. herb, key, wood, money) would have no attributes, or no attributes except quantity.
+
To powinny być wszystkie oferowane przedmioty specjalne. Wiele przedmiotów (np. zioła, klucze, drewno, pieniądze) nie miałoby żadnych atrybutów lub atrybutów poza ilością.
  
Finally you need to specify where the item can be equipped:
+
Na koniec musisz określić, gdzie można wyposażyć przedmiot:
 
* rhand
 
* rhand
 
* lhand
 
* lhand
Linia 97: Linia 104:
 
* cloak
 
* cloak
 
* finger
 
* finger
 +
* fingerb
 +
* pas
 
* feet
 
* feet
 
* keyring
 
* keyring
 
* bag
 
* bag
  
All items should be equippable in bag, unless you have a good reason that players shouldn't be allowed to carry them. All stackable items should be equippable in rhand and lhand in case the player wants to split stacks. And although in stendhal we have the drawing of where the shield and sword should go on the character window, we do allow players to equip shield, and weapon in either hand. Rings go on the finger, but also in keyring and and bag for ease of carrying.
+
Wszystkie przedmioty powinny znajdować się w torbie, chyba że masz dobry powód, dla którego gracze nie powinni mieć możliwości ich noszenia. Wszystkie przedmioty, które można układać w stosy, powinny być wyposażone w rhand i lhand na wypadek, gdyby gracz chciał podzielić stosy. I chociaż w PolanieOnLine mamy rysunek, gdzie tarcza i miecz powinny iść w oknie postaci, pozwalamy graczom wyposażyć się w tarczę i broń w obu rękach. Pierścionki zakładane są na palec, ale także w rzemyku i torbie dla ułatwienia przenoszenia.
  
= Add GFX=
+
= Dodanie GFX =
  
Now place the 32x32 sprite in the folder '''data/sprites/items/<class>/<subclass>.png'''
+
Teraz umieść sprite 32x32 w folderze '''data/sprites/items/<klasa>/<podklasa>.png'''
  
See also [[StendhalRefactoringGraphics#Items| How to know graphics specifications for items]]
+
Zobacz także [[PolanieOnLine Refaktoryzacja Grafiki#Przedmioty | Jak poznać specyfikacje graficzne przedmiotów]]
  
If you want your item image animated (like money) simply make a 32N x 32 sprite. E.g. if it has 5 frames in the animation it will be a 160 x 32 sprite. It will automatically appear animated.
+
Jeśli chcesz, aby obraz przedmiotu był animowany (jak pieniądze), po prostu utwórz sprite'a 32N x 32. Na przykład. jeśli ma 5 klatek w animacji, będzie to sprite 160 x 32. Automatycznie pojawi się animacja.
  
= Register the class =
+
= Rejestracja klasy =
So far we have defined what the item is like to the server. Registering the class tells the client what to do with it. (Is it stackable and should have numbers displayed, is it useable and should have a Use displayed?) '''Most classes are already registered and you may be able to ignore this section... read on to find out.'''
+
Do tej pory zdefiniowaliśmy, jaki element jest podobny do serwera. Zarejestrowanie klasy mówi klientowi, co z nią zrobić. (Czy można go układać w stosy i powinien mieć wyświetlane liczby, czy jest użyteczny i powinien mieć wyświetlane ''użycie''?) '''Większość klas jest już zarejestrowana i możesz zignorować tę sekcję... czytaj dalej, aby się dowiedzieć.'''
  
Items will default to behave as a non stackable, non useable Item to the client. This covers armor, weapons, most items that don't change. Stackable but non useable classes get registered by class i.e. money, missiles, herbs etc. And most Useable items like food, drink, are registered as a whole class. So if you are adding to any existing class you very likely can ignore all this following stuff. Just come back if something doesn't work... like you expected to be able to use your new item and can't. Or if you are adding a totally new class.
+
Przedmioty będą domyślnie zachowywać się dla klienta jak przedmiot nie nadający się do układania w stos i nie nadający się do użytku. Dotyczy to zbroi, broni i większości przedmiotów, które się nie zmieniają. Klasy nadające się do układania w stosy, ale nie nadające się do użytku, są rejestrowane według klasy, tj. pieniądze, amunicja, zioła itp. Większość przedmiotów użytkowych, takich jak żywność, napoje, jest rejestrowanych jako cała klasa. Więc jeśli dodajesz do jakiejkolwiek istniejącej klasy, najprawdopodobniej możesz zignorować wszystkie następujące rzeczy. Po prostu wróć, jeśli coś nie działa... tak jak oczekiwałeś, że będziesz mógł użyć nowego przedmiotu, a nie możesz. Lub jeśli dodajesz zupełnie nową klasę.
  
So, if you have a new class and you want it to be stackable or useable <small>or is a totally new client side object, extending Item,</small> then add your class with type (item), class and your chosen behaviour to the rest in ''src/games/stendhal/client/entity/factory/EntityMap.java'', e.g.
+
Tak więc, jeśli masz nową klasę i chcesz, aby można ją było układać w stosy lub używać <small>lub jest to całkowicie nowy obiekt po stronie klienta, rozszerzający przedmiot</small>, dodaj swoją klasę z typem (przedmiotem), klasą i wybranym zachowanie do reszty w ''src/games/stendhal/client/entity/factory/EntityMap.java'', np.
  
 
<source lang = "java">
 
<source lang = "java">
  // flower was a new class of stackables
+
  // ''Flower'' był nową klasą sztaplowanych przedmiotów
 
  register("item", "flower", null, StackableItem.class);
 
  register("item", "flower", null, StackableItem.class);
  // drink was a new class of Useables
+
  // ''Drink'' były nową klasą przedmiotów użytkowych
 
  register("item", "drink", null, UseableItem.class);
 
  register("item", "drink", null, UseableItem.class);
  // Box is a new client side object
+
  // ''Box'' to nowy obiekt po stronie klienta
 
  register("item", "box", null, Box.class);
 
  register("item", "box", null, Box.class);
 
</source>
 
</source>
  
What if your item is part of a class which has a mixture of stackable and non stackable or useable and non useable? Remember the default is non stackable and non useable. So then you need to register the special ones individually. This is done by type (item), class, as before, and also subclass (same as in the xml) to specify which exact item you meant.
+
A co, jeśli twój przedmiot należy do klasy, która jest połączeniem elementów nadających się do układania w stosy i nie nadających się do układania w stosy lub nadających się do użytku i nie nadających się do użycia? Pamiętaj, że ustawienie domyślne nie jest możliwe do układania w stosy i nie nadaje się do użytku. Więc musisz zarejestrować te specjalne indywidualnie. Odbywa się to według typu (elementu), klasy, jak poprzednio, a także podklasy (tak samo jak w xml), aby określić dokładnie, o który element masz na myśli.
  
 
<source lang = "java">
 
<source lang = "java">
  // most tools don't have a Use but the sugar mill should. the subclass in xml is sugarmill
+
  // większość narzędzi nie ma zastosowania, ale ''sugar mill'' powinna. Podklasa w xml to sugarmill
 
  register("item", "tool", "sugarmill", UseableItem.class);
 
  register("item", "tool", "sugarmill", UseableItem.class);
 
</source>
 
</source>
  
Finally, go to ''src/games/stendhal/client/gui/j2d/entity/EntityViewFactory.java'' and configure item in the same way only if you needed to add to EntityMap above. The examples are
+
Wreszcie przejdź do ''src/games/stendhal/client/gui/j2d/entity/EntityViewFactory.java'' i skonfiguruj element w ten sam sposób tylko wtedy, gdy musisz dodać do EntityMap powyżej. Oto przykłady
  
 
<source lang = "java">
 
<source lang = "java">
  // flower was a new class of stackables
+
  // ''Flower'' był nową klasą sztaplowanych przedmiotów
 
  register("item", "flower", null, StackableItem2DView.class);
 
  register("item", "flower", null, StackableItem2DView.class);
  // drink was a new class of Useables
+
  // ''Drink'' były nową klasą przedmiotów użytkowych
 
  register("item", "drink", null, UseableItem2DView.class);
 
  register("item", "drink", null, UseableItem2DView.class);
  // Box is a new client side object
+
  // ''Box'' to nowy obiekt po stronie klienta
 
  register("item", "box", null, Box2DView.class);
 
  register("item", "box", null, Box2DView.class);
  
  // most tools don't have a Use but the sugar mill should. the subclass in xml is sugarmill
+
  // większość narzędzi nie ma zastosowania, ale ''sugar mill'' powinna. Podklasa w xml to sugarmill
 
  register("item", "tool", "sugarmill", UseableItem2DView.class);
 
  register("item", "tool", "sugarmill", UseableItem2DView.class);
 
</source>
 
</source>
  
== Add Grammar ==
+
== Dodaj gramatykę ==
Item names should be short and enough to identify the item, but in spoken and written English there may be some extra words associated with saying the item. For example, Carmen should offer to sell ''100 bottles of potion'' not ''100 potion''. (Add npc text example here?)
+
Nazwy przedmiotów powinny być krótkie i wystarczające, aby zidentyfikować przedmiot, ale w mowie i piśmie w języku polskim mogą występować dodatkowe słowa związane z wypowiedzeniem przedmiotu. Na przykład Carmen powinna zaoferować sprzedaż „100 butelek eliksiru”, a nie „100 eliksirów”. (Czy dodać tutaj przykład tekstu NPC?)
  
Some examples:
+
Kilka przykładów:
 
{|
 
{|
 
|-
 
|-
|potion
+
|eliksir
|bottle of potion
+
|butelka eliksiru
|-
 
|leather legs
 
|pair of leather legs
 
|-
 
|wine
 
|glass of wine
 
 
|-
 
|-
|plate armor
+
|skórzane spodnie
|suit of plate armor
+
|para skórzanych spodni
 
|-
 
|-
|meat
+
|mięso
|piece of meat
+
|kawałek mięsa
 
|}
 
|}
  
To add such a grammatical prefix to NPC speech and speech recognition, edit [http://arianne.cvs.sourceforge.net/viewvc/arianne/stendhal/src/games/stendhal/common/grammar/PrefixManager.java src/games/stendhal/common/grammar/PrefixManager.java].  
+
Aby dodać taki przedrostek gramatyczny do mowy i rozpoznawania mowy NPC, edytuj [https://github.com/PolanieOnLine/PolanieOnLine/blob/master/src/games/stendhal/common/grammar/PrefixManager.java src/games/stendhal/common/grammar/PrefixManager.java].
{{TODO|The new structure needs documentation on the different options for register, registerEnd and registerPrefix.}}
+
{{TODO | Nowa struktura wymaga dokumentacji dotyczącej różnych opcji register, registerEnd i registerPrefix.}}
  
== Add to game==
+
== Dodanie do gry ==
===Dropped by creature===
+
===Wypada z potwora===
You can have a creature drop your newly made item. This is done by editing that creature in its XML file, found in the file location [http://arianne.cvs.sourceforge.net/viewvc/arianne/data/conf/creatures?view=markup projects/stendhal/data/conf/creatures]. Every creature in the game is located in this folder, categorized by creature type. For example, rats can be found in the file [http://arianne.cvs.sourceforge.net/viewvc/arianne/data/conf/creatures/animal.xml?view=markup projects/stendhal/data/conf/creatures/animal.xml].
+
Możesz sprawić, by stwór upuścił twój nowo wykonany przedmiot. Odbywa się to poprzez edycję tego stworzenia w jego pliku XML, znajdującym się w lokalizacji pliku [https://github.com/PolanieOnLine/PolanieOnLine/tree/master/data/conf/creatures]. W tym folderze znajduje się każda istota w grze, podzielona na kategorie według typu stwora. Na przykład szczury można znaleźć w pliku [https://github.com/PolanieOnLine/PolanieOnLine/blob/master/data/conf/creatures/stendhal/animal.xml].
  
===Add to map or grower===
+
===Dodaj do mapy lub plantatora===
You may wish to add items to a map (for player to pick up or harvest). You can either add to zone by creating a java file (good for one - off items like the poison and scroll of Haizen's table in his hut) or add using tiled which is more work initially but allows you to add to the objects layer in tiled again and again in future. (Good for iron ore to collect from the ground, herbs etc). This needs a whole tutorial on spawners (also knows as growers), please see [[HowToAddGrowers]].
+
Możesz chcieć dodać przedmioty do mapy (aby gracz mógł je zbierać). Możesz dodać do strefy, tworząc plik java (dobry dla pojedynczych elementów, takich jak trucizna i zwój stołu Haizena w jego chacie) lub dodać za pomocą kafelków, co początkowo wymaga więcej pracy, ale pozwala na dodawanie do warstwy obiektów w kafelkach w przyszłości. (Dobre dla rudy żelaza do zbierania z ziemi, ziół itp.). Wymaga to całego samouczka o spawnerach (znanych również jako hodowcy), zobacz [[JakDodaćGrowers]].
  
===Sold by NPC===
+
===Sprzedawany przez NPC===
If the NPC is not already created, you can [[Stendhal NPC Coding|code a new NPC]]. Then you will need to add a seller behaviour to your NPC, which should be covered separately. Until that is done, look at Seller examples such as Margaret in Semos Tavern in your source code. The file is [http://arianne.cvs.sourceforge.net/viewvc/arianne/stendhal/src/games/stendhal/server/maps/semos/tavern/BarMaidNPC.java?view=markup src/games/stendhal/server/maps/semos/tavern/BarMaidNPC.java]. If you have any problems with the NPC understanding the item name, you might like to check [[How to test NPC Parser]].
+
Jeśli NPC nie został jeszcze utworzony, możesz [[Kodowanie NPC PolanieOnLine|Jak zakodować nowego NPC]]. Następnie będziesz musiał dodać zachowanie sprzedawcy do swojego NPC, które powinno być omówione osobno. Dopóki tego nie zrobisz, spójrz na przykłady sprzedawcy, takie jak Margaret w tawernie Semos w swoim kodzie źródłowym. Plik to [https://github.com/PolanieOnLine/PolanieOnLine/blob/master/src/games/stendhal/server/maps/semos/tavern/BarMaidNPC.java]. Jeśli masz problemy ze zrozumieniem nazwy przedmiotu przez NPC, możesz sprawdzić [[Jak przetestować NPC Parser]].
  
===Produced by NPC===
+
===Produkowanie przez NPC===
If the NPC is not already created, you can [[Stendhal NPC Coding|code a new NPC]]. You will need to add a Producer behaviour to your NPC, which should be covered separately. Until that is done, look at Producer examples such as Arlindo in Ados Bakery in your source code. The file is [http://arianne.cvs.sourceforge.net/viewvc/arianne/stendhal/src/games/stendhal/server/maps/ados/bakery/BakerNPC.java?view=markup src/games/stendhal/server/maps/ados/bakery/BakerNPC.java]. If you have any problems with the NPC understanding the item name, you might like to check [[How to test NPC Parser]].
+
Jeśli NPC nie został jeszcze utworzony, możesz [[Kodowanie NPC PolanieOnLine|Jak zakodować nowego NPC]]. Będziesz musiał dodać zachowanie producenta do swojego NPC, które powinno być omówione osobno. Dopóki tego nie zrobisz, spójrz na przykłady producentów, takie jak Arlindo w piekarni Ados w swoim kodzie źródłowym. Plik to [https://github.com/PolanieOnLine/PolanieOnLine/blob/master/src/games/stendhal/server/maps/ados/bakery/BakerNPC.java]. Jeśli masz problemy ze zrozumieniem nazwy przedmiotu przez NPC, możesz sprawdzić [[Jak przetestować NPC Parser]].
  
===Item Quests and Quest Rewards===
+
===Zadania związane z przedmiotami i nagrody za zadania===
Perhaps you will want your NPC to equip the player with an item as part of a quest, see [[HowToCreateQuests]]. You can also add your items to either the [[StendhalQuest#Daily_Item_Quest|Daily Item quest]] or the [[StendhalQuest#Kirdneh_Museum_needs_help.21|Weekly item quest]], which are related to the appearance around the world (e.g. rare item?).  
+
Być może będziesz chciał, aby Twój NPC wyposażył gracza w przedmiot w ramach zadania, patrz [[JakNapisacZadanie]]. Możesz także dodać swoje przedmioty do [[https://polanieonline.eu/zadania/burmistrze/zadanie_burmistrza_ados.html|Dzienne zadanie]] lub [[https://polanieonline.eu/zadania/burmistrze/zadanie_kuratorki_w_kirdneh.html|Tygodniowe zadanie na przedmiot]], które są związane z pojawieniem się na świecie (np. rzadki przedmiot).
  
  
 
----
 
----
[[Stendhal | Back to stendhal main wiki page]]
+
[[PolanieOnLine | Powrót do głównej strony wiki PolanieOnLine]]
  
[[Category:Stendhal]]
+
[[Category:PolanieOnLine]]

Aktualna wersja na dzień 19:54, 28 cze 2021


Możesz dodać nowy przedmiot do gry w kilku bardzo prostych krokach:

Przygotowanie

Skonfiguruj środowisko programistyczne zgodnie z opisem w PolanieOnLine na Eclipse.

Edycja przedmioty.xml

Wszystkie pliki przedmioty.xml zlokalizowane są w folderze /data/conf/items/. Są ułożone według klasy (patrz poniżej), np: tarcze, miecze, klucze, żywność itp... Plik zawiera wszystkie opisy przedmiotów w grze. Zacznijmy od tego, jak robić broń, na przykład w daggers.xml:

  <item name="sztylecik">
    <type class="sword" subclass="dagger" tileid="-1"/>
    <description>Oto sztylecik. Bardziej służy za dekorację, ale możesz nim dość szybko dźgnąć.</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>

Ważne jest, aby zrozumieć, jak to działa.

Musimy nadać przedmiotowi nazwę i jest to robione w tagu item. Następnie określamy klasę i podklasę w tagu type. Jeśli sprawdzisz ścieżkę obrazka w kliencie, zdasz sobie sprawę, że wygląda to podobnie do:

 sprites/
     items/
         klasa/
             podklasa.png

W ten sposób możemy ponownie użyć jednego GFX dla różnych elementów. Na przykład: nóż + 1, stary nóż, elficki nóż, ... Dajemy elementowi ładny opis (gdy gracz kliknie Zobacz) wewnątrz tagu description.

Znacznik implementacji należy skopiować z góry, chyba że element można układać w stosy, w takim przypadku użyj:

     <implementation class-name="games.stendhal.server.entity.item.StackableItem"/>

Gdy status przedmiotu może zostać zmieniony np: poprzez niszczenie się jego stanu, wtedy zastosuj:

     <implementation class-name="games.stendhal.server.entity.item.BreakableItem"/>

Wewnątrz tagu atrybuty możesz określić atrybuty broni:

  • ATK jest to wartość proporcjonalna do szkody, jaką przedmiot może wyrządzić.
  • DEF (OBR) jest to wartość proporcjonalna do tego, ile uszkodzeń może zablokować przedmiot.
  • RATE (WAGA) to jak szybko możesz trafić bronią ofensywną.
WAGA 1 oznacza, że ​​możesz trafić w każdej turze, WAGA 10 oznacza tylko raz na 10 tur.
WAGA musi być większa niż 0, ale nie ma górnej granicy. (W POL najwolniejszą broń jaką mamy to 15)
Tylko broń ofensywna ma wagę.
  • RANGE (ZASIĘG) jest atrybutem ataku broni dystansowej, takiej jak łuk i strzała, lub pocisków, takich jak włócznie oraz różdzki i magie.
Im większy zasięg, tym broń jest skuteczniejsza.
  • QUANTITY (ILOŚĆ) to atrybut broni, którą można układać w stosy, takich jak strzały i włócznie (ustawiona na 1)
  • LIFESTEAL (KRADZIEŻ ŻYCIA) to specjalny atrybut broni ofensywnej.
Musi to być liczba z przedziału od -1 do 1.
Wszelkie obrażenia od ataku zadane bronią kradzieży życia są „zwracane” graczowi jako leczące PŻ
Broń z kradzieżą życia 0,2 przywraca graczowi 20% PŻ obrażeń, jakie zadają wrogowi.
Ujemna kradzież życia wysysa HP gracza zgodnie z obrażeniami, jakie zadają wrogowi.


W przypadku żywności, napojów, mikstur i trucizn te atrybuty są następujące:

  • AMOUNT - całkowite PŻ, które przywraca przedmiot (ujemne dla trujących przedmiotów)
  • REGEN - ile jesteś leczony na raz (dla mikstur powinno to być równe AMOUNT, dla trucizn powinno być ujemne)
  • FREQUENCY - jak szybko jesteś uzdrowiony (mniejsza liczba oznacza szybciej, wybierz 1 dla mikstur)
  • QUANTITY - powinny być używane (ustawione na 1), wszystkie można układać w stosy.

Zwróć uwagę, że mikstury i trucizny (i antidotum) są dostępne na klasie drinks. Odtrutki mają:

  • AMOUNT - jak długo chronią cię przed trucizną (np. antidotum to 400, większe to 800)
  • REGEN równa 0
  • FREQUENCY równa 1
  • QUANTITY równa 1

W przypadku zwojów, z których większość to zwoje teleportacyjne, postępuj zgodnie z przykładami w scrolls.xml, aby wybrać implementację. Atrybut INFOSTRING dla zaznaczonych zwojów to miejsce docelowe zwoju, np.

 <infostring value="0_nalwor_city 40 60"/>

W przypadku zwojów przywołania INFOSTRING to nazwa stworzenia, lecz implementacja

 <implementation class-name="games.stendhal.server.entity.item.scroll.SummonScroll"/> 

dba o to, więc nie ustawiasz tego.

To powinny być wszystkie oferowane przedmioty specjalne. Wiele przedmiotów (np. zioła, klucze, drewno, pieniądze) nie miałoby żadnych atrybutów lub atrybutów poza ilością.

Na koniec musisz określić, gdzie można wyposażyć przedmiot:

  • rhand
  • lhand
  • armor
  • head
  • legs
  • cloak
  • finger
  • fingerb
  • pas
  • feet
  • keyring
  • bag

Wszystkie przedmioty powinny znajdować się w torbie, chyba że masz dobry powód, dla którego gracze nie powinni mieć możliwości ich noszenia. Wszystkie przedmioty, które można układać w stosy, powinny być wyposażone w rhand i lhand na wypadek, gdyby gracz chciał podzielić stosy. I chociaż w PolanieOnLine mamy rysunek, gdzie tarcza i miecz powinny iść w oknie postaci, pozwalamy graczom wyposażyć się w tarczę i broń w obu rękach. Pierścionki zakładane są na palec, ale także w rzemyku i torbie dla ułatwienia przenoszenia.

Dodanie GFX

Teraz umieść sprite 32x32 w folderze data/sprites/items/<klasa>/<podklasa>.png

Zobacz także Jak poznać specyfikacje graficzne przedmiotów

Jeśli chcesz, aby obraz przedmiotu był animowany (jak pieniądze), po prostu utwórz sprite'a 32N x 32. Na przykład. jeśli ma 5 klatek w animacji, będzie to sprite 160 x 32. Automatycznie pojawi się animacja.

Rejestracja klasy

Do tej pory zdefiniowaliśmy, jaki element jest podobny do serwera. Zarejestrowanie klasy mówi klientowi, co z nią zrobić. (Czy można go układać w stosy i powinien mieć wyświetlane liczby, czy jest użyteczny i powinien mieć wyświetlane użycie?) Większość klas jest już zarejestrowana i możesz zignorować tę sekcję... czytaj dalej, aby się dowiedzieć.

Przedmioty będą domyślnie zachowywać się dla klienta jak przedmiot nie nadający się do układania w stos i nie nadający się do użytku. Dotyczy to zbroi, broni i większości przedmiotów, które się nie zmieniają. Klasy nadające się do układania w stosy, ale nie nadające się do użytku, są rejestrowane według klasy, tj. pieniądze, amunicja, zioła itp. Większość przedmiotów użytkowych, takich jak żywność, napoje, jest rejestrowanych jako cała klasa. Więc jeśli dodajesz do jakiejkolwiek istniejącej klasy, najprawdopodobniej możesz zignorować wszystkie następujące rzeczy. Po prostu wróć, jeśli coś nie działa... tak jak oczekiwałeś, że będziesz mógł użyć nowego przedmiotu, a nie możesz. Lub jeśli dodajesz zupełnie nową klasę.

Tak więc, jeśli masz nową klasę i chcesz, aby można ją było układać w stosy lub używać lub jest to całkowicie nowy obiekt po stronie klienta, rozszerzający przedmiot, dodaj swoją klasę z typem (przedmiotem), klasą i wybranym zachowanie do reszty w src/games/stendhal/client/entity/factory/EntityMap.java, np.

 // ''Flower'' był nową klasą sztaplowanych przedmiotów
 register("item", "flower", null, StackableItem.class);
 // ''Drink'' były nową klasą przedmiotów użytkowych
 register("item", "drink", null, UseableItem.class);
 // ''Box'' to nowy obiekt po stronie klienta
 register("item", "box", null, Box.class);

A co, jeśli twój przedmiot należy do klasy, która jest połączeniem elementów nadających się do układania w stosy i nie nadających się do układania w stosy lub nadających się do użytku i nie nadających się do użycia? Pamiętaj, że ustawienie domyślne nie jest możliwe do układania w stosy i nie nadaje się do użytku. Więc musisz zarejestrować te specjalne indywidualnie. Odbywa się to według typu (elementu), klasy, jak poprzednio, a także podklasy (tak samo jak w xml), aby określić dokładnie, o który element masz na myśli.

 // większość narzędzi nie ma zastosowania, ale ''sugar mill'' powinna. Podklasa w xml to sugarmill
 register("item", "tool", "sugarmill", UseableItem.class);

Wreszcie przejdź do src/games/stendhal/client/gui/j2d/entity/EntityViewFactory.java i skonfiguruj element w ten sam sposób tylko wtedy, gdy musisz dodać do EntityMap powyżej. Oto przykłady

 // ''Flower'' był nową klasą sztaplowanych przedmiotów
 register("item", "flower", null, StackableItem2DView.class);
 // ''Drink'' były nową klasą przedmiotów użytkowych
 register("item", "drink", null, UseableItem2DView.class);
 // ''Box'' to nowy obiekt po stronie klienta
 register("item", "box", null, Box2DView.class);

 // większość narzędzi nie ma zastosowania, ale ''sugar mill'' powinna. Podklasa w xml to sugarmill
 register("item", "tool", "sugarmill", UseableItem2DView.class);

Dodaj gramatykę

Nazwy przedmiotów powinny być krótkie i wystarczające, aby zidentyfikować przedmiot, ale w mowie i piśmie w języku polskim mogą występować dodatkowe słowa związane z wypowiedzeniem przedmiotu. Na przykład Carmen powinna zaoferować sprzedaż „100 butelek eliksiru”, a nie „100 eliksirów”. (Czy dodać tutaj przykład tekstu NPC?)

Kilka przykładów:

eliksir butelka eliksiru
skórzane spodnie para skórzanych spodni
mięso kawałek mięsa

Aby dodać taki przedrostek gramatyczny do mowy i rozpoznawania mowy NPC, edytuj src/games/stendhal/common/grammar/PrefixManager.java. Szablon:TODO

Dodanie do gry

Wypada z potwora

Możesz sprawić, by stwór upuścił twój nowo wykonany przedmiot. Odbywa się to poprzez edycję tego stworzenia w jego pliku XML, znajdującym się w lokalizacji pliku [1]. W tym folderze znajduje się każda istota w grze, podzielona na kategorie według typu stwora. Na przykład szczury można znaleźć w pliku [2].

Dodaj do mapy lub plantatora

Możesz chcieć dodać przedmioty do mapy (aby gracz mógł je zbierać). Możesz dodać do strefy, tworząc plik java (dobry dla pojedynczych elementów, takich jak trucizna i zwój stołu Haizena w jego chacie) lub dodać za pomocą kafelków, co początkowo wymaga więcej pracy, ale pozwala na dodawanie do warstwy obiektów w kafelkach w przyszłości. (Dobre dla rudy żelaza do zbierania z ziemi, ziół itp.). Wymaga to całego samouczka o spawnerach (znanych również jako hodowcy), zobacz JakDodaćGrowers.

Sprzedawany przez NPC

Jeśli NPC nie został jeszcze utworzony, możesz Jak zakodować nowego NPC. Następnie będziesz musiał dodać zachowanie sprzedawcy do swojego NPC, które powinno być omówione osobno. Dopóki tego nie zrobisz, spójrz na przykłady sprzedawcy, takie jak Margaret w tawernie Semos w swoim kodzie źródłowym. Plik to [3]. Jeśli masz problemy ze zrozumieniem nazwy przedmiotu przez NPC, możesz sprawdzić Jak przetestować NPC Parser.

Produkowanie przez NPC

Jeśli NPC nie został jeszcze utworzony, możesz Jak zakodować nowego NPC. Będziesz musiał dodać zachowanie producenta do swojego NPC, które powinno być omówione osobno. Dopóki tego nie zrobisz, spójrz na przykłady producentów, takie jak Arlindo w piekarni Ados w swoim kodzie źródłowym. Plik to [4]. Jeśli masz problemy ze zrozumieniem nazwy przedmiotu przez NPC, możesz sprawdzić Jak przetestować NPC Parser.

Zadania związane z przedmiotami i nagrody za zadania

Być może będziesz chciał, aby Twój NPC wyposażył gracza w przedmiot w ramach zadania, patrz JakNapisacZadanie. Możesz także dodać swoje przedmioty do [zadanie] lub [zadanie na przedmiot], które są związane z pojawieniem się na świecie (np. rzadki przedmiot).



Powrót do głównej strony wiki PolanieOnLine