Vývoj pluginu do Minecraftu – Sponge server

Minecraft se stále drží na výsluní sandboxových her, i když jeho sláva pomalu pohasíná. Cílem tohoto článku je stručný úvod, jak napsat jednoduchý plugin pro nový Sponge server.

Když byl v září roku 2014 ukončen vývoj bukkitu, začal vznikat nový projekt – Sponge. Tento server je psán úplně odzačátku a jeho módovaná verze – SpongeForge plně spolupracuje s Minecraft Forge. Také existuje nemódovaná verze – SpongeVanilla. Obě verze mají společné API. Plugin, který napíšete, bude tedy fungovat na obou verzích bez problémů. Bohužel ani dnes stále není k dispozici léta slibované oficiální modding API od Mojangu. Místo toho se tato firma v roce 2014 koupená Microsoftem začala orientovat na změny v EULA – postupnými změnami bere možnosti majitelům serverů jak financovat provoz.

V tomto článku si ukážeme, jak jednoduchý plugin pro bukkit popsaný v článku „Vývoj pluginu do Minecraftu – bukkit server“ přepsat, aby fungoval i pro Sponge API. Nejdříve je ale potřeba uvést několik odkazů na zdroje Sponge projektu, dokumentaci a další příklady.

Poslední z odkazů využijeme i při tvorbě našeho vlastního pluginu. Vytvoříme si nějaký adresář pro náš nový plugin. Někam vedle si naklonujeme repozitář s ukázkovými pluginy pomocí

git clone https://github.com/SpongePowered/Cookbook.git

Pro sestavování pluginů je doporučený a také nejčastěji používaný nástroj Gradle (podobně jako módů využívajících Minecraft Forge), použijeme jej tedy také. Alternativou může být použití nástrojů maven či ant. Do našeho adresáře tedy zkopírujeme z ukázkového pluginu WorldsTest adresář gradle, soubory build.gradle, gradlew a gradlew.bat. Dále vytvoříme adresář src/main/java, ve kterém se budou nacházet zdrojové kódy našeho pluginu. Dále bude potřeba chmod +x gradlew (používám linux). Tím máme hotovu základní adresářovou strukturu pro náš nový plugin (projekt).

Nyní připravený prázdný projekt naimportujeme do IDE – Pokud používáte Eclipse, nainstalujte si z marketplace gradle plugin, pak pomocí File>Import proveďte import gradle projektu. Po vybrání adresáře je třeba kliknout na „Build Model“, poté zaškrtnout (vybrat) náš projekt. Nyní můžeme klasicky vytvořit nejdříve např. java package cz.zdrojak.ukazka a poté třídu UkazkaPluginu.

Ukázka pluginu pro Sponge vychází z ukázky pluginu pro Bukkit, kterou jsem publikoval zde na zdrojáku před delší dobou. Zdrojový kód vypadá tedy takto:

package cz.zdrojak.ukazka;

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.block.ChangeBlockEvent;
import org.spongepowered.api.event.game.state.GameStartingServerEvent;
import org.spongepowered.api.plugin.Plugin;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.channel.MessageChannel;
import org.spongepowered.api.text.format.TextColors;

@Plugin(id = "ukazkapluginu", name = "UkazkaPluginu", version = "1.0", description = "example code of sponge plugin")
public class UkazkaPluginu {
    
    @Listener
    public void onEnable(GameStartingServerEvent event) {
         //Sponge.getEventManager().registerListeners(this, UkazkaListener(this));
         
    }
    
    @Listener
    public void onBlockBreak(ChangeBlockEvent.Break event) {
        
        final Player player = event.getCause().first(Player.class).orElse(null);
        if (player == null) {
            return;
        }
        
        String minedblock = event.getTransactions().get(0).getOriginal().getState().getName();
        
        if (minedblock.contains("minecraft:diamond_ore")) {
            
            Text broadcast = Text.of(TextColors.AQUA, "Hrac ", TextColors.GOLD, player.getName() , TextColors.AQUA, " prave nasel diamanty!");
            MessageChannel.TO_ALL.send(broadcast);
            
        }
        
    }

}

V době psaní článku SpongeAPI neobsahovalo event pro dispenzer, proto byla oproti bukkit verzi tato část vypuštěna.

Nyní si tedy rozebereme jednotlivé části tohoto jednoduchého pluginu.

Před definicí hlavní třídy pluginu je anotace obsahující informace o pluginu, myslím, že není třeba ji podrobněji rozebírat, její části jsou samovysvětlující. Listener onEnable je v kódu uveden jen jako ukázka toho, na jakém místě a jak registrovat případný hlavní EventHandler složitějšího pluginu.

Dále následuje Listener události, když je rozbit blok. Protože SpongeAPI uchovává příčiny (cause) událostí, je třeba jako první zjistit, zda příčinou rozbití bloku byl hráč. Toto zjištění dělá tato část kódu:

final Player player = event.getCause().first(Player.class).orElse(null);
if (player == null) {
    return;
}

Poté již následuje zjištění, jaký blok byl rozbit:

String minedblock = event.getTransactions().get(0).getOriginal().getState().getName();

následovaný podmínkou, zda se jednalo o diamantovou rudu:

        if (minedblock.contains("minecraft:diamond_ore")) {
            
            Text broadcast = Text.of(TextColors.AQUA, "Hrac ", TextColors.GOLD, player.getName() , TextColors.AQUA, " prave nasel diamanty!");
            MessageChannel.TO_ALL.send(broadcast);
            
        }

Tvar stringu minedblock se skládá ze dvou částí – před dvojtečkou je mód, v případě vanilla nemódovaných bloků/itemů je zde „minecraft“ a za dvojtečkou už samotný blok/item. Pokud tedy hráč najde diamantovou rudu a vykope ji, server pošle zprávu všem (broadcast) připojeným hráčům na serveru. Zprávu si barevně naformátujeme do proměnné broadcast:

Text broadcast = Text.of(TextColors.AQUA, "Hrac ", TextColors.GOLD, player.getName() , TextColors.AQUA, " prave nasel diamanty!");

a odešleme všem:

MessageChannel.TO_ALL.send(broadcast);

Plugin se sestaví pomocí ./gradlew build v adresáři pluginu. V podadresáři build/libs/ naleznete pak jar soubor, který nahrajete do adresáře mods/ na serveru. Pokud již máte nějaké zkušenosti s Bukkit pluginy, nebude vám změna na Sponge dělat moc potíže. Přeji hodně úspěchů při programování pluginů pro SpongeAPI!

Správa linuxových serverů je jeho prací i koníčkem. Založil RebelGames.net a kromě programování pluginů se věnuje i módům do Minecraftu.

Komentáře: 1

Přehled komentářů

Alois Kovařík Konečně někdo
Zdroj: https://www.zdrojak.cz/?p=18504