Поиск…


Вступление

Создание простого элемента с Forge - одна из первых задач, которую должен научиться начинающий модем. Как это изменилось в разных версиях Minecraft и, вероятно, на «умеренной» задаче с ошибкой 1.7.10 из-за большого количества ошибок, которые можно совершить, особенно с тем, чтобы сделать их правильно отображенными.

замечания

Если что-то пойдет не так, и ваш пользовательский элемент имеет отсутствующую текстуру (черный / фиолетовый) или модель (куб по умолчанию, который слишком велик, когда он удерживается), проверьте журнал. Проблемы такого рода будут почти всегда появляться в журнале, если вы зарегистрировали вещи правильно.

Первое, что будет отображаться, - это строка "Exception loading model for variant..." или аналогичная, сообщающая, какой блок или элемент не удалось загрузить должным образом. После дюжины строк, начинающихся с at... будет еще одна строка, начинающаяся Caused by...

Эта строка «Causeed By» является важной, она скажет вам, какой файл не удалось загрузить должным образом и может быть одной из нескольких ошибок, таких как:

  • Malformed JSON (ваш JSON-файл недействителен и имеет опечатку)
  • Файл не найден (файл, который Minecraft ищет, неправильно назван или находится в нужном месте)
  • Отсутствие исключения варианта (ваш Blockstate JSON является неполным)

Вы можете даже получить более одной ошибки при ошибке! Если вы не знаете, какой элемент является проблемой, закомментируйте каждый блок и элемент, который, как вы знаете, работаете, уменьшите список ошибок до блока (или блоков), о котором идет речь. Возможно, вам придется делать это несколько раз.

Кроме того, текстура смешивания отображается так же, как и простой список всех недостающих ресурсов для данного домена (идентификатор мод).

Класс предмета

Эта часть не изменилась по версиям Minecraft очень много, хотя в точных сигнатурах метода также были некоторые мутации, а также иерархия классов. Основной предмет (тот, у которого нет функциональности, например, палки или слитка: это правильно, оба не делают ничего!)

public class CustomItem extends Item {

    public CustomItem () {
        super();
        this.setMaxDamage(0);
        this.setCreativeTab(CreativeTabs.MISC);
    }
}

В отличие от блоков, на данный момент не так много места для настройки. Все, что мы можем сделать, это изменить, может ли элемент нанести урон (инструменты используют это) и какую таковую будет в нем. Название и текстура мы будем обрабатывать, когда мы регистрируем элемент с помощью GameRegistry.

Тем не менее, это все, что необходимо для удержания, переноса, опускания, изготовления, плавки и другого использования предмета. Некоторые элементы в Minecraft (например, палки) даже не имеют уникального класса и просто используют new Item() . Мы могли бы сделать это здесь, однако для любого элемента с дополнительной функциональностью потребуется класс.

Модель товара

Как и в случае с блоками, элементам также нужны модели.

{
    "parent": "item/generated",
    "textures": {
        "layer0": "example:items/basic"
    }
}

Это почти все, что необходимо для его работы после регистрации элемента. Важно только то, что имя файла соответствует имени реестра, используемому для регистрации блока, и должно быть во всех строчных (имена файлов 1.11+ должны быть строчными, до этого они чувствительны к регистру).

Обратите внимание, что «layer0» - единственная текстура, и маловероятно, что любая другая текстура будет указана вообще (хотя некоторые предметы, такие как зелья и кожаные доспехи, имеют «layer1»). Все имена определяются item/builtin (внутренней самой верхней родительской моделью для элементов), в отличие от блоков.

Назовите модель JSON-файла my_item.json (сопоставив имя реестра, которое мы собираемся дать позже) и сохраните его в src\main\resources\assets\example\models\item\ (где example - это идентификатор мод, указанный в @Mod аннотация вашего основного класса мод).

Кроме того, создайте текстуру для своего элемента, назовите ее basic.png и сохраните ее в src\main\resources\assets\example\textures\items\

Модель элемента здесь использует родителя элемента / сгенерированного, что означает, что единая поставляемая текстура будет использоваться (как и для большинства неблокированных элементов) и будет удерживаться в руке игрока в ориентации по умолчанию. Существует также пункт / handheld, который определяет различные ориентации дисплея (для инструментов). Элементы могут также предоставлять свой собственный атрибут «display», переопределяя их от родителя, но не нужны в 99,9% использования.

Регистрация позиции

Регистрация элементов производится из основного класса mod или метода класса ModItems, вызванного из основного класса mod во время preInit.

Item item = new CustomItem();
string registryname = "my_item";
item.setRegistryName(registryname);
item.setUnlocalizedName(item.getRegistryName().toString());
GameRegistry.register(item);

Существует важная причина использовать item.setUnlocalizedName(item.getRegistryName().toString()); также! Это гарантирует, что нелокализованное имя вашего объекта содержит идентификатор мод, чтобы избежать конфликтов языковых файлов между модами.

Теперь предмет тоже нуждается в модели, и в этом случае ситуация стала трудной после 1.7.10, которая просто включала указание Minecraft имя текстуры для загрузки и могло быть указано в конструкторе элемента.

final ModelResourceLocation fullModelLocation = new ModelResourceLocation(item.getRegistryName().toString(), "inventory");
ModelBakery.registerItemVariants(item, fullModelLocation);
ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition()
    {
        public ModelResourceLocation getModelLocation(ItemStack stack)
        {
            return fullModelLocation;
        }
    });

Обратите внимание, что этот раздел должен быть расположен только на стороне клиента (т. Е. Клиентский прокси), так как многие ссылочные классы не существуют на выделенном сервере.

Регистрация элементов с вариантами, например Saplings, должна выполняться по-другому, используя ModelLoader.setCustomModelResourceLocation(item, metadata, resourceLocation) хотя он позволяет нам использовать файл Blockstate, чтобы указать наши варианты (что намного предпочтительнее альтернативы). Наш товар не использует варианты, поэтому мы закончили.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow