Lekce 1 - Úvod, první příkaz a zpráva
Vítejte u mého prvního tutoriálu o tvorbě pluginů pro hru Minecraft (konkrétně server Spigot). V této sérii budeme probírat základy (tvorbu příkazů) a pokročilejší návody (minihry) o vytváření pluginů.
Předpokládané znalosti
Pokud chcete číst tento tutoriál, předpokládá se, že budete umět alespoň základy Objektového orientování (OOP) v Javě. Pokud ho aktuálně neumíte, více se o něm dozvíte zde na ITnetwork. V tutoriálu budu používat vývojové prostředí Eclipse (návod na instalaci).
Plugin vs. mód
Na začátek si ujasníme, jaký je rozdíl mezi pluginem a módem. Často uslyšíte termíny "Spigot" a "Forge". Tvorba módu je vlastně tvorba obsahu pro hru (tj. nové kladivo, ...) a využívá se Forge API (tutorial najdete zde na ITnetwork).
Plugin je naproti tomu nová funkcionalita (např. aby hra na něco reagovala, přidání nové minihry, apod.) a budeme je tvořit pro Minecraftový server Spigot s využitím jejich API.
První pokus
V našem prvním kódu si popíšeme základní metody Spigotu a uděláme si
také první příkaz. Co budeme potřebovat? Budeme potřebovat importovat
knihovny Spigotu do našeho projektu. Čím začneme? Založíme si nový
projekt pod názvem Test, zvolíme si Javu 8 či 7, to jistě
už znáte . Doporučuji dát
nejnovější Javu.
Máme založený projekt a dalším krokem bude:
- Klikneme pravým na projekt Test
- Zvolíme možnost Properties, zobrazí se nám okno
- V tomto okně přejdeme na Java Build Path
- V poslední řadě nahoře přejdeme na Libraries
- Po pravé straně se nachází Add External JARs
- Otevře se nám adresář, my zvolíme API Spigotu, který si stáhneme ze stránky https://tcpr.ca/…loads/spigot
Skvěle, dáme OK a máme v našem projektu k dispozici API Spigotu (knihovny). My postoupíme dál a vytvoříme si balíček a pojmenujeme si ho, jak se nám zachce. Do tohoto balíčku si vytvoříme třídu, kterou si opět pojmenujeme podle nás. Já jí vždy dávám název Main nebo Core, protože má vyjadřovat hlavní třídu. Máme tedy něco takového:
package cz.pandap.test; public class Main { }
Potřebujeme dědit metody Spigotu a říci hlavní třídě, že právě
toto je hlavní třída (trochu paradox . Uděláme to jednoduše:
package cz.pandap.test; public class Main extends JavaPlugin { }
Ano, uděláme to pomocí třídy JavaPlugin (třída od
Spigotu) a to tím že jí zdědíme. Nyní bychom určitě chtěli, aby to
něco dělalo, že? Co takhle zkusit něco vypsat do konzole, když zapneme a
vypneme server? Taktéž to
uděláme jednoduše a to ve dvou krocích, prvně si napíšeme jednu povinnou
a jednu nepovinnou metodu to této třídy:
package cz.pandap.test; public class Main extends JavaPlugin { public void onEnable() { } public void onDisable() { } }
Metoda onEnable() se volá, když se server zapíná a tato metoda je pro plugin povinná, tedy nesmíme jí vynechat, jelikož by nám server plugin nespustil. Metoda onDisable() se volá, když se server vypíná a tato metoda je nepovinná. Nyní si zorganizujeme zprávy, které budeme chtít vypisovat při zapnutí a vypnutí do konzole.
package cz.pandap.test; public class Main extends JavaPlugin { public void onEnable() { Bukkit.getServer().getLogger().info("Plugin Test se zapnul!"); } public void onDisable() { Bukkit.getServer().getLogger().info("Plugin Test se vypnul!"); } }
Ano, jak jste zjistili, je to velice jednoduché! Pro koho ne, tak to tedy
vysvětlím. Voláme metodu info(), které má svůj argument
typu String. Tímto řetězcem je právě zpráva, která se vypíše
při spuštění. Není to zatím nic těžkého, co myslíte? Nyní bychom
mohli vytvořit nějaký příkaz. Příkaz se dělá pomocí metody, která má
4 argumenty. Je to opět naprosto jednoduché. Samozřejmě u obtížnějších
příkazu to už tak lehké nebude... K tomu ale až v dalších dílech
package cz.pandap.test; public class Main extends JavaPlugin { public void onEnable() { Bukkit.getServer().getLogger().info("Plugin Test se zapnul!"); } public void onDisable() { Bukkit.getServer().getLogger().info("Plugin Test se vypnul!"); } public boolean onCommand(CommandSender sender, Command cmd, String labels, String[] args) { return false; } }
Návratová hodnota je boolean z toho důvodu, že se může
vykonat, ale také nemusí a argumenty jsou z důvodu, aby se vám dobře
definoval hráč. Příklad: send message Pandap968 zpráva
Tento příkaz obsahuje 3 argumenty, nezapočítávám samotný příkaz send. Tomuto se tedy říká argumenty v příkazu. V naší metodě je to pod názvem args. Zatím máme pouze metodu, která příkaz vyvolá, my musíme vymyslet samotné jádro příkazu (co to udělá). Nyní potřebujeme ověřit, jestli příkaz neposílá někdo jiný než hráč. Samozřejmě to může být naopak nebo také vůbec, ale my to prozatím chceme takhle:
package cz.pandap.test; public class Main extends JavaPlugin { public void onEnable() { Bukkit.getServer().getLogger().info("Plugin Test se zapnul!"); } public void onDisable() { Bukkit.getServer().getLogger().info("Plugin Test se vypnul!"); } public boolean onCommand(CommandSender sender, Command cmd, String labels, String[] args) { if (!(sender instanceof Player)) { sender.sendMessage("Konzole nemůže vykonat tento příkaz!"); return true; } return false; } }
Takto napíšeme podmínku, jestli sender (odesílatel) není instancí hráče. Pokud toto platí, vypíše se nám zpráva o tom, že konzole nemůže vykonat tento příkaz. Konzole píšu rovnou, protože nikdo jiný než konzole nebo hráč ani příkaz odeslat nemůže. Podmínku máme hotovu, ale pořád nemáme samotný příkaz:
package cz.pandap.test; public class Main extends JavaPlugin { public void onEnable() { Bukkit.getServer().getLogger().info("Plugin Test se zapnul!"); } public void onDisable() { Bukkit.getServer().getLogger().info("Plugin Test se vypnul!"); } public boolean onCommand(CommandSender sender, Command cmd, String labels, String[] args) { if (!(sender instanceof Player)) { sender.sendMessage("Konzole nemůže vykonat tento příkaz!"); return true; } Player player = (Player) sender; if (cmd.getName().equalsIgnoreCase("test")) { player.sendMessage("Toto se vykoná, když hráč napíše příkaz test!"); } return false; } }
Ano předposlední fáze, než plugin půjde spustit na reálném serveru.
Nadefinovali jsme si proměnnou player, instanci třídy
Player. Nyní máme podmínku, která prostě takhle bude a nikdo ji
nemůže nějak ovlivnit (samozřejmě kromě vývojářů Spigotu ). Musíme si jí zapamatovat.
Tato podmínka značí to, že pokud hráč napíše příkaz test, vykoná se
nějaká akce. V tomto případě tou akcí je, že proměnné player
se odešle zpráva.
Plugin máme hotový! Ale pozor, nesmíme ještě zapomenout na jeden soubor jménem plugin.yml, který nám udává informace o pluginu (jméno, příkazy, verzi, hlavní třídu, ...). Vytvoříme si ho a naše podoba bude následující:
name: Test main: cz.pandap.test.Main version: 1.0 commands: test:
Udělal jsem taktéž menší tabulku popisu:
Název | Funkce |
---|---|
name | Název pluginu, bude se zobrazovat ve hře / konzoli |
main | Cesta k hlavní třídě pluginu, popisovali jsme si |
version | Verze pluginu, můžeme napsat, co se nám zachce |
commands | Příkazy, píšeme pod sebe |
Plugin zkompilujeme. Uděláme to následujícím způsobem:
- Klikneme pravým na náš projekt
- Zvolíme možnost Export
- Otevřeme okno, kde zvolíme možnost Java a JAR File
- Nyní pouze zvolíme cestu, kde se nám soubor JAR uloží
- Klikneme Finish
- Gratuluji! Máte vyhráno!
Nahrání pluginu na server
Máme-li zkompilovaný plugin, chceme ho určitě někde nahrát. Počítám
s tím, že máte již připravený server. Pokud nemáte, na internetu jsou o
tom stovky návodů. Po zapnutí serveru máme v hlavním adresáři složku
plugins, do této složky přejdeme a přetáhneme zde náš
JAR soubor. Když už máme plugin nahrán do této složky, resetujeme server
nebo napíšeme do chatu/konzole příkaz /reload. Doporučuji
resetovat server, je to bezpečnější.
Zde máme ukázku, co se nám zobrazí po spuštění:

Co jsme se naučili?
V tomto díle jsme se naučili, jak používat a definovat příkaz a zprávy.
Závěr
Toto by bylo vše k tomuto prvním dílu.
V příštím díle, Více o příkazech a barvy, bychom pokračovali v příkazech a argumentech. Děkuji za přečtení! V případě problémů se obraťte do komentářů!