- 1,159
- 38
- 544
Все привет. Сделал свой блок с кастомной моделью. Блок работает и рендерится хорошо, но в руке выглядит безобразно:
Прочитал, что мне нужно сделать ItemRenderer и зарегистрировать его. Только вот регистрироваться он у меня не хочет - renderItem() не вызывается.
Вот блок:
Его TESR и ItemRenerer (внутренний класс)
Клиент прокси
CommonProxy
Интересно, что в ClientProxy Item.getItemFromBlock(new UpgradeStationBlock()) выдает null, а ItemBlock.getItemFromBlock(new UpgradeStationBlock()) - нет
Гуглил, гугли, но разобраться пока так и не смог. Подскажите как правильно завести ItemRenderer
Прочитал, что мне нужно сделать 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