- Версия(и) Minecraft
- 1.10-1.12
- Источник
- https://shadowfacts.net/tutorials/
Forge's «Ore Dictionary» система предоставляет API, который создатели модификаций могут использовать для обозначения элементов / блоков как эквивалентных друг другу. Это было первоначально создано, потому что несколько модов добавляли свои собственные версии тех же руд и слитков (медь, олово и так далее). Эта система работает так: каждый пакет
Давайте создадим класс
Этот класс просто принимает второй
Мы также обновим наш класс
Теперь, когда у нас есть все наши базовые классы, мы собираемся изменить некоторые из наших элементов и блоков, чтобы дать имена «Ore Dictionary»!
Единственный блок, который будет иметь имя «Ore Dictionary» это блок медной руды. Следуя соглашениям для названий «Ore Dictionary» (если вы посмотрите в классе
Мы просто изменим наш регистрационный вызов для блока медной руды на второй параметр, который также является
Теперь мы заменим оба элемента
Наконец, мы обновим наш класс
Рецепты__________________________________________________________________________
Теперь, когда у нас есть названия «Ore Dictionary» для некоторых наших предметов и блоков, давайте добавим рецепты, которые их используют. «Forge» предоставляет два новых типа рецептов специально для использования «Ore Dictionary»:
Мы создадим новый файл в подпапке
Вместо указания параметра предмета для ингредиента мы укажем тип как
Forge's «Ore Dictionary» система предоставляет API, который создатели модификаций могут использовать для обозначения элементов / блоков как эквивалентных друг другу. Это было первоначально создано, потому что несколько модов добавляли свои собственные версии тех же руд и слитков (медь, олово и так далее). Эта система работает так: каждый пакет ItemStackпредставляет собой список связанных с ним имен String «Ore Dictionary».
Давайте создадим интерфейс
Мы также создадим класс
Этот класс просто принимает второй
Мы будем делать что-то подобное для нашего класса
Нам нужно внести некоторые изменения в классы
Сначала мы проверим, реализует ли элемент наш интерфейс
Мы будем делать это аналогично в классе
Теперь, когда у нас есть все наши базовые классы, мы собираемся изменить некоторые из наших элементов и блоков, чтобы получить названия «Ore Dictionary»!
Единственным блоком, который будет иметь название «Ore Dictionary», является блок медной руды. Следуя соглашениям о названиях «Ore Dictionary» (если вы посмотрите в классе
Мы просто изменим наш регистрационный вызов для блока медной руды, чтобы иметь второй параметр, который также является
Теперь мы заменим оба элемента ingotCopper и cropCorn , чтобы иметь названия «Ore Dictionary» ingotCopper и cropCornсоответственно. Все это требует изменения экземпляров ItemBase для экземпляров ItemOre и передачи искомого имени «Ore Dictionary» в качестве второго параметра конструктора.
Рецепты__________________________________________________________________________
Теперь, когда у нас есть «Ore Dictionary» имена для некоторых наших элементов и блоков, давайте добавим рецепты, которые их используют. «Forge» добавляет классы
Эти рецепты должны быть созданы вручную и зарегистрированы с использованием
Этот рецепт такой же, как рецепт ванильного ведра, за исключением того, что вместо железа используется любой предмет с «Ore Dictionary» именем
ItemStack
представляет собой список связанных с ним имен String
«Ore Dictionary».Давайте создадим класс
ItemOre
, который расширяет ItemBase
и имеет метод initOreDict
для обработки регистрации «Ore Dictionary». Это даст нам хороший полностью реализованный класс для ore-dictionaried(рудодикционированных) предметов.
Java:
package net.shadowfacts.tutorial.item;
import net.minecraftforge.oredict.OreDictionary;
public class ItemOre extends ItemBase {
private String oreName;
public ItemOre(String name, String oreName) {
super(name);
this.oreName = oreName;
}
public void initOreDict() {
OreDictionary.registerOre(oreName, this);
}
}
Этот класс просто принимает второй
String
параметр в своем конструкторе, который является именем ore-dictionary, а затем использует его в методе initOreDict
.Мы также обновим наш класс
BlockOre
, чтобы предоставить аналогичный метод initOreDict
.
Java:
package net.shadowfacts.tutorial.block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.oredict.OreDictionary;
public class BlockOre extends BlockBase {
private String oreName;
public BlockOre(String name, String oreName) {
super(Material.ROCK, name);
this.oreName = oreName;
setHardness(3f);
setResistance(5f);
}
public void initOreDict() {
OreDictionary.registerOre(oreName, this);
}
@Override
public BlockOre setCreativeTab(CreativeTabs tab) {
super.setCreativeTab(tab);
return this;
}
}
Теперь, когда у нас есть все наши базовые классы, мы собираемся изменить некоторые из наших элементов и блоков, чтобы дать имена «Ore Dictionary»!
Единственный блок, который будет иметь имя «Ore Dictionary» это блок медной руды. Следуя соглашениям для названий «Ore Dictionary» (если вы посмотрите в классе
OreDictionary
, вы можете получить общее представление о том, что это за соглашения), наш блок медной руды будет иметь имя «Ore Dictionary» oreCopper
.Мы просто изменим наш регистрационный вызов для блока медной руды на второй параметр, который также является
"oreCopper"
, сообщая классу BlockOre
использовать oreCopper
в качестве имени словаря для этого блока.
Java:
// ...
public class ModBlocks {
// ...
public static BlockOre oreCopper = new BlockOre("ore_copper", "oreCopper");
// ...
}
Теперь мы заменим оба элемента
ingotCopper
и cropCorn
, чтобы иметь названия «Ore Dictionary» ingotCopper
и cropCorn
соответственно. Все это требует изменения экземпляров ItemBase
для экземпляров ItemOre
и передачи искомого имени «Ore Dictionary» в качестве второго параметра конструктора.
Java:
// ...
public class ModItems {
// ...
public static ItemOre ingotCopper = new ItemOre("ingot_copper", "ingotCopper");
public static ItemOre corn = new ItemOre("corn", "cropCorn");
// ...
}
Наконец, мы обновим наш класс
ModRecipes
, чтобы вызвать различные методы initOreDict
.
Java:
// ...
public class ModRecipes {
public static void init() {
// Ore Dict
ModBlocks.oreCopper.initOreDict();
ModItems.ingotCopper.initOreDict();
ModItems.corn.initOreDict();
// ...
}
}
Рецепты__________________________________________________________________________
Теперь, когда у нас есть названия «Ore Dictionary» для некоторых наших предметов и блоков, давайте добавим рецепты, которые их используют. «Forge» предоставляет два новых типа рецептов специально для использования «Ore Dictionary»:
forge:ore_shaped
и forge: ore_shapeless
.Мы создадим новый файл в подпапке
recipes
нашей папки assets
под названием bucket.json
. В корневом объекте будет пара свойств, похожих на другой рецепт формы, который мы добавили. На этот раз Тип рецепта будет forge:ore_shaped
, результатом будет minecraft:bucket
, а входной ингредиент будет немного отличаться, так что он использует «Ore Dictionary».Вместо указания параметра предмета для ингредиента мы укажем тип как
forge:ore_dict
, поэтому используется ингредиент «Ore Dictionary», и мы укажем руду как ingotCopper
, чтобы любой медный слиток был принят.
JSON:
{
"type": "forge:ore_shaped",
"pattern": [
"I I",
" I "
],
"key": {
"I": {
"type": "forge:ore_dict",
"ore": "ingotCopper"
}
},
"result": {
"item": "minecraft:bucket"
}
}
Forge's «Ore Dictionary» система предоставляет API, который создатели модификаций могут использовать для обозначения элементов / блоков как эквивалентных друг другу. Это было первоначально создано, потому что несколько модов добавляли свои собственные версии тех же руд и слитков (медь, олово и так далее). Эта система работает так: каждый пакет ItemStackпредставляет собой список связанных с ним имен String «Ore Dictionary».
Давайте создадим интерфейс
ItemOreDict
в пакете item
нашего мода. Этот интерфейс будет использоваться для обозначения наших элементов/блоков, которые будут зарегистрированы в «Ore Dictionary». Этот интерфейс будет иметь один абстрактный метод, называемый initOreDict
, который будет выполнять регистрацию.
Java:
package net.shadowfacts.tutorial.item;
public interface ItemOreDict {
void initOreDict();
}
Мы также создадим класс
ItemOre
, который расширяет ItemBase
и реализует ItemOreDict
, чтобы дать нам хороший полностью реализованный класс для элементов ore-dictionaried.
Java:
package net.shadowfacts.tutorial.item;
import net.minecraftforge.oredict.OreDictionary;
public class ItemOre extends ItemBase implements ItemOreDict {
private String oreName;
public ItemOre(String name, String oreName) {
super(name);
this.oreName = oreName;
}
@Override
public void initOreDict() {
OreDictionary.registerOre(oreName, this);
}
}
Этот класс просто принимает второй
String
параметр в своем конструкторе, который является именем ore-dictionary, а затем использует его в методе initOreDict
.Мы будем делать что-то подобное для нашего класса
BlockOre
, то есть реализуем ItemOreDict
и initOreDict
и будем иметь второй параметр для имени «Ore Dictionary».
Java:
package net.shadowfacts.tutorial.block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.oredict.OreDictionary;
import net.shadowfacts.tutorial.item.ItemOreDict;
public class BlockOre extends BlockBase implements ItemOreDict {
private String oreName;
public BlockOre(String name, String oreName) {
super(Material.ROCK, name);
this.oreName = oreName;
setHardness(3f);
setResistance(5f);
}
@Override
public void initOreDict() {
OreDictionary.registerOre(oreName, this);
}
@Override
public BlockOre setCreativeTab(CreativeTabs tab) {
super.setCreativeTab(tab);
return this;
}
}
Нам нужно внести некоторые изменения в классы
ModItems
и ModBlocks
, чтобы они вызывали метод initOreDict
после регистрации элемента/блока в GameRegistry
.Сначала мы проверим, реализует ли элемент наш интерфейс
ItemOreDict
(потому что не все наши элементы будут использовать «Ore Dictionary»), и если да, то вызывает на нем метод initOreDict
.
Java:
// ...
public class ModItems {
// ...
private static <T extends Item> T register(T item) {
GameRegistry.register(item);
if (item instanceof ItemModelProvider) {
((ItemModelProvider)item).registerItemModel(item);
}
if (item instanceof ItemOreDict) {
((ItemOreDict)item).initOreDict();
}
return item;
}
}
Мы будем делать это аналогично в классе
ModBlocks
, за исключением того, что мы проверим экземпляр ItemOreDict
и визовым initOreDict
как для самого блока, так и для связанного с ним ItemBlock
.
Java:
// ...
public class ModBlocks {
// ...
private static <T extends Block> T register(T block, ItemBlock itemBlock) {
GameRegistry.register(block);
if (itemBlock != null) {
GameRegistry.register(itemBlock);
if (block instanceof ItemModelProvider) {
((ItemModelProvider)block).registerItemModel(itemBlock);
}
if (block instanceof ItemOreDict) {
((ItemOreDict)block).initOreDict();
}
if (itemBlock instanceof ItemOreDict) {
((ItemOreDict)itemBlock).initOreDict();
}
}
}
}
Теперь, когда у нас есть все наши базовые классы, мы собираемся изменить некоторые из наших элементов и блоков, чтобы получить названия «Ore Dictionary»!
Единственным блоком, который будет иметь название «Ore Dictionary», является блок медной руды. Следуя соглашениям о названиях «Ore Dictionary» (если вы посмотрите в классе
OreDictionary
, вы можете получить общее представление о том, что представляют собой эти соглашения), наш блок медной руды будет иметь в качестве «Ore Dictionary» имени имя: oreCopper
.Мы просто изменим наш регистрационный вызов для блока медной руды, чтобы иметь второй параметр, который также является
«oreCopper»
, сообщая классу BlockOre
использовать oreCopper
в качестве названия «Ore Dictionary» для этого блока.
Java:
// ...
public class ModBlocks {
// ...
public static void init() {
oreCopper = register(new BlockOre("oreCopper", "oreCopper"));
// ...
}
}
Теперь мы заменим оба элемента ingotCopper и cropCorn , чтобы иметь названия «Ore Dictionary» ingotCopper и cropCornсоответственно. Все это требует изменения экземпляров ItemBase для экземпляров ItemOre и передачи искомого имени «Ore Dictionary» в качестве второго параметра конструктора.
Java:
// ...
public class ModItems {
// ...
public static void init() {
ingotCopper = register(new ItemOre("ingotCopper", "ingotCopper"));
corn = register(new ItemOre("corn", "cropCorn"));
// ...
}
}
Рецепты__________________________________________________________________________
Теперь, когда у нас есть «Ore Dictionary» имена для некоторых наших элементов и блоков, давайте добавим рецепты, которые их используют. «Forge» добавляет классы
ShapedOreRecipe
и ShapelessOreRecipe
, которые идентичны рецептам ванильной формы и бесформенности, за исключением того, что вместо того, чтобы просто принимать элемент/блок/стек для ввода, они также могут принимать строку имени «Ore Dictionary» которая будет соответствовать чему-либо с этим именем.Эти рецепты должны быть созданы вручную и зарегистрированы с использованием
GameRegistry.addRecipe
в отличие от рецептов нормальной формы/бесформенности, которые имеют удобные методы в GameRegistry
.
Java:
// ...
public class ModRecipes {
public static void init() {
// ...
GameRegistry.addRecipe(new ShapedOreRecipe(Items.BUCKET, "I I", " I ", 'I', "ingotCopper"));
// ...
}
}
Этот рецепт такой же, как рецепт ванильного ведра, за исключением того, что вместо железа используется любой предмет с «Ore Dictionary» именем
ingotCopper
, а не только железные слитки.
Спасибо за рецензию!