Слои на блоки

Версия Minecraft
1.12.2
5,149
49
899
Здравствуйте! Как вы знаете, есть в новых версиях такая фича, как рендер чего либо на сущности.
Есть ли что то подобное для блоков? В частности, мне нужно накладывать свою текстуру поверх ЛЮБОГО блока в игре(хоть ванильного, хоть моего, хоть еще какого левого)
 
Слушайте! А ведь когда ломаешь блок, текстура трещин накладывается на него! Вот оно!
Я даже нашел метод, но лазаю по Call Hierarchy и не могу нигде найти это место где она накладывается((

Java:
 public boolean onPlayerDestroyBlock(BlockPos pos)
    {
        if (this.currentGameType.hasLimitedInteractions())
        {
            if (this.currentGameType == GameType.SPECTATOR)
            {
                return false;
            }

            if (!this.mc.player.isAllowEdit())
            {
                ItemStack itemstack = this.mc.player.getHeldItemMainhand();

                if (itemstack.isEmpty())
                {
                    return false;
                }

                if (!itemstack.canDestroy(this.mc.world.getBlockState(pos).getBlock()))
                {
                    return false;
                }
            }
        }
 
Итак, выкладываю очередные результаты. Нашел я то место где накладывается вроде текстура ломания.

Насколько я все понял мне надо для этого слоя сделать следующее:
1) Получить модель плоскости\нарисовать ее там же
2) Получить текстуру(спрайт этот)
3)Зарендерить модель с этой текстурой на блоке

@Minebot ты бы мне точно помог!

Java:
    public void renderBlockDamage(IBlockState state, BlockPos pos, TextureAtlasSprite texture, IBlockAccess blockAccess)
    {
        if (state.getRenderType() == EnumBlockRenderType.MODEL)
        {
            state = state.getActualState(blockAccess, pos);
            IBakedModel ibakedmodel = this.blockModelShapes.getModelForState(state);
            IBakedModel ibakedmodel1 = net.minecraftforge.client.ForgeHooksClient.getDamageModel(ibakedmodel, texture, state, blockAccess, pos);
            this.blockModelRenderer.renderModel(blockAccess, ibakedmodel1, state, pos, Tessellator.getInstance().getBuffer(), true);
        }
    }

Попробовал реализовать такую же примерно штуку у себя. Попутно открыл много радостей по поводу получения разных всяких методов.
Код:
public class LayerEvent {
    
    
    static Minecraft mc = Minecraft.getMinecraft();
    
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void layer(BlockEvent.PlaceEvent e) {
        IBlockAccess world = e.getWorld();
        BlockPos pos = e.getPos();
        IBlockState state = e.getWorld().getBlockState(pos).getActualState(world, pos);    
        Block block = e.getWorld().getBlockState(pos).getBlock();
        BlockModelShapes bms = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes();
        TextureAtlasSprite texture = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("realism:blocks/panehorizontal");
        IBakedModel ibakedmodel = bms.getModelForState(state);
        IBakedModel ibakedmodel1 = net.minecraftforge.client.ForgeHooksClient.getDamageModel(ibakedmodel, texture, state, world, pos);
        ResourceLocation glass = new ResourceLocation("realism:blocks/panehorizontal");  
        bms.getModelManager().getTextureMap().registerSprite(glass);
        BlockModelRenderer bmr = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelRenderer();
        //Tessellator.getInstance().getBuffer().addVertexData(vertexData);
        Entity entity = this.mc.getRenderViewEntity();
        Tessellator rs = Tessellator.getInstance();
        if(e.getWorld().getBlockState(pos).getBlock() == Blocks.BRICK_BLOCK) {
             bmr.renderModel(world, ibakedmodel1, state, pos, Tessellator.getInstance().getBuffer(), true);
        
        }


    }
    @SideOnly(Side.CLIENT)
    @SubscribeEvent 
    public void spriteRegisterEventPre(TextureStitchEvent.Pre event) {  
        ResourceLocation glass = new ResourceLocation("realism:blocks/panehorizontal");  
        event.getMap().registerSprite(glass); 
    }

}
}

В итоге при установке блока - ОХРЕНЕТЬ, даже что то работает. Правда выкидывает исключения. Но что происходит я понять не могу. Слезно молю о помощи, я почти сделал его!
Код:
[23:20:03] [Server thread/ERROR] [FML]: Exception caught during firing event net.minecraftforge.event.world.BlockEvent$PlaceEvent@52bb1655:
net.minecraft.util.ReportedException: Tesselating block model
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:55) ~[BlockModelRenderer.class:?]
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:38) ~[BlockModelRenderer.class:?]
    at ru.legendgamer.Realism.Events.LayerEvent.layer(LayerEvent.java:59) ~[LayerEvent.class:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_23_LayerEvent_layer_PlaceEvent.invoke(.dynamic) ~[?:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:179) [EventBus.class:?]
    at net.minecraftforge.event.ForgeEventFactory.onPlayerBlockPlace(ForgeEventFactory.java:149) [ForgeEventFactory.class:?]
    at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:891) [ForgeHooks.class:?]
    at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:200) [ItemStack.class:?]
    at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:504) [PlayerInteractionManager.class:?]
    at net.minecraft.network.NetHandlerPlayServer.processTryUseItemOnBlock(NetHandlerPlayServer.java:767) [NetHandlerPlayServer.class:?]
    at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) [CPacketPlayerTryUseItemOnBlock.class:?]
    at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) [CPacketPlayerTryUseItemOnBlock.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) [PacketThreadUtil$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_151]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_151]
    at net.minecraft.util.Util.runTask(Util.java:53) [Util.class:?]
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:796) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:741) [MinecraftServer.class:?]
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) [IntegratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:590) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]
Caused by: java.lang.IllegalArgumentException: vertex lighter needs format with lightmap
    at net.minecraftforge.client.model.pipeline.VertexLighterFlat.setParent(VertexLighterFlat.java:89) ~[VertexLighterFlat.class:?]
    at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.renderModelSmooth(ForgeBlockModelRenderer.java:100) ~[ForgeBlockModelRenderer.class:?]
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:47) ~[BlockModelRenderer.class:?]
    ... 21 more
[23:20:03] [Server thread/ERROR] [FML]: Index: 1 Listeners:
[23:20:03] [Server thread/ERROR] [FML]: 0: NORMAL
[23:20:03] [Server thread/ERROR] [FML]: 1: ASM: ru.legendgamer.Realism.Events.LayerEvent@51920bb0 layer(Lnet/minecraftforge/event/world/BlockEvent$PlaceEvent;)V
[23:20:03] [Server thread/FATAL]: Error executing task
java.util.concurrent.ExecutionException: net.minecraft.util.ReportedException: Tesselating block model
    at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_151]
    at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_151]
    at net.minecraft.util.Util.runTask(Util.java:54) [Util.class:?]
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:796) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:741) [MinecraftServer.class:?]
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) [IntegratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:590) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]
Caused by: net.minecraft.util.ReportedException: Tesselating block model
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:55) ~[BlockModelRenderer.class:?]
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:38) ~[BlockModelRenderer.class:?]
    at ru.legendgamer.Realism.Events.LayerEvent.layer(LayerEvent.java:59) ~[LayerEvent.class:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_23_LayerEvent_layer_PlaceEvent.invoke(.dynamic) ~[?:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:179) ~[EventBus.class:?]
    at net.minecraftforge.event.ForgeEventFactory.onPlayerBlockPlace(ForgeEventFactory.java:149) ~[ForgeEventFactory.class:?]
    at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:891) ~[ForgeHooks.class:?]
    at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:200) ~[ItemStack.class:?]
    at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:504) ~[PlayerInteractionManager.class:?]
    at net.minecraft.network.NetHandlerPlayServer.processTryUseItemOnBlock(NetHandlerPlayServer.java:767) ~[NetHandlerPlayServer.class:?]
    at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) ~[CPacketPlayerTryUseItemOnBlock.class:?]
    at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) ~[CPacketPlayerTryUseItemOnBlock.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_151]
    at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_151]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 5 more
Caused by: java.lang.IllegalArgumentException: vertex lighter needs format with lightmap
    at net.minecraftforge.client.model.pipeline.VertexLighterFlat.setParent(VertexLighterFlat.java:89) ~[VertexLighterFlat.class:?]
    at net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer.renderModelSmooth(ForgeBlockModelRenderer.java:100) ~[ForgeBlockModelRenderer.class:?]
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:47) ~[BlockModelRenderer.class:?]
    at net.minecraft.client.renderer.BlockModelRenderer.renderModel(BlockModelRenderer.java:38) ~[BlockModelRenderer.class:?]
    at ru.legendgamer.Realism.Events.LayerEvent.layer(LayerEvent.java:59) ~[LayerEvent.class:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_23_LayerEvent_layer_PlaceEvent.invoke(.dynamic) ~[?:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:179) ~[EventBus.class:?]
    at net.minecraftforge.event.ForgeEventFactory.onPlayerBlockPlace(ForgeEventFactory.java:149) ~[ForgeEventFactory.class:?]
    at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:891) ~[ForgeHooks.class:?]
    at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:200) ~[ItemStack.class:?]
    at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:504) ~[PlayerInteractionManager.class:?]
    at net.minecraft.network.NetHandlerPlayServer.processTryUseItemOnBlock(NetHandlerPlayServer.java:767) ~[NetHandlerPlayServer.class:?]
    at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) ~[CPacketPlayerTryUseItemOnBlock.class:?]
    at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) ~[CPacketPlayerTryUseItemOnBlock.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_151]
    at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_151]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 5 more
 
Последнее редактирование:
Ну что? Есть идеи?
Неужели никому неинтересно как запилить слои на блоки?(
 
Попробовал реализовать такую же примерно штуку у себя. Попутно открыл много радостей по поводу получения разных всяких методов.
Рисовать модель при плейсе блока? В потоке ворлда? (хах)
 
Рисовать модель при плейсе блока? В потоке ворлда? (хах)
да хоть где)) Не нашел лучшего места. Думал так: при установке блока будетрендерится моделька
 
Он может рисовать только в потоке где присутствует opengl context, и в потоке мира его точно нет, поверь.
Например?
Мне надо то вообще если честно. Просто поверх стороны блока нарисовать тесселятором плоскость и на нее наложить текстуру. Хотя бы так для начала. Куда лезть, че брать, где смотреть - в этом и весь вопрос.
 
Назад
Сверху