Alors, j’ai créer un GUI pour mon block Chaudron, ce GUI va servir pour faire des potions, dans ce GUI j’ai 7 slots pour mettre des ingrédients, et 2 autres, 1 pour mettre une fiole vide, l’autre un sceau d’eau. J’ai aussi un bouton créer pour lancer le craft.
Je voudrais que quand il y a un certains items dans les 7 slots et qu’il y a une fiole et un sceau alors ca supprime tout ca et dans un autre slot ca te mettes une potion.
Mes codes:
package com.harrypotter.sosoh.common.gui;
import org.lwjgl.opengl.GL11;
import com.harrypotter.sosoh.common.ModHarryPotter;
import com.harrypotter.sosoh.common.blocks.TileEntityChaudron;
import com.harrypotter.sosoh.common.gui.container.ContainerChaudron;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
public class GuiChaudron extends GuiContainer
{
public static ResourceLocation texture = new ResourceLocation("modharrypotter", "textures/gui/container/GuiChaudron.png");
private TileEntityChaudron chaudron;
private IInventory playerInventory;
private ContainerChaudron containerChaudron;
private GuiButton confirmButton;
public GuiChaudron(InventoryPlayer inventory, TileEntityChaudron tileEntity)
{
super(new ContainerChaudron(inventory, tileEntity));
this.chaudron = tileEntity;
this.playerInventory = inventory;
this.ySize = 230;
}
protected void drawGuiContainerForegroundLayer(int par1, int par2)
{
this.fontRendererObj.drawString(this.playerInventory.hasCustomInventoryName() ? this.playerInventory.getInventoryName() : I18n.format(this.playerInventory.getInventoryName()), 8, 129, 0);
this.fontRendererObj.drawString(this.chaudron.hasCustomInventoryName() ? this.chaudron.getInventoryName() : I18n.format(this.chaudron.getInventoryName()), 8, 7, 0);
}
@Override
protected void drawGuiContainerBackgroundLayer(float f, int i, int j)
{
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.getTextureManager().bindTexture(texture);
int x = (this.width - this.xSize) / 2;
int y = (this.height - this.ySize) / 2;
this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
}
public void initGui()
{
super.initGui();
int x = (this.width - this.xSize) / 2;
int j = (this.height - this.ySize) / 2;
this.confirmButton = new GuiButton(0, x + 120, j + 100, 45, 20, "Créer");
this.buttonList.add(confirmButton);
}
protected void actionPerformed(GuiButton guiButton)
{
if(guiButton.id == 0)
{
}
}
}
package com.harrypotter.sosoh.common.gui.container;
import com.harrypotter.sosoh.common.blocks.TileEntityChaudron;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class ContainerChaudron extends Container
{
private TileEntityChaudron tileEntity;
public ContainerChaudron(InventoryPlayer playerInventory, TileEntityChaudron teChaudron)
{
this.tileEntity = teChaudron;
this.addSlotToContainer(new Slot(teChaudron, 1, 26, 18));
this.addSlotToContainer(new Slot(teChaudron, 2, 62, 18));
this.addSlotToContainer(new Slot(teChaudron, 3, 98, 18));
this.addSlotToContainer(new Slot(teChaudron, 4, 134, 18));
this.addSlotToContainer(new Slot(teChaudron, 5, 44, 36));
this.addSlotToContainer(new Slot(teChaudron, 6, 80, 36));
this.addSlotToContainer(new Slot(teChaudron, 7, 116, 36));
this.addSlotToContainer(new Slot(teChaudron, 20, 8, 90));
this.addSlotToContainer(new Slot(teChaudron, 21, 26, 90));
this.addSlotToContainer(new Slot(teChaudron, 22, 278, 90));
this.bindPlayerInventory(playerInventory);
}
private void bindPlayerInventory(InventoryPlayer playerInventory)
{
int i;
for(i = 0; i < 3; i++)
{
for(int j = 0; j < 9; j++)
{
this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 103 + i * 18 + 37));
}
}
for(i = 0; i < 9; i++)
{
this.addSlotToContainer(new Slot(playerInventory, i, 8 + i * 18, 161 + 37));
}
}
@Override
public boolean canInteractWith(EntityPlayer player)
{
return tileEntity.isUseableByPlayer(player);
}
public ItemStack transferStackInSlot(EntityPlayer player, int slotId)
{
ItemStack itemstack = null;
Slot slot = (Slot)this.inventorySlots.get(slotId);
if(slot != null && slot.getHasStack())
{
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if(slotId < 9)
{
if(!this.mergeItemStack(itemstack1, 9, this.inventorySlots.size(), true))
{
return null;
}
}
else if(!this.mergeItemStack(itemstack1, 0, 9, false))
{
return null;
}
if(itemstack1.stackSize == 0)
{
slot.putStack((ItemStack)null);
}
else
{
slot.onSlotChanged();
}
}
return itemstack;
}
}
Mon init dans ma classe principale:
@EventHandler
public void init(FMLInitializationEvent event)
{
proxy.registerRender();
network = NetworkRegistry.INSTANCE.newSimpleChannel("HarryPotterMod");
NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler());
SomnolenceEffect.loadEffects();
SomnolenceEffect.register();
MinecraftForge.EVENT_BUS.register(new com.harrypotter.sosoh.common.EventHandlerHarryPotter());
}
| package com.harrypotter.sosoh.common.gui.handler; |
| |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.tileentity.TileEntity; |
| import net.minecraft.world.World; |
| |
| import com.harrypotter.sosoh.common.blocks.TileEntityChaudron; |
| import com.harrypotter.sosoh.common.gui.GuiChaudron; |
| import com.harrypotter.sosoh.common.gui.container.ContainerChaudron; |
| |
| 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 te = world.getTileEntity(x, y, z); |
| |
| if(te instanceof TileEntityChaudron) |
| { |
| return new ContainerChaudron(player.inventory, (TileEntityChaudron)te); |
| } |
| return null; |
| } |
| |
| @Override |
| public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { |
| |
| TileEntity te = world.getTileEntity(x, y, z); |
| if(te instanceof TileEntityChaudron) |
| { |
| return new GuiChaudron(player.inventory, (TileEntityChaudron)te); |
| } |
| return null; |
| } |
| |
| } |
package com.harrypotter.sosoh.common.blocks;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
public class TileEntityChaudron extends TileEntity implements IInventory{
private byte direction;
private ItemStack[] inventory = new ItemStack[72];
private String customName;
@Override
public void readFromNBT(NBTTagCompound nbttag)
{
super.readFromNBT(nbttag);
this.direction = nbttag.getByte("Direction");
NBTTagList nbttaglist = nbttag.getTagList("Items", blockMetadata);
this.inventory = new ItemStack[this.getSizeInventory()];
if (nbttag.hasKey("CustomName"))
{
this.customName = nbttag.getString("CustomName");
}
for (int i = 0; i < nbttaglist.tagCount(); i++)
{
NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.getCompoundTagAt(i);
int j = nbttagcompound1.getByte("Slot");
if (j >= 0 && j < this.inventory.length)
{
this.inventory[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
}
}
}
public void writeToNBT(NBTTagCompound nbttag)
{
super.writeToNBT(nbttag);
nbttag.setByte("Direction", this.direction);
NBTTagList nbttaglist = new NBTTagList();
for (int i = 0; i < this.inventory.length; i++)
{
if (this.inventory* != null)
{
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound1.setByte("Slot", (byte)i);
this.inventory*.writeToNBT(nbttagcompound1);
nbttaglist.appendTag(nbttagcompound1);
}
}
nbttag.setTag("Items", nbttaglist);
if (this.hasCustomInventoryName())
{
nbttag.setString("CustomName", this.customName);
}
}
public byte getDirection()
{
return direction;
}
public void setDirection(byte direction)
{
this.direction = direction;
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
}
public Packet getDescriptionPacket()
{
NBTTagCompound nbttagcompound = new NBTTagCompound();
this.writeToNBT(nbttagcompound);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound);
}
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
{
this.readFromNBT(pkt.func_148857_g());
this.worldObj.markBlockRangeForRenderUpdate(this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord);
}
@Override
public int getSizeInventory() {
return inventory.length;
}
@Override
public ItemStack getStackInSlot(int slotId) {
return inventory[slotId];
}
@Override
public ItemStack decrStackSize(int slotId, int quantity)
{
if (this.inventory[slotId] != null)
{
ItemStack itemstack;
if (this.inventory[slotId].stackSize <= quantity)
{
itemstack = this.inventory[slotId];
this.inventory[slotId] = null;
this.updateContainingBlockInfo();
return itemstack;
}
else
{
itemstack = this.inventory[slotId].splitStack(quantity);
if (this.inventory[slotId].stackSize == 0)
{
this.inventory[slotId] = null;
}
this.updateContainingBlockInfo();
return itemstack;
}
}
else
{
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int slotId)
{
if (this.inventory[slotId] != null)
{
ItemStack itemstack = this.inventory[slotId];
this.inventory[slotId] = null;
return itemstack;
}
else
{
return null;
}
}
@Override
public void setInventorySlotContents(int slotId, ItemStack stack)
{
this.inventory[slotId] = stack;
if (stack != null && stack.stackSize > this.getInventoryStackLimit())
{
stack.stackSize = this.getInventoryStackLimit();
}
this.updateContainingBlockInfo();
}
@Override
public String getInventoryName()
{
return this.hasCustomInventoryName() ? this.customName : "container.chaudron";
}
@Override
public boolean hasCustomInventoryName()
{
return this.customName != null && this.customName.length() > 0;
}
public void setCustomGuiName(String name)
{
this.customName = name;
}
@Override
public int getInventoryStackLimit() {
return 1;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player)
{
return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public boolean isItemValidForSlot(int slotId, ItemStack stack)
{
return true;
}
}
| package com.harrypotter.sosoh.common.blocks; |
| |
| import java.util.Random; |
| |
| import com.harrypotter.sosoh.common.ModHarryPotter; |
| import com.harrypotter.sosoh.proxy.ClientProxy; |
| |
| import cpw.mods.fml.common.network.internal.FMLNetworkHandler; |
| import net.minecraft.block.Block; |
| import net.minecraft.block.material.Material; |
| import net.minecraft.creativetab.CreativeTabs; |
| import net.minecraft.entity.EntityLivingBase; |
| import net.minecraft.entity.item.EntityItem; |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.item.Item; |
| import net.minecraft.item.ItemStack; |
| import net.minecraft.nbt.NBTTagCompound; |
| import net.minecraft.tileentity.TileEntity; |
| import net.minecraft.world.IBlockAccess; |
| import net.minecraft.world.World; |
| |
| public class BlockChaudron extends Block{ |
| |
| public BlockChaudron(Material Material) { |
| super(Material); |
| this.setCreativeTab(ModHarryPotter.creativetabsHPP); |
| this.setHardness(3.5F); |
| } |
| |
| @Override |
| public TileEntity createTileEntity(World world, int metadata) |
| { |
| return new TileEntityChaudron(); |
| } |
| |
| @Override |
| public boolean hasTileEntity(int metadata) |
| { |
| return true; |
| } |
| |
| @Override |
| public Item getItemDropped(int metadata, Random random, int fortune) { |
| return Item.getItemFromBlock(ModHarryPotter.blockChaudron); |
| } |
| |
| public boolean isOpaqueCube() |
| { |
| return false; |
| } |
| |
| public boolean renderAsNormalBlock() |
| { |
| return false; |
| } |
| |
| public int getRenderType() |
| { |
| return ClientProxy.blockChaudronRenderId; |
| } |
| |
| public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) |
| { |
| this.setBlockBounds(0.1F, 0.0F, 0.1F, 0.9F, 0.8F, 0.9F); |
| } |
| |
| public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) |
| { |
| FMLNetworkHandler.openGui(player, ModHarryPotter.instance, 0, world, x, y, z); |
| return true; |
| } |
| |
| public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) |
| { |
| TileEntity te = world.getTileEntity(x, y, z); |
| if(te != null && stack.getItemDamage() == 3 && te instanceof TileEntityChaudron && stack.hasDisplayName()) |
| { |
| ((TileEntityChaudron)te).setCustomGuiName(stack.getDisplayName()); |
| } |
| } |
| |
| public void breakBlock(World world, int x, int y, int z, Block side, int metadata) |
| { |
| dropContainerItem(world, x, y, z); |
| super.breakBlock(world, x, y, z, side, metadata); |
| } |
| |
| protected void dropContainerItem(World world, int x, int y, int z) |
| { |
| TileEntityChaudron chaudron = (TileEntityChaudron)world.getTileEntity(x, y, z); |
| |
| if (chaudron != null) |
| { |
| for (int slotId = 0; slotId < chaudron.getSizeInventory(); slotId++) |
| { |
| ItemStack stack = chaudron.getStackInSlot(slotId); |
| |
| if (stack != null) |
| { |
| float f = world.rand.nextFloat() * 0.8F + 0.1F; |
| float f1 = world.rand.nextFloat() * 0.8F + 0.1F; |
| EntityItem entityitem; |
| |
| for (float f2 = world.rand.nextFloat() * 0.8F + 0.1F; stack.stackSize > 0; world.spawnEntityInWorld(entityitem)) |
| { |
| int k1 = world.rand.nextInt(21) + 10; |
| |
| if (k1 > stack.stackSize) |
| { |
| k1 = stack.stackSize; |
| } |
| |
| stack.stackSize -= k1; |
| entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(stack.getItem(), k1, stack.getItemDamage())); |
| float f3 = 0.05F; |
| entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3); |
| entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F); |
| entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3); |
| |
| if (stack.hasTagCompound()) |
| { |
| entityitem.getEntityItem().setTagCompound((NBTTagCompound)stack.getTagCompound().copy()); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |