4. díl - První event a konfigurace (MOTD)

Java Minecraft Modding Spigot První event a konfigurace (MOTD)

Vítejte u čtvrtého tutoriálu. Minule jsem si udělali odpočinkový díl, kdy jsem si zopakovali tvorbu příkazů a ovládaní argumentů. Dnes se podíváme, co to jsou eventy a jak je zapisovat, poté jak vytvořit konfigurační soubor.

Co dnes budeme tvořit?

Dnes se podíváme, jak tvořit konfigurační soubor. V první řadě si řekneme něco o eventu - co to je a jak ho ovládat, zapíšeme si zprávu při připojení na server. Musíme event registrovat, to si taktéž ukážeme. Dále si řekneme, jak vytvářet a registrovat konfigurační soubory. Budeme vytahovat zprávu z konfigurace, kterou následně budeme vypisovat.

Eventy

Event je událost. Událost je nějaký pohyb anebo činnost. Event může být skok, pohyb, kopání, sbírání, zabíjení, všechny události, co Minecraft dělá nebo vy děláte. Eventy musíme registrovat (implementovat), a registrovat v metodě onEnable(), v poslední řadě před každou metodou, co vyjadřuje event, dáme anotaci @EventHandler.

Jak použit Event a Konfiguraci v praxi?

Pro příklad budeme chtít, aby se po připojení vypsala danému hráči zpráva, kterou uvidí pouze on. Vytvoříme si nový projekt, balíček, třídu a vyplním základní konstrukci včetně hlavní metod:

package cz.pandap.join;

public class Main extends JavaPlugin {

        public void onEnable() {
                Bukkit.getServer().getLogger().info("Plugin Join se zapnul!");
        }

        public void onDisable() {
                Bukkit.getServer().getLogger().info("Plugin Join se vypnul!");
        }
}

Máme vytvořený základní konstruktor. Co budeme potřebovat dál? Bude nutné, abychom implementovali třídu Listener, tímto řekneme, že právě zde se nachází nějaká registrace eventu. Uděláme to jednoduše:

public class Main extends JavaPlugin implements Listener {

Půjdeme popořadě, vždy když plugin registruje nějaký Event, musíme tyto eventy zaznamenávat. Pravidlo zní: Pokud se v projektu nachází event, musíme ho v metodě onEnable() zaznamenat:

public void onEnable() {
        Bukkit.getServer().getLogger().info("Plugin Join se zapnul!");
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
}

Ovládá nám to metoda registerEvents(mís­to, kde se registrace eventů nachází, místo, kde se event nachází, a kde je implementace Listener);

Trochu odejdeme od tématu a ukážeme si, jak zaregistrovat event v jiné třídě. Event se bude nacházet ve třídě Pohyb a budeme registrovat, zda se hráč hýbe. Pokud se bude hýbat, vypíše se mu zpráva. Jdeme na to, prvně si vytvoříme třídu Pohyb:

public class Pohyb implements Listener {

}

Máme vytvořenou třídu, dáme si do ní Event. Event si vytvoříme tak, jak jsem říkal. Musíme prvně dát anotaci @EventHandler.

public class Pohyb implements Listener {

        @EventHandler
}

Nyní musíme vytvořit metodu, která je ve formátu:

public void onNěco(NázevEventu proměnná) {}

V praxi:

public class Pohyb implements Listener {

        @EventHandler
        public void onMove(PlayerMoveEvent event) {

        }
}

Mám vytvořen event a nyní si musíme definovat hráče, který event vykonává:

@EventHandler
public void onMove(PlayerMoveEvent event) {
        Player p = event.getPlayer();
}

Máme definovaného hráče, následně budeme vypisovat zprávu:

@EventHandler
public void onMove(PlayerMoveEvent event) {
        Player p = event.getPlayer();
        p.sendMessage("§aNyní ses pohnul.");
}

Hotovo, vytvořili jsme třídu Pohyb, poté vytvoříme třídu Main1. (UPOZORNĚNÍ! Třída Pohyb a Main je od tématu, tedy nyní třída Main1 není totožná s původní třídu Main, kde budeme tvořit event na připojení. Toto pouze demonstruje příklad, jak vytvořit event mimo třídu Main1).

public class Main1 extends JavaPlugin {

        public void onEnable() {
                Bukkit.getServer().getPluginManager().registerEvents(new Pohyb(), this);
        }
}

Máme registrovaný event mimo třídu. :-) Přesuneme se zpět k aktuálnímu projektu. Máme hotovou registraci v třídě onEnable(). V této třídě si vytvoříme opět registraci eventu:

@EventHandler

Metoda na připojení:

@EventHandler
public void onJoin(PlayerJoinEvent event) {

}

Definujeme si hráče:

@EventHandler
public void onJoin(PlayerJoinEvent event) {
        Player p = event.getPlayer();
}

Budeme odesílat tomuto hráči zprávu, že se připojil. Zprávu, která se mu bude vypisovat zjistíme z konfigurace. Potřebujeme toto:

  • Vytvoříme si konfiguraci, budeme ji registrovat v třídě onEnable()
  • Zjistíme si v metodě sendMessage();, co je ve řetězci message v konfiguraci

My si přidáme do metody onEnable():

public void onEnable() {
        Bukkit.getServer().getLogger().info("Plugin Join se zapnul!");
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
        getConfig().options().copyDefaults(true);
        saveConfig();
}

Vysvětlení metod:

  • saveConfig(); Tato metoda zajistí, aby se config uložil
  • copyDefaults(tru­e); Zkontroluje, zda se zkopírovaly hodnoty z výchozího configu

Abych ještě důkladněji vysvětlil tuto metodu, config můžeme vytvářet dvěma způsoby:

  • Vytvořit si ho a předepsat si hodnoty
  • Vytvořit ho v kódu a přidávat do něho hodnoty z kódu

Tato metoda je právě pro první metodu, takže my nyní vytvoříme podobu configu:

message: Připojil ses do hry!

Nyní se přesuneme k samotnému eventu, máme ho následující:

@EventHandler
public void onJoin(PlayerJoinEvent event) {
        Player p = event.getPlayer();
}

Přidáme mu metodu sendMessage();:

@EventHandler
public void onJoin(PlayerJoinEvent event) {
        Player p = event.getPlayer();
        p.sendMessage(ChatColor.GREEN + getConfig().getString("message"));
}

Z configu vytáhneme řetězec message. Nebylo to nic těžkého, že? config.yml musíme taktéž jako plugin.yml přidat k projektu.

Zde máme celý výpis kódu:

package cz.pandap.join;

public class Main extends JavaPlugin implements Listener {

        public void onEnable() {
                Bukkit.getServer().getLogger().info("Plugin Join se zapnul!");
                Bukkit.getServer().getPluginManager().registerEvents(this, this);
                getConfig().options().copyDefaults(true);
                saveConfig();
        }

        public void onDisable() {
                Bukkit.getServer().getLogger().info("Plugin Join se vypnul!");
        }

        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
                Player p = event.getPlayer();
                p.sendMessage(ChatColor.GREEN + getConfig().getString("message"));
        }


}

Co jsme se naučili?

V tomto díle jsme se naučili, co je to Event a jak ho použít v praxi, dále jsme si vytvořili a použili konfiguraci.

Závěr

Toto by bylo vše k tomuto čtvrtému dílu, v příštím díle bychom se podívali, na pokračování konfigurací a vysvětlíme si a použijeme práva. Děkuji za přečtení! V případě problémů se obraťte do komentářů nebo do zpráv!


 

  Aktivity (6)

Článek pro vás napsal PandaP968
Avatar
Autor se zabývá programováním v Javě, PHP, HTML a CSS. Většinu času programuje pluginy pro Minecraft servery.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 


Miniatura
Předchozí článek
Prank plugin (Opakování)
Miniatura
Všechny články v sekci
Tvorba pluginů pro Spigot

 

 

Komentáře

Avatar
Michal Raška:

Zdravím, u demo třídy Main1 v metodě onEnable()

public void onEnable() {
                Bukkit.getServer().getPluginManager().registerEvents(this, new Pohyb());
        }

je chyba. Správně je to takto:

public void onEnable() {
                Bukkit.getServer().getPluginManager().registerEvents(new Pohyb(),this );
        }

Je tam prohozený Listener s Pluginem

 
Odpovědět 22. května 0:11
Avatar
PandaP968
Redaktor
Avatar
PandaP968:

Ahoj, omlouvám se za dlouhodobou odezvu, ano máš pravdu. Mám tam chybku, opravím ji. Děkuji :)

Odpovědět 5. června 17:16
Autor se zabývá programováním v Javě, PHP, HTML a CSS. Většinu času programuje pluginy pro Minecraft servery.
Avatar
Michal Raška:

Ahoj, budou další díly?

 
Odpovědět 25. června 18:22
Avatar
PandaP968
Redaktor
Avatar
Odpovídá na Michal Raška
PandaP968:

Ahoj, určitě budou, ale až o prázdninách a až na to budu mít pořádnou chuť.

Odpovědět 27. června 15:59
Autor se zabývá programováním v Javě, PHP, HTML a CSS. Většinu času programuje pluginy pro Minecraft servery.
Avatar
Ondřej Matýs:

Ahoj, budeš ještě dělat další díly ?? Toto je téma o které se zajímám už hodně dlouho a od tebe se mi to zatím líbí nejvíc :)

 
Odpovědět 6. října 20:12
Avatar
PandaP968
Redaktor
Avatar
PandaP968:

Ahoj, jsem zde pořád aktivní, ale toto psaní mě moc nebaví, pokud budu mít chuť, určitě napíšu další díl, ale zatím tuto chuť nemám. :-(

Odpovědět 6. října 20:53
Autor se zabývá programováním v Javě, PHP, HTML a CSS. Většinu času programuje pluginy pro Minecraft servery.
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na PandaP968
Petr Stastny:

Tak udělej tutorial na nějakej plugin, který by se dal využít normálně, bude to mnohem větší sranda :)

Třeba plugin, který hlídá, když uživatel rozbije blok. A dejme tomu nastavit maximum za časovou jednotku. Třeba maximum 200 bloků písku za MC den. To by se dalo použít, každý zná ty lidi, co si vezmou plnej inv ench dia lopat a vykopou celou poušť.

 
Odpovědět 6. října 21:27
Avatar
PandaP968
Redaktor
Avatar
PandaP968:

Hmm, to je zajímavé a i docela lehké.

Odpovědět 6. října 21:41
Autor se zabývá programováním v Javě, PHP, HTML a CSS. Většinu času programuje pluginy pro Minecraft servery.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.