minecraft
Создание базового элемента с кузницей
Поиск…
Вступление
Создание простого элемента с 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, чтобы указать наши варианты (что намного предпочтительнее альтернативы). Наш товар не использует варианты, поэтому мы закончили.