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

Odebírat
Upozornit na
guest
7 Komentářů
Nejstarší
Nejnovější Nejvíce hlasů
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

Proč vám model napíše Python, i když jste si řekli o Rust

AI
Komentáře: 0
Výkonnostní propast mezi Pythonem a ostatními jazyky se za poslední rok a půl skoro zavřela. Dnešní modely zvládají Rust i Go srovnatelně dobře. Když jim ale volbu necháte, sáhnou stejně po Pythonu. A u knihoven je to ještě výraznější: mezi funkčně srovnatelnými balíčky je až 84procentní rozdíl v kvalitě generovaného kódu. Proč to tak je a co s tím.

WP2Shell: Kritická hrozba pro samotné jádro WordPressu. Útočníci mohou získat kontrolu nad webem

Zranitelnost ve WordPressu není žádná novinka. Kdo provozuje weby postavené na této platformě, ví, že bezpečnostní záplaty chodí prakticky pořád. O to větší pozornost by měla vzbudit chyba, u které nic z toho neplatí. A přesně takový je případ zranitelnosti, která dostala přezdívku wp2shell. potřeb. Zranitelný kontaktní formulář, děravý e-shopový plugin, opomenutá kontrola oprávnění v nějaké obskurní rozšiřující knihovně – to je denní chleba každého, kdo sleduje bezpečnostní feedy. Zpráva „nová chyba ve WordPress pluginu“ má tak nízkou informační hodnotu, že ji většina lidí přejde bez mrknutí oka.

Mýtus jedné aplikace: proč PWA nenahradí vývoj pro každou platformu

PWA mohou webu přidat ikonu na ploše, fungování bez připojení, notifikace a některé systémové funkce. Nejsou ale cestou k jednomu klientu pro všechny platformy. Vyplatí se tam, kde se lidé k webu vracejí a ocení okamžitý vstup z odkazu. Jakmile aplikace musí spolehlivě běžet na pozadí nebo fungovat stejně na každém zařízení, bývá vhodnější nativní řešení.