FABRIC 1.18 Сохранить текстуру блока в предмете

Версия Minecraft
1.18.2
API
Fabric
Как бравые разработчики модов знают, у нас есть Block и, так называемый BlockItem. JSON предмета при этом просто ссылается на родительский блок.
Суть проблемы: имеется блок, который меняет текстуру по типу печки (обновление property в BlockState и ссылка на него в block_state.json при определении вариантов, ведущих на несколько моделей блока с разной текстурой). Надо чтоб текущая (в момент "добычи") текстура блока (и все его property) сохранялись в BlockItem. Пока что, когда BlockItem просто использует дефолтную (первую в списке?) текстуру. Как решить сию проблему? (МБ кто-то знает, в исходном коде какого открытого мода это можно подсмотреть, желательно не замудренного временем, в котором все реализовано вообще не по стандарту)
Если кому нужен контекст ситуации, чтоб было понятнее. Есть Кристал. Моделька выглядит как каменная колона, в которую этот кристал заточен. У кристала есть два свойства: тип и количество хранимой энергии. В зависимости от типа энергии он может окрашиваться в разные цвета (базовый, т.е. в нулевом типе энергии = без нее, у него белый)

Кроме использования как блок-батарейка он должен использоваться и как предмет-батарейка. Вот тут начинаются проблемы с рендером.
 
Самый примитивный вариант решения проблемы - регестрировать отдельно каждый кристал как блок. Но с учетом что самих кристалов будет минимум три, а типов хранимой в них энергии больше десятка... Это уже садомазохизм. При этом следует учитывать, что в таком случае придется динамичски просто подменять блок и предмет в инвентаре, когда энергия кончилась или изменилась. Что тоже не звучит как адекватное решение.
 
7,099
324
1,510
Посмотри в сторону TESR: Renderer - Forge Documentation
К предмету можно прикрутить аналогичную штуку - TileEntityItemStackRenderer
Посмотри ванильный баннер, например, это один в один твоя таска
 
1,560
86
204
Вот, как пример, моделька предмета сундука.
JSON:
{
    "parent": "builtin/entity",
    "textures": {
        "particle": "block/oak_planks"
    },
    ...
}
Как это работает я так до конца не разобрался, но если убрать рендер сундука (миксинами), то предмет будет невидимым. Можно рыть в эту сторону.
Попробуй такую же модель сделать для своего предмета.
 
Пытался прошарить банер.
Посмотри в сторону TESR: Renderer - Forge Documentation
К предмету можно прикрутить аналогичную штуку - TileEntityItemStackRenderer
Посмотри ванильный баннер, например, это один в один твоя таска
Вывод: просто все сейвится в nbt и достается оттуда при инициализации блока и предмета. Но как оно рендерится - я так и не понял. И + к этому он тащит с собой сразу паттерн банера, что немного не подходит... Т.е. рендер там идет в любом случае по принципу: получить паттерн -> нарисовать. А у меня получить состояния -> выбрать модель. Разница конечно не велика, но знать бы как ЭТО рендерится вообще
 
7,099
324
1,510
Но как оно рендерится - я так и не понял
Заходим в IBakedModel и смотрим использования isBuiltInRenderer, смотрим использование в ItemRenderer:
Java:
itemStackIn.getItem().getItemStackTileEntityRenderer().func_239207_a_(itemStackIn, transformTypeIn, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn);
Переходим в ItemStackTileEntityRenderer, видим рендер баннера. Смотрим использования ItemStackTileEntityRenderer, в Item.
Оказывается, ItemStackTileEntityRenderer зависит от Item и при создании предмета можно задать свою реализацию ItemStackTileEntityRenderer
Брух!

Т.е. рендер там идет в любом случае по принципу: получить паттерн -> нарисовать. А у меня получить состояния -> выбрать модель. Разница конечно не велика, но знать бы как ЭТО рендерится вообще
Разницы ваще нет.
При дропе блока в виде стака записывай в его нбт блокстейт или сразу имя модели. В редере доставай модель в соответствии с нбт и рисуй ее.
Модели можно достать во время ModelBakeEvent и сохранить в Map<String, IBakedModel>
Нарисовать модель можно при помощи Minecraft.getInstance().getItemRenderer().renderModel(...), или посмотреть как оно там работает и взять нужные части
 
Сверху