[1.7.10] GUI меню от блок

Версия Minecraft
1.7.10
API
Forge
делал GUI по этой теме тык но тут проблемка не могу открыть её по блоку

TestBlock:
package spokers.block;

import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import spokers.Entity.TileEntityTest;
import spokers.Spokers;
import spokers.block.gui.GuiHandlerP;
import spokers.block.gui.GuiP;

public class Tst extends Block implements ITileEntityProvider {

    public Tst() {
        super(Material.circuits);
        setCreativeTab(Spokers.spokerstab);
        setHardness(0.25F);
        setStepSound(soundTypeMetal);
        setBlockTextureName("iron_block");
        setBlockName(Spokers.MODID + ".block_techne1");
    }

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

    public int getRenderType() {
        return -1;
    }

    public boolean isOpaqueCube() {
        return false;
    }

    public boolean renderAsNormalBlock() {
        return false;
    }

    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float clickX,
                                    float clickY, float clickZ) {
        Block block = world.getBlock(x, y, z);
        TileEntity entity = world.getTileEntity(x, y, z);
        // Открыть GUI только, если игрок, блок и TileEntity не равны нулю, а также TileEntity является инстанцией нужного.
        if (block != null && entity instanceof TileEntityTest && player != null) {
            // Открыть GUI, если игрок не сидит.
            if (!player.isSneaking()) {
                // Открыть у игрока GUI из мода (первый аргумент) под id (второй аргумент).
                player.openGui(Spokers.instance, 0, world, x, y, z);
                return true;
            }
        }
        return false;
    }
}

ContainerP:
package spokers.block.Container;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import spokers.block.Entity.TileEntityP;

public class ContainerP extends Container {
    private TileEntityP tile;

    /**
     * В аргументы указывается инвентарь игрока и TileEntity, который мы открыли
     */
    public ContainerP(InventoryPlayer player, TileEntityP testTile) {
    /* Назначаем локальный TileEntity на тот, откуда открывается контейнер. Нужно для методов,
    что требуют TileEntity. */
        tile = testTile;
        //Переменная, отвечающая за id слота, да, они не должны повторятся.
        int i = 0;
    /* Метод, отвечающий за добавление слота, для конструктора обычного слота используется:
    IInventory (Тут - инвентарь TileEntity), id слота (будет использовать getStackInSlot, или как его там),
    два целых числа, обозначающие местонахождение слота. */
        addSlotToContainer(new Slot(testTile, i++, 8, 38));
        //Второй слот инвентаря
        addSlotToContainer(new Slot(testTile, i++, 44, 21));
    /* Два цикла, отвечающие за добавление инвентаря игрока (второй - его хотбар) в привычные места
    интерфейса (и контейнера). Да, just copy paste. */
        for (i = 0; i < 3; ++i) {
            for (int j = 0; j < 9; ++j) {
                this.addSlotToContainer(new Slot(player, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }
        for (i = 0; i < 9; ++i) {
            this.addSlotToContainer(new Slot(player, i, 8 + i * 18, 142));
        }
    }


    /**
     * Метод, который выполняется до открытия контейнера и GUI, обычно используется для проверки расстояния
     * между игроком и TileEntity (и отмены открытия, если оно слишком большое).
     */
    @Override
    public boolean canInteractWith(EntityPlayer player) {
        return tile.isUseableByPlayer(player);
    }
}

GuiP:
package spokers.block.gui;

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 org.lwjgl.opengl.GL11;
import spokers.Spokers;
import spokers.block.Container.ContainerP;
import spokers.block.Entity.TileEntityP;

public class GuiP extends GuiContainer {

    private static final ResourceLocation textures = new ResourceLocation(
            Spokers.MODID, "textures/gui/container/GUI.png");

    private TileEntityP tile;

    public GuiP(InventoryPlayer player, TileEntityP tileTest) {
        // Сюда указать объект контейнера.
        super(new ContainerP(player, tileTest));
        // Сохраняем TileEntity в объекте GUI для использования другими методами.
        tile = tileTest;
    }

    /**
     * Метод для отрисовки текстов и etc.
     */
    @Override
    protected void drawGuiContainerForegroundLayer(int x, int y) {
        // Отрисовать название инвентаря игрока, где оно обычно находится.
        fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, ySize - 96 + 2,
                4210752);
        // Отрисовать название GUI (TileEntity), учитывая его переименование и локализацию.
        String s = tile.hasCustomInventoryName() ? tile.getInventoryName()
                : I18n.format(tile.getInventoryName(), new Object[0]);
        fontRendererObj.drawString(s, 6, 6, 4210752);
    }

    /**
     * Метод отрисовки задника GUI (фон, etc).
     */
    @Override
    public void drawGuiContainerBackgroundLayer(float size, int x, int y) {
        // Окрасить все в белый цвет и в полную непрозрачность, не уверен в нужности.
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        // Привязать текстуру
        mc.getTextureManager().bindTexture(textures);
    }
}
GuiHandlerP:
package spokers.block.gui;

import cpw.mods.fml.common.network.IGuiHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import spokers.block.Container.ContainerP;
import spokers.block.Entity.TileEntityP;

public class GuiHandlerP implements IGuiHandler {
    /**
     * Вызов контейнера при его открытии.
     */
    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        // Получить TileEntity, из которого вызван контейнер.
        TileEntity tile = world.getTileEntity(x, y, z);
    /* Проверяем id контейнера на ноль (первый), можно вынести id контейнеров в константы.
    Также проверяем, что TileEntity является тем, для которого сделан контейнер. */
        if (ID == 0 && tile instanceof TileEntityP)
            return new ContainerP(player.inventory, (TileEntityP) tile);
        // Ничего не возвращаем, сли не один из контейнеров не был вызван.
        return null;
    }

    /**
     * Вызов GUI для контейнера.
     */
    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        // Получить TileEntity, из которого вызван GUI.
        TileEntity tile = world.getTileEntity(x, y, z);
        // Проверить id (оно должно совпадать с id контейнера) и TileEntity на принадлежность к GUI.
        if (ID == 0 && tile instanceof TileEntityP)
            return new GuiP(player.inventory, (TileEntityP) tile);
        return null;
    }
}
TileEntityP:
package spokers.block.Entity;

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

public class TileEntityP extends TileEntity implements IInventory {

    public TileEntityP() {

    }

    @Override
    public int getSizeInventory() {
        return 8;
    }

    @Override
    public ItemStack getStackInSlot(int i) {
        return null;
    }

    @Override
    public ItemStack decrStackSize(int i, int i1) {
        return null;
    }

    @Override
    public ItemStack getStackInSlotOnClosing(int i) {
        return null;
    }

    @Override
    public void setInventorySlotContents(int i, ItemStack itemStack) {

    }

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

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

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

    @Override
    public boolean isUseableByPlayer(EntityPlayer entityPlayer) {
        return false;
    }

    @Override
    public void openInventory() {

    }

    @Override
    public void closeInventory() {

    }

    @Override
    public boolean isItemValidForSlot(int i, ItemStack itemStack) {
        return false;
    }
}
Spokers:
package spokers;


import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import net.minecraft.creativetab.CreativeTabs;
import spokers.CreativeTab.SpokersTab;
import spokers.Recipes.Recipe;
import spokers.block.Blocks;
import spokers.block.gui.GuiHandlerP;
import spokers.items.Items;

@Mod(modid = Spokers.MODID, version = Spokers.VERSION, name = Spokers.NAME)

public class Spokers {
    public static final String MODID = "Spokers";
    public static final String VERSION = "1";
    public static final String NAME = "Spokerss";

    @Mod.Instance(Spokers.MODID) public static Spokers instance;
    @SidedProxy(modId = Spokers.MODID, clientSide = "spokers.ProxyClient", serverSide = "spokers.ProxyCommon")
    public static ProxyCommon proxy;

    public static CreativeTabs spokerstab = new SpokersTab("11");

    @Mod.EventHandler
    public void init(FMLInitializationEvent event)
    {
        proxy.init();
        NetworkRegistry.INSTANCE.registerGuiHandler(Spokers.instance, new GuiHandlerP());
    }

    @Mod.EventHandler
    public void preload(FMLPreInitializationEvent event){
        Recipe.registerRecipes();
    }

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {

        Items.registerItems();
        Blocks.registerBlock();

        proxy.preInit();

    }

}

Возникает вопрос ещё что вставлять сюда
Testblokc (Tst)
player.openGui(Spokers.instance, 0, world, x, y, z);
 

sk9zist :l

Исправился
981
18
157
ещё что вставлять сюда
У тебя вроде все правильно вставлено.
Только добавь проверку на мир (потому что гуи всегда должен открываться на сервере), вот пример:
Java:
if(!worldIn.isRemote)
        {
        playerIn.openGui(Main.INSTANCE, 0, worldIn, pos.getX(), pos.getY(), pos.getZ());
        }
А еще,
if (block != null && entity instanceof TileEntityTest && player != null) {
Ты зачем то тут проверяешь на TileEntityTest, хотя твой тайл энтити - это TileEntityP
 

sk9zist :l

Исправился
981
18
157
Проверку на мир сделал?
Тогда у тебя проблема с регистрацией гуи, 100%
Во первых: Зачем тебе ProxyClient и ProxyCommon если ты регаешь все в Главном классе?
Во вторых:
Перенеси этот код в ProxyCommon в init:
Java:
NetworkRegistry.INSTANCE.registerGuiHandler(Spokers.instance, new GuiHandlerP());
 

sk9zist :l

Исправился
981
18
157
🤦‍♂️Омг.
Открывается то оно на сервере, а видно для клиента..
 
Проверку на мир сделал?
Тогда у тебя проблема с регистрацией гуи, 100%
Во первых: Зачем тебе ProxyClient и ProxyCommon если ты регаешь все в Главном классе?
Во вторых:
Перенеси этот код в ProxyCommon в init:
Java:
NetworkRegistry.INSTANCE.registerGuiHandler(Spokers.instance, new GuiHandlerP());
да сделал и перенёс на прокси коммон но гуй так и не открылась
 

sk9zist :l

Исправился
981
18
157
Во первых:
Замени свой isUseableByPlayer, он должен быть такого вида:
Java:
@Override
    public boolean isUseableByPlayer(EntityPlayer entityplayer) {
       
        return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false: entityPlayer.getDistanceSq((double)this.xCoord + 0.5D,(double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
       
    }
По поводу прозрачного интерфейса щас скажу..
 

sk9zist :l

Исправился
981
18
157
mc.getTextureManager().bindTexture(textures);
У тебя возможно проблема с биндом текстуры, либо ты ее неправильно нарисовал. Снизу и справа от текстуры должны быть прозрачные отступы - посмотри пример в ванильные текстурах контейнеров (сундук или шалкер)
А вообще, Скинь сюда свою текстуру по пути:
textures/gui/container/GUI.png
он ничего не рисует, потому и ничего нет
Если бы при загрузке текстуру бы не нашло - был бы краш
 
390
7
27
sk9zist :l написал(а):
Если бы при загрузке текстуру бы не нашло - был бы краш
Амм... Он конечно забиндил текстуру, но он ее и не отрисовал.
 

sk9zist :l

Исправился
981
18
157
Как сказал @MrUser - ты не отрисовал свою текстуру.

// Окрасить все в белый цвет и в полную непрозрачность, не уверен в нужности. GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // Привязать текстуру mc.getTextureManager().bindTexture
После этого кода напиши:
Java:
this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
(Код для 1.12.2, если будут ошибки то тебе не составит труда заменить под свою версию)
 
Сверху