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") {
            // Ś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);   
    }
}