2. díl - Minecraft Modding - Hlavní třída a Item

Java Minecraft Modding Minecraft Modding - Hlavní třída a Item

V minulém díle 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".

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

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).

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.

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 se koukneme už i na bloky, které jsou trošku náročnější.


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal Matěj Černý
Avatar
Autor se věnuje programování v Javě, moduje Java hru Minecraft a pracuje se Cinema4D.

Jak se ti líbí článek?
Celkem (6 hlasů) :
4444 4


 


Miniatura
Předchozí článek
Minecraft Modding - Úvod
Miniatura
Všechny články v sekci
Minecraft Modding

 

 

Komentáře

Avatar
David Novák
Tým ITnetwork
Avatar
David Novák:

Nejsem Javista (= netuším, jestli by to takhle šlo), ale nebylo by přehlednější napsat to takhle? :)

public static Item itemSul = new Item();
itemSul.setUnlocalizedName("itemSul");
itemSul.setCreativeTab(CreativeTabs.tabMaterials);
itemSul.setTextureName("item_sul");
Odpovědět 17.4.2015 11:46
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Petr Štechmüller:

Ahoj, určitě by to takhle šlo napsat taky, koukni na návrhový vzor stavitel. Co se týče přehlednosti, tak je to věc názoru.

Odpovědět 17.4.2015 13:04
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na David Novák
Zdeněk Pavlátka:

Později je lepší místo tohohle postupu použít třídu dědící od Item, v jejímž konstruktoru to nastavíš. Ale i pak je to řetězení užitečné pro drobné změny parametrů. Co jsem viděl tutoriály po internetu, všude se to píše pomocí toho řetězení.

Odpovědět 18.4.2015 7:02
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
tomekmichalhu:

mě to nefachá (opět), podtrhává mi to Item, CreativeTabs, FMLPreInitiali­zationEvent, GameRegistry, itemSul, FMLPostInitia­lizationEvent :-(

 
Odpovědět  -2 21.7.2015 18:00
Avatar
Richard H.
Redaktor
Avatar
Richard H.:

mam takoví menší problém pořád my to píše item.blabla.name

Odpovědět  -1 27.9.2015 15:59
Malý užitečný manuál je vždy lepší než bichle k ničemu.
Avatar
thebestgamesify:

Mne to furt podčiarkuje to setTextureName a piše mi tam add cast to method re....

 
Odpovědět 6.12.2015 9:47
Avatar
Odpovídá na Richard H.
Neaktivní uživatel:

Ahoj mě to taky blbne :D ale nepadlo mě jestli nemáš špatně nastavený jazyk oni v MC jsou 2 ajiny :D jedna marericka a druha fakt prava anglina

Odpovědět 8.12.2015 17:25
Neaktivní uživatelský účet
Avatar
Odpovídá na Richard H.
Neaktivní uživatel:

Ahoj, nebo ještě na to přišla moje blbost . Zapoměl jsem udělat tečku za lang tudíž to byl jen soubor txt a ne soubor lang :D

Odpovědět 8.12.2015 18:28
Neaktivní uživatelský účet
Avatar
Odpovídá na tomekmichalhu
Tomáš Prokop:

Pokud se nepletu a dobře si vzpomínám, tak stačí najet na to určené slovo (třeba ten Item), aby ti vyskočila ta tabulka a dát "Import 'Item' (net.minecraf­t.item)" :-) Samozřejmě se může stát, že to může být blbě napsané nebo tomu něco chybí, nevím jak bych to popsal, sám nejsem vůbec programátor a učím se to teprve, ale už jsem něco pochytil.. :-)

Editováno 5. dubna 18:33
 
Odpovědět 5. dubna 18:32
Avatar
Richard H.
Redaktor
Avatar
Richard H.:
  • nemělo by se používat cz místo cs ?
  • Aby mi fungovaly textury a lang musel jsme to pojemenovat assets.minecraft a připojit do resources soubor pack.mcmeta s obsahem
"pack":{
  "pack_format"1,
}
Odpovědět 18. května 18:55
Malý užitečný manuál je vždy lepší než bichle k ničemu.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.