Kodowanie NPC PolanieOnLine: Różnice pomiędzy wersjami

Z PolanieOnLine
Skocz do: nawigacja, szukaj
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ć [[Konfigurować środowisko programistyczne (IDE)|skonfigurować IDE]] i być w stanie skompilować i uruchomić lokalny serwer PolanieOnLine.
+
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);   
    }
}