Лампа

Версия Minecraft
1.7.10
Добрый день, я новичок в создании модов, по этому прошу помощи у вас, опытных мододелов. Так вот в чем проблема, для практики я создаю лампу, обычную светящуюся, прозрачную лампу. Скриншот я прикрепил.

Но если приглядеться, то у нее не видно стенок (я там показал стрелочкой).

Как это можно исправить?

Лампа:
Код:
package ru.saharok.mod.blocks;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.util.IIcon;
import ru.saharok.mod.Main;

public class Lamp extends Block {

 
    protected IIcon BlockIconSide;
    protected IIcon BlockIconTop;
 
 public Lamp() {
 super(Material.wood);
 
 setBlockName("lamp");
 setCreativeTab(Main.tab);
 setHardness(0.5F);
 setResistance(1F);
 setLightLevel(1F);
 setBlockBounds(0.3F, 0F, 0.3F, 0.7F, 1F, 0.7F);
 }
 
    public void registerBlockIcons(IIconRegister par1IconRegister)
    {
        BlockIconSide = par1IconRegister.registerIcon("mod:lamp");
        BlockIconTop = par1IconRegister.registerIcon("mod:lamp2");
    }

    
    public IIcon getIcon(int par1int, int par2int)
    {
        if (par1int == 0 || par1int == 1) { return BlockIconTop; }
        return BlockIconSide;
    }
    
    
    public int getRenderBlockPass()
    {
     return 1;
    }
    

    public boolean isOpaqueCube() {
 return false;
 }
 
    
 public boolean renderAsNormalBlock()
    {
     return false;
    }
 
}
 

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    156.6 KB · Просмотры: 46
808
3
124
Писать свой ISimpleBlockRenderingHandler, и с его помощью закостылить так, чтобы лампа рисовала прозрачные части в render pass 1, а непрозрачные - в render pass 0. Карпентер это костылит как-то так (класс блока):

   @Override
   public boolean canRenderInPass(int pass) {
     // костыль чтобы во время рендеринга блоков знать, в каком рендер пассе мы находимся
      ForgeHooksClient.setRenderPass(pass);
      return true;
   }

   @SideOnly(Side.CLIENT)
   @Override
   public int getRenderBlockPass() {
      // если поставить тут 0, то рисовать в первом рендер пассе не будет даже пытаться, а если наоборот - пытается рисовать в обоих
      return 1;
   }
Ну а как нарисовать нужный кусок блока в зависимости от рендер пасса думаю разберешься.


GL_CULL_FACE трогать не надо: если блок вшивается в чанк, то его никак адекватно не выключишь. Если нужно рисовать бекфейсы - просто дублируй полигоны (спойлер: это не будет нормально работать с полупрозрачными объектами)
 
5,021
47
784
Я не особо шарю, по этому то, что я сейчас напишу может показаться для вас глупостью. Может можно сделать 3 текстуры в одной? Как Вы наверное поняли, мне нужно, чтобы прозрачной была только желтая часть лампы, "подставки серого цвета в 1px должны быть видны в любом случае". Так вот суть бреда, что если как-то сделать верхнюю текстуру - отдельно, центр - отдельно, и низ - отдельно. Так вообще возможно? Потому что опять таки я только осваиваюсь в модах и из того, что написали сверху я практичеки ничего не понял.
 

IKR

24
0
Писать свой ISimpleBlockRenderingHandler, и с его помощью закостылить так, чтобы лампа рисовала прозрачные части в render pass 1, а непрозрачные - в render pass 0. Карпентер это костылит как-то так (класс блока):


Ну а как нарисовать нужный кусок блока в зависимости от рендер пасса думаю разберешься.


GL_CULL_FACE трогать не надо: если блок вшивается в чанк, то его никак адекватно не выключишь. Если нужно рисовать бекфейсы - просто дублируй полигоны (спойлер: это не будет нормально работать с полупрозрачными объектами)
У меня сейчас похожая проблема, посмотрел как сделано в мультипарте сделал почти то же самое что написано здесь и все работает но по какой то неизвестной причине полупрозрачная часть баганно рендерится рядом с другими полупрозрачными блоками и исчезает
Кто нибудь знает как исправить?
Еще это происходит и без рендеринга в 1 пассе только если есть это но тогда исчезают другие блоки
Java:
// We need draw triangles
Tessellator.instance.draw();
Tessellator.instance.startDrawing(GL11.GL_TRIANGLES);

// We need back to quads
Tessellator.instance.draw();
Tessellator.instance.startDrawingQuads();
 
Последнее редактирование:
Сверху