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.
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
Neni implementace onDispense(…) blbe? ten kod co tam je nedava moc smysl.. ;)
Urcite mas pravdu, malo to asi byt if (event.getItem().getType() == Material.LAVA_BUCKET) … alebo tak nieco :). Kedysi som sa skusal hrat s Bukkitom no teraz v poslednej dobe nestiham tak sa tomu uz nevenujem, ale snad sa este niekedy k tomu vratim, kazdopadne sa tesim na dalsie casti :). Tu je nieco co som kedysi skusal robit: http://91.230.45.240/mc/index.php
jak Mojang spustil Realmy, tak zmenil pravidla a zakazuje provozovani jinych serveru pokud vybiraji penize.
Admine HunterCz :D
Jaký je program k tomu?
Eclipse
Ahoj, chtěl bych se zeptat, jak to spustit nebo co s tím udělat (jak založit java script) atd.
Děkuji