Kodowanie NPC PolanieOnLine: Różnice pomiędzy wersjami
Linia 12: | Linia 12: | ||
== Zanim zaczniesz == | == Zanim zaczniesz == | ||
− | Ta strona opisuje jak zakodować NPC. Nie musisz dużo wiedzieć o Javie. Powinieneś jednak już mieć [[ | + | Ta strona opisuje jak zakodować NPC. Nie musisz dużo wiedzieć o Javie. Powinieneś jednak już mieć [[Skonfigurowanie Środowiska Programistycznego (IDE)|skonfigurowane IDE]] i być w stanie skompilować oraz uruchomić lokalny serwer PolanieOnLine. |
+ | |||
+ | == Zdefiniuj NPC za pomocą Javy == | ||
+ | |||
+ | Najpierw musisz zdecydować, w jakim regionie będzie twój NPC, abyśmy mogli utworzyć plik Java we właściwym miejscu. Lokalizacja pliku będzie następująca: | ||
+ | src/games/stendhal/server/maps/''region''/''podregion'' | ||
+ | |||
+ | Powinieneś nazwać plik NPC po funkcji NPC. Przykładami są GreeterNPC, HealerNPC, BuyerNPC, ChefNPC, SellerNPC, LifeguardNPC | ||
+ | |||
+ | W tym przykładzie stworzymy czarodzieja w chatce maga. | ||
+ | |||
+ | Stworzymy więc plik <code>src/games/stendhal/server/maps/ados/magician_house/WizardNPC.java</code> | ||
+ | |||
+ | Początek pliku będzie musiał określić kilka standardowych rzeczy, aby działał, nie martw się o to, po prostu skopiuj je na razie. Zauważ, że ''klasa'' jest taka sama jak nasza ''nazwa pliku'', a ''pakiet'' jest powiązany z miejscem, w którym umieściliśmy plik. | ||
+ | |||
+ | <source lang="java"> | ||
+ | package games.stendhal.server.maps.ados.magician_house; | ||
+ | |||
+ | import java.util.Arrays; | ||
+ | import java.util.LinkedList; | ||
+ | import java.util.List; | ||
+ | import java.util.Map; | ||
+ | |||
+ | import games.stendhal.server.core.config.ZoneConfigurator; | ||
+ | import games.stendhal.server.core.engine.SingletonRepository; | ||
+ | import games.stendhal.server.core.engine.StendhalRPZone; | ||
+ | import games.stendhal.server.core.pathfinder.FixedPath; | ||
+ | import games.stendhal.server.core.pathfinder.Node; | ||
+ | // to znajduje się tylko dlatego, że nasz NPC jest sprzedawcą | ||
+ | import games.stendhal.server.entity.npc.ShopList; | ||
+ | import games.stendhal.server.entity.npc.SpeakerNPC; | ||
+ | // to znajduje się tylko dlatego, że nasz NPC jest sprzedawcą | ||
+ | import games.stendhal.server.entity.npc.behaviour.adder.SellerAdder; | ||
+ | // to znajduje się tylko dlatego, że nasz NPC jest sprzedawcą | ||
+ | import games.stendhal.server.entity.npc.behaviour.impl.SellerBehaviour; | ||
+ | |||
+ | public class WizardNPC implements ZoneConfigurator { | ||
+ | // to znajduje się tylko dlatego, że NPC posiada ''sklep'' ze sprzedażą mikstur | ||
+ | private final ShopList shops = SingletonRepository.getShopList(); | ||
+ | |||
+ | /** | ||
+ | * Skonfiguruj strefę. | ||
+ | * | ||
+ | * @param zone Strefa do skonfigurowania. | ||
+ | * @param attributes Atrybuty konfiguracji. | ||
+ | */ | ||
+ | public void configureZone(final StendhalRPZone zone, final Map<String, String> attributes) { | ||
+ | buildNPC(zone); | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | Teraz ustawiliśmy standardowe rzeczy, dzięki którym możemy zbudować rzeczywistego NPC. Nazwiemy metodę, która buduje NPC ''buildNPC''. | ||
+ | |||
+ | <source lang="java"> | ||
+ | private void buildNPC(final StendhalRPZone zone) { | ||
+ | final SpeakerNPC npc = new SpeakerNPC("Pan Uzdrowiciel") { | ||
+ | // Ścieżka, na której NPC będzie chodził po mapie | ||
+ | protected void createPath() { | ||
+ | List<Node> nodes=new LinkedList<Node>(); | ||
+ | nodes.add(new Path.Node(9,5)); | ||
+ | nodes.add(new Path.Node(14,5)); | ||
+ | setPath(nodes,true); | ||
+ | } | ||
+ | |||
+ | protected void createDialog() { | ||
+ | // Pozwala NPC odpowiedzieć "Dzień dobry", gdy gracz go wita. Ale mogliśmy ustawić niestandardowe powitanie w () | ||
+ | addGreeting(); | ||
+ | // Pozwala NPC odpowiedzieć, gdy gracz powie "praca" | ||
+ | addJob("Posiadam zdolności lecznicze i leczę rannych graczy. Sprzedaję też #mikstury i antidota."); | ||
+ | // Pozwala NPC odpowiedzieć, gdy gracz prosi o pomoc | ||
+ | addHelp("Poproś mnie o #uzdrowienie a pomogę Ci lub zapytaj #oferta a pokażę rzeczy z mojego sklepu."); | ||
+ | // Sprawia, że NPC sprzedaje mikstury i antidotum | ||
+ | addSeller(new SellerBehaviour(shops.get("leczenie"))); | ||
+ | // Pozwala NPC leczyć graczy za darmo | ||
+ | addHealer(0); | ||
+ | // odpowiedz na specjalne słowo wyzwalające | ||
+ | addReply("mikstury","Poproś o moją #ofertę."); | ||
+ | // użyj standardowego pożegnania, ale możesz też ustawić je wewnątrz () | ||
+ | addGoodbye(); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | // To decyduje o tym, jak NPC będzie wyglądał. welcomernpc.png to obrazek znajdujący się w data/sprites/npc/ | ||
+ | npc.setEntityClass("welcomernpc"); | ||
+ | // Ustaw opis NPC, kiedy gracz sprawdzi go klikając na 'Zobacz' | ||
+ | npc.setDescription("Oto Pan Uzdrowiciel, który wygląda w tej chwili na trochę zajętego, ale może i tak może ci pomóc."); | ||
+ | // Ustaw pozycję początkową jako pierwszy węzeł na ścieżce zdefiniowanej powyżej. | ||
+ | npc.setPosition(9, 5); | ||
+ | npc.initHP(100); | ||
+ | |||
+ | zone.add(npc); | ||
+ | } | ||
+ | } | ||
+ | </source> |
Wersja z 19:36, 28 cze 2021
Zazwyczaj dodajemy NPC (postacie niezależne), aby ożywić świat i używać ich w zadaniach.
W ten sposób NPC są dodawane do świata.
Plik java powinien określać ścieżkę, po której chodzą, podstawowe okno dialogowe i wygląd. Może również określać zachowanie NPC w sprzedaży, kupowaniu, leczeniu lub produkcji. NPC jest ładowany do strefy tylko wtedy, gdy z edytujesz również plik xml strefy, aby skonfigurować strefę przy użyciu tego pliku java.
Bardziej skomplikowane dialogi dla NPC, takie jak te, które można znaleźć w zadaniu, opisane są w Kodowanie Zadania PolanieOnLine. Ale podstawy dla każdego NPC użytego w zadaniu powinny być napisane jak poniżej.
Zanim zaczniesz
Ta strona opisuje jak zakodować NPC. Nie musisz dużo wiedzieć o Javie. Powinieneś jednak już mieć skonfigurowane IDE i być w stanie skompilować oraz uruchomić lokalny serwer PolanieOnLine.
Zdefiniuj NPC za pomocą Javy
Najpierw musisz zdecydować, w jakim regionie będzie twój NPC, abyśmy mogli utworzyć plik Java we właściwym miejscu. Lokalizacja pliku będzie następująca:
src/games/stendhal/server/maps/region/podregion
Powinieneś nazwać plik NPC po funkcji NPC. Przykładami są GreeterNPC, HealerNPC, BuyerNPC, ChefNPC, SellerNPC, LifeguardNPC
W tym przykładzie stworzymy czarodzieja w chatce maga.
Stworzymy więc plik src/games/stendhal/server/maps/ados/magician_house/WizardNPC.java
Początek pliku będzie musiał określić kilka standardowych rzeczy, aby działał, nie martw się o to, po prostu skopiuj je na razie. Zauważ, że klasa jest taka sama jak nasza nazwa pliku, a pakiet jest powiązany z miejscem, w którym umieściliśmy plik.
package games.stendhal.server.maps.ados.magician_house;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import games.stendhal.server.core.config.ZoneConfigurator;
import games.stendhal.server.core.engine.SingletonRepository;
import games.stendhal.server.core.engine.StendhalRPZone;
import games.stendhal.server.core.pathfinder.FixedPath;
import games.stendhal.server.core.pathfinder.Node;
// to znajduje się tylko dlatego, że nasz NPC jest sprzedawcą
import games.stendhal.server.entity.npc.ShopList;
import games.stendhal.server.entity.npc.SpeakerNPC;
// to znajduje się tylko dlatego, że nasz NPC jest sprzedawcą
import games.stendhal.server.entity.npc.behaviour.adder.SellerAdder;
// to znajduje się tylko dlatego, że nasz NPC jest sprzedawcą
import games.stendhal.server.entity.npc.behaviour.impl.SellerBehaviour;
public class WizardNPC implements ZoneConfigurator {
// to znajduje się tylko dlatego, że NPC posiada ''sklep'' ze sprzedażą mikstur
private final ShopList shops = SingletonRepository.getShopList();
/**
* Skonfiguruj strefę.
*
* @param zone Strefa do skonfigurowania.
* @param attributes Atrybuty konfiguracji.
*/
public void configureZone(final StendhalRPZone zone, final Map<String, String> attributes) {
buildNPC(zone);
}
Teraz ustawiliśmy standardowe rzeczy, dzięki którym możemy zbudować rzeczywistego NPC. Nazwiemy metodę, która buduje NPC buildNPC.
private void buildNPC(final StendhalRPZone zone) {
final SpeakerNPC npc = new SpeakerNPC("Pan Uzdrowiciel") {
// Ścieżka, na której NPC będzie chodził po mapie
protected void createPath() {
List<Node> nodes=new LinkedList<Node>();
nodes.add(new Path.Node(9,5));
nodes.add(new Path.Node(14,5));
setPath(nodes,true);
}
protected void createDialog() {
// Pozwala NPC odpowiedzieć "Dzień dobry", gdy gracz go wita. Ale mogliśmy ustawić niestandardowe powitanie w ()
addGreeting();
// Pozwala NPC odpowiedzieć, gdy gracz powie "praca"
addJob("Posiadam zdolności lecznicze i leczę rannych graczy. Sprzedaję też #mikstury i antidota.");
// Pozwala NPC odpowiedzieć, gdy gracz prosi o pomoc
addHelp("Poproś mnie o #uzdrowienie a pomogę Ci lub zapytaj #oferta a pokażę rzeczy z mojego sklepu.");
// Sprawia, że NPC sprzedaje mikstury i antidotum
addSeller(new SellerBehaviour(shops.get("leczenie")));
// Pozwala NPC leczyć graczy za darmo
addHealer(0);
// odpowiedz na specjalne słowo wyzwalające
addReply("mikstury","Poproś o moją #ofertę.");
// użyj standardowego pożegnania, ale możesz też ustawić je wewnątrz ()
addGoodbye();
}
});
// To decyduje o tym, jak NPC będzie wyglądał. welcomernpc.png to obrazek znajdujący się w data/sprites/npc/
npc.setEntityClass("welcomernpc");
// Ustaw opis NPC, kiedy gracz sprawdzi go klikając na 'Zobacz'
npc.setDescription("Oto Pan Uzdrowiciel, który wygląda w tej chwili na trochę zajętego, ale może i tak może ci pomóc.");
// Ustaw pozycję początkową jako pierwszy węzeł na ścieżce zdefiniowanej powyżej.
npc.setPosition(9, 5);
npc.initHP(100);
zone.add(npc);
}
}