Как отрисовать кастомный блок в руке?

Версия Minecraft
1.7.10
1,159
38
544
Все привет. Сделал свой блок с кастомной моделью. Блок работает и рендерится хорошо, но в руке выглядит безобразно:
Снимок экрана (14).png

Прочитал, что мне нужно сделать ItemRenderer и зарегистрировать его. Только вот регистрироваться он у меня не хочет - renderItem() не вызывается.

Вот блок:

Java:
package rsstats.inventory.container.rsstats.blocks;

import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import rsstats.common.RSStats;

import java.util.Random;

public class UpgradeStationBlock extends BlockContainer {
    public static final String name = "upgrade_station";
    public static final String item_name = "upgrade_station_item";

    public UpgradeStationBlock() {
        super(Material.wood);
        setBlockTextureName(RSStats.MODID + ":" + name);
        //setBlockBounds(0.25F, 0, 0.25F, 0.75F, 0.5F, 0.75F);
        setBlockName(name);
        setCreativeTab(RSStats.CREATIVE_TAB);
        setHardness(2.5F); // Как у верстака, судя по вики
        // TODO: Установить подходящий инструмент, взывоустойчивость, горение и другие свойства
        //BlockStairs
    }

    @Override
    public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) {
        return false;
    }

    @Override
    public boolean isOpaqueCube() {
        return false;
    }

    @Override
    public boolean renderAsNormalBlock() {
        return false;
    }

    @Override
    public TileEntity createNewTileEntity(World world, int par2) {
        return new UpgradeStationEntity();
    }

    /**
     * Called upon block activation (right click on the block.)
     */
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) {
        if (!world.isRemote) {
            entityPlayer.openGui(RSStats.instance, RSStats.UPGRADE_UI_FROM_BLOCK_CODE, world, x, y, z);
            //CommonProxy.INSTANCE.sendToServer(new PacketOpenWindow(x, y, z));
            //return false; // TODO: Зачем?
        }
        return super.onBlockActivated(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ);
    }

    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack p_149689_6_) {
        //This gets the direction the player is facing as an int from 0 to 3
        int dir = MathHelper.floor_double((player.rotationYaw * 4F) / 360F + 0.5D) & 3;
        //You can use the block metadata to save the direction
        world.setBlockMetadataWithNotify(x, y, z, dir, 3);
        //Or you can save it in a tile entity if you are using one
        //createNewTileEntity(world, world.getBlockMetadata(x, y, z));
        super.onBlockPlacedBy(world, x, y, z, player, p_149689_6_);
    }

    @Override
    public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) {
        return super.getItem(p_149694_1_, p_149694_2_, p_149694_3_, p_149694_4_);
    }

    @Override
    public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) {
        return super.getItemDropped(p_149650_1_, p_149650_2_, p_149650_3_);
    }
}

Его TESR и ItemRenerer (внутренний класс)

Код:
package rsstats.inventory.container.rsstats.blocks;

import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import rsstats.common.RSStats;

public class UpgradeStationTESR extends TileEntitySpecialRenderer
{
    IModelCustom model = AdvancedModelLoader.loadModel(new ResourceLocation(RSStats.MODID, "obj/upgrade_station.obj"));
    ResourceLocation texture = new ResourceLocation(RSStats.MODID, "textures/t.png");

    @Override
    public void renderTileEntityAt(TileEntity entity, double x, double y, double z, float p_147500_8_) {

        bindTexture(texture);

        GL11.glPushMatrix();
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glTranslatef((float) x + 0.5F, (float) y + 0.0F, (float) z + 0.5F);
        //GL11.glScalef(0.09375F, 0.09375F, 0.09375F);

        // Поворачиваем блок в нужном направлении (направление хранится в метадате блока, которая выставляется когда игрок ставит блок)
        int dir = entity.blockMetadata;
        if (dir == 0)
        {
            GL11.glRotatef(-180F, 0.0F, 1.0F, 0.0F);
        }

        if (dir % 2 != 0)
        {
            GL11.glRotatef(dir * (/*-*/90F), 0.0F, 1.0F, 0.0F);
        }

        if (dir % 2 == 0)
        {
            GL11.glRotatef(dir * (-180F), 0.0F, 1.0F, 0.0F);
        }

        // Рендерим блок
        model.renderAll();
        GL11.glPopMatrix();
    }

    public static class Renderer implements IItemRenderer {
        TileEntitySpecialRenderer render;
        private TileEntity te;

        public Renderer(TileEntitySpecialRenderer render, TileEntity te) {
            this.render = render;
            this.te = te;
        }

        @Override
        public boolean handleRenderType(ItemStack item, ItemRenderType type) {
            return true;
        }

        @Override
        public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
            return true;
        }

        @Override
        public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
            if (type == IItemRenderer.ItemRenderType.ENTITY) {
                GL11.glTranslatef(-0.5F, 0.0F, -0.5F);
            }
            GL11.glScalef(1.5F, 1.5F, 1.5F);
            this.render.renderTileEntityAt(this.te, 0.0D, 0.0D, 0.0D, 0.0F);
        }
    }
}

Клиент прокси

Код:
package rsstats.client;

import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.world.World;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.common.MinecraftForge;
import rsstats.client.gui.MainMenuGUI;
import rsstats.client.gui.SSPPage;
import rsstats.client.gui.UpgradeGUI;
import rsstats.common.CommonProxy;
import rsstats.common.RSStats;
import rsstats.common.event.KeyHandler;
import rsstats.data.ExtendedPlayer;
import rsstats.inventory.container.MainContainer;
import rsstats.inventory.container.UpgradeContainer;
import rsstats.inventory.container.rsstats.blocks.UpgradeStationBlock;
import rsstats.inventory.container.rsstats.blocks.UpgradeStationEntity;
import rsstats.inventory.container.rsstats.blocks.UpgradeStationTESR;

/**
 * Прокси, исполняемый на стороне клиента
 * @author RareScrap
 */
public class ClientProxy extends CommonProxy {
    /**
     * Получает GUI для указанного ID
     * @param ID идентификатор GUI, объект которого необходимо возвратить
     * @param player Сущность игрока, вызывающего GUI
     * @param world Мир
     * @param x Местоположение сущности игрока по оси X
     * @param y Местоположение сущности игрока по оси Y
     * @param z Местоположение сущности игрока по оси Z
     * @return Потомок класса GuiContainer, соответствующий указанному ID
     */
    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        // Проверяем, точно ли мы на клиете
        // TODO: Не могу однозначно сказать что эта проверка делает
        if (world instanceof WorldClient) {
            // Ищем GUI, соответствующий данному ID
            switch (ID) {
                case RSStats.GUI: {
                    return new MainMenuGUI(
                            ExtendedPlayer.get(player),
                            new MainContainer(player,
                                    player.inventory,
                                    ExtendedPlayer.get(player).statsInventory,
                                    ExtendedPlayer.get(player).skillsInventory,
                                    ExtendedPlayer.get(player).wearableInventory)
                    );
                }
                /*
                ВНИМАНИЕ! По туториалу, мне не нужно делать проверку в строке 25.
                Более того, мне нужно свитч затолкать в CommonProxy. Но так как
                у меня все работает и при таком раскладе, я пока оставлю все как есть
                */
                case RSStats.SSP_UI_CODE: return new SSPPage(player, player.inventory, ExtendedPlayer.get(player).statsInventory);
                case RSStats.UPGRADE_UI_FROM_BLOCK_CODE: return new UpgradeGUI(new UpgradeContainer(player.inventory, ((UpgradeStationEntity)world.getTileEntity(x, y, z)).upgradeStationInventory));
                case RSStats.UPGRADE_UI_FROM_CMD_CODE: return new UpgradeGUI(new UpgradeContainer(player.inventory, null));
            }
        }
        return null;
    }
    
    // Кей-хандлеры должны регистрироваться только на клиенте
    @Override
    public void registerKeyBindings() {
        keyHandler = new KeyHandler();
        FMLCommonHandler.instance().bus().register(keyHandler);
        MinecraftForge.EVENT_BUS.register(new MainMenuGUI(null, new MainContainer()));
    }

    @Override
    public void preInit(FMLPreInitializationEvent event) {
        super.preInit(event);
        //MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(new UpgradeStationBlock()), new UpgradeStationTESR.Renderer(new UpgradeStationTESR(), new UpgradeStationEntity()));
    }

    @Override
    public void init(FMLInitializationEvent event) {
        super.init(event);
        // Регистрируем рендереры
        ClientRegistry.bindTileEntitySpecialRenderer(UpgradeStationEntity.class, new UpgradeStationTESR());

        // Пытаюсь как-то получить item для блока
        Item d1 = Item.getItemFromBlock(new UpgradeStationBlock());
        ItemBlock d = new ItemBlock(new UpgradeStationBlock());
        Item d12 = GameRegistry.findItem(RSStats.MODID, d.getUnlocalizedName());
        Item d13 = ItemBlock.getItemFromBlock(new UpgradeStationBlock());
        
        UpgradeStationTESR.Renderer d2 =  new UpgradeStationTESR.Renderer(new UpgradeStationTESR(), new UpgradeStationEntity());
        MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(new UpgradeStationBlock()), new UpgradeStationTESR.Renderer(new UpgradeStationTESR(), new UpgradeStationEntity()));
    }
}

CommonProxy

Код:
package rsstats.common;

import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.IGuiHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemBlock;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import rsstats.common.event.KeyHandler;
import rsstats.common.network.*;
import rsstats.data.ExtendedPlayer;
import rsstats.inventory.container.MainContainer;
import rsstats.inventory.container.StatsContainer;
import rsstats.inventory.container.UpgradeContainer;
import rsstats.inventory.container.rsstats.blocks.UpgradeStationBlock;
import rsstats.inventory.container.rsstats.blocks.UpgradeStationEntity;
import rsstats.items.ExpItem;
import rsstats.items.RerollCoin;
import rsstats.items.SkillItem;
import rsstats.items.StatItem;
import rsstats.utils.DiceRoll;
import rsstats.utils.RollModifier;

import java.util.ArrayList;
import java.util.List;

import static rsstats.common.RSStats.instance;
import static rsstats.common.RSStats.proxy;

/**
 * Проки, содержащий код как для клиента, так и сервера
 * @author RareScrap
 */
public class CommonProxy implements IGuiHandler {
    public enum Skills {
        ClimbingSkillItem,
        EquitationSkillItem,
        LockpickingSkillItem,
        DrivingSkillItem,
        FightingSkillItem,
        DisguiseSkillItem,
        ThrowingSkillItem,
        PilotingSkillItem,
        SwimmingSkillItem,
        ShootingSkillItem,
        ShippingSkillItem,
        GamblingSkillItem,
        PerceptionSkillItem,
        SurvivalSkillItem,
        TrackingSkillItem,
        MedicineSkillItem,
        ProvocationSkillItem,
        InvestigationSkillItem,
        RepearSkillItem,
        StreetFlairSkillItem,
        IntimidationSkillItem,
        DiplomacySkillItem,
    }

    public enum Stats {
        StrengthStatItem,
        AgilityStatItem,
        IntelligenceStatItem,
        EnduranceStatItem,
        CharacterStatItem
    }

    /** Обработчик нажатия кнопок, используемых для вызова GUI */
    protected KeyHandler keyHandler;
    /** Обертка для работы с сетью */
    public static final SimpleNetworkWrapper INSTANCE =
            NetworkRegistry.INSTANCE.newSimpleChannel(RSStats.MODID.toLowerCase());

    public void preInit(FMLPreInitializationEvent event) {
        int discriminator = 0;

        // Когда сообщений станет много, их можно вынести в отдельный класс в метод init()
        INSTANCE.registerMessage(RollPacketToServer.MessageHandler.class, RollPacketToServer.class, discriminator++, Side.SERVER); // Регистрация сообщения о пробросе статы
        INSTANCE.registerMessage(PacketOpenRSStatsInventory.MessageHandler.class, PacketOpenRSStatsInventory.class, discriminator++, Side.SERVER);
        INSTANCE.registerMessage(PacketOpenSSPPage.MessageHandler.class, PacketOpenSSPPage.class, discriminator++, Side.SERVER);
        INSTANCE.registerMessage(PacketOpenWindow.MessageHandler.class, PacketOpenWindow.class, discriminator++, Side.SERVER);
        INSTANCE.registerMessage(PacketShowSkillsByStat.MessageHandler.class, PacketShowSkillsByStat.class, discriminator++, Side.SERVER);
        INSTANCE.registerMessage(PacketSyncGUI.MessageHandler.class, PacketSyncGUI.class, discriminator++, Side.SERVER);

        INSTANCE.registerMessage(PacketSyncPlayer.MessageHandler.class, PacketSyncPlayer.class, discriminator++, Side.CLIENT);
        INSTANCE.registerMessage(PacketCommandReponse.MessageHandler.class, PacketCommandReponse.class, discriminator++, Side.CLIENT);

        // Дайсы для статов
        ArrayList<DiceRoll> statDices = new ArrayList<DiceRoll>();
        statDices.add(new DiceRoll(null, null, 4));
        statDices.add(new DiceRoll(null, null, 6));
        statDices.add(new DiceRoll(null, null, 8));
        statDices.add(new DiceRoll(null, null, 10));
        statDices.add(new DiceRoll(null, null, 12));
        // Инициализация предметов статов
        StatItem strenghtStatItem = new StatItem(statDices, "StrengthStatItem", "rsstats:strenght", "item.StrengthStatItem"); // 3 - rarescrap:StrenghtIcon_
        StatItem agilityStatItem = new StatItem(statDices, "AgilityStatItem", "rsstats:agility", "item.AgilityStatItem");
        StatItem intelligenceStatItem = new StatItem(statDices, "IntelligenceStatItem", "rsstats:intelligence", "item.IntelligenceStatItem");
        StatItem enduranceStatItem = new StatItem(statDices, "EnduranceStatItem", "rsstats:endurance", "item.EnduranceStatItem");
        StatItem characterStatItem = new StatItem(statDices, "CharacterStatItem", "rsstats:character", "item.CharacterStatItem");
        // Регистрация предметов статов
        GameRegistry.registerItem(strenghtStatItem, "StrengthStatItem");
        GameRegistry.registerItem(agilityStatItem, "AgilityStatItem");
        GameRegistry.registerItem(intelligenceStatItem, "IntelligenceStatItem");
        GameRegistry.registerItem(enduranceStatItem, "EnduranceStatItem");
        GameRegistry.registerItem(characterStatItem, "CharacterStatItem");

        // Дайся для скиллов
        // TODO: Проверять на то, поставляется ли dices уже с модификаторами
        List<RollModifier> modificators = new ArrayList<RollModifier>();
        modificators.add(new RollModifier(-2, StatCollector.translateToLocal("modifiers.MissingSkill"))); // TODO: Разобраться почему это работает на сервере
        ArrayList<DiceRoll> skillDices = new ArrayList<DiceRoll>();
        skillDices.add(new DiceRoll(null, null, 4, modificators)); // Создание дополнительного броска для нулевого уровня скиллов
        skillDices.add(new DiceRoll(null, null, 4));
        skillDices.add(new DiceRoll(null, null, 6));
        skillDices.add(new DiceRoll(null, null, 8));
        skillDices.add(new DiceRoll(null, null, 10));
        skillDices.add(new DiceRoll(null, null, 12));
        // Инициализация предметов склиллов
        SkillItem equitationSkillItem = new SkillItem(skillDices, "EquitationSkillItem", "rsstats:skills/Equitation", "item.EquitationSkillItem", agilityStatItem);
        SkillItem lockpickingSkillItem = new SkillItem(skillDices, "LockpickingSkillItem", "rsstats:skills/Lockpicking", "item.LockpickingSkillItem", agilityStatItem);
        SkillItem drivingSkillItem = new SkillItem(skillDices, "DrivingSkillItem", "rsstats:skills/Driving", "item.DrivingSkillItem", agilityStatItem);
        SkillItem fightingSkillItem = new SkillItem(skillDices, "FightingSkillItem", "rsstats:skills/Fighting", "item.FightingSkillItem", agilityStatItem);
        SkillItem disguiseSkillItem = new SkillItem(skillDices, "DisguiseSkillItem", "rsstats:skills/Disguise", "item.DisguiseSkillItem", agilityStatItem);
        SkillItem throwingSkillItem = new SkillItem(skillDices, "ThrowingSkillItem", "rsstats:skills/Throwing", "item.ThrowingSkillItem", agilityStatItem);
        SkillItem pilotingSkillItem = new SkillItem(skillDices, "PilotingSkillItem", "rsstats:skills/Piloting", "item.PilotingSkillItem", agilityStatItem);
        SkillItem swimmingSkillItem = new SkillItem(skillDices, "SwimmingSkillItem", "rsstats:skills/Swimming", "item.SwimmingSkillItem", agilityStatItem);
        SkillItem shootingSkillItem = new SkillItem(skillDices, "ShootingSkillItem", "rsstats:skills/Shooting", "item.ShootingSkillItem", agilityStatItem);
        SkillItem shippingSkillItem = new SkillItem(skillDices, "ShippingSkillItem", "rsstats:skills/Shipping", "item.ShippingSkillItem", agilityStatItem);
        SkillItem gamblingSkillItem = new SkillItem(skillDices, "GamblingSkillItem", "rsstats:skills/Gambling", "item.GamblingSkillItem", intelligenceStatItem);
        SkillItem perceptionSkillItem = new SkillItem(skillDices, "PerceptionSkillItem", "rsstats:skills/Perception", "item.PerceptionSkillItem", intelligenceStatItem);
        SkillItem survivalSkillItem = new SkillItem(skillDices, "SurvivalSkillItem", "rsstats:skills/Survival", "item.SurvivalSkillItem", intelligenceStatItem);
        SkillItem trackingSkillItem = new SkillItem(skillDices, "TrackingSkillItem", "rsstats:skills/Tracking", "item.TrackingSkillItem", intelligenceStatItem);
        SkillItem medicineSkillItem = new SkillItem(skillDices, "MedicineSkillItem", "rsstats:skills/Medicine", "item.MedicineSkillItem", intelligenceStatItem);
        SkillItem provocationSkillItem = new SkillItem(skillDices, "ProvocationSkillItem", "rsstats:skills/Provocation", "item.ProvocationSkillItem", intelligenceStatItem);
        SkillItem investigationSkillItem = new SkillItem(skillDices, "InvestigationSkillItem", "rsstats:skills/Investigation", "item.InvestigationSkillItem", intelligenceStatItem);
        SkillItem repearSkillItem = new SkillItem(skillDices, "RepearSkillItem", "rsstats:skills/Repear", "item.RepearSkillItem", intelligenceStatItem);
        SkillItem streetFlairSkillItem = new SkillItem(skillDices, "StreetFlairSkillItem", "rsstats:skills/StreetFlair", "item.StreetFlairSkillItem", intelligenceStatItem);
        SkillItem intimidationSkillItem = new SkillItem(skillDices, "IntimidationSkillItem", "rsstats:skills/Intimidation", "item.IntimidationSkillItem", characterStatItem);
        SkillItem diplomacySkillItem = new SkillItem(skillDices, "DiplomacySkillItem", "rsstats:skills/Diplomacy", "item.DiplomacySkillItem", characterStatItem);
        SkillItem climbingSkillItem = new SkillItem(skillDices, "ClimbingSkillItem", "rsstats:skills/Climbing", "item.ClimbingSkillItem", strenghtStatItem);
        // Регистрация предметов скиллов
        GameRegistry.registerItem(equitationSkillItem, "EquitationSkillItem");
        GameRegistry.registerItem(lockpickingSkillItem, "LockpickingSkillItem");
        GameRegistry.registerItem(drivingSkillItem, "DrivingSkillItem");
        GameRegistry.registerItem(fightingSkillItem, "FightingSkillItem");
        GameRegistry.registerItem(disguiseSkillItem, "DisguiseSkillItem");
        GameRegistry.registerItem(throwingSkillItem, "ThrowingSkillItem");
        GameRegistry.registerItem(pilotingSkillItem, "PilotingSkillItem");
        GameRegistry.registerItem(swimmingSkillItem, "SwimmingSkillItem");
        GameRegistry.registerItem(shootingSkillItem, "ShootingSkillItem");
        GameRegistry.registerItem(shippingSkillItem, "ShippingSkillItem");
        GameRegistry.registerItem(gamblingSkillItem, "GamblingSkillItem");
        GameRegistry.registerItem(perceptionSkillItem, "PerceptionSkillItem");
        GameRegistry.registerItem(survivalSkillItem, "SurvivalSkillItem");
        GameRegistry.registerItem(trackingSkillItem, "TrackingSkillItem");
        GameRegistry.registerItem(medicineSkillItem, "MedicineSkillItem");
        GameRegistry.registerItem(provocationSkillItem, "ProvocationSkillItem");
        GameRegistry.registerItem(investigationSkillItem, "InvestigationSkillItem");
        GameRegistry.registerItem(repearSkillItem, "RepearSkillItem");
        GameRegistry.registerItem(streetFlairSkillItem, "StreetFlairSkillItem");
        GameRegistry.registerItem(intimidationSkillItem, "IntimidationSkillItem");
        GameRegistry.registerItem(diplomacySkillItem, "DiplomacySkillItem");
        GameRegistry.registerItem(climbingSkillItem, "ClimbingSkillItem");

        // Регистрация прочих предметов
        RerollCoin rerollCoinItem = new RerollCoin("RerollCoinItem");
        GameRegistry.registerItem(rerollCoinItem, "RerollCoinItem");
        ExpItem expItem = new ExpItem("ExpItem");
        GameRegistry.registerItem(expItem, "ExpItem");

        // Регистрация сущностей
        GameRegistry.registerTileEntity(UpgradeStationEntity.class, "UpgradeStationEntity");

        /// регистрация блоков
        UpgradeStationBlock b = new UpgradeStationBlock();
        //GameRegistry.registerItem(new ItemBlock(b), UpgradeStationBlock.item_name);
        GameRegistry.registerBlock(b, UpgradeStationBlock.name);


        /*UpgradeStationBlock block3DWeb = (Block3DWeb)(new Block3DWeb().setUnlocalizedName("mbe05_block_3d_web_unlocalised_name"));
        block3DWeb.setRegistryName("mbe05_block_3d_web_registry_name");
        ForgeRegistries.BLOCKS.register(block3DWeb);

        // We also need to create and register an ItemBlock for this block otherwise it won't appear in the inventory
        ItemBlock itemBlock3DWeb = new ItemBlock(block3DWeb);
        itemBlock3DWeb.setRegistryName(block3DWeb.getRegistryName());
        ForgeRegistries.ITEMS.register(itemBlock3DWeb);*/
    }

    public void init(FMLInitializationEvent event) {
        NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy);
        registerKeyBindings();
    }

    public void postInit(FMLPostInitializationEvent event) {}

    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        switch (ID) {
            case RSStats.GUI:
                return new MainContainer(player, player.inventory, ExtendedPlayer.get(player).statsInventory, ExtendedPlayer.get(player).skillsInventory, ExtendedPlayer.get(player).wearableInventory);
            case RSStats.SSP_UI_CODE:
                return new StatsContainer(player, player.inventory, ExtendedPlayer.get(player).statsInventory);
            case RSStats.UPGRADE_UI_FROM_BLOCK_CODE: {
                // Получение сущности по координатам блока, по которому кликнул игрок
                TileEntity tileEntity = world.getTileEntity(x, y, z);
                if (tileEntity instanceof UpgradeStationEntity) {
                    UpgradeStationEntity upgradeStationEntity = (UpgradeStationEntity) tileEntity;
                    return new UpgradeContainer(player.inventory, upgradeStationEntity.upgradeStationInventory);
                }
                break;
            }
            case RSStats.UPGRADE_UI_FROM_CMD_CODE:
                return new UpgradeContainer(player.inventory, null);
        }
        return null;
    }

    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        return null; // Переопределяется в ClientProxy
    }
    
    // Переопределяется в ClientProxy
    public void registerKeyBindings() {}
}

Интересно, что в ClientProxy Item.getItemFromBlock(new UpgradeStationBlock()) выдает null, а ItemBlock.getItemFromBlock(new UpgradeStationBlock()) - нет

Гуглил, гугли, но разобраться пока так и не смог. Подскажите как правильно завести ItemRenderer
 
1,159
38
544
ItemRenderer для стандартного рендера не нужен.
Вряд ли рендер блока с катстомной моделью является стандартным. И какая разница нужен ItemRender там или нет: как проблему исправить-то?
 
1,159
38
544
Весь день инфу рою - ничего не работает. Дайте хоть мануал какой-нибудь
 
1,159
38
544
Сверху