Vývoj pluginu do Minecraftu – bukkit server

Minecraft se stal fenoménem. Malé hranaté kostičky si získaly nejedno hráčské srdce. Podívejme se společně, jak je možné pro tuto hru vytvořit jednoduchý plugin a nainstalovat jej na server.

Snad každý z vás se již alespoň okrajově setkal s jedním z herních fenoménů dnešní doby – sandboxovou hrou Minecraft od švédské firmy Mojang. V tomto článku bych rád ukázal úplné základy pluginu – serverového rozšíření – pro nejznámější a nejpoužívanější serverovou implementaci – bukkit.

Bukkit je vlastně neoficiální implementace minecraft serveru, neboť i přes několikaleté sliby doposud Mojang nezveřejnil žádné API. Přitom právě množství pluginů a módů (o těch třeba někdy příště) ukazuje na ohromný potenciál této hry a mnoho vývojářů tuto hru bere spíše jako engine.

Pomocí pluginů lze upravovat mechaniku hry, díky zachytávání událostí ve hře (event) lze vytvářet různé reakce na podněty a podobně. Existuje řada sofistikovaných pluginů, které vytvoří různé zábavné minihry, jako například koulovaná, podkopávačka a další. Vše se dá pomocí pluginu zautomatizovat – rozdělení hráčů na týmy, určení výchozí pozice a nakonec samotná hra.

Jako ukázku pro začátek ale zvolím něco jednoduššího. Osobně používám pro vývoj Eclipse, následující postup bude tedy právě pro toto vývojové prostředí. Založíme si nový Java projekt, v něm package a nakonec první class. V našem případě jsem projekt pojmenoval ClanekZdrojak, package cz.zdrojak.NovyPlugin a první class bude MujPlugin.java. Dále je potřeba do Build Path libraries přidat jar soubor s bukkit serverem, v našem případě spigot-1.7.10-R0.1-SNAPSHOT.jar

Jdeme na věc

Nyní již k samotnému kódu pluginu. Jako ukázkové zadání jsem zvolil jednoduchý příklad – chceme na serveru globálně zabránit pomocí dispenseru vylévat lávu a dále při vykopání diamantové rudy do globálního chatu napsat, že daný hráč našel diamanty.

Hráč HunterzCZ právě našel diamanty

Ještě než začneme psát samotný plugin, nesmíme zapomenout na vytvoření souboru plugin.yml v našem projektu. Tento soubor bude v našem případě obsahovat následující informace:

name: NovyPlugin
author: HunterzCZ
version: '1.0.0'
description: Example plugin for website zdrojak.cz
main: cz.zdrojak.NovyPlugin.MujPlugin

Většina je samopopisující, za zmínku stojí snad jen položka main, kterou určujete, která class je hlavní, kterou má spustit server.

public class MujPlugin extends JavaPlugin implements Listener {

Každá hlavní class pluginu rozšiřuje JavaPlugin, Listenery bývají u složitějších pluginů samostatně, v našem jednoduchém případě je vše v jednom.

public void onEnable()
{
  getServer().getPluginManager().registerEvents(this, this);
}

Metoda onEnable() se volá při zapínání pluginu a v našem případě provede registraci nového Listeneru pro server.

@EventHandler
public void onDispense(BlockDispenseEvent event) {
 event.getItem().getType();
 if (Material.LAVA_BUCKET != null) {
    event.setCancelled(true);
 }
}

Tento EventHandler obsluhuje událost na serveru pojmenovanou BlockDispenseEvent, v našem případě nás zajímá item, který měl být despenznutý a v případě, že se jedná o kyblík lávy, je tato událost zrušena a kyblík zůstává uvnitř dispenzeru.

@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
  if (event.getBlock().getType() == Material.DIAMOND_ORE) {
    getServer().broadcastMessage(ChatColor.AQUA + "Hrac " + ChatColor.GOLD + event.getPlayer().getDisplayName() + ChatColor.AQUA + " prave nasel diamanty!");
  }
}

Tento EventHandler reaguje na událost BlockBreakEvent, tedy, když hráč rozbije (vytěží) blok. V tomto případě pokud je blokem diamantová ruda, server pošle globální zprávu o tom, že konkrétní hráč našel diamanty. Všimněte si i možností formátování textu, zde uvedenou pouze obarvování pomoci ChatColor.

Při psaní kódu Eclipse krásně navrhuje, co naimportovat, u tohoto pluginu to budou importy začínající org.bukkit.

Jak plugin zprovozníme

Kompletní class:

package cz.zdrojak.NovyPlugin;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class MujPlugin extends JavaPlugin implements Listener
{ 
  
  public void onEnable()
  {
    getServer().getPluginManager().registerEvents(this, this);
  }

  @EventHandler
  public void onDispense(BlockDispenseEvent event) {
    event.getItem().getType();
    if (Material.LAVA_BUCKET != null) {
      event.setCancelled(true);
    }
   
  }
  
  @EventHandler
  public void onBlockBreak(BlockBreakEvent event) {
   if (event.getBlock().getType() == Material.DIAMOND_ORE) {
    getServer().broadcastMessage(ChatColor.AQUA + "Hrac " + ChatColor.GOLD + event.getPlayer().getDisplayName() + ChatColor.AQUA + " prave nasel diamanty!");
   }
  }
}

Pokud vývojové prostředí neukazuje žádnou chybu, plugin sestavíme pomocí Export… vyberete Java a pak Jar file. Nyní máte hotovo.  Zkušenější si mohou ulehčit práci pomocí nástrojů Maven či Gradle. Teď už stačí jen plugin nahrát do adresáře plugins a spustit server. Pokud se rozhodnete svůj plugin publikovat pro veřejnost, asi nejlepším místem je http://dev.bukkit.org, kde máte široký přehled kategorií. Také doporučuji pořídit si dekompilátor javy, který vám usnadní nahlížení do cizího kódu, čímž se můžete hodně naučit.

Další zdroje: Plugin_Tutorial

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: 7

Přehled komentářů

mefi onDispense
Larry Re: onDispense
jiri.benes01 bez peněz
Lukas Super článek
Petr Švrček V čem
Koolyc Re: V čem
Jan Zavrel V čem
Zdroj: https://www.zdrojak.cz/?p=13023