Kodowanie NPC PolanieOnLine

Z PolanieOnLine
Skocz do: nawigacja, szukaj



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);   
    }
}

Pierwszą zdefiniowaną rzeczą jest nazwa. NPC jest dodawany do listy NPC, więc możesz go później pobrać, aby dodać więcej dialogów do zadań. Dlatego bardzo ważne jest, aby nazwa, którą nadajesz swojemu NPC, była unikalna.

Następnie określ ścieżkę, którą NPC będzie podążał na tym obszarze. Po prostu użyłeś swojej kafelkowej mapy lub chodź po grze i sprawdź współrzędne, aby wybrać węzły. Każdy węzeł to miejsce, w którym obraca się NPC. Upewnij się, że jesteś w każdym punkcie zwrotnym i nie przegapisz żadnego (nie przechodź z jednego rogu, po przekątnej do drugiego rogu).

Możesz również sprawić, by NPC stał nieruchomo, używając zamiast tego:

    protected void createPath() {
        // NPC się nie porusza
        setPath(null);
    }

W takim przypadku twój NPC będzie stał nieruchomo w dowolnym punkcie, który ustawisz jako początkową pozycję za pomocą npc.setPosition(x, y);.

A następnie utwórz dialogi. Dialogi i tym podobne są rozwijane w sekcjach Quest, ale powinieneś zauważyć, że powyższy przykład obejmuje większość opcji, a opcje takie jak addHelp są dość oczywiste. Znajdują się takie jak:

addGreeting
addOffer
addHelp
addJob
addQuest
addGoodbye
addReply określ wyzwalacz i odpowiedź

Swój strój dla NPC ustalamy według:

  • ustawienie swojej klasy na obraz PNG, która istnieje w data/sprites/npc, np. npc.setEntityClass("welcomernpc");
  • ustawienie swojego stroju metodą setOutfit np. npc.setOutfit(new Outfit(0, 05, 01, 06, 01)); - patrz plik strojów

Miło jest ustawić opis, kiedy gracz robi Zobacz. Jeśli go nie ustawisz, powie tylko: Oto [Nazwa NPC].

Na koniec ustaw jego początkową pozycję i jego HP. Nie martw się o swojego NPC. Nie można go zaatakować ani zabić.

Gdy to zrobisz, dodaj NPC do strefy za pomocą metody zone.add().

Skonfiguruj strefę xml

Musimy określić strefe, aby załadowała ten plik klasy konfiguracyjnej, aby NPC został gdzieś dodany do świata. NPC w przykładzie mieszka w obszarze ados, więc informacje są przechowywane w data/conf/zones/ados.xml. Mapa, na której się znajduje, nazywa się int_ados_magician_house, więc informacje znajdują się w sekcji <zone name="int_ados_magician_house" file="interiors/ados/magician_house.tmx"> </zone>. Aby załadować utworzony plik klasy Java, po prostu dodaj linię

  <configurator class-name="games.stendhal.server.maps.ados.magician_house.WizardNPC" />

zaraz po <zone ... tmx"> Sprawdź, czy lokalizacja pliku jest zgodna ze ścieżką ustawioną w nazwie klasy!