Přejít k navigační liště

Zdroják » Různé » Vývoj pluginu do Minecraftu – bukkit server

Vývoj pluginu do Minecraftu – bukkit server

Články Různé

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.

Nálepky:

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

Komentáře

Subscribe
Upozornit na
guest
7 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
mefi

Neni implementace onDispense(…) blbe? ten kod co tam je nedava moc smysl.. ;)

Larry

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

jiri.benes01

jak Mojang spustil Realmy, tak zmenil pravidla a zakazuje provozovani jinych serveru pokud vybiraji penize.

Lukas

Admine HunterCz :D

Petr Švrček

Jaký je program k tomu?

Koolyc

Eclipse

Jan Zavrel

Ahoj, chtěl bych se zeptat, jak to spustit nebo co s tím udělat (jak založit java script) atd.

Děkuji

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.