Слои на блоки

Версия Minecraft
1.12.2
5,149
49
899
Здравствуйте! Как вы знаете, есть в новых версиях такая фича, как рендер чего либо на сущности.
Есть ли что то подобное для блоков? В частности, мне нужно накладывать свою текстуру поверх ЛЮБОГО блока в игре(хоть ванильного, хоть моего, хоть еще какого левого)
 
Могу предложить только создавать тайлы с собственным рендером и пихать их блоку... Только не факт, что всё не глюканёт. Да и с блоками, у которых уже есть тайл, такого не выйдет...
Либо пихать хуком свой рендер для блоков, а инфу сохранять где-нибудь в чанке.
 
Там рендер на сущности очень простенький... Может, попробовать по аналогии сделать?
 
Либо пихать хуком свой рендер для блоков
Хорошая идея. Подскажи класс, где рендерится блок?
 
Еще нашел какой то
net.minecraft.client.renderer.texture.LayeredTexture.class
Че эт?
 
Короче возникло несколько идей.
1) Хук в рендер блока(не могу найти аналогичный класс рендера как для энтити
public abstract class RenderLivingBase<T extends EntityLivingBase> extends Render<T>)
2) Через net.minecraft.client.renderer.texture.LayeredTexture.class отдельно подгруженную текстуру как то накладывать на блок
Жду ваших мыслей по этому поводу.
 
Кусок чанка 16x16x16 компилируется в list(OpenGL Display List) и потом каждый draw тик они все соритруются и вызывается комманда отрисовки листов. Тайлы рисуются отдельно, "динамически". Так что единственный путь это хукать при "компилировании" листа чанка. (В 1.7.10 класс называется WorldRenderer, насчет 1.12 хз)
 
Можешь скинуть че там внутри этого WorldRenderer ? Просто может его тут переименовали, а начинка таже осталась
 
Можешь скинуть че там внутри этого WorldRenderer ? Просто может его тут переименовали, а начинка таже осталась
У тебя нет возможности покопаться в RenderGlobal и самому посмотреть что да как?
 
У тебя нет возможности покопаться в RenderGlobal и самому посмотреть что да как?
Уже понял. Нашел там такое:
Java:
   public int renderBlockLayer(BlockRenderLayer blockLayerIn, double partialTicks, int pass, Entity entityIn)
    {
        RenderHelper.disableStandardItemLighting();

        if (blockLayerIn == BlockRenderLayer.TRANSLUCENT)
        {
            this.mc.mcProfiler.startSection("translucent_sort");
            double d0 = entityIn.posX - this.prevRenderSortX;
            double d1 = entityIn.posY - this.prevRenderSortY;
            double d2 = entityIn.posZ - this.prevRenderSortZ;

            if (d0 * d0 + d1 * d1 + d2 * d2 > 1.0D)
            {
                this.prevRenderSortX = entityIn.posX;
                this.prevRenderSortY = entityIn.posY;
                this.prevRenderSortZ = entityIn.posZ;
                int k = 0;

                for (RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation : this.renderInfos)
                {
                    if (renderglobal$containerlocalrenderinformation.renderChunk.compiledChunk.isLayerStarted(blockLayerIn) && k++ < 15)
                    {
                        this.renderDispatcher.updateTransparencyLater(renderglobal$containerlocalrenderinformation.renderChunk);
                    }
                }
            }

            this.mc.mcProfiler.endSection();
        }

        this.mc.mcProfiler.startSection("filterempty");
        int l = 0;
        boolean flag = blockLayerIn == BlockRenderLayer.TRANSLUCENT;
        int i1 = flag ? this.renderInfos.size() - 1 : 0;
        int i = flag ? -1 : this.renderInfos.size();
        int j1 = flag ? -1 : 1;

        for (int j = i1; j != i; j += j1)
        {
            RenderChunk renderchunk = (this.renderInfos.get(j)).renderChunk;

            if (!renderchunk.getCompiledChunk().isLayerEmpty(blockLayerIn))
            {
                ++l;
                this.renderContainer.addRenderChunk(renderchunk, blockLayerIn);
            }
        }

        this.mc.mcProfiler.func_194339_b(() ->
        {
            return "render_" + blockLayerIn;
        });
        this.renderBlockLayer(blockLayerIn);
        this.mc.mcProfiler.endSection();
        return l;
    }

    @SuppressWarnings("incomplete-switch")
    private void renderBlockLayer(BlockRenderLayer blockLayerIn)
    {
        this.mc.entityRenderer.enableLightmap();

        if (OpenGlHelper.useVbo())
        {
            GlStateManager.glEnableClientState(32884);
            OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
            GlStateManager.glEnableClientState(32888);
            OpenGlHelper.setClientActiveTexture(OpenGlHelper.lightmapTexUnit);
            GlStateManager.glEnableClientState(32888);
            OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
            GlStateManager.glEnableClientState(32886);
        }

        this.renderContainer.renderChunkLayer(blockLayerIn);

        if (OpenGlHelper.useVbo())
        {
            for (VertexFormatElement vertexformatelement : DefaultVertexFormats.BLOCK.getElements())
            {
                VertexFormatElement.EnumUsage vertexformatelement$enumusage = vertexformatelement.getUsage();
                int k1 = vertexformatelement.getIndex();

                switch (vertexformatelement$enumusage)
                {
                    case POSITION:
                        GlStateManager.glDisableClientState(32884);
                        break;
                    case UV:
                        OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + k1);
                        GlStateManager.glDisableClientState(32888);
                        OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
                        break;
                    case COLOR:
                        GlStateManager.glDisableClientState(32886);
                        GlStateManager.resetColor();
                }
            }
        }

        this.mc.entityRenderer.disableLightmap();
    }
Мож туда и надо хук засунуть?:unsure:
 
Лол, но тут нет вертексов)
Java:
 public boolean renderBlock(IBlockState state, BlockPos pos, IBlockAccess blockAccess, BufferBuilder bufferBuilderIn)
    {
        try
        {
            EnumBlockRenderType enumblockrendertype = state.getRenderType();

            if (enumblockrendertype == EnumBlockRenderType.INVISIBLE)
            {
                return false;
            }
            else
            {
                if (blockAccess.getWorldType() != WorldType.DEBUG_ALL_BLOCK_STATES)
                {
                    try
                    {
                        state = state.getActualState(blockAccess, pos);
                    }
                    catch (Exception var8)
                    {
                        ;
                    }
                }

                switch (enumblockrendertype)
                {
                    case MODEL:
                        IBakedModel model = this.getModelForState(state);
                        state = state.getBlock().getExtendedState(state, blockAccess, pos);
                        return this.blockModelRenderer.renderModel(blockAccess, model, state, pos, bufferBuilderIn, true);
                    case ENTITYBLOCK_ANIMATED:
                        return false;
                    case LIQUID:
                        return this.fluidRenderer.renderFluid(blockAccess, state, pos, bufferBuilderIn);
                    default:
                        return false;
                }
            }
        }
        catch (Throwable throwable)
        {
            CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Tesselating block in world");
            CrashReportCategory crashreportcategory = crashreport.makeCategory("Block being tesselated");
            CrashReportCategory.addBlockInfo(crashreportcategory, pos, state.getBlock(), state.getBlock().getMetaFromState(state));
            throw new ReportedException(crashreport);
        }
    }
 
ЧТо я в конце концов ожидаю найти:
8 вертексов обычного куба. Просто 8 вертексов. И туда хуком заснуть еще 8 которые будут делать чуть более обьемный куб чем тот который есть. Я правильно думаю?
 
Назад
Сверху