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.
Конечно, так лучше не делать, мало ли что, но когда это нужно то вот
Мб потом либу напишу, а мб уже ту что я скидывал в предыдущей теме работает похожим образом.