IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

  1. Klikneme pravým na projekt Test
  2. Zvolíme možnost Properties, zobrazí se nám okno
  3. V tomto okně přejdeme na Java Build Path
  4. V poslední řadě nahoře přejdeme na Libraries
  5. Po pravé straně se nachází Add External JARs
  6. 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:

  1. Klikneme pravým na náš projekt
  2. Zvolíme možnost Export
  3. Otevřeme okno, kde zvolíme možnost Java a JAR File
  4. Nyní pouze zvolíme cestu, kde se nám soubor JAR uloží
  5. Klikneme Finish
  6. 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í:

Tvorba pluginů pro Spigot

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ářů!


 

Všechny články v sekci
Tvorba pluginů pro Spigot
Přeskočit článek
(nedoporučujeme)
Více o příkazech a barvy
Článek pro vás napsal PandaP968
Avatar
Uživatelské hodnocení:
10 hlasů
Autor se zabývá programováním v Javě. Většinu času programuje pluginy pro Minecraft servery.
Aktivity