IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 2 - Minecraft Modding - Hlavní třída a Item

V minulém díle, Minecraft Modding - Úvod, jsme se koukli jak na nastavení prostředí pro modding, tak i na 2 finální atributy našeho modu: MODID a VERSION přičemž je povinné pouze MODID (kdybychom nenapsali verzi, nic se neděje).

Dnes se koukneme na hlavní třídu našeho modu a ještě si přidáme item. (Vše potřebné je ke stáhnutí pod článkem.)

Hlavní třída modu

Nyní by bylo příhodné, říci si něco o hlavní třídě našeho modu: Tato třída musí být označena anotací vážící se k interface @Mod a nastaven parametr @Mod(modid=“Muj_Mod­“), parametr VERSION můžeme vynechat:

@Mod(modid = “Muj_Modik“, version = “0.1AlphaBlaBla“)
public class Main

Každá třída s touto anotací bude brána jako nový mod. Nyní bych chtěl zmínit ještě to, že Forge si díky tomuto označení @Mod načte tento mod, z čehož jasně vyplývá, že je povinné tuto anotaci spolu s uložením MODID napsat nad hlavní mod třídu. Pokud chcete vědět, jaké všechny atributy můžete nastavit, jednoduše podržte Control a najeďte myší na @Mod (a klikněte). Ale to jen tak okrajově, mod můžeme dělat klidně bez těchto znalostí.

init Metody

Dobrá - máme třídu, kterou FML bere jako mod avšak nemůže s ní nijak komunikovat a k tomu nám poslouží metody. Hlavními metodami jsou:

@EventHandler
public void preInit(FMLPreInitializationEvent event)

@EventHandler
public void init(FMLInitializationEvent event)

@EventHandler
public void postInit(FMLPostInitializationEvent event)

Tyto metody jsou volány postupně v určité fázi, kdy se hra spouští. Nezapomeňme přitom na anotaci @EventHandler, jelikož všechny tyto metody musí být tímto označeny. Pro více informací se koukněte na popis @EventHandler (jenom na to najeďte v Eclipse). Je zde mnoho textu, já se pouze pokusím nastínit ty nejdůležitější:

  • preInit : Přečtěte si config, vytvořte si blok itemy a registrujte je pomocí GameRegistry (o tom za chvíli).
  • init : Nastav mod, registruj recepty, pošli ostatním modům zprávu, že tu jsi.
  • postInit : Dokonči nastavení svého modu podle komunikace s ostatními mody.

Item

To bychom měli trochu teorie a teď si pojďme přidat/vytvořit nějaký item. Nejprve si ukážeme, co jsme zatím udělali:

@Mod(modid = Main.MODID, version = Main.VERSION)
public class Main
{
    public static final String MODID = "SulMod";
    public static final String VERSION = "1.0";

    @EventHandler
    public void preInit(FMLPreInitializationEvent event){}

    @EventHandler
    public void init(FMLInitializationEvent event){}

    @EventHandler
    public void postInit(FMLPostInitializationEvent event){}

}

Nyní deklarujeme atribut této třídy, který bude typu Item.

public static Item itemSul = new Item();

Můžeme napsat i toto avšak prakticky by tento item ani nemohl existovat protože potřebuje String UnlocalizedName, což je něco jako MODID itemu čili "ITEMID".

public static Item itemSul = new Item().setUnlocalizedName("itemSul");

Jelikož všechny metody set vracejí právě instanci toho itemu, můžeme deklaraci itemu takto jednoduše řetězit. Dále si nastavíme CreativeTab, což je seznam itemů např: jídlo, nástroje + zbraně + brnění, materiály, bloky. To známe z creativu, když otevřeme inventář. Můžeme samozřejmě vytvořit náš vlastní CreativeTab avšak pro začátek se spokojíme pouze s Minecraftími "Taby".

public static Item itemSul = new Item().setUnlocalizedName("itemSul").setCreativeTab(CreativeTabs.tabMaterials);

V tomto kroku bych chtěl zmínit, že CreativeTabs.ta­bAllSearch nastavíme tehdy, když si budeme přát aby náš item šlo vyhledat, ale nevíme do jaké "Taby" ho máme dát.

Textury

public static Item itemSul = new Item().setUnlocalizedName("itemSul").setCreativeTab(CreativeTabs.tabMaterials).setTextureName("item_sul");

Zde nastavujeme jméno textury. Jistě vás napadlo, že texturu si budeme muset udělat sami. vytvoříme si tedy v nějakém obrázkovém editoru např. GIMP plátno 16X16 ale klidně i větší(32X32) nezapomínejme na Alpha kanál čili kanál průhlednosti. V tom pixelu, kde je Alpha míň jak 255 bude Minecraft považovat tento pixel za průhledný a tudíž ho nevykreslí.(Ke stažení pod článkem) Obrázek máme, teď ovšem nastává otázka, kam s ním. Ve složce vašeho modu tj. kde je složka eclipse, v ní je složka se jménem vašeho modu(projektu v Eclipse, já mám "SaltMod") do ní vložte tyto složky /src/assets/mi­necraft/textu­res/items. (Ke stáhnutí pod článkem) Nyní do složky items vložte nakreslený obrázek se jménem "sul.png".

Minecraft Modding

Registrace Itemu

Item bychom tím pádem měli, teď ho musíme registrovat (bez toho by žádný item nebyl). Uděláme to přes statickou třídu GameRegistry. Jak již jsme si řekli, použijeme k tomu metodu preInit.

@EventHandler
public void preInit(FMLPreInitializationEvent event){
    GameRegistry.registerItem(itemSul, "itemSul");
}

První parametr dvouparametrické metody je nový item a druhý parametr je jméno. Nyní když program spustíme, měli bychom vidět zaprvé v Mods náš mod a zadruhé po najetí nějakého světa v creativu, když otevřeme inventář, zadáme do vyhledávání "sul", měli bychom najít náš item.

Lang

Minecraft Modding

Jistě jste si všimli jednoho nedostatku, po najetí na náš item jsme zjistili že jméno není takové, jak jsme si představovali a zadali s metodou setUnlocalized­Name("itemSul"), ale jmenuje se "item.itemSul­.name". Je to způsobeno tím, že Minecraft je samozřejmě hrou mezinárodní a můžeme si tam nastavit takřka jakýkoliv jazyk, zčehož nutně vyplývá, že jsme nenastavili název itemu, ale pouze univerzální jméno, ke kterému se musí přiřadit správný název ve správném jazyce ve správném jazykovém souboru. Tento soubor nalezneme ve složce eclipse, která je v našem velkém projektu. Dále ve složce eclipse je složka SaltMod/src/as­sets/minecraf­t/lang*(Ke stáhnutí pod článkem).

Minecraft Modding

V této složce si vytvoříme soubor en_GB.lang a následně jej otevřeme v Pozn. bloku. Nyní budeme tedy jméno upravovat právě pro jazyk anglický, Velká Británie. Nyní již k samotné syntaxi, na každý řádek se píše překlad jednoho itemu, přičemž nejprve napíšeme univerzální jméno našeho itemu včetně postraních názvů př. "item.to_jméno­.name", poté znamínko "=" a následně překlad, čili jak chceme, aby se nám to zobrazilo.

item.itemSul.name=Sul
item.itemDalší.name=Další hezký item

Aha, tohle bychom měli jenže teď zde padla otázka, co když uživatel bude mít nastaven jazyk jiný např. češtinu. To se mu potom zase zobrazí "item.itemSul­.name". To lze vyřešit dvěma způsoby:

  1. Vytvořit soubory se všemy jazyky a následně vše do nich přepsat.
  2. Nastavit ve Forge, aby se tento název objevoval vždy bez rozdílu na zvoleném jazyku.

Jistě vás napadlo, že bude lepší zp č. 2. Bohužel tento způsob (metoda) je označena @Deprecated což znamená, že ve verzi 1.8 již nebude existovat. Stejně ji tu máte:

@EventHandler
 public void preInit(FMLPreInitializationEvent event){
        GameRegistry.registerItem(itemSul, "itemSul");
        LanguageRegistry.addName(itemSul, "Sul");
    }

Vytvoříme si tedy soubor lang se jménem "en_GB.lang" a vložíme do něj "item.itemSul­.name=Sul". (!Pokud jste zjistili jméno univerzálního souboru .lang určitě mi napište do komentářů, díky!) Tím pádem si musíme nastavit Minecraft na English(UK). Nyní po spuštění a po najetí na ten item bychom měli být spokojeni.

Minecraft Modding

Závěr

Ještě jsem se rozhodl sem dát celý kod, co jsme prozatím udělali.

@Mod(modid = Main.MODID, version = Main.VERSION)
public class Main
{
    public static final String MODID = "SulMod";
    public static final String VERSION = "1.0";

    public static Item itemSul = new Item().setUnlocalizedName("itemSul").setCreativeTab(CreativeTabs.tabMaterials).setTextureName("sul");

    @EventHandler
    public void preInit(FMLPreInitializationEvent event){
        GameRegistry.registerItem(itemSul, "itemSul");
    }

    @EventHandler
    public void init(FMLInitializationEvent event){}

    @EventHandler
    public void postInit(FMLPostInitializationEvent event){}
}

V dalším díle, Minecraft Modding - Konvence a SidedBlockTextures, se koukneme už i na bloky, které jsou trošku náročnější.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 76x (2.43 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Minecraft Modding - Úvod
Všechny články v sekci
Minecraft Modding
Přeskočit článek
(nedoporučujeme)
Minecraft Modding - Konvence a SidedBlockTextures
Článek pro vás napsal Matěj Černý
Avatar
Uživatelské hodnocení:
6 hlasů
Autor se věnuje programování v Javě, C++, zajímá se o OpenGL.
Aktivity