делал GUI по этой теме тык но тут проблемка не могу открыть её по блоку
Возникает вопрос ещё что вставлять сюда
Testblokc (Tst)
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);