[1.7.10]Gui открывается и сразу закрывается

Статус
В этой теме нельзя размещать новые ответы.
Всем привет!
Создаю Gui, захожу в майнкрафт, нажимаю на блок появляется gui и сразу закрывается.

GuiHandler:
Код:
package ru.DarkMark.Armors;

import ru.DarkMark.Armors.BlocksClass.TileEntityFurnaceOven;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;

public class GuiHandler 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);
        if(entity != null){
            switch(ID){
            case Main.guiIDFurnace:
                    return new ConatinerArmorFurnace(player.inventory, (TileEntityFurnaceOven)entity);
            }
            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);
        if(entity != null){
            switch(ID){
            case Main.guiIDFurnace:
                if(entity instanceof TileEntityFurnaceOven){
                return new GuiArmorFurnace(player.inventory, (TileEntityFurnaceOven)entity);
                }
                return null;
            }
        }
        return null;
    }
    
}

gui:
Код:
import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
import ru.DarkMark.Armors.BlocksClass.TileEntityFurnaceOven;

public class GuiArmorFurnace extends GuiContainer{
    
    public static final ResourceLocation bground = new ResourceLocation("armorsmod:textures/gui/GuiArmorFurnace.png");
    
    public TileEntityFurnaceOven armorFurnace;

    public GuiArmorFurnace(InventoryPlayer inventory,TileEntityFurnaceOven entity) {
        super(new ConatinerArmorFurnace(inventory, entity));
        this.armorFurnace = entity;
        
        this.xSize = 176;
        this.ySize = 165;
    }
    
    public void drawGuiContainerForegroundLayer(int par1, int par2){
        String name = this.armorFurnace.hasCustomInventoryName() ? this.armorFurnace.getInventoryName() : net.minecraft.client.resources.I18n.format(this.armorFurnace.getInventoryName(), new Object[0]);
        this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
        this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 128,this.ySize - 96 +2, 4210752);
    }
    
    @Override
    protected void drawGuiContainerBackgroundLayer(float p_146976_1_,int p_146976_2_, int p_146976_3_) {
        GL11.glColor4f(1F, 1F, 1F, 1F);
        Minecraft.getMinecraft().getTextureManager().bindTexture(bground);
        drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
    }

}
Сам класс блока
Код:
package ru.DarkMark.Armors.BlocksClass;

import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ru.DarkMark.Armors.GuiHandler;
import ru.DarkMark.Armors.Main;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
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.Item;
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 BlockFurnace extends BlockContainer{
    private final boolean isActive;
    
    @SideOnly(Side.CLIENT)
    private IIcon iconFront;
    
    @SideOnly(Side.CLIENT)
    private IIcon iconTop;
    
    public static boolean keepInventory;
    
    public BlockFurnace(boolean isActive) {
        super(Material.iron);
        
        this.isActive = isActive;
    }

    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister iconrRegister){
        this.blockIcon = iconrRegister.registerIcon("armorsmod:ArmorFurnaceSide");
        this.iconFront = iconrRegister.registerIcon("armorsmod:" + (this.isActive ? "ArmorFurnace_On" : "ArmorFurnace_Off"));
        this.iconTop = iconrRegister.registerIcon("armorsmod:furnace_top");
    }
    
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata){
        return side == 1 ? this.iconTop : (side == 0 ? this.iconTop : (side != metadata ? this.blockIcon : this.iconFront));
    }
    
    public Item getItemDropped(World world, int x, int y, int z){
        return Item.getItemFromBlock(Main.FurnaceDIdle);
    }
    
    public void onBlockAdded(World world, int x, int y, int z){
        super.onBlockAdded(world, x, y, z);
        this.setDefaultDerection(world, x, y, z);
    }
    
    @Override
    public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) {
        par5EntityPlayer.openGui(Main.instance, Main.guiIDFurnace, par1World, x, y, z);
        return true;
    }
    
    private void setDefaultDerection(World world, int x, int y, int z) {
        if(!world.isRemote){
            Block b1 = world.getBlock(x, y, z - 1);
            Block b2 = world.getBlock(x, y, z + 1);
            Block b3 = world.getBlock(x - 1, y, z);
            Block b4 = world.getBlock(x + 1, y, z);
            
            byte b0 = 3;
            if(b1.func_149730_j() && !b2.func_149730_j()){
                b0 = 3;
            }
            if(b2.func_149730_j() && !b1.func_149730_j()){
                b0 = 3;
            }
            if(b3.func_149730_j() && !b4.func_149730_j()){
                b0 = 3;
            }
            if(b4.func_149730_j() && !b3.func_149730_j()){
                b0 = 3;
            }
            
            world.setBlockMetadataWithNotify(x, y, z, b0, 2);
        }
    }
    
    public void onBlockPlacedBy(World w, int x, int y, int z, EntityLivingBase player, ItemStack itemstack){
        int l = MathHelper.floor_double((double)(player.rotationYaw * 4.0F / 360F) + 0.5D) & 3;
        if(l == 0){
            w.setBlockMetadataWithNotify(x, y, z, 2, 2);
        }
        if(l == 1){
            w.setBlockMetadataWithNotify(x, y, z, 5, 2);
        }
        if(l == 2){
            w.setBlockMetadataWithNotify(x, y, z, 3, 2);
        }
        if(l == 3){
            w.setBlockMetadataWithNotify(x, y, z, 4, 2);
        }
        if(itemstack.hasDisplayName()){
            ((TileEntityFurnaceOven)w.getTileEntity(x, y, z)).setGuiDisplayName(itemstack.getDisplayName());
        }
    }
    
    
    @Override
    public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
        return new TileEntityFurnaceOven();
    }
    
    public static void updateArmorFurnace(boolean active, World worldObj,int xCoord, int yCoord, int zCoord){
        int i = worldObj.getBlockMetadata(xCoord, yCoord, zCoord);
        TileEntity tileentity = worldObj.getTileEntity(xCoord, yCoord, zCoord);
        keepInventory = true;
        
        if(active){
            worldObj.setBlock(xCoord, yCoord, zCoord, Main.FurnaceDActive);
        }else{
            worldObj.setBlock(xCoord, yCoord, zCoord, Main.FurnaceDIdle);
        }
        keepInventory = false;
        worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, i,2);
        if(tileentity != null){
            tileentity.validate();
            worldObj.setTileEntity(xCoord, yCoord, zCoord, tileentity);
        }
    }
}
TileEntity
Код:
package ru.DarkMark.Armors.BlocksClass;

import ru.DarkMark.Armors.Main;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.tileentity.TileEntity;

public class TileEntityFurnaceOven extends TileEntity implements ISidedInventory{

    private String localizedName;
    
    private ItemStack[] slots = new ItemStack[3];
    
    private static final int[] slots_top = new int[]{0};
    private static final int[] slots_bootom = new int[]{2,1};
    private static final int[] slots_side = new int[]{1};
    
    public int furnaceSpeed = 150;
    public int burnTime;
    public int currentItemBurnTime;
    public int cookTime;
    
    public void setGuiDisplayName(String displayName) {
        this.localizedName = displayName;
    }
    
    public boolean isBurning(){
        return this.burnTime > 0;
    }
    
    public void updateEntity(){
        boolean flag = this.burnTime > 0;
        boolean flag1 = false;
        
        if(this.isBurning()){
            this.burnTime--;
        }
        if(!this.worldObj.isRemote){
            if(this.burnTime == 0 && this.canSmelt()){
                this.currentItemBurnTime = this.burnTime * getItemBurnTime(this.slots[1]);
            }
        }
        if(this.isBurning()){
            flag1 = true;
            if(this.slots[1] != null){
                this.slots[1].stackSize--;
                if(this.slots[1].stackSize == 0){
                    this.slots[1] = this.slots[1].getItem().getContainerItem(this.slots[1]);
                }
            }
        }
        if(this.isBurning() && this.canSmelt()){
            this.cookTime++;
            if(this.cookTime == this.furnaceSpeed){
                this.cookTime = 0;
                this.smeltItem();
                flag1 = true;
            }
        }else{
            this.cookTime = 0;
        }
        if(flag != this.isBurning()){
            flag1 = true;
            BlockFurnace.updateArmorFurnace(this.burnTime >0,this.worldObj,this.xCoord,this.yCoord,this.zCoord);
        }
        if(flag1){
            this.markDirty();
        }
    }
    
    
    public String getInventoryName(){
        return this.hasCustomInventoryName() ? this.localizedName : "container.armorFurnace";
    }
    
    public boolean hasCustomInventoryName(){
        return this.localizedName != null && this.localizedName.length() > 0;
    }
    
    public int getSizeInventory(){
        return this.slots.length;
    }

    @Override
    public ItemStack getStackInSlot(int p_70301_1_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ItemStack decrStackSize(int var1, int var2) {
        if(this.slots[var1] != null){
            ItemStack itemstack;
            
            if(this.slots[var1].stackSize <= var2){
                itemstack = this.slots[var1];
                this.slots[var1] = null;
                return itemstack;
            }else{
                itemstack = this.slots[var1].splitStack(var2);
                if(this.slots[var1].stackSize == 0){
                    this.slots[var1] = null;
                }
            }
        }
        return null;
    }

    @Override
    public ItemStack getStackInSlotOnClosing(int i) {
        if(this.slots[i] != null){
            ItemStack itemstack = this.slots[i];
            this.slots[i] = null;
            return itemstack;
        }
        return null;
    }

    @Override
    public void setInventorySlotContents(int i, ItemStack itemStack) {
        this.slots[i] = itemStack;
        if(itemStack !=null && itemStack.stackSize > this.getInventoryStackLimit()){
            itemStack.stackSize = this.getInventoryStackLimit();
        }
        
    }

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

    @Override
    public boolean isUseableByPlayer(EntityPlayer entity) {
        
        return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entity.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
    }
    
    public void openInventory() {}
    public void closeInventory() {}

    @Override
    public boolean isItemValidForSlot(int i, ItemStack itemStack) {
        
        return i == 2 ? false : (i == 1 ? isItemFuel(itemStack) : true);
    }
    
    public static boolean isItemFuel(ItemStack itemStack){
        return getItemBurnTime(itemStack) > 0;
    }

    private static int getItemBurnTime(ItemStack itemStack) {
        if(itemStack == null){
            return 0;
        }else{
            Item item = itemStack.getItem();
            
            if(item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air){
                Block block = Block.getBlockFromItem(item);
                if(item == Items.lava_bucket) return 500;
                if(item == Items.coal) return 1600;
                if(item == Items.blaze_rod) return 2600;
                
                return GameRegistry.getFuelValue(itemStack);
            }
        }
        return 0;
    }

    @Override
    public int[] getAccessibleSlotsFromSide(int var1) {
        return var1 == 0 ? slots_bootom : (var1 == 1 ? slots_top : slots_side);
    }
    
    public boolean canSmelt(){
        if(this.slots[0] == null){
            return false;
        }else{
            ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]);
            if(this.slots[2] == null) return true;
            if(!this.slots[2].isItemEqual(itemstack)) return false;
            
            int result = this.slots[2].stackSize + itemstack.stackSize;
            return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize());
            
        }
    }
    
    public void smeltItem(){
        if(this.canSmelt()){
            ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]);
            if(this.slots[2]== null){
                this.slots[2] = itemstack.copy();
            }else if(this.slots[2].isItemEqual(itemstack)){
                this.slots[2].stackSize += itemstack.stackSize;
            }
            this.slots[0].stackSize--;
            if(this.slots[0].stackSize <= 0){
                this.slots[0] = null;
            }
        }
    }
    
    @Override
    public boolean canInsertItem(int i, ItemStack var2,int var3) {
        return this.isItemValidForSlot(i, var2);
    }

    @Override
    public boolean canExtractItem(int i, ItemStack var2,int j) {
        
        return j != 0 || i != 1 || var2.getItem() == Items.bucket;
    }
}
 
А где ConatinerArmorFurnace?
 
timaxa007 написал(а):
А где ConatinerArmorFurnace?
Места не хватает, но если надо, то вот:
Код:
package ru.DarkMark.Armors;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotFurnace;
import net.minecraft.tileentity.TileEntity;
import ru.DarkMark.Armors.BlocksClass.TileEntityFurnaceOven;

public class ConatinerArmorFurnace extends Container{

    private TileEntityFurnaceOven armorFurnace;

    public int lastburnTime;
    public int lastcurrentItemBurnTime;
    public int lastcookTime;
    
    public ConatinerArmorFurnace(InventoryPlayer inventory,TileEntityFurnaceOven entity) {
        this.armorFurnace = entity;
        this.addSlotToContainer(new Slot(entity,0,54,19));
        this.addSlotToContainer(new Slot(entity,1,12,56));
        this.addSlotToContainer(new SlotFurnace(inventory.player, entity,2,114,17));
        
        for(int i = 0;i < 3;i++){
            for(int j = 0; j <9;j++){
                this.addSlotToContainer(new Slot(inventory, j + i *9 +9, 8+j*18, 94 + i*18));
            }
        }
        for(int i = 0; i < 9; i++){
            this.addSlotToContainer(new Slot(inventory,i,8 +i * 15,142));
        }
    }
    
    public void addCraftingToCrafters(ICrafting icrafting){
        super.addCraftingToCrafters(icrafting);
        icrafting.sendProgressBarUpdate(this, 0, this.armorFurnace.cookTime);
        icrafting.sendProgressBarUpdate(this, 1, this.armorFurnace.burnTime);
        icrafting.sendProgressBarUpdate(this, 2, this.armorFurnace.currentItemBurnTime);
    }
    
    public void detectAndSendChanges(){
        super.detectAndSendChanges();
        for(int i = 0; i < this.crafters.size(); i++){
            ICrafting icrafting = (ICrafting)this.crafters.get(i);
            if(this.lastcookTime != this.armorFurnace.cookTime){
                icrafting.sendProgressBarUpdate(this, 0, this.armorFurnace.cookTime);
            }
            if(this.lastburnTime != this.armorFurnace.burnTime){
                icrafting.sendProgressBarUpdate(this, 1, this.armorFurnace.burnTime);
            }
            if(this.lastcurrentItemBurnTime != this.armorFurnace.currentItemBurnTime){
                icrafting.sendProgressBarUpdate(this, 2, this.armorFurnace.cookTime);
            }
        }
        this.lastcookTime = this.armorFurnace.cookTime;
        this.lastburnTime = this.armorFurnace.burnTime;
        this.lastcurrentItemBurnTime = this.armorFurnace.currentItemBurnTime;
    }
    
    @SideOnly(Side.CLIENT)
    public void updateProgressBar(int slot, int newValue){
        
    }

    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        
        return false;
    }

}
 
Kapelka написал(а):
Код:
    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        
        return false;
    }
Примерно должно быть:
Код:
    @Override
    public boolean canInteractWith(EntityPlayer player) {
        return armorFurnace.isUseableByPlayer(player);
    }
 
timaxa007 написал(а):
Kapelka написал(а):
Код:
    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        
        return false;
    }
Примерно должно быть:
Код:
    @Override
    public boolean canInteractWith(EntityPlayer player) {
        return armorFurnace.isUseableByPlayer(player);
    }
Спасибо. Тему можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху