Как правильно установить модель элемента в Forge 1.12.2
Я пытаюсь установить модель для моего второго блока в моде утилиты, которую я делаю. Мне удалось успешно сделать первый блок, Fast Cobble, но попытка привязать файл ресурса ко второму блоку, Clock, просто изменяет ресурс Fast Cobble и вообще не устанавливает часы. По иронии судьбы, эта ошибка влияет только на модель предмета, а не когда блок находится на земле. Текстура мира работает просто отлично, поэтому я знаю, что это не проблема с файлами.json.
Ниже моё создание итемблоков FastCobble и Clock.
public Item FastCobble() {
FastCobbleItem = new ItemBlock(RegisterBlocks.FastCobble).setRegistryName(RegisterBlocks.FastCobble.getRegistryName());
ModelResourceLocation FastCobbleResource = new ModelResourceLocation(SenorsStuff.MODID + ":fast_cobble", "inventory");
ModelLoader.setCustomModelResourceLocation(FastCobbleItem, 0, FastCobbleResource);
System.out.println("RN: " + RegisterBlocks.FastCobble.getRegistryName());
System.out.println("FC: " + FastCobbleResource.toString());
System.out.println("Register Item: " + FastCobbleItem.getUnlocalizedName().toString());
return FastCobbleItem;
}
public Item Clock() {
ClockItem = new ItemBlock(RegisterBlocks.Clock).setRegistryName(RegisterBlocks.Clock.getRegistryName());
ModelResourceLocation ClockResource = new ModelResourceLocation(SenorsStuff.MODID + ":clock", "inventory"); //Changes FastCobble, but Not Clock
ModelLoader.setCustomModelResourceLocation(ClockItem, 0, ClockResource);
System.out.println("RN: " + RegisterBlocks.Clock.getRegistryName());
System.out.println("CR: " + ClockResource.toString());
System.out.println("Register Item: " + ClockItem.getUnlocalizedName().toString());
return ClockItem;
}
Предметы регистрируются с помощью строки event.getRegistry().registerAll(FastCobbleItem, ClockItem);
Вывод терминала для моих линий печати...
[08:11:28] [main/INFO]: [com.senorcontento.stuff.RegisterItems:FastCobble:28]: RN: senorsstuff:fast_cobble
[08:11:28] [main/INFO]: [com.senorcontento.stuff.RegisterItems:FastCobble:29]: FC: senorsstuff:fast_cobble#inventory
[08:11:28] [main/INFO]: [com.senorcontento.stuff.RegisterItems:FastCobble:31]: Register Item: tile.stonebrick
[08:11:28] [main/INFO]: [com.senorcontento.stuff.RegisterItems:Clock:40]: RN: senorsstuff:clock
[08:11:28] [main/INFO]: [com.senorcontento.stuff.RegisterItems:Clock:41]: CR: senorsstuff:clock#inventory
[08:11:28] [main/INFO]: [com.senorcontento.stuff.RegisterItems:Clock:43]: Register Item: tile.senorsstuff:clock
"Зарегистрировать элемент:" для FastCobble - это tile.stonebrick, потому что я установил нелокализованное имя блока таким же, как ванильный булыжник, поэтому он может выглядеть как ванильный булыжник (я работаю над сообщением под именем, чтобы отличить FastCobble от ванильный булыжник, так как не все будут нажимать F3 + H, как я).
Наконец, мои файлы JSON следуют формату
Файл блочного состояния: assets.senorsstuff.blockstates.clock
{
"variants": {
"normal": { "model": "senorsstuff:clock"},
"inventory": { "model": "senorsstuff:clock"}
}
}
Файл блока: assets.senorsstuff.models.block.clock
{
"parent": "block/cube_all",
"textures": {
"all": "minecraft:blocks/dirt"
}
}
Файл элемента: assets.senorsstuff.models.item.clock
{
"parent": "senorsstuff:clock",
}
Что касается файла блока, у меня есть своя собственная текстура для часов, но проблема все еще возникает даже при установке ванильной текстуры грязи. Ресурсы FastCobble имеют одинаковый формат, за исключением того, что часы становятся fast_cobble. (Например, как в senorsstuff: часы для senorsstuff: fast_cobble). Fast Cobble использует minecraft: blocks / cobblestone, когда я не пытаюсь установить ресурс элемента часов.
Блоки используют правильные ресурсы, когда находятся на земле, и комментирование приведенного ниже кода позволит FastCobble использовать правильные ресурсы в инвентаре, но установка приведенного ниже кода изменяет текстуру FastCobble на любую, для которой я установил текстуру Clock на be and clock имеет по умолчанию черно-фиолетовую текстуру ресурса.
ModelResourceLocation ClockResource = new ModelResourceLocation(SenorsStuff.MODID + ":clock", "inventory"); //Changes FastCobble, but Not Clock
ModelLoader.setCustomModelResourceLocation(ClockItem, 0, ClockResource);
Если это неправильное место для такого типа вопросов, я был бы более чем рад переместить этот вопрос, но, уже просмотрев страницу тура Gaming, я не думаю, что они берут вопросы по программированию, поэтому я поставил этот вопрос здесь.
Я решил перенести весь репо в новую ветку, потому что этот вопрос сложнее, чем я думал, и вам нужно больше информации.
Редактировать:
Итак, я решил создать блок FastStone, чтобы проверить, была ли проблема с загрузкой ресурса вызвана попыткой загрузить файл с измененными ресурсами, это не так. FastStone - это тот же код, что и FastCobble, за исключением того, что он указывает на Smoothstone вместо Cobblestone.
В этом я решил проверить, была ли ошибка вызвана ModelResourceLocation или ModelLoader. Я проверил это, позволив ModelResourceLocations создавать ресурсы, но вместо этого загрузил бы ресурс другого элемента (например, Загрузка FastCobble или FastStone на Clock или FastStone). Я также попробовал это, отключив ModelResourceLocations, которые не были установлены (то же самое, что и загрузка FastCobble Resource over Clock Item). Это все равно приводило к той же ошибке, но приводило к тому, что любой ресурс, который будет установлен, будет загружен FastStone или Clock. Эта ошибка может произойти независимо от того, был ли предмет зарегистрирован в игре или нет. Чтобы предотвратить перезапись ресурса другим ресурсом, нужно отключить ModelLoader для этого элемента, который не зарегистрирован.
Я также переместил элементы, чтобы они были локальными для их функции, в случае, если это имело отношение к этому. Нет. Приведенный ниже код - это то, что я имею в виду под локализацией уведомление Item FastCobbleItem
, Я также изменил старый код SenorsStuff.MODID + ":fast_cobble"
захватить имя реестра прямо из блока с помощью RegisterBlocks.FastCobble.getRegistryName()
, Это не помогло решить проблему.
public Item FastCobble() {
Item FastCobbleItem = new ItemBlock(RegisterBlocks.FastCobble).setRegistryName(RegisterBlocks.FastCobble.getRegistryName());
ModelResourceLocation FastCobbleResource = new ModelResourceLocation(RegisterBlocks.FastCobble.getRegistryName(), "inventory");
ModelLoader.setCustomModelResourceLocation(FastCobbleItem, 0, FastCobbleResource);
...
}
В общем, я знаю, что ошибка связана с ModelLoader (и он вызывается в pre-init), но я до сих пор не могу понять, почему. Я мог бы попытаться возиться с тем, какие элементы я установил, а также попытаться объективизировать ModelLoader (как в ML ml = new ML();
). Если это что-то изменит, я обновлю соответственно.
Вы не можете установить.setCustomModelResourceLocation объективно, он должен быть статическим. Кроме того, установка различных элементов не влияет на то, какой элемент устанавливается после того, как вы установили ресурс первого элемента. Первый элемент будет установлен правильно, независимо от того, является ли он FastCobble, FastStone или Clock. После этого только тот элемент, который вы установили первым, будет обновлен новым ресурсом, независимо от того, какой элемент вы пытаетесь установить.