Résolu Machine à 2 slots .
-
Bonjour, j’ai créé un mode qui rajoute ( entre autre ) des bâtons à effets. J’aimerai pouvoir les améliorer ( que l’effets de potion soit plus puissant ) grâce à une machine à deux slots d’input ( entrée ) et 1 d’output ( sortie/résultat ). J’ai travaillé pendant longtemps dessus mais je n’ai réussis que à mettre les deux slots d’input et le slot d’output. Le problème s’est que les recettes ne marche pas.
(Ma machine s’appelle machineUp)
Merci à ce qui m’aideront
Voici mes class :
MachineUpRecipes :
package nolann.juet.multiore.common.machineUp; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import nolann.juet.multiore.common.MultiOre; public class MachineUpRecipes { private static final MachineUpRecipes smeltingBase = new MachineUpRecipes(); //Permet d'instancier votre classe car vous le l'instancierez nul part ailleur private Map smeltingList = new HashMap(); //Ceci permet de mettre vos recettes public MachineUpRecipes() { this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); this.addRecipe(MultiOre.obsidianIngot, MultiOre.obsidianIngot, new ItemStack(MultiOre.obsidianPowder)); } public void addRecipe(ItemStack stack1, ItemStack stack2, ItemStack stack) //Cette fonction de comprend que des ItemStack, c'est celle qui ajoute les recettes à la HashMap { ItemStack[] stackList = new ItemStack[]{stack1, stack2}; this.smeltingList.put(stackList, stack); this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); this.addRecipe(MultiOre.obsidianIngot, MultiOre.obsidianIngot, new ItemStack(MultiOre.obsidianPowder)); } public void addRecipe(Item item1, Item item2, ItemStack stack) //1er cas { this.addRecipe(new ItemStack(item1), new ItemStack(item2), stack); this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); this.addRecipe(MultiOre.obsidianIngot, MultiOre.obsidianIngot, new ItemStack(MultiOre.obsidianPowder)); } public void addRecipe(Block block1, Item item2, ItemStack stack) //2nd cas { this.addRecipe(Item.getItemFromBlock(block1), item2, stack); } public void addRecipe(Block block1, Block block2, ItemStack stack) //3ème cas { this.addRecipe(Item.getItemFromBlock(block1), Item.getItemFromBlock(block2), stack); } public ItemStack getSmeltingResult(ItemStack[] stack) //En argument : un tableau avec le contenu des trois slots d'input { Iterator iterator = this.smeltingList.entrySet().iterator(); Entry entry; do { if (!iterator.hasNext()) // Si il n'y a plus de recettes dans la liste { return null; //Il n'y a pas de recette correspondante } entry = (Entry)iterator.next(); //prend la recette suivante } while (!this.isSameKey(stack, (ItemStack[])entry.getKey())); //Check si le tableau passé en argument correspond à celui de la recette, vous avez une erreur ici, on crée la fonction tout de suite. return (ItemStack)entry.getValue(); //retourne l'itemstack : resultat de la recette } private boolean isSameKey(ItemStack[] stackList, ItemStack[] stackList2) { boolean isSame = false; //Au début ce n'est pas la même for(int i=0; i<=3; ++i) // Pour les 3 items { if(stackList*.getItem() == stackList2*.getItem()) //On vérifie si ce sont les même { isSame = true; // Si c'est le cas alors isSame vaut true } else { return false; //Si un seul n'est pas bon, on cherche pas, c'est pas la bonne recette } } return isSame; } public Map getSmeltingList() { return this.smeltingList; } public static MachineUpRecipes smelting() { return smeltingBase; } }
GuiMachineUp :
package nolann.juet.multiore.common.machineUp; import org.lwjgl.opengl.GL11; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.util.ResourceLocation; import nolann.juet.multiore.common.ContainerMachineUp; import nolann.juet.multiore.common.MultiOre; public class GuiMachineUp extends GuiContainer { private static final ResourceLocation texture = new ResourceLocation(MultiOre.MODID,"textures/gui/container/guiMachineUp.png"); @SuppressWarnings("unused") private TileEntityMachineUp tileMachineUp; private IInventory playerInv; public GuiMachineUp(TileEntityMachineUp tile, InventoryPlayer inventory) { super(new ContainerMachineUp(tile, inventory)); this.tileMachineUp = tile; this.playerInv = inventory; this.allowUserInput = false; this.ySize = 208; this.xSize = 196; } @Override protected void drawGuiContainerBackgroundLayer(float partialRenderTick, int x, int y) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(texture); int k = (this.width - this.xSize) / 2; int l = (this.height - this.ySize) / 2; this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); if(this.tileMachineUp.isBurning()) { int i = this.tileMachineUp.getCookProgress(); //Nous créerons cette fonction après this.drawTexturedModalRect(k + 45, l + 60, 0, 209, i + 2, 16); } } protected void drawGuiContainerForegroundLayer(int x, int y) { this.fontRendererObj.drawString(this.playerInv.hasCustomInventoryName() ? this.playerInv.getInventoryName() : I18n.format(this.playerInv.getInventoryName()), 10, this.ySize - 98, 4210752); } }
MachineUp :
package nolann.juet.multiore.common.machineUp; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import nolann.juet.multiore.common.MultiOre; public class MachineUp extends BlockContainer { public MachineUp() { super(Material.rock); this.setResistance(8.0F); this.setHarvestLevel("pickaxe", 2); this.setBlockTextureName(MultiOre.MODID + ":machine_up"); } @Override public TileEntity createNewTileEntity(World world, int metadata) //Instancie le TileEntity { return new TileEntityMachineUp(); } @Override public boolean hasTileEntity(int metadata) //Permet de savoir si le bloc a un TileEntity { return true; } public void breakBlock(World world, int x, int y, int z, Block block, int metadata) { TileEntity tileentity = world.getTileEntity(x, y, z); if (tileentity instanceof IInventory) { IInventory inv = (IInventory)tileentity; for (int i1 = 0; i1 < inv.getSizeInventory(); ++i1) { ItemStack itemstack = inv.getStackInSlot(i1); if (itemstack != 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; itemstack.stackSize > 0; world.spawnEntityInWorld(entityitem)) { int j1 = world.rand.nextInt(21) + 10; if (j1 > itemstack.stackSize) { j1 = itemstack.stackSize; } itemstack.stackSize -= j1; entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.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 (itemstack.hasTagCompound()) { entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); } } } } world.func_147453_f(x, y, z, block); } super.breakBlock(world, x, y, z, block, metadata); } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitx, float hity, float hitz) { if (world.isRemote) { return true; } else { player.openGui(MultiOre.instance, 0, world, x, y, z); return true; } } }
MachineUpRecipes :
package nolann.juet.multiore.common.machineUp; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import nolann.juet.multiore.common.MultiOre; public class MachineUpRecipes { private static final MachineUpRecipes smeltingBase = new MachineUpRecipes(); //Permet d'instancier votre classe car vous le l'instancierez nul part ailleur private Map smeltingList = new HashMap(); //Ceci permet de mettre vos recettes public MachineUpRecipes() { this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); this.addRecipe(MultiOre.obsidianIngot, MultiOre.obsidianIngot, new ItemStack(MultiOre.obsidianPowder)); } public void addRecipe(ItemStack stack1, ItemStack stack2, ItemStack stack) //Cette fonction de comprend que des ItemStack, c'est celle qui ajoute les recettes à la HashMap { ItemStack[] stackList = new ItemStack[]{stack1, stack2}; this.smeltingList.put(stackList, stack); this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); this.addRecipe(MultiOre.obsidianIngot, MultiOre.obsidianIngot, new ItemStack(MultiOre.obsidianPowder)); } public void addRecipe(Item item1, Item item2, ItemStack stack) //1er cas { this.addRecipe(new ItemStack(item1), new ItemStack(item2), stack); this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); this.addRecipe(MultiOre.obsidianIngot, MultiOre.obsidianIngot, new ItemStack(MultiOre.obsidianPowder)); } public void addRecipe(Block block1, Item item2, ItemStack stack) //2nd cas { this.addRecipe(Item.getItemFromBlock(block1), item2, stack); } public void addRecipe(Block block1, Block block2, ItemStack stack) //3ème cas { this.addRecipe(Item.getItemFromBlock(block1), Item.getItemFromBlock(block2), stack); } public ItemStack getSmeltingResult(ItemStack[] stack) //En argument : un tableau avec le contenu des trois slots d'input { Iterator iterator = this.smeltingList.entrySet().iterator(); Entry entry; do { if (!iterator.hasNext()) // Si il n'y a plus de recettes dans la liste { return null; //Il n'y a pas de recette correspondante } entry = (Entry)iterator.next(); //prend la recette suivante } while (!this.isSameKey(stack, (ItemStack[])entry.getKey())); //Check si le tableau passé en argument correspond à celui de la recette, vous avez une erreur ici, on crée la fonction tout de suite. return (ItemStack)entry.getValue(); //retourne l'itemstack : resultat de la recette } private boolean isSameKey(ItemStack[] stackList, ItemStack[] stackList2) { boolean isSame = false; //Au début ce n'est pas la même for(int i=0; i<=3; ++i) // Pour les 3 items { if(stackList*.getItem() == stackList2*.getItem()) //On vérifie si ce sont les même { isSame = true; // Si c'est le cas alors isSame vaut true } else { return false; //Si un seul n'est pas bon, on cherche pas, c'est pas la bonne recette } } return isSame; } public Map getSmeltingList() { return this.smeltingList; } public static MachineUpRecipes smelting() { return smeltingBase; } }
SlotResultUp :
package nolann.juet.multiore.common.machineUp; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class SlotResultUp extends Slot { public SlotResultUp(IInventory inventory, int id, int x, int y) { super(inventory, id, x, y); } @Override public boolean isItemValid(ItemStack stack) //Interdit la pose d'items dans le slot { return false; } public ItemStack decrStackSize(int amount) { return super.decrStackSize(amount); } public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { super.onCrafting(stack); super.onPickupFromSlot(player, stack); } }
TileEntityMachineUp :
package nolann.juet.multiore.common.machineUp; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; 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.tileentity.TileEntity; public class TileEntityMachineUp extends TileEntity implements IInventory { private ItemStack[] contents = new ItemStack[3]; //0, 1 et 2 sont les inputs et 3 est l'output private int workingTime = 0; //Temps de cuisson actuel private int workingTimeNeeded = 200; //Temps de cuisson nécessaire @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.contents.length; ++i) //pour les slots { if (this.contents* != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); this.contents*.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } compound.setTag("Items", nbttaglist); compound.setShort("workingTime",(short)this.workingTime); //On les enregistrent en short compound.setShort("workingTimeNeeded", (short)this.workingTimeNeeded); } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList nbttaglist = compound.getTagList("Items", 10); this.contents = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < nbttaglist.tagCount(); ++i) //Encore une fois pour les slots { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.contents.length) { this.contents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } this.workingTime = compound.getShort("workingTime"); //On lit nos valeurs this.workingTimeNeeded = compound.getShort("workingTimeNeeded"); } public int getSizeInventory() { //Tout est dans le nom, retourne la taille de l'inventaire, pour notre bloc c'est quatre return this.contents.length; } public ItemStack getStackInSlot(int slotIndex) { //Renvoie L'itemStack se trouvant dans le slot passé en argument return this.contents[slotIndex]; } public ItemStack decrStackSize(int slotIndex, int amount) { if (this.contents[slotIndex] != null) { ItemStack itemstack; if (this.contents[slotIndex].stackSize <= amount) { itemstack = this.contents[slotIndex]; this.contents[slotIndex] = null; this.markDirty(); return itemstack; } else { itemstack = this.contents[slotIndex].splitStack(amount); if (this.contents[slotIndex].stackSize == 0) { this.contents[slotIndex] = null; } this.markDirty(); return itemstack; } } else { return null; } } public ItemStack getStackInSlotOnClosing(int slotIndex) { if (this.contents[slotIndex] != null) { ItemStack itemstack = this.contents[slotIndex]; this.contents[slotIndex] = null; return itemstack; } else { return null; } } public void setInventorySlotContents(int slotIndex, ItemStack stack) { this.contents[slotIndex] = stack; if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { stack.stackSize = this.getInventoryStackLimit(); } this.markDirty(); } public String getInventoryName() { //J'ai décider qu'on ne pouvait pas mettre de nom custom return "tile.machineTuto"; } public boolean hasCustomInventoryName() { return false; } public int getInventoryStackLimit() { return 64; } public boolean isUseableByPlayer(EntityPlayer player) { return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; } public void openInventory() { } public void closeInventory() { } public boolean isItemValidForSlot(int slot, ItemStack stack) { return slot == 3 ? false : true; } public boolean isBurning() { return this.workingTime > 0; } private boolean canSmelt() { if (this.contents[0] == null || this.contents[1] == null || this.contents[2] == null) //Si les trois premiers slots sont vides { return false; //On ne peut pas lancer le processus } else { ItemStack itemstack = MachineUpRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1], this.contents[2]}); //Il y a une erreur ici, c'est normal, on y vient après (c'est pour les recettes) if (itemstack == null) return false; //rapport avec les recettes if (this.contents[3] == null) return true; //vérifications du slot d'output if (!this.contents[3].isItemEqual(itemstack)) return false; //ici aussi int result = contents[3].stackSize + itemstack.stackSize; return result <= getInventoryStackLimit() && result <= this.contents[3].getMaxStackSize(); //Et là aussi décidément } } public void updateEntity() //Méthode exécutée à chaque tick { if(this.isBurning() && this.canSmelt()) //Si on "cuit" et que notre recette et toujours bonne, on continue { ++this.workingTime; //incrémentation } if(this.canSmelt() && !this.isBurning()) //Si la recette est bonne mais qu'elle n'est toujours pas lancée, on la lance { this.workingTime = 1; //La méthode isBurning() renverra true maintenant (1>0) } if(this.canSmelt() && this.workingTime == this.workingTimeNeeded) //Si on est arrivé au bout du temps de cuisson et que la recette est toujours bonne { this.smeltItem(); //on "cuit" les items this.workingTime = 0; //et on réinitialise le temps de cuisson } if(!this.canSmelt()) //Si la recette la recette n'est plus bonne { this.workingTime= 0; //le temps de cuisson est de 0 } } public void smeltItem() { if (this.canSmelt()) { ItemStack itemstack = MachineUpRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1], this.contents[2]}); //On récupère l'output de la recette if (this.contents[3] == null) //Si il y a rien dans le slot d'output { this.contents[3] = itemstack.copy(); //On met directement l'ItemStack } else if (this.contents[3].getItem() == itemstack.getItem()) //Et si l'item que l'on veut est le même que celui qu'il y a déjà { this.contents[3].stackSize += itemstack.stackSize; // Alors ont incrémente l'ItemStack } –this.contents[0].stackSize; //On décrémente les slots d'input –this.contents[1].stackSize; –this.contents[2].stackSize; if (this.contents[0].stackSize <= 0) //Si les slots sont vides, on remet à null le slot { this.contents[0] = null; } if (this.contents[1].stackSize <= 0) { this.contents[1] = null; } if (this.contents[2].stackSize <= 0) { this.contents[2] = null; } } } @SideOnly(Side.CLIENT) public int getCookProgress() { return this.workingTime * 100 / this.workingTimeNeeded; } }
GuiHandler :
package nolann.juet.multiore.common; import cpw.mods.fml.common.network.IGuiHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import nolann.juet.multiore.common.machineUp.GuiMachineUp; import nolann.juet.multiore.common.machineUp.TileEntityMachineUp; public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityMachineTuto) { return new ContainerMachineTuto((TileEntityMachineTuto)tile, player.inventory); } if(tile instanceof TileEntityMachineUp) { return new ContainerMachineUp((TileEntityMachineUp)tile, player.inventory); } } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityMachineTuto) { return new GuiMachineTuto((TileEntityMachineTuto)tile, player.inventory); } if(tile instanceof TileEntityMachineUp) { return new GuiMachineUp((TileEntityMachineUp)tile, player.inventory); } } return null; } }
-
Up UP up
J’ai réussi par pur hasard !!
Pour ce qui voudrait faire la même machine que moi, je vous envoie les class.
Maintenant à vous de comprendre le code et le modifier pour améliorer votre mode !!
TileEntityMachineUp :
package nolann.juet.multiore.common.machineUp; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; 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.tileentity.TileEntity; public class TileEntityMachineUp extends TileEntity implements IInventory { private ItemStack[] contents = new ItemStack[3]; //0, 1 et 2 sont les inputs et 3 est l'output private int workingTime = 0; //Temps de cuisson actuel private int workingTimeNeeded = 200; //Temps de cuisson nécessaire @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.contents.length; ++i) //pour les slots { if (this.contents* != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); this.contents*.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } compound.setTag("Items", nbttaglist); compound.setShort("workingTime",(short)this.workingTime); //On les enregistrent en short compound.setShort("workingTimeNeeded", (short)this.workingTimeNeeded); } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList nbttaglist = compound.getTagList("Items", 10); this.contents = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < nbttaglist.tagCount(); ++i) //Encore une fois pour les slots { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.contents.length) { this.contents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } this.workingTime = compound.getShort("workingTime"); //On lit nos valeurs this.workingTimeNeeded = compound.getShort("workingTimeNeeded"); } public int getSizeInventory() { //Tout est dans le nom, retourne la taille de l'inventaire, pour notre bloc c'est quatre return this.contents.length; } public ItemStack getStackInSlot(int slotIndex) { //Renvoie L'itemStack se trouvant dans le slot passé en argument return this.contents[slotIndex]; } public ItemStack decrStackSize(int slotIndex, int amount) { if (this.contents[slotIndex] != null) { ItemStack itemstack; if (this.contents[slotIndex].stackSize <= amount) { itemstack = this.contents[slotIndex]; this.contents[slotIndex] = null; this.markDirty(); return itemstack; } else { itemstack = this.contents[slotIndex].splitStack(amount); if (this.contents[slotIndex].stackSize == 0) { this.contents[slotIndex] = null; } this.markDirty(); return itemstack; } } else { return null; } } public ItemStack getStackInSlotOnClosing(int slotIndex) { if (this.contents[slotIndex] != null) { ItemStack itemstack = this.contents[slotIndex]; this.contents[slotIndex] = null; return itemstack; } else { return null; } } public void setInventorySlotContents(int slotIndex, ItemStack stack) { this.contents[slotIndex] = stack; if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { stack.stackSize = this.getInventoryStackLimit(); } this.markDirty(); } public String getInventoryName() { //J'ai décider qu'on ne pouvait pas mettre de nom custom return "tile.machineUp"; } public boolean hasCustomInventoryName() { return false; } public int getInventoryStackLimit() { return 64; } public boolean isUseableByPlayer(EntityPlayer player) { return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; } public void openInventory() { } public void closeInventory() { } public boolean isItemValidForSlot(int slot, ItemStack stack) { return slot == 2 ? false : true; } public boolean isBurning() { return this.workingTime > 0; } private boolean canSmelt() { if (this.contents[0] == null || this.contents[1] == null) //Si les trois premiers slots sont vides { return false; //On ne peut pas lancer le processus } else { ItemStack itemstack = MachineUpRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1]}); //Il y a une erreur ici, c'est normal, on y vient après (c'est pour les recettes) if (itemstack == null) return false; //rapport avec les recettes if (this.contents[2] == null) return true; //vérifications du slot d'output if (!this.contents[2].isItemEqual(itemstack)) return false; //ici aussi int result = contents[2].stackSize + itemstack.stackSize; return result <= getInventoryStackLimit() && result <= this.contents[2].getMaxStackSize(); //Et là aussi décidément } } public void updateEntity() //Méthode exécutée à chaque tick { if(this.isBurning() && this.canSmelt()) //Si on "cuit" et que notre recette et toujours bonne, on continue { ++this.workingTime; //incrémentation } if(this.canSmelt() && !this.isBurning()) //Si la recette est bonne mais qu'elle n'est toujours pas lancée, on la lance { this.workingTime = 1; //La méthode isBurning() renverra true maintenant (1>0) } if(this.canSmelt() && this.workingTime == this.workingTimeNeeded) //Si on est arrivé au bout du temps de cuisson et que la recette est toujours bonne { this.smeltItem(); //on "cuit" les items this.workingTime = 0; //et on réinitialise le temps de cuisson } if(!this.canSmelt()) //Si la recette la recette n'est plus bonne { this.workingTime= 0; //le temps de cuisson est de 0 } } public void smeltItem() { if (this.canSmelt()) { ItemStack itemstack = MachineUpRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1]}); //On récupère l'output de la recette if (this.contents[2] == null) //Si il y a rien dans le slot d'output { this.contents[2] = itemstack.copy(); //On met directement l'ItemStack } else if (this.contents[2].getItem() == itemstack.getItem()) //Et si l'item que l'on veut est le même que celui qu'il y a déjà { this.contents[2].stackSize += itemstack.stackSize; // Alors ont incrémente l'ItemStack } –this.contents[0].stackSize; //On décrémente les slots d'input –this.contents[1].stackSize; if (this.contents[0].stackSize <= 0) //Si les slots sont vides, on remet à null le slot { this.contents[0] = null; } if (this.contents[1].stackSize <= 0) { this.contents[1] = null; } } } @SideOnly(Side.CLIENT) public int getCookProgress() { return this.workingTime * 100 / this.workingTimeNeeded; } }
ContainerMachineUp :
package nolann.juet.multiore.common.machineUp; 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 ContainerMachineUp extends Container { private TileEntityMachineUp tileMachineUp; public ContainerMachineUp(TileEntityMachineUp tile, InventoryPlayer inventory) { this.tileMachineUp = tile; this.addSlotToContainer(new Slot(tile, 0, 48, 28)); //Lancez votre jeu en debug pour calibrer vos slots this.addSlotToContainer(new Slot(tile, 1, 88, 28)); this.addSlotToContainer(new SlotResultUp(tile, 2, 88, 88)); //Ici c'est un slot que j'ai créer, on le fera après this.bindPlayerInventory(inventory); //Les containers ont été vus dans un tutoriel de robin, merci de d'y référer } @Override public boolean canInteractWith(EntityPlayer player) { return this.tileMachineUp.isUseableByPlayer(player); } private void bindPlayerInventory(InventoryPlayer inventory) { int i; for (i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 17 + j * 18, 125 + i * 18)); } } for (i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(inventory, i, 17 + i * 18, 183)); } } public ItemStack transferStackInSlot(EntityPlayer player, int quantity) { ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(quantity); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if (quantity < this.tileMachineUp.getSizeInventory()) { if (!this.mergeItemStack(itemstack1, this.tileMachineUp.getSizeInventory(), this.inventorySlots.size(), true)) { return null; } } else if (!this.mergeItemStack(itemstack1, 0, this.tileMachineUp.getSizeInventory(), false)) { return null; } if (itemstack1.stackSize == 0) { slot.putStack((ItemStack)null); } else { slot.onSlotChanged(); } } return itemstack; } public void onContainerClosed(EntityPlayer player) { super.onContainerClosed(player); this.tileMachineUp.closeInventory(); } }
GuiMachineUp :
package nolann.juet.multiore.common.machineUp; import org.lwjgl.opengl.GL11; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.util.ResourceLocation; import nolann.juet.multiore.common.MultiOre; public class GuiMachineUp extends GuiContainer { private static final ResourceLocation texture = new ResourceLocation(MultiOre.MODID,"textures/gui/container/guiMachineUp.png"); @SuppressWarnings("unused") private TileEntityMachineUp tileMachineUp; private IInventory playerInv; public GuiMachineUp(TileEntityMachineUp tile, InventoryPlayer inventory) { super(new ContainerMachineUp(tile, inventory)); this.tileMachineUp = tile; this.playerInv = inventory; this.allowUserInput = false; this.ySize = 208; this.xSize = 196; } @Override protected void drawGuiContainerBackgroundLayer(float partialRenderTick, int x, int y) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(texture); int k = (this.width - this.xSize) / 2; int l = (this.height - this.ySize) / 2; this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); if(this.tileMachineUp.isBurning()) { int i = this.tileMachineUp.getCookProgress(); //Nous créerons cette fonction après this.drawTexturedModalRect(k + 45, l + 60, 0, 209, i + 2, 16); } } protected void drawGuiContainerForegroundLayer(int x, int y) { this.fontRendererObj.drawString(this.playerInv.hasCustomInventoryName() ? this.playerInv.getInventoryName() : I18n.format(this.playerInv.getInventoryName()), 10, this.ySize - 98, 4210752); } }
MachineUp :
package nolann.juet.multiore.common.machineUp; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import nolann.juet.multiore.common.MultiOre; public class MachineUp extends BlockContainer { public MachineUp() { super(Material.rock); this.setResistance(8.0F); this.setHarvestLevel("pickaxe", 2); this.setBlockTextureName(MultiOre.MODID + ":machine_up"); } @Override public TileEntity createNewTileEntity(World world, int metadata) //Instancie le TileEntity { return new TileEntityMachineUp(); } @Override public boolean hasTileEntity(int metadata) //Permet de savoir si le bloc a un TileEntity { return true; } public void breakBlock(World world, int x, int y, int z, Block block, int metadata) { TileEntity tileentity = world.getTileEntity(x, y, z); if (tileentity instanceof IInventory) { IInventory inv = (IInventory)tileentity; for (int i1 = 0; i1 < inv.getSizeInventory(); ++i1) { ItemStack itemstack = inv.getStackInSlot(i1); if (itemstack != 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; itemstack.stackSize > 0; world.spawnEntityInWorld(entityitem)) { int j1 = world.rand.nextInt(21) + 10; if (j1 > itemstack.stackSize) { j1 = itemstack.stackSize; } itemstack.stackSize -= j1; entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.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 (itemstack.hasTagCompound()) { entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); } } } } world.func_147453_f(x, y, z, block); } super.breakBlock(world, x, y, z, block, metadata); } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitx, float hity, float hitz) { if (world.isRemote) { return true; } else { player.openGui(MultiOre.instance, 0, world, x, y, z); return true; } } }
MachineUpRecipes :
package nolann.juet.multiore.common.machineUp; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import nolann.juet.multiore.common.MultiOre; public class MachineUpRecipes { private static final MachineUpRecipes smeltingBase = new MachineUpRecipes(); //Permet d'instancier votre classe car vous le l'instancierez nul part ailleur private Map smeltingList = new HashMap(); //Ceci permet de mettre vos recettes public MachineUpRecipes() { this.addRecipe(Items.apple, Items.apple, new ItemStack(Blocks.diamond_block)); //Ajout d'une recette, on fait un bloc de diamant à partie de deux pommes et une flèche } public void addRecipe(ItemStack stack1, ItemStack stack2, ItemStack stack3) //Cette fonction de comprend que des ItemStack, c'est celle qui ajoute les recettes à la HashMap { ItemStack[] stackList = new ItemStack[]{stack1, stack2}; this.smeltingList.put(stackList, stack3); } public void addRecipe(Item item1, Item item2, ItemStack stack) //1er cas { this.addRecipe(new ItemStack(item1), new ItemStack(item2), stack); this.addRecipe(new ItemStack(MultiOre.obsidianIngot), new ItemStack(MultiOre.obsidianIngot), new ItemStack(MultiOre.obsidianPowder)); this.addRecipe(new ItemStack(MultiOre.ironStick), new ItemStack(MultiOre.energieFragment), new ItemStack(MultiOre.ironStick)); } public void addRecipe(Block block1, Item item2, ItemStack stack) //2nd cas { this.addRecipe(Item.getItemFromBlock(block1), item2, stack); } public void addRecipe(Block block1, Block block2, ItemStack stack) //3ème cas { this.addRecipe(Item.getItemFromBlock(block1), Item.getItemFromBlock(block2), stack); } public ItemStack getSmeltingResult(ItemStack[] stack) //En argument : un tableau avec le contenu des trois slots d'input { Iterator iterator = this.smeltingList.entrySet().iterator(); Entry entry; do { if (!iterator.hasNext()) // Si il n'y a plus de recettes dans la liste { return null; //Il n'y a pas de recette correspondante } entry = (Entry)iterator.next(); //prend la recette suivante } while (!this.isSameKey(stack, (ItemStack[])entry.getKey())); //Check si le tableau passé en argument correspond à celui de la recette, vous avez une erreur ici, on crée la fonction tout de suite. return (ItemStack)entry.getValue(); //retourne l'itemstack : resultat de la recette } private boolean isSameKey(ItemStack[] stackList, ItemStack[] stackList2) { boolean isSame = false; //Au début ce n'est pas la même for(int i=0; i<=1; ++i) // Pour les 3 items { if(stackList*.getItem() == stackList2*.getItem()) //On vérifie si ce sont les même { isSame = true; // Si c'est le cas alors isSame vaut true } else { return false; //Si un seul n'est pas bon, on cherche pas, c'est pas la bonne recette } } return isSame; } public Map getSmeltingList() { return this.smeltingList; } public static MachineUpRecipes smelting() { return smeltingBase; } }
SlotResultUp :
package nolann.juet.multiore.common.machineUp; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class SlotResultUp extends Slot { public SlotResultUp(IInventory inventory, int id, int x, int y) { super(inventory, id, x, y); } @Override public boolean isItemValid(ItemStack stack) //Interdit la pose d'items dans le slot { return false; } public ItemStack decrStackSize(int amount) { return super.decrStackSize(amount); } public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { super.onCrafting(stack); super.onPickupFromSlot(player, stack); } }
GuiHandler :
package nolann.juet.multiore.common; import cpw.mods.fml.common.network.IGuiHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import nolann.juet.multiore.common.machineUp.ContainerMachineUp; import nolann.juet.multiore.common.machineUp.GuiMachineUp; import nolann.juet.multiore.common.machineUp.TileEntityMachineUp; public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityMachineTuto) { return new ContainerMachineTuto((TileEntityMachineTuto)tile, player.inventory); } if(tile instanceof TileEntityMachineUp) { return new ContainerMachineUp((TileEntityMachineUp)tile, player.inventory); } } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case 0: TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityMachineTuto) { return new GuiMachineTuto((TileEntityMachineTuto)tile, player.inventory); } if(tile instanceof TileEntityMachineUp) { return new GuiMachineUp((TileEntityMachineUp)tile, player.inventory); } } return null; } }
Voilà, j’espère que cela vous aura aidé !!!
J’ai passé beaucoup de temps ( des jours ) pour réussir a faire fonctionner cette machine.
Et faite attention car il y a du code lié à une autre machine dans le GuiHandler ( La machineTuto ) .