2. diel - Minecraft Modding - Hlavná trieda a Item
V minulom diele sme sa pozreli ako na nastavenie prostredia pre modding, tak i na 2 finálne atribúty nášho modu: MODID a VERSION pričom je povinné len MODID (keby sme nenapísali verziu, nič sa nedeje). Dnes sa pozrieme na hlavnú triedu nášho modu a ešte si pridáme item. (Všetko potrebné je na stiahnutie pod článkom.)
Hlavná trieda modu
Teraz by bolo príhodné, povedať si niečo o hlavnej triede nášho modu: Táto trieda musí byť označená anotácií viažuce sa k interface @Mod a nastavený parameter @Mod (modid = "Muj_Mod"), parameter VERSION môžeme vynechať:
@Mod(modid = “Muj_Modik“, version = “0.1AlphaBlaBla“) public class Main
Každá trieda s touto anotáciou bude braná ako nový mod. Teraz by som chcel spomenúť ešte to, že Forge si vďaka tomuto označeniu @Mod načíta tento mod, z čoho jasne vyplýva, že je povinné túto anotáciu spolu s uložením MODID napísať nad hlavnou mod triedu. Ak chcete vedieť, aké všetky atribúty môžete nastaviť, jednoducho podržte Control a prejdite myšou na @Mod (a kliknite). Ale to len tak okrajovo, mod môžeme robiť pokojne bez týchto znalostí.
Init Metódy
Dobrá - máme triedu, ktorú <acronym title="ForgeModLoader">FML</acronym> berie ako mod avšak nemôže s ňou nijako komunikovať ak tomu nám poslúži metódy. Hlavnými metódami sú:
@EventHandler public void preInit(FMLPreInitializationEvent event) @EventHandler public void init(FMLInitializationEvent event) @EventHandler public void postInit(FMLPostInitializationEvent event)
Tieto metódy sú volány postupne v určitej fáze, kedy sa hra spúšťa. Nezabudnime pritom na anotáciu @EventHandler, keďže všetky tieto metódy musia byť týmto označené. Pre viac informácií sa pozrite na opis @EventHandler (len na to choďte v Eclipse). Je tu mnoho textu, ja sa len pokúsim načrtnúť tie najdôležitejšie:
- preInit: Prečítajte si config, vytvorte si blok itemy a registrujte je pomocou GameRegistry (o tom za chvíľu).
- init: Nastav mod, registruj recepty, pošli ostatným módu správu, že tu si.
- postInit: Ukončenie nastavenia svojho modu podľa komunikácie s ostatnými mody.
Item
To by sme mali trochu teórie a teraz si poďme pridať / vytvoriť nejaký item. Najprv si ukážeme, čo sme zatiaľ urobili:
@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){} }
Teraz deklarujeme atribút tejto triedy, ktorý bude typu Item.
public static Item itemSul = new Item();
Môžeme napísať i toto avšak prakticky by tento item ani nemohol existovať pretože potrebuje String UnlocalizedName, čo je niečo ako MODID item čiže "Itemid".
public static Item itemSul = new Item().setUnlocalizedName("itemSul");
Keďže všetky metódy set vracajú práve inštanciu toho item, môžeme deklarácii item takto jednoducho reťaziť. Ďalej si nastavíme CreativeTab, čo je zoznam itemov napr: jedlo, nástroje + zbrane + brnenia, materiály, bloky. To poznáme z Creative keď otvoríme inventár. Môžeme samozrejme vytvoriť náš vlastný CreativeTab avšak pre začiatok sa uspokojíme iba s Minecraftími "Taby".
public static Item itemSul = new Item().setUnlocalizedName("itemSul").setCreativeTab(CreativeTabs.tabMaterials);
V tomto kroku by som chcel spomenúť, že CreativeTabs.tabAllSearch nastavíme vtedy, keď si budeme priať aby náš item išlo vyhľadať, ale nevieme do akej "Taby" ho máme dať.
Textúry
public static Item itemSul = new Item().setUnlocalizedName("itemSul").setCreativeTab(CreativeTabs.tabMaterials).setTextureName("item_sul");
Tu nastavujeme meno textúry. Iste vás napadlo, že textúru si budeme musieť urobiť sami. vytvoríme si teda v nejakom obrázkovom editore napr. GIMP plátno 16x16 ale pokojne aj väčšie (32x32) nezabúdajme na Alpha kanál čiže kanál transparentnosti. V tom pixelu, kde je Alpha menej ako 255 bude Minecraft považovať tento pixel za priehľadný a teda ho nevykreslí. (Na stiahnutie pod článkom) Obrázok máme, teraz však nastáva otázka, kam s ním. V priečinku vášho modu tj. Kde je zložka eclipse, v nej je zložka s menom vášho modu (projektu v Eclipse, ja mám "SaltMod") do nej vložte tieto zložky / src / assets / minecraft / textures / items. (Pre stiahnutie pod článkom) Teraz do zložky items vložte nakreslený obrázok s menom "sul.png".
Registrácia item
Item by sme tým pádom mali, teraz ho musíme registrovať (bez toho by žiadny item nebol). Urobíme to cez statickú triedu GameRegistry. Ako už sme si povedali, použijeme k tomu metódu preInit.
@EventHandler public void preInit(FMLPreInitializationEvent event){ GameRegistry.registerItem(itemSul, "itemSul"); }
Prvý parameter dvouparametrické metódy je nový item a druhý parameter je meno. Teraz keď program spustíme, mali by sme vidieť po prvé v Mods náš mod a po druhé po nabehnutí nejakého sveta v Creative keď otvoríme inventár, zadáme do vyhľadávania "sul", mali by sme nájsť náš item.
Lang
Iste ste si všimli jedného nedostatku, po nabehnutí na náš item sme zistili že meno nie je také, ako sme si predstavovali a zadali s metódou setUnlocalizedName ( "itemSul"), ale volá sa "item.itemSul.name". Je to spôsobené tým, že Minecraft je samozrejme hrou medzinárodné a môžeme si tam nastaviť takmer akýkoľvek jazyk, zčehož nutne vyplýva, že sme nenastavili názov item, ale iba univerzálny meno, ku ktorému sa musí priradiť správny názov v správnom jazyku v správnom jazykovom súbore. Tento súbor nájdeme v zložke eclipse, ktorá je v našom veľkom projekte. Ďalej v priečinku eclipse je zložka SaltMod / src / assets / minecraft / lang * (Pre stiahnutie pod článkom).
V tejto zložke si vytvoríme súbor en_GB.lang a následne ho otvoríme v Pozn. bloku. Teraz budeme teda meno upravovať práve pre jazyk anglický, Veľká Británia. Teraz už k samotnej <acronym title="zápisu">syntax,</acronym> na každý riadok sa píše preklad jedného item, pričom najprv napíšeme univerzálny meno nášho Item vrátane postranných názvov pr. "Item.to_jméno.name", potom znamienko "=" a následne preklad, čiže ako chceme, aby sa nám to zobrazilo.item.itemSul.name=Sul item.itemDalší.name=Další hezký item
Aha, toto by sme mali lenže teraz tu padla otázka, čo ak užívateľ bude mať nastavený jazyk iný napr. Slovenčinu. To sa mu potom zasa zobrazí "item.itemSul.name". To možno vyriešiť dvoma spôsobmi:
- Vytvoriť súbory zo všetkými jazykmi a následne všetko do nich prepísať.
- Nastaviť vo Forge, aby sa tento názov objavoval vždy bez rozdielu od vybraného jazyka.
Iste vás napadlo, že bude lepšie zp č. 2. Bohužiaľ tento spôsob (metóda) je označená @Deprecated čo znamená, že vo verzii 1.8 už nebude existovať. Rovnako ju tu máte:
@EventHandler public void preInit(FMLPreInitializationEvent event){ GameRegistry.registerItem(itemSul, "itemSul"); LanguageRegistry.addName(itemSul, "Sul"); }
Vytvoríme si teda súbor lang s menom "en_GB.lang" a vložíme do neho "item.itemSul.name = Sul". (! Ak ste zistili meno univerzálneho súboru .lang určite mi napíšte do komentárov, vďaka!) Tým pádom si musíme nastaviť Minecraft na English (UK). Teraz po spustení a po nabehnutí na ten item by sme mali byť spokojní.
Záver
Ešte som sa rozhodol sem dať celý kod, čo sme zatiaľ urobili.
@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 ďalšom diele sa pozrieme už aj na bloky, ktoré sú trošku náročnejšie.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 77x (2.43 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java