Ore Dictionary

Перевод Ore Dictionary

Версия(и) Minecraft
1.10-1.12
Источник
https://shadowfacts.net/tutorials/
Forge's «Ore Dictionary» система предоставляет API, который создатели модификаций могут использовать для обозначения элементов / блоков как эквивалентных друг другу. Это было первоначально создано, потому что несколько модов добавляли свои собственные версии тех же руд и слитков (медь, олово и так далее). Эта система работает так: каждый пакет 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"
    }
}

OICDDTJ.png








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, а не только железные слитки.

OICDDTJ.png
Автор
Garik
Просмотры
5,052
Первый выпуск
Обновление
Оценка
5.00 звёзд 3 оценок

Другие ресурсы пользователя Garik

Последние рецензии

Очень проффесионально сделано)
Garik
Garik
Хехе) Всё что надо это лишь большой словарный запас, поисковик, и какой-то машинный онлайн переводчик!
Спасибо за рецензию!
Очень крутой гайд!
Garik
Garik
Спасибо!
(Это прикол какой-то ХD? Я тупааа.... В Шокэ!)
Молодец, переводы и оформление у тебя получается делать хорошо. Разных товарищей, которые говорят что все это есть в свободном доступе и бла-бла, игнорируй, очень хорошо и удобно когда все есть в одном месте. Любопытный факт, что вот MagTemTenebrius щас на ровном месте захейтил, а потом сам же будет этим пользоваться, вот инфа сотка. Правда, о том что он этим пользовался, он никогда не признается, но мы то знаем, как оно на самом деле!)
Garik
Garik
Хехе) Ты поднял мне настроение!
-Дайте этому человеку +500 баллов в репу (с) Тчалла Кароль Ваканды
Сверху