V této lekci si ukážeme, jak do hry přidat vlastní item.

Abychom si usnadnili práci při přidávání itemů, tak si vytvoříme novou třídu ModItems, která bude obsahovat všechny itemy, které náš mód přidává.

Umístění třídy

Nové třídy budeme umisťovat do stejné složky, kde je naše hlavní třída CustomItem. Složka by se měla jmenovat podle názvu balíčku, který jste si zvolili při vytváření módu - v mém případě tedy com.example.item.

Třídu přidáme tak, že klikneme pravým tlačítkem myši na složku a zvolíme New > Java Class. Zobrazí se nám okno, kam zadáme název třídy - v našem případě tedy ModItems. Vytvoření třídy potvrdíme klávesou Enter.

Aktuálně by tedy struktura souborů měla vypadat následovně:

Připomenutí

Veškerý kód píšeme vždy mezi složené závorky {}

Jako první si přidáme metodu, která nám zajistí registraci itemu.

Ve třídě ModItems si tedy vytvoříme metodu register:

public static Item register(Item item, String id) {
 
}
  • k této metodě můžeme přistupovat odkudkoliv public static
  • jako hodnotu vrací registrovaný item Item
  • a jako parametry budeme předávat item, který chceme registrovat a id, pod kterým chceme daný item registrovat
    • item bude typu Item
    • id bude textový řetězec - typ String

Identifikátor

Při registraci itemu si nejprve potřebujeme vytvořit identifikátor, pod kterým item registrujeme. Identifikátor je například minecraft:stone. Skládá se tedy ze dvou částí:

  • namespace
    • to je část před : - používá se název módu
  • path
    • to je část za : - mělo by to odpovídat anglickému názvu itemu

Vytvoříme si tedy proměnnou itemID typu Identifier, do které si uložíme identifikátor itemu. Ten vytvoříme pomocí metody of ze třídy Identifier. U této metody potřebujeme uvést právě namespace a path.

  • namespace můžeme použít název módu, který máme uložený v proměnné MOD_ID ve třídě CustomItem.
  • path bude parametr id, který jsme definovali v naší metodě register
Identifier itemID = Identifier.of(CustomItem.MOD_ID, id);

Přidání itemu do registrů

V Minecraftu se vše ukládá do tzv. registrů. Máme registry na itemy, bloky, kapaliny, enchanty, entity, dimenze, biomy atd. Všechny registry najdete na Minecraft wiki. Do těchto registrů můžeme samozřejmě i přidávat nové věci. V této části si ukážeme, jak přidat nový item.

Vytvoříme proměnnou registeredItem typu Item, kam si uložíme registrovaný item. Samotná registrace se provádí pomocí metody register ze třídy Registry.

Jako první argument musíme specifikovat, do jakého registru chceme přidávat. Seznam všech registrů je ve třídě Registries - my přidáváme item, takže vybereme ITEM. Dále musíme uvést identifikátor itemu - proměnná itemID. A jako poslední samotný item, který chceme registrovat - parametr item.

Item registeredItem = Registry.register(Registries.ITEM, itemID, item);

Vrácení hodnoty

Jako poslední věc musíme vrátit registrovaný item, abychom ho po registraci mohli dále používat. To uděláme pomocí slova return a za to uvedeme hodnotu, kterou chceme vrátit. V našem případě proměnná registeredItem.

Celý kód bude vypadat následovně:

public static Item register(Item item, String id) {
	Identifier itemID = Identifier.of(FabricDocsReference.MOD_ID, id);
 
	Item registeredItem = Registry.register(Registries.ITEM, itemID, item);
 
	return registeredItem;
}

Tip

Pokud chcete, aby váš kód vypadal o něco lépe (správné odsazení textu, mezery, atd.), tak můžete použít klávesovou zkratku Ctrl+Alt+L

Registrování itemu

Nyní můžeme použít naši vytvořenou metodu k registraci itemu.

Ve třídě ModItems si vytvoříme proměnnou MAGIC_DUST typu Item

  • hodnotu proměnné nebudeme chtít po vytvoření měnit a zároveň k ní chceme přistupovat odkudkoliv, proto proměnnou nastavíme jako public static final

Do proměnné nyní uložíme výsledek metody register, kde jako argument uvedeme item a id. Item musíme vytvořit nový. To uděláme pomocí slova new a názvu třídy (Item). Třída item ale potřebuje jako argument nastavení itemu. Opět tedy vytvoříme nový objekt, ale tentokrát to bude třída Settings. Třída je obsažena v balíčku Item, takže musíme použít Item.Settings. Item se základním nastavením tedy vytvoříme pomocí:

new Item(new Item.Settings())

Dále potřebujeme uvést ještě id itemu, která chceme registrovat. Můžeme použít stejný název jako jsme použili u názvu proměnné - suspicious_substance.

Celý kód registrace itemu a uložení do proměnné bude vypadat následovně:

 public static final Item MAGIC_DUST = register(
			new Item(new Item.Settings()),
			"magic_dust"
 );

Pokud bychom nyní spustili hru, tak se item ještě nepřidá, protože musíme v hlavní třídě našeho módu říct, že má použít naši třídu ModItems.

Na to si ve třídě ModItems vytvoříme metodu initialize, která se používá na provedení nastavení třídy. Tato metoda bude opět public static, abychom k ní mohli přistupovat odkudkoliv. A jako návratový typ nebude vracet nic, což se v programování označuje slovem void. Metoda zatím nebude obsahovat žádný kód a bude tedy vypadat následovně:

public static void initialize() {
}

Celá třída ModItems pak bude vypadat následovně:

public class ModItems {
    public static final Item MAGIC_DUST = register(
            new Item(new Item.Settings()),
            "magic_dust"
    );
 
    public static void initialize() {
    }
 
    public static Item register(Item item, String id) {
        Identifier itemID = Identifier.of(CustomItem.MOD_ID, id);
 
        Item registeredItem = Registry.register(Registries.ITEM, itemID, item);
 
        return registeredItem;
    }
}

V hlavní třídě našeho módu (CustomItem) pak naši třídu s itemy použijeme tak, že do metody onInitialize přidáme volání metody initialize ze třídy ModItems:

public class CustomItem implements ModInitializer {
	public static final String MOD_ID = "custom-item";
 
	public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
 
	@Override
	public void onInitialize() {
		LOGGER.info("Hello Fabric world!");
		ModItems.initialize();
	}
}

Když nyní mód spustíme, tak bychom item měli mít ve hře. Item zatím nemá žádnou texturu ani název a jediný způsob, jako ho nyní můžeme získat je přes příkaz:

/give @s custom-item:magic_dust