Всем привет!
Создаю Gui, захожу в майнкрафт, нажимаю на блок появляется gui и сразу закрывается.
GuiHandler:
gui:
Сам класс блока
TileEntity
Создаю 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);
}
}
}
Код:
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;
}
}