Обилие классов при регистрации объектов

Версия Minecraft
1.7.10
355
2
17
При регистрации блоков с OBJ/Уникальной моделькой требуется регистрировать блок как класс наследуемый от TileEntity.

Java:
GameRegistry.registerTileEntity( ? extends TileEntity, "Name");

А сам класс по сути может быть пустым, смотрел множество модов, везде такое обилие, но ранее видел и моды, которые как-то подгружали эти блоки без такого вот обилия, но уже не вспомню какие.
Собственно вопрос: Есть ли какие-то иные методы регистрации блоков с уникальной моделькой, не создавая для каждого блока пустой класс?

Не откажусь от советов как регистрировать множество моделек :)
 
5,018
47
783
Потому что для TESR необходим тайлэнтити. Можешь сделать его как класс в классе, если тебе не нравится лишний файл.
Рендерить модельку без тайла ... вроде как с ModelBase чето мутить надо, но я не пробовал, не знаю
 

timaxa007

Модератор
5,831
409
672
@Sunrise, альтернатива ISimpleBlockRenderingHandler (про подобное уже было, но темы не нашёл).
У меня получилось сделать вот такой код:
ProxyClient:
Java:
    public static int
    block_obj_alt_renderID
    ;

    public static void init() {
        block_obj_alt_renderID = RenderingRegistry.getNextAvailableRenderId();
        RenderingRegistry.registerBlockHandler(block_obj_alt_renderID, new RenederBlockObjAlt(block_obj_alt_renderID));
    }

}
В твоём блоке:
Java:
    @SideOnly(Side.CLIENT)
    @Override
    public int getRenderType() {
        return ProxyClient.block_obj_alt_renderID;
    }
RenederBlockObjAlt:
Java:
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;

import org.lwjgl.opengl.GL11;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;

public class RenederBlockObjAlt implements ISimpleBlockRenderingHandler {

    public static final IModelCustom model =
            AdvancedModelLoader.loadModel(new ResourceLocation(ModBlockObjAlt.MODID, "obj/block.obj"));
    public static final ResourceLocation texture = new ResourceLocation(ModBlockObjAlt.MODID, "textures/blocks/model_obj.png");
    final int id;

    public RenederBlockObjAlt(int block_obj_alt_renderID) {
        id = block_obj_alt_renderID;
    }

    @Override
//Рендер в инвентаре (и как-бы в руке).
    public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
        GL11.glPushMatrix();
        GL11.glTranslatef(0.5F, 0.0F, 0.5F);
        Minecraft.getMinecraft().renderEngine.bindTexture(texture);
        model.renderAll();
        GL11.glPopMatrix();
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
        Tessellator tessellator = Tessellator.instance;
        renderer.renderStandardBlock(block, x, y, z);//Не помню зачем писал.
        tessellator.draw();//Да тут мы завершаем стандартный рендер квадратов

        tessellator.setBrightness(world.getLightBrightnessForSkyBlocks(x, y, z, block.getLightValue(world, x, y, z)));
        tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);//Не помню зачем писал.
        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        GL11.glTranslatef(0.5F, 0.0F, 0.5F);
        Minecraft.getMinecraft().renderEngine.bindTexture(texture);//Бинд нашей текстуры
        model.renderAll();//Рендер модели
        GL11.glPopMatrix();

        tessellator.startDrawingQuads();//А тут мы начинаем, чтобы дальнейшие квадраты тоже рендерились
        Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);//Если не применить это, то дальнейшие квадраты примут текстуру от нашей модели
        return true;
    }

    @Override
    public boolean shouldRender3DInInventory(int modelId) {
        return true;//Хотите-ли чтобы рендерилась эта модель в инвентаре (не используя дополнительный класс для рендера его как предмета)
    }

    @Override
    public int getRenderId() {
        return id;
    }

}
При первом тесте подобного работало нормально, но дальнейшую стабильность работы не проверял (так как я всегда использовал TileEntity, потому-что у каждой модели были какие-то задачи), так что не знаю будет-ли лагать или нет.

На всякий случай - Ускорение рендера моделей
 
Последнее редактирование:
355
2
17
Частично разобрался, но все равно возникает ряд вопросов... Только вхожу в рендер.

И насчет ускорения рендера, если использовать ModelBase через собственно Java, нагрузка аналогичная? Задача добавить несколько десятков моделей которые будут наполнять окружение, сами по себе модели не сложные. И что насчет JSON? В новых версиях используют его, не думаю что взялись бы за это направление, если бы оно было плохим.

UPD.
Пробовал рендерить объект через лист как тут Ускорение рендера моделей, используя ModelBase вместо obj, отрисовывает лишь одну детальку из модели, а если без листа, то все нормально..

Java:
 public RenderModel(ModelBase model, ResourceLocation texture, String name)
    {
        this.model = model;
        this.texture = texture;

        this.list = GL11.glGenLists(1);
        
        GL11.glNewList(list, GL11.GL_COMPILE);

         // Содержимое листа
        this.model.render((Entity) null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);

        GL11.glEndList();
    }

    @Override
    public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float pt)
    {
        int i;

        if (tileEntity.getWorldObj() == null)
            i = 0;
        else
        {
            Block block = tileEntity.getBlockType();
            i = tileEntity.getBlockMetadata();

            if (block != null && i == 0) i = tileEntity.getBlockMetadata();
        }

        GL11.glPushMatrix();
        GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
        Minecraft.getMinecraft().renderEngine.bindTexture(texture);
        GL11.glPushMatrix();
        GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);

        int j = 0;

        if(i == 3) j = 270;

        if(i == 2) j = 180;

        if(i == 1) j = 90;

        if(i == 0) j = 360;
        GL11.glRotatef(j, 0.0F, 1.0F, 0F);

        // Вызов содержимого листа
        GL11.glCallList(list);

        GL11.glPopMatrix();
        GL11.glPopMatrix();

    }
 
Последнее редактирование:
Сверху