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

Zdroják » Různé » Vývoj módu pro Minecraft

Vývoj módu pro Minecraft

Články Různé

Pro hru Minecraft existuje veliké množství modifikací – módů. Přidávají nové bloky, předměty, mění herní mechaniku, rozšiřují herní možnosti. Pokud máte nápady, schopnosti a hlavně čas, můžete se pustit do vývoje nového zajímavého módu. Tento článek se pokusí ukázat, jak začít.

Naprostá většina módů využívá neoficiální API – Minecraft Forge. Firma Mojang přes mnohaleté sliby o uvolnění modding api stále nevydala žádné oficiální api pro rozšiřování a upravování Minecraftu. Pro zavádění módů je třeba i FML – Forge Mod Loader, ten je součástí Forge a bez něj by to nefungovalo.

Jako ukázku jsem zvolil svůj mód, který dělá jednoduchou věc – upravuje chování nicků (nametagů) nad hráči. Modifikace je vhodná především pro PvP servery, výchozí vanilla Minecraft totiž ukazuje nicky hráčů i přes bloky. Tento mód zobrazí nick nad hráčem, pouze pokud hráče skutečně vidíte a jste dostatečně blízko. Mód tedy umožní mnohem férovější hru.

Z webu files.minecraftforge.net tedy stáhneme a rozbalíme Src Minecraft forge
Uvnitř naleznete spustitelný soubor gradlew. Připravíme si workspace:

 ./gradlew setupDecompWorkspace
 ./gradlew eclipse

V eclipse si zvolíme cestu k adresáři eclipse uvnitř rozbalené forge, po spuštění výše uvedených příkazů tam bude kompletně připravené prostředí pro vývoj. Přes tlačítko Run bude možné si zvolit, zda chceme pouštět server či klient. V project exploreru jsou nyní dvě důležitá místa:

src/main/java
src/main/resources

V prvním jmenovaném se bude nacházet kód samotného módu, v druhém budou především tzv. assets – grafika, zvuky, překlady a další součásti. Dále je zde textový soubor mcmod.info, který obsahuje informace o módu, jako je verze, autor, domovská stránka a další. Informace z tohoto souboru jsou pak ve hře zobrazeny po kliknutí na tlačítko Mods a vybrání příslušného módu.

Mód jsem pojmenoval Nametags Tweaks, vytvořím tedy v src/main/java package hunterzcz.NametagsTweaks a dále v něm třídy NametagsTweaks.java a NametagsTweaksEventHandler.java.

Hlavní třída módu je první uvedená, kterou si nyní rozebereme:

package hunterzcz.NametagsTweaks;

import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;

@Mod(modid = NametagsTweaks.modid, name = "NametagsTweaks", version = "1.0", dependencies = "")

public class NametagsTweaks {
 public static final String modid = "NametagsTweaks";
 
    @EventHandler
    public void load(FMLInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(new NametagsTweaksEventHandler());
 
    }

}

Importy nám doplní eclipse, či se můžeme inspirovat ukázkovým módem, který je součástí instalace Forge. Řádek

@Mod(modid = NametagsTweaks.modid, name = "NametagsTweaks", version = "1.0", dependencies = "")

obsahuje základní informace o módu, jako je modid, název, verze a případně závislosti.

Dále náleduje definice samotné třídy a proměnné modid. Pomocí anotace @EventHandler označíme metodu load, která se volá při inicializaci módu. Touto metodou zaregistrujeme náš EventHandler NametagsEventHandler. V této ukázce reaguje tento EventHandler na jedinou událost – renderování hráče.

Třída Event handleru (NametagsTweaksEventHandler.java):

package hunterzcz.NametagsTweaks;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.client.event.RenderLivingEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class NametagsTweaksEventHandler {
 
 @SubscribeEvent
 @SideOnly(value = Side.CLIENT)
 public void onRenderLiving(RenderLivingEvent.Specials.Pre event){
     if ((event.entity instanceof EntityPlayer))
        {
          if (event.isCancelable())
          {
           Minecraft mc = Minecraft.getMinecraft();
         MovingObjectPosition objectMouseOver = mc.objectMouseOver;
         try {
          Entity Target = objectMouseOver.entityHit;
          if(mc.objectMouseOver != null && mc.objectMouseOver.entityHit != null) {
           if(event.entity.getEntityId() == Target.getEntityId()) {
            event.setCanceled(false);
           }
           else  {
            event.setCanceled(true);
           }
          }
          else {
           event.setCanceled(true);
          }
         } catch (Exception e) {
          
         }
          
          }
        }
  
 }

}

Po importech a definici třídy následují dvě velmi důležité anotace:
@SubscribeEvent – bude následovat metoda, která se vykoná při určité události ve hře
@SideOnly(value = Side.CLIENT) – metoda se vykoná jen na klientu – server nic nerenderuje

Událost, která se děje, když se renderuje nick nad hráčem, se jmenuje RenderLivingEvent.Specials.Pre. Dále už následuje samotný kód, jak renderování modifikovat.

První podmínka určuje, že nás zajímá renderování jen entit hráčů. Pokud je zrušitelná, pokračujeme dále, kde si definujeme proměnnou, ve které bude uloženo, přes co přejíždíme ukazatelem myši uprostřed herní obrazovky.

Abych zabránil NPE (Null Pointer Exception), když se díváte na hráče, který je zrovna na žebříku, přidal jsem část try/catch pro zachycení této výjimky.

Dále si do proměnné Target uložíme entitu hráče, na kterou právě ukazujeme (hráč, na něhož je zaměřen ukazatel myši). Nyní následuje vlastně jádro celého módu:

if(mc.objectMouseOver != null && mc.objectMouseOver.entityHit != null) {
 if(event.entity.getEntityId() == Target.getEntityId()) {
  event.setCanceled(false);
        }
        else  {
         event.setCanceled(true);
        }
else {
 event.setCanceled(true);
}

To funguje následovně: když přejíždím myší přes hráče, na kterého se dívám, event se nezruší, ve všech ostatních případech se event zruší a tedy nicky ostatních hráčů, které mám v zorném poli, a také nicky hráčů, kteří jsou například za zdí, se nezobrazí.

Pomocí tlačítka Run a profilu Client si můžete mód vyzkoušet, když se připojíte na server, kde budete mít několik hráčů. Jakmile máte ověřeno, že vše funguje, můžete mód sestavit pomocí gradle. Ještě před tím si ale upravte soubor build.gradle, kde pozměnte alespoň řádky version a archiveBaseName, kde zapište verzi módu a jeho modid (název).

Sestavení módu se provádí příkazem:

./gradlew build

Při tomto kroku dojde nejen ke kompilaci do jar souboru, ale také obfuskaci. Hotový mód pak naleznete v adresáři build/libs. Svůj vytvořený mód pak můžete publikovat např. na minecraft fóru, či planet minecraft. Tento sestavený mód tedy naleznete zde v minecraft fóru.

Existuje veliké množství tutorálů, či módů s otevřenými zdrojovými kódy na githubu, ze kterých se můžete učit. Minecraft Forge má svou wiki s tutoriály, případně fórum a také IRC kanál. Mezi doporučované tutoriály bych zařadil např. Wuppy’s tutorials.

Přeji hodně úspěchů při tvorbě vlastních Minecraft modifikací.

Komentáře

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

Hunterzi to se povedlo to se mi bude hodit aspon už ,mohu pracovt na B-paradise Menu do louncheru na kterém pracuji už rok dekuji

Petr Šabata

Byť detaily použitého API neznám, nutnost zachycovat NPE mě zarazila. Předpokládám, že by to mělo být řešitelné vhodnou kontrolou… Z kódu bohužel není úplně jasné, kde může spadnout. Chtělo by to zapracovat na čitelnosti… :)

public void onRenderLiving(RenderLivingEvent.Specials.Pre event) {
  if (!event.entity instanceof EntityPlayer) {
    return;
  }

  if (!event.isCancelable()) {
    return;
  }

  Minecraft mc = Minecraft.getMinecraft();
  MovingObjectPosition objectMouseOver = mc.objectMouseOver;

  if ((objectMouseOver != null) && (objectMouseOver.entityHit != null))
  {
    Entity target = objectMouseOver.entityHit;

    event.setCancelled(event.entity.getEntityId() != target.getEntityId());           
  } else {
    event.setCancelled(true);
  }
}  

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.