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 5 - Dynamická konfigurace a práva (MOTD)

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.

Tvorba pluginů pro Spigot

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!


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

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

 

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