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.tabAllSearch 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/minecraft/textures/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 setUnlocalizedName("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/assets/minecraft/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:
- Vytvořit soubory se všemy jazyky a následně vše do nich přepsat.
- 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, 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 77x (2.43 kB)
Aplikace je včetně zdrojových kódů v jazyce Java