[Решено]Как добыть изображение блока и как запилить java модели?

Версия Minecraft
1.12.2
476
9
39
В 1.9+ нет iicon. 
А я тут портирую капец древний мод, и у него половина функционала завязана на иконках от блоков. 
Если честно, самому мне лень искать. 
Есть быстрый, простой способ получить текстуру блока. 
И как-то с ней взаимодействовать. 
Плохо без IIcon у него можно было сразу U/V узнать вообще шикарно.
//Решено. p.s я так долго думал, что его вообще нет, что даже не сравнивал старые классы с новыми, как я обычно это делаю.


Вспомнил, что его переименовали в TextureAtlasSprite. :D
//Шикарно! Я ж теперь страдать больше не буду.

Как теперь его получить с блока?
 
Решение
RE: Как добыть изображение блока?

Парнииии, я нашёл как добыть спрайт.
Всё, что реализует интерфейс IBakedModel
должно реализовать метод
List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand);
Т.е именно этот метод отдаёт Quad как я понимаю это квадрат, т.е тупо одна из плоскостей блока, НО с моделью... текстурой, и при этом там есть EnumFacing т.е мы даже знаем куда эту текстуру засунуть.
Таким нехитрым образом можно и java модельки как-нибудь, да впихнуть пронаследовав от IBakedModel.
Теперь имея что-то напоминающее модель мы должны её как-то зарегистрировать для блока.
В пакете net.minecraft.client.renderer есть класс BlockModelShapes.
Внутри него есть поле:
Код:
    private final...
476
9
39
RE: Как добыть изображение блока?

Добыл
Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("modid:blocks/lava_fill");
 
476
9
39
RE: Как добыть изображение блока?

Парнииии, я нашёл как добыть спрайт.
Всё, что реализует интерфейс IBakedModel
должно реализовать метод
List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand);
Т.е именно этот метод отдаёт Quad как я понимаю это квадрат, т.е тупо одна из плоскостей блока, НО с моделью... текстурой, и при этом там есть EnumFacing т.е мы даже знаем куда эту текстуру засунуть.
Таким нехитрым образом можно и java модельки как-нибудь, да впихнуть пронаследовав от IBakedModel.
Теперь имея что-то напоминающее модель мы должны её как-то зарегистрировать для блока.
В пакете net.minecraft.client.renderer есть класс BlockModelShapes.
Внутри него есть поле:
Код:
    private final Map<IBlockState, IBakedModel> bakedModelStore = Maps.<IBlockState, IBakedModel>newIdentityHashMap();
И метод через который модель можно получить
Код:
    public IBakedModel getModelForState(IBlockState state)
    {
        IBakedModel ibakedmodel = this.bakedModelStore.get(state);

        if (ibakedmodel == null)
        {
            ibakedmodel = this.modelManager.getMissingModel();
        }

        return ibakedmodel;
    }
Ну и кто как может придумать тот так и сделает. Хуклибой добавить проверку на твой блок и отдавать твою модель.
Оригинальный список можно модифицировать и по другому через Access Transformers таким образом не трогая метод. Ибо добавлять туда что-то довольно просто. Правда модель привязана к IBlockState так что могут возникнуть неожиданности.
Но, конечно, все скажут, что это костыли поэтому я предлагаю мега костыль. Но удобный.
В пакете net.minecraft.client.renderer.block.model есть класс ModelManager
где нас интересует
Код:
    public IBakedModel getModel(ModelResourceLocation modelLocation)
    {
        if (modelLocation == null)
        {
            return this.defaultModel;
        }
        else
        {
            IBakedModel ibakedmodel = this.modelRegistry.getObject(modelLocation);
            return ibakedmodel == null ? this.defaultModel : ibakedmodel;
        }
    }
Модифицируем на своё, добавив например проверку на "modid:javamodel/model" и можем отдавать модель всему что её захочет. При этом без json'a, т.е тупо фантомный путь до модели.
Почему делать лучше так? Потому что так вероятность того, что что-то сломается меньше.
Регистрация модели, т.е пути происходит, как я понял в BlockModelShapes, метод здесь:
Код:
    public void registerBlockWithStateMapper(Block assoc, IStateMapper stateMapper)
    {
        this.blockStateMapper.registerBlockStateMapper(assoc, stateMapper);
    }
Возможно придётся париться с StateMapper, т.е реализовать свой с наследованием от StateMapperBase и поменять метод getModelResourceLocation иначе заглушка с путём работать не будет.
Ну как бы теперь вы знаете как юзать свои java модели и забить навсегда на json.
Конечно, так лучше не делать, мало ли что, но когда это нужно то вот :)

Мб потом либу напишу, а мб уже ту что я скидывал в предыдущей теме работает похожим образом.
 
Сверху