Блок с своим интерфейсом

Всем привет. Только учусь создавать моды. Блоки, айтемы, крафты усвоил...есть одна проблема. Не получается создать интерфейс для своего блока(как у печки).
Перерыл много тем на форуме, сайтов.
Последний раз наткнулся на такой урок
[youtube]g7I0acMIRoo[/youtube]
[youtube]9w71MUms1IE[/youtube]
Сделал все точь в точь. Ошибок в коде не было, краша при запуске также, но при ПКМ по блоку ничего не работало.
Вписал System.out.println("Блок активирован"); чтобы через консоль проверить... и в консоли тоже ничего не выводилось. В чем может быть проблема подскажите пожалуйста!!

Molding Machine.java
Код:
package com.essenxmax.additplus;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class MoldingMachine extends Block {
 
 // Объявляем текстуру для блока
    @SideOnly(Side.CLIENT)
    protected IIcon MoldingMachineSide;
    protected IIcon MoldingMachineTop;
    protected IIcon MoldingMachineFront;
 // Конструктор класса
    public MoldingMachine()
    {
        super(Material.iron);
        // Указываем вкладку креатива, в которой будет наш блок (вкладка Блоки, можно указать любую)
        setCreativeTab(BaseClass.tabAdditplus);
        // Указываем имя для блока (понадобится для локализации)
        setBlockName(BaseClass.MODID + "." + "moldingmachine");
    }
    ////////////////////////TILE ENTITY///////////////////////////
    public TileEntity createNewTileEntity(World var1, int var2){
     return new MoldingMachineTileEntity();
    }
    //////////////////////////////////////////////////////////////
    /////////////////////////TEXTURES//////////////////////////////////  
    // Этот метод позволяет зарегистрировать новые текстуры
    @SideOnly(Side.CLIENT)
    @Override
    public void registerBlockIcons(IIconRegister par1IconRegister)
    {
        // Регистрируем путь до png-текстуры
        MoldingMachineSide = par1IconRegister.registerIcon(BaseClass.MODID + ":" + "compressor_side");
        MoldingMachineFront = par1IconRegister.registerIcon(BaseClass.MODID + ":" + "compressor_front");
        MoldingMachineTop = par1IconRegister.registerIcon(BaseClass.MODID + ":" + "compressor_top");
    }
 // Этот метод получает текстуры блока
    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int par1int, int par2int)
    {
     return par1int == 1 ? MoldingMachineTop : (par1int == 1 ? MoldingMachineTop : (par2int == 2 && par1int == 2 ? MoldingMachineFront : (par2int == 3 && par1int == 5 ? MoldingMachineFront : (par2int == 0 && par1int == 3 ? MoldingMachineFront : (par2int == 1 && par1int == 4 ? MoldingMachineFront : MoldingMachineSide)))));
}
 @Override
    public void onBlockPlacedBy(World par1World, int par2int, int par3int, int par4int, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        // Ниже мы определяем угол поворота игрока
        // И определяем, куда будет повернут блок
        int i = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
        par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, i, 2);
    }
    //////////////////////////////////////////////////////////////////////////////  
 public boolean onBLockActivated(World world, int x,int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ){
  player.openGui(BaseClass.instance, 0, world, x, y, z);
     System.out.println("Блок активирован");
     return true;
    }
   }

MoldingMachineContainer.java
Код:
package com.essenxmax.additplus;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;

public class MoldingMachineContainer extends Container{
 private MoldingMachineTileEntity MoldingMachineTileEntity;
 public MoldingMachineContainer(InventoryPlayer invPlayer,MoldingMachineTileEntity entity ){
  this.MoldingMachineTileEntity = entity;
 }
 @Override
 public boolean canInteractWith(EntityPlayer var1) {
 
  return MoldingMachineTileEntity.isUseableByPlayer(var1);
 }

}

MoldingMachineGui.java
Код:
package com.essenxmax.additplus;

import java.io.IOException;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.util.ResourceLocation;

public class MoldingMachineGui extends GuiContainer{
 
 public static final ResourceLocation texture = new ResourceLocation("additplus:/textures/gui/moldingmachine_gui.png");

 public MoldingMachineGui(InventoryPlayer playerInv, MoldingMachineTileEntity tileentity) {
  super(new MoldingMachineContainer(playerInv, tileentity));
  xSize = 200;
  ySize = 200;
 }

 @Override
 protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
  GL11.glColor4f(1F, 1F, 1F, 1F);
  try{
   Minecraft.getMinecraft().getResourceManager().getResource(texture);
  }catch (IOException e){
   System.out.println("Texture has not been loaded yet");
  
   e.printStackTrace();
  }
  drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
 }

}

MoldingMachineGuiHandler.java
Код:
package com.essenxmax.additplus;

import cpw.mods.fml.common.network.IGuiHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class MoldingMachineGuiHandler implements IGuiHandler{

 @Override
 public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
  TileEntity entity = world.getTileEntity(x, y, z);
  switch(ID){
  case 0:
   if(entity != null && entity instanceof MoldingMachineTileEntity){
    return new MoldingMachineContainer(player.inventory,(MoldingMachineTileEntity)entity);
   }else{
    return null;
   }
  }
  return null;
 }

 @Override
 public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
  TileEntity entity = world.getTileEntity(x, y, z);
  switch(ID){
  case 0:
  if(entity != null && entity instanceof  MoldingMachineTileEntity){
   return new MoldingMachineGui(player.inventory,(MoldingMachineTileEntity)entity);
  }
  }
  return null;
 }
 }

MoldingMachineTileEntity.java
Код:
package com.essenxmax.additplus;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;

public class MoldingMachineTileEntity extends TileEntity implements IInventory{
 private ItemStack[] inventory;
 
 public MoldingMachineTileEntity(){
  inventory = new ItemStack[1];
 }
 @Override
 public int getSizeInventory() {
  
  return inventory.length;
 }

 @Override
 public ItemStack getStackInSlot(int slot) {
  
  return (slot ==0 ? inventory[0]:null);
 }

 @Override
 public ItemStack decrStackSize(int var1, int var2) {
  ItemStack itemStack = getStackInSlot(var1);
  if(itemStack != null){
   if(itemStack.stackSize <= var2){
    setInventorySlotContents(var1, null);
   }else{
    itemStack = itemStack.splitStack(var2);
    onInventoryChanged();
   }
  }
  return itemStack;
 }

 private void onInventoryChanged() {
  
  
 }
 @Override
 public ItemStack getStackInSlotOnClosing(int var1) {
  ItemStack itemStack = getStackInSlot(var1);
  setInventorySlotContents (var1, null);
  return itemStack;
 }

 @Override
 public void setInventorySlotContents(int var1, ItemStack var2) {
 inventory [var1] = var2;
 if (var2 != null && var2.stackSize > getInventoryStackLimit()){
  var2.stackSize = getInventoryStackLimit();
 }
  
 }

 @Override
 public String getInventoryName() {
  
  return "MoldingMachine";
 }

 @Override
 public boolean hasCustomInventoryName() {
  
  return true;
 }

 @Override
 public int getInventoryStackLimit() {
  
  return 64;
 }

 @Override
 public boolean isUseableByPlayer(EntityPlayer var1) {
  if(var1.getDistanceSq(xCoord = (int)0.5D, yCoord + 0.5D, zCoord + 0.5D)<=64){
   return true;
  }else{
   return false;
  }
  
 }

 @Override
 public void openInventory() {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void closeInventory() {
  // TODO Auto-generated method stub
  
 }

 @Override
 public boolean isItemValidForSlot(int var1, ItemStack var2) {
  
  return true;
 }

}
 

timaxa007

Модератор
5,831
409
672
Кода твоего не видим. Возможно где-то не правильные аргументы, не правельно написаны названия методов. Может что-то не зарегистрировано. Всё может быть.
 
timaxa007

Добавил код...что можете сказать?
 

timaxa007

Модератор
5,831
409
672
Ошибка, у тебя onBLockActivated, а надо onBlockActivated.
 
Черт, мне даже немного стыдно за подобную ошибку..Спасибо большое!
В консоль выводится сообщение, но интерфейс по прежнему не открывается.
Может еще где ни будь ошибся?
 

timaxa007

Модератор
5,831
409
672
Зарегистрирован(-ы) MoldingMachineTileEntity и/или MoldingMachineGuiHandler?
[merge_posts_bbcode]Добавлено: 22.06.2016 13:08:29[/merge_posts_bbcode]

EssenXmax написал(а):
Код:
@Override
 public boolean isUseableByPlayer(EntityPlayer var1) {
  if(var1.getDistanceSq(xCoord = (int)0.5D, yCoord + 0.5D, zCoord + 0.5D)<=64){
   return true;
  }else{
   return false;
  }
  
 }

Код:
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
    return worldObj.getTileEntity(xCoord, yCoord, zCoord) != this ? false : player.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D;
}
 
В базовом классе:
Код:
@EventHandler
public static void init(FMLPreInitializationEvent event){
new MoldingMachineGuiHandler();
NetworkRegistry.INSTANCE.registerGuiHandler(BaseClass.instance, new MoldingMachineGuiHandler());
}

В MoldingMachine.java
Код:
public TileEntity createNewTileEntity(World var1, int var2){
return new MoldingMachineTileEntity();
}
 

timaxa007

Модератор
5,831
409
672
createNewTileEntity - это создание, а не регистрация.
[merge_posts_bbcode]Добавлено: 22.06.2016 13:26:28[/merge_posts_bbcode]

Я про GameRegistry.registerTileEntity(...).
 
Видимо такого нету..
TileEntity надо регистрировать в основном классе или в классе блока?
 
769
1
42
В основном, а в блоке ты его получаешь
[merge_posts_bbcode]Добавлено: 22.06.2016 13:33:53[/merge_posts_bbcode]

И из класса блока отправляешь в TileEntity
Код:
public TileEntity createNewTileEntity(World world) {
        return new TileEntityFuelGenerator();
    }//это писать в класс блока
 
Получается в блоке у меня,

Код:
public TileEntity createNewTileEntity(World var1, int var2){
     return new MoldingMachineTileEntity();
    }


а в основном
Код:
GameRegistry.registerTileEntity(MoldingMachineTileEntity.class, "molding_machine_tile_entity");


Правильно?
 
Ничего не изменилось... В консоль сообщение выходит, но интерфейс не открывается
 

timaxa007

Модератор
5,831
409
672
Ещё кое-что нашёл:
EssenXmax написал(а):
Код:
public class MoldingMachine extends Block {
Надо добавить ещё ITileEntityProvider:
Код:
public class MoldingMachine extends Block implements ITileEntityProvider {
 
ДА!ура! получилось) но есть одно НО...
Текстуру интерфейса вроде загрузил

Вот путь:
Код:
public static final ResourceLocation texture = new ResourceLocation
("additplus:/textures/gui/moldingmachine_gui.png");

Вот название пакета с текстурой
assets.additplus.textures.gui

Вроде правильно
 

timaxa007

Модератор
5,831
409
672
EssenXmax написал(а):
Код:
 @Override
 protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
  GL11.glColor4f(1F, 1F, 1F, 1F);
  try{
   Minecraft.getMinecraft().getResourceManager().getResource(texture);
  }catch (IOException e){
   System.out.println("Texture has not been loaded yet");
  
   e.printStackTrace();
  }
  drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
 }
Код:
 @Override
 public void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
  GL11.glColor4f(1F, 1F, 1F, 1F);
  mc.getTextureManager().bindTexture(texture);
  drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
 }
 
769
1
42
Ну может нет разницы, но попробуй перед "textures" убрать "/"
 
Вообще шикарно!Все открылось! Круто)
Теперь осталось разобраться как добавить слоты, саму "пережарку" (в моем случае создание пластин) и собсна сами рецепты) Не подскажите где можно пример подсмотреть?
 
Сверху