2. díl - Více o příkazech a barvy

Java Minecraft Modding Spigot Více o příkazech a barvy

Vítejte u druhého tutoriálu. Minule jsme si popsali základní metody, dnes budeme pokračovat v příkazech.

Co dnes budeme tvořit?

V dnešním díle se podíváme, jak efektivně udělat příkaz na uzdravení a nakrmení hráče. Popíšeme si jak fungují argumenty (budeme je využívat) a v poslední řadě se podíváme na použití barvy. Můžeme se do toho pustit!

Příkaz Heal (/heal <hráč>)

Začneme stejně jako minule, tedy vytvoříme si balíček a třídu.

package cz.pandap.heal;

public class Main extends JavaPlugin {

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

        public void onDisable() {
                Bukkit.getServer().getLogger().info("Plugin Health 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;


                return false;
        }
}

Toto je náš základ. Co dál? Potřebujeme udělat příkazy, který vyléčí (doplní HP) mě samotného. Bude to naprosto jednoduché:

if (cmd.getName().equalsIgnoreCase("health")) {

}

Máme samotný příkaz, který nebude vykonávat nic, ale ve hře bude zaregistrován. My k tomuto příkazu přidáme argument, pod kterým bude uzdravení:

if (cmd.getName().equalsIgnoreCase("heal")) {
        if (args.length == 0) {
                player.setHealth(20);
                player.sendMessage(ChatColor.GREEN + "Byl jsi uzdraven!");
                return true;

        }
}

Teď to pravděpodobně pro vás bude trochu španělská vesnička. Kdo by uhodl, co bude dělat tato podmínka? Zkuste pouvažovat, co by to mohlo umět, poté se podívejte na pokračování tohoto textu.

V zásadě budeme chtít používat /heal dvěmi způsoby - na sebe a případně na jiného hráče. Pokud napíšeme do konzole /heal, má tento příkaz nula argumentů. V druhém případě by měl jeden argument a by to vypadlo např. takhle: /heal <hráč>. Tento jeden argument specifikuje hráče, kterému má být doplněn život.

Pokud napíšeme /heal bez argumentů, bude náš příkaz zavolán bez argumentů a to můžeme zjistit právě podmínkou v ukázce výše. Pak se vykoná následující:

  • Hráči doplní srdíčka na plno (20), např. půlka by byla deset
  • Napíše hráči, že byl uzdraven

return true; Ukončí příkaz a říká, že byl proveden správně.

Skvěle! Máme udělaný příkaz pro uzdravení sama sebe. Dále bychom chtěli, abychom mohli uzdravit jiného hráče - tedy příkaz /heal <hráč> Bude to opět jednoduché:

if (cmd.getName().equalsIgnoreCase("heal")) {
        if (args.length == 0) {
                player.setHealth(20);
                player.sendMessage(ChatColor.GREEN + "Byl jsi uzdraven!");
                return true;
        }

        Player target = (Bukkit.getServer().getPlayer(args[0]));

        if (target == null) {
                player.sendMessage("Tento hráč není online!");
                return true;
        }

        target.setHealth(20);
        target.sendMessage("Byl jsi uzdraven hráčem " + player.getName());
}

Máme to tu! Opět to není ani moc těžké. Nejprve získáme instanci hráče, tedy target (cíl). Tato instance bude vyjadřovat, že se jedná o hráče, který je určen prvním argumentem za příkazem /heal. Argument je vlastně sekvence znaků oddělená jednou nebo více mezerami. Příkaz /heal PandaP968 tedy uzdraví hráče se jménem PandaP968.

Možná vás napadá, co se stane, když napíšeme něco jako: /heal PandaP968 dsds sdsd sdsdd sds. Tak, jak to máme napsané teď, to bude fungovat v pořádku - náš plugin se na další argumenty vůbec nedívá. V kódu vidíme příkaz getPlayer(args[0]) - ten vezme první argument (s indexem 0) a použije ho jako jméno hráče.

Kdybychom toto chtěli ošetřit, museli bychom udělat další podmínku na počet argumentů podobnou té první. Ale to zase v příštích dílech. Máme určeny cíl, teď si ověříme pomocí podmínky, jestli tu vůbec ten náš cíl je. Pokud takový hráč není, vypíše se zpráva a vrátí tuto zprávu odesílateli. Pokud zde hráč je, uzdraví se a odešle se mu zpráva. Abych vysvětlil opět:

  • player = odesílatel, určovali jsem si ho, než jsem začali dělat příkaz, tedy Player player = (Player) sender;
  • target = cíl, určovali jsem si ho už v příkazu Player target = (Bukkit.getServer().getPlayer(args[0]));

Toto bychom měli. Teď bych se chtěl přesunout k problému, jak hráče nakrmit (doplnit mu hunger bar). Bude to opět úplně stejné, jen se naše metody setHealth() zamění metodou setFoodLevel().

if (cmd.getName().equalsIgnoreCase("feed")) {
        if (args.length == 0) {
                  player.setFoodLevel(20);
                  player.sendMessage(ChatColor.GREEN + "Byl jsi nakrmen!");
                  return true;
        }

        Player target = (Bukkit.getServer().getPlayer(args[0]));

        if (target == null) {
                player.sendMessage("Tento hráč není online!");
                return true;
        }

        target.setFoodLevel(20);
        target.sendMessage("Byl jsi nakrmen hráčem " + player.getName());
}

Barvy

Barvy tvoří celý Minecraft. Barevné jsou blocky, barevný je chat. Barvy jsou vše! My ale zatím nevíme, jak tyto barvy použít. Bude to podobné, jako to píšete v Minecraftu pod znakem "&". My si to ale uděláme naprosto jinak. Máme tři možnosti jak tento barevný chat udělat. Já je teď vyjmenuji:

  • Pomocí znaku "§"
  • Pomocí třídy ChatColor.<bar­va>, u tohoto se zastavím máme zde několik barev na výběr:
    • BLACK
    • DARK_BLUE
    • DARK_GREEN
    • DARK_AQUA
    • DARK_RED
    • DARK_PURPLE
    • GOLD
    • GRAY
    • DARK_GRAY
    • GREEN
    • AQUA
    • RED
    • PINK
    • YELLOW
    • WHITE
    • Poté máme ještě další třídy, které slouží např. na podtržení atd.
  • V poslední řadě můžeme barvu zapsat také pomocí kódu.

Když napíšete např. do metody sendMessage() znak "&", musíte tento znak nejprve nějak přeložit Spigotu. Můžeme to udělat tímto příkazem: ChatColor.translateAlternateColorCodes('&', "&czpráva");

Nyní si to předvedeme v praxi:

player.sendMessage("§cToto je zpráva!");
player.sendMessage(ChatColor.RED + "Toto je zpráva!");
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cToto je zpráva!"));

Poslední možnost nedoporučuji, nejlepší je možnost první, je rychlá a také přehledná. U druhé možnosti musíme určení barvy oddělovat znaménkem +.

Co jsme se naučili?

V tomto díle jsem se naučili, jak používat argumenty, dvě nové metody a jak nastavit barvu.

Závěr

Toto by bylo vše k tomuto druhému dílu, v příštím díle bychom pokračovali opět v příkazech. Děkuji za přečtení! V případě problémů se obraťte do komentářů nebo do zpráv!


 

  Aktivity (2)

Č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
Úvod, první příkaz a zpráva
Miniatura
Všechny články v sekci
Tvorba pluginů pro Spigot
Miniatura
Následující článek
Prank plugin (Opakování)

 

 

Komentáře

Avatar
David Podeszwa:

Upřímně nejraději používám druhou možnost obarvení textu. Sice není tak rychlá na napsání ale to už je jen maličkost ale za to přímo vidím v kodu jaka to je barva a pokud se na kod podivam po delší době vim co znamena a nemusim luštit co kde jaké písmenko znamená :D Ale je to na každém co používá. Jinak hezky tutorial, pokud vím tak to je asi zatím první psaný plugin tutoriál v češtině který není psaný chaoticky a v podobě ITnetwork seriálu dává smysl a asi ho budu číst i přes to že s Spigotem už umím možná trošku víc než ůplné základy.

 
Odpovědět  +1 18. května 13:35
Avatar
PandaP968
Redaktor
Avatar
PandaP968:

Ahoj, druhou možnost používám taktéž, je nejrychlejší a nejspolehlivější. Toto nebudou jen základy. Budu zde publikovat i tvorbu např. nějakých miniher a zajímavých problematických pluginů.

Odpovědět 18. května 13:39
Autor se zabývá programováním v Javě, PHP, HTML a CSS. Většinu času programuje pluginy pro Minecraft servery.
Avatar
PandaP968
Redaktor
Avatar
PandaP968:

Ještě se opravím, používám tedy tu první možnost se znakem §

Odpovědět 18. května 13:51
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 3 zpráv z 3.