Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Lekce 5 - Dynamická konfigurace a práva (MOTD)

Java Minecraft Modding Spigot Dynamická konfigurace a práva (MOTD)

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, První event a konfigurace (MOTD), jsme si ukázali jak základně používat konfiguraci a event na připojení hráče. Dnes budeme pokračovat v konfiguraci.

Co dnes budeme tvořit?

Podíváme se, jak upravovat konfiguraci ze hry. Vytvoříme příkaz /motd, vypisující aktuální MOTD z konfigurace, funkcí /setmotd budeme moci nastavit nový MOTD, který se automaticky přepíše. Využijeme práva, aby nemohl využívat tyto příkazy každý. U příkazu /setmotd se v článku pozastavíme, protože bude komplikovanější.

Příkaz pro vypsání MOTD (/motd)

Aktuální kód vypadá takto:

public class MOTD extends JavaPlugin implements Listener {

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

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

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

}

Vytvoříme si metodu pro vytvoření příkazu /motd:

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    if (cmd.getName().equalsIgnoreCase("motd")) {
        return true;
    }
    return false;
}

Použili jsme metodu pro vytvoření příkazu onCommand(), kterou jistě bezpečně již známe, zpravidla vracíme false. V metodě vytváříme samotný příkaz pomocí podmínky. Vracíme hodnotu true, jelikož přidáme do tohoto příkazu vrácení MOTD textu z konfigurace.

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    if (cmd.getName().equalsIgnoreCase("motd")) {
        sender.sendMessage(ChatColor.RED + "MOTD: " + getConfig().getString("message"));
        return true;
    }
    return false;
}

Odesílateli příkazu vrátíme zprávu, která obsahuje MOTD. Všimněte si, že jsme použili novou metodu getString() navazující na metodu getConfig(), kterou známe ze 4. tutoriálu. Metoda getString() vrátí text z konfigurace pod příslušným názvem - argument metody getString(). My máme MOTD v konfiguraci uložené již pod zmiňovaným názvem message. Zkompilujeme, nahrajeme na server a příkaz vyzkoušíme, jestli funguje. Nezapomeneme zapsat příkaz do souboru plugin.yml.

Skvěle! 8-) Plugin funguje, příkaz taktéž. Nyní přejdeme na těžší část, tvorbu příkazu pro nastavení nového MOTD ze hry a aplikaci práv.

Příkaz pro nastavení nového MOTD (/setmotd <nová zpráva>)

Opět si založíme nové jádro pro příkaz, který implementujeme do stávající metody onCommand().

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    if (cmd.getName().equalsIgnoreCase("motd")) {
        sender.sendMessage(ChatColor.RED + "MOTD: " + getConfig().getString("message"));
        return true;
    }

    if (cmd.getName().equalsIgnoreCase("setmotd")) {
        return true;
    }

    return false;
}

Nevšímejme si příkazu /motd, soustřeďme se nyní na příkaz /setmotd (Kód je zde celý úmyslně, abychom se neztratili). Do příkazu zakomponujeme pár podmínek, abychom předešli chybám hráčů při psaní příkazu. Pokud hráč napíše pouze příkaz /setmotd, tak ho plugin upozorní na tuto skutečnost. Základní práci s argumenty známe již z 3. tutoriálu.

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    if (cmd.getName().equalsIgnoreCase("motd")) {
        sender.sendMessage(ChatColor.RED + "MOTD: " + getConfig().getString("message"));
        return true;
    }

    if (cmd.getName().equalsIgnoreCase("setmotd")) {
        if (args.length == 0) {
            sender.sendMessage(ChatColor.RED + "Spatne argumenty! /setmotd <motd>");
            return true;
        }
        return true;
    }

    return false;
}

V tomto případě, pokud odesílatel nesplňuje argumenty, tj. napsal pouze /motd, server odesílatele upozorní. Využijeme novou metodu hasPermission(). Tato metoda můžeme používat na instanci tříd CommandSender a Player. Využívá se, pokud chceme povolit příkaz či jinou funkci skupině uživatelů, kteří mají permissi vyjádřenou v argumentu této metody. Náš algoritmus bude následující - pokud hráč nemá dané oprávnění, vypíše se mu upozornění, jestliže toto oprávnění má, podmínka se bude ignorovat.

if (cmd.getName().equalsIgnoreCase("setmotd")) {
    if (!sender.hasPermission("motd.set")) {
        sender.sendMessage(ChatColor.RED + "Na tuto akci nemas opravneni!");
        return true;
    }
     if (args.length == 0) {
        sender.sendMessage(ChatColor.RED + "Spatne argumenty! /setmotd <motd>");
        return true;
    }
     return true;
}

Zopakujeme si trochu OOP Javy. Pokud hráč napíšeme před zprávu např. 100 mezer, musí se zpráva nastavit do konfigurace bez zbytečných mezer. Využijeme třídu StringBuilder a cyklus, který na String aplikuje metodu append() odstraňující zbytečné mezery.

if (cmd.getName().equalsIgnoreCase("setmotd")) {
    if (!sender.hasPermission("motd.set")) {
        sender.sendMessage(ChatColor.RED + "Na tuto akci nemas opravneni!");
        return true;
    }
     if (args.length == 0) {
        sender.sendMessage(ChatColor.RED + "Spatne argumenty! /setmotd <motd>");
        return true;
    }
     StringBuilder builder = new StringBuilder();
    for (int i = 0; i < args.length; i++) {
        builder.append(args[i] + " ");
    }
     return true;
}

Proměnnou builder převedeme zpátky do objektového datového typu String.

if (cmd.getName().equalsIgnoreCase("setmotd")) {
    if (!sender.hasPermission("motd.set")) {
        sender.sendMessage(ChatColor.RED + "Na tuto akci nemas opravneni!");
        return true;
    }
     if (args.length == 0) {
        sender.sendMessage(ChatColor.RED + "Spatne argumenty! /setmotd <motd>");
        return true;
    }
     StringBuilder str = new StringBuilder();
    for (int i = 0; i < args.length; i++) {
        str.append(args[i] + " ");
    }

    String motd = str.toString();
     return true;
}

Na konec bloku využijeme metodu set(), navazující na metodu getConfig(). Prvním argumentem této metody je název objektu a druhým argumentem nový text či podmínka do tohoto objektu. Vždy potřebujeme po nějaké změně konfiguraci uložit pomocí metody saveConfig(), kterou bezpečně známe. Abychom upozornili odesílatele na změnu, můžeme vypsat zprávu do chatu.

if (cmd.getName().equalsIgnoreCase("setmotd")) {
    if (!sender.hasPermission("motd.set")) {
        sender.sendMessage(ChatColor.RED + "Na tuto akci nemas opravneni!");
        return true;
    }
     if (args.length == 0) {
        sender.sendMessage(ChatColor.RED + "Spatne argumenty! /setmotd <motd>");
        return true;
    }
     StringBuilder str = new StringBuilder();
    for (int i = 0; i < args.length; i++) {
        str.append(args[i] + " ");
    }
     String motd = str.toString();
    getConfig().set("message", motd);
    saveConfig();
    sender.sendMessage(ChatColor.RED + "MOTD: " + motd);
    return true;
}

Co jsme se naučili?

V tomto díle jsme se naučili, jak přenastavit konfiguraci ze hry, jak používat příkaz a zároveň konfiguraci. Využili jsme nové metody pro správu pluginu.

Závěr

Toto by bylo vše k tomuto pátému dílu. V příštím díle bychom se podívali na teleportaci hráčů. Zdrojový kód je ke stažení v příloze. Děkuji za přečtení! V případě problémů se obraťte do komentářů nebo do zpráv!


 

Stáhnout

Staženo 7x (1.29 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

 

Článek pro vás napsal PandaP968
Avatar
Jak se ti líbí článek?
3 hlasů
Autor se zabývá programováním v Javě. Většinu času programuje pluginy pro Minecraft servery.
Miniatura
Předchozí článek
První event a konfigurace (MOTD)
Miniatura
Všechny články v sekci
Tvorba pluginů pro Spigot
Aktivity (2)

 

 

Komentáře

Avatar
Ondřej Nováček:19. února 23:09

Úžasný tutoriál :D Plánuje se pokračování ?

 
Odpovědět 19. února 23:09
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Ondřej Nováček
gcx11:20. února 0:14

Podle toho, co vím, tak bohužel ne

 
Odpovědět  +1 20. února 0:14
Avatar
Odpovídá na gcx11
Ondřej Nováček:20. února 18:41

Škoda. Takový kvalitní tutoriál abys v češtině pohledal :(

 
Odpovědět  +1 20. února 18:41
Avatar
Adam Adikl Volkman:25. června 21:51

Udělej další.

 
Odpovědět 25. června 21:51
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 4 zpráv z 4.