Kodowanie NPC PolanieOnLine: Różnice pomiędzy wersjami
Linia 69: | Linia 69: | ||
private void buildNPC(final StendhalRPZone zone) { | private void buildNPC(final StendhalRPZone zone) { | ||
final SpeakerNPC npc = new SpeakerNPC("Pan Uzdrowiciel") { | final SpeakerNPC npc = new SpeakerNPC("Pan Uzdrowiciel") { | ||
− | // | + | // Zdefiniowana ścieżka, po której NPC będzie podróżował |
protected void createPath() { | protected void createPath() { | ||
List<Node> nodes=new LinkedList<Node>(); | List<Node> nodes=new LinkedList<Node>(); |
Wersja z 19:37, 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") {
// Zdefiniowana ścieżka, po której NPC będzie podróżował
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);
}
}