Résolu Problème GUI
-
Tu dois faire deux variables : une du temps total de cuisson et une du temps actuel (burnTime), tu fais une fonction qui return le burnTime en fonction de l’item qui est appelée si le slots n’est pas null et si le burnTime = 0 et tu décrémente le burnTime tous les ticks.
Et bien sur dans canSmelt(), tu rajoute if(this.burnTime <= 0) return false;Pour la fonction qui return le burnTime en fonction du l’item, je te conseille de prendre celle du four.
-
Pour les combustible ceux de minecraft suffiront.
Et pour l’animation des flammes ?
Machine utilise 3 (et un quatrième qui est le result) slots pour le craft donc si le prend mon troisieme slot pour le charbon il faut que je retire un slots du craftMon craft est basé sur 3 items et non 2, comment je modifie ça ?
-
Pour les slots, tu dois en avoir 4, 2 pour les inputs, 1 pour l’output et 1 pour le carburant :
Recipes :
public class AlloyerRecipes { private static final AlloyerRecipes smeltingBase = new AlloyerRecipes(); private Map <itemstack[], itemstack="">smeltingList = new HashMap<itemstack[], itemstack="">(); public AlloyerRecipes() { this.addRecipe(MechanicalCraft.copperDust, MechanicalCraft.tinDust, new ItemStack(MechanicalCraft.bronzeIngot, 2, 0)); this.addRecipe(MechanicalCraft.tinDust, MechanicalCraft.copperDust, new ItemStack(MechanicalCraft.bronzeIngot, 2, 0)); } public void addRecipe(ItemStack input1, ItemStack input2, ItemStack output1) { ItemStack[] stackList = new ItemStack[] {input1, input2}; this.smeltingList.put(stackList, output1); } public void addRecipe(Item input1, Item input2 ,ItemStack output1) { this.addRecipe(new ItemStack(input1), new ItemStack(input2), output1); } public ItemStack getSmeltingResult(ItemStack[] stack) { Iterator<entry<itemstack[], itemstack="">> iterator = this.smeltingList.entrySet().iterator(); Entry <itemstack[], itemstack="">entry; do { if(!iterator.hasNext()) { return null; } entry = (Entry<itemstack[], itemstack="">)iterator.next(); } while(!this.isSameKey(stack, (ItemStack[])entry.getKey())); return (ItemStack)entry.getValue(); } private boolean isSameKey(ItemStack[] stackList, ItemStack[] stackList2) { boolean isSame = false; for(int i = 0; i < 2; i++) { if(stackList*.getItem() == stackList2*.getItem()) { isSame = true; } else { return false; } } return isSame; } public Map <itemstack[], itemstack="">getSmeltingList() { return this.smeltingList; } public static AlloyerRecipes smelting() { return smeltingBase; } }
Pour les flammes, si tu parles des particules -> regarde le code du four de minecraft | si tu parles de la texture dans le GUI -> il faut faire pareil que pour la barre de progression de la recette</itemstack[],></itemstack[],></itemstack[],></entry<itemstack[],></itemstack[],></itemstack[],>
-
@‘AymericRed’:
Tu dois faire deux variables : une du temps total de cuisson et une du temps actuel (burnTime), tu fais une fonction qui return le burnTime en fonction de l’item qui est appelée si le slots n’est pas null et si le burnTime = 0 et tu décrémente le burnTime tous les ticks.
Et bien sur dans canSmelt(), tu rajoute if(this.burnTime <= 0) return false;Pour la fonction qui return le burnTime en fonction du l’item, je te conseille de prendre celle du four.
D’accord mais j’en fait quoi de la deuxième variable (burnTimeToatal) ?
-
Inspire-toi de ce que j’ai fait ici au pire : http://www.minecraftforgefrance.fr/showthread.php?tid=2716#classetileentity
Mais le principe est de savoir combien de temps le carburant actuel va encore brûler et savoir de savoir combien de temps le carburant actuel permet de brûler :
Exemple :
Charbon -> brûle pendant 500 (au hasard) et il reste 250
Scaling de la texture = 250 * hauteur de la texture / 500
Bois -> brûle pendant 15 et il reste 3
Scaling de la texture = 3 * largeur de la texture / 15Pour savoir si il faut prendre la hauteur ou la largeur il suffit de te demander sur quel axe évolue ta texture ?
Dans le four de minecraft la barre de progression évolue à l’horizontal -> largeur de la texture
Dans le four de minecraft la barre de progression du carburant évolue à la verticale -> hauteur de la textureEnsuite il suffit de récupéré le scaling dans le gui
Scaling sur la largeur -> this.drawTexturedModalRect(x, y, u, v, scaling, hauteur);
Scaling sur la hauteur -> this.drawTexturedModalRect(x, y, u, v, largeur, scaling);Du coup dans ton TE il te faut 2 variable pour le carburant une qui est décrémentée à chaque tick et une autre qui est changé quand
un nouveau carburant est consommé -
Brokenswing a tout résumé, burnTumeTotal sert pour la texture, au moment où tu get le burnTime de l’item, tu affectés à burnTumeTotal la valeur de burnTime
-
Là mon craft ne demarre pas
-
1. Pourquoi “protected static” pour tes variables dans le TE ? Jamais static à part pour certains cas
2. Dans la fonction canSmelt() :
Pourquoi tester si le slot du carburant est vide ? Il faut juste qu’il reste du burnTime
Et pourquoi mettre 3 items pour dans le tableau en paramètre de la fonction getSmeltingResult(ItemStack[] stacks) ? Il faut en mettre 2
3. Enlève la fonction getBurnTime(ItemStack stack)Et je suis encore en train de voir le reste
-
package com.google.SpyMan.Mechanicalcraft.common.BlockAlloyer; 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; import net.minecraft.tileentity.TileEntityFurnace; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class TileEntityAlloyer extends TileEntity implements IInventory { private byte direction; public byte getDirection() { return direction; } public void setDirection(byte direction) { this.direction = direction; this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); } private ItemStack[] contents = new ItemStack[4]; protected int workingTime = 0; protected int workingTimeNeeded = 200; protected int burnTime = 0; protected int burnTimeTotal = 0; @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList nbttaglist = new NBTTagList(); compound.setByte("Direction", this.direction); for(int i = 0; i < this.contents.length; ++i) { 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); compound.setShort("workingTimeNeeded", (short)this.workingTimeNeeded); } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.direction = compound.getByte("Direction"); NBTTagList nbttaglist = compound.getTagList("Items", 10); this.contents = new ItemStack[this.getSizeInventory()]; for(int i = 0; i < nbttaglist.tagCount(); ++i) { 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"); this.workingTimeNeeded = compound.getShort("workingTimeNeeded"); } public int getSizeInventory() { return this.contents.length; } public ItemStack getStackInSlot(int slotIndex) { 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() { return "tile.Alloyer"; } 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) { return false; } else { ItemStack itemstack = AlloyerRecipes.smelting().getSmeltingResult(new ItemStack[] {this.contents[0], this.contents[1]}); if(itemstack == null) return false; if(this.contents[3] == null) return true; if(!this.contents[3].isItemEqual(itemstack)) return false; int result = contents[3].stackSize + itemstack.stackSize; return result <= getInventoryStackLimit() && result <= this.contents[3].getMaxStackSize(); } } public void updateEntity() { System.out.println(burnTime + "/" + burnTimeTotal); if(this.burnTime > 0) { burnTime–; } if(this.canSmelt()) { if(this.burnTime <= 0) { int time = TileEntityFurnace.getItemBurnTime(contents[2]); this.decrStackSize(2, 1); this.burnTimeTotal = time; this.burnTime = time; } if(burnTime > 0) { workingTime++; } } if (this.workingTime >= this.workingTimeNeeded) { this.smeltItem(); this.workingTime = 0; } if (!this.canSmelt() || burnTime <= 0) { this.workingTime = 0; } } public void smeltItem() { if(this.canSmelt()) { ItemStack itemstack = AlloyerRecipes.smelting().getSmeltingResult(new ItemStack[] {this.contents[0], this.contents[1]}); if(this.contents[3] == null) { this.contents[3] = itemstack.copy(); } else if(this.contents[3].getItem() == itemstack.getItem()) { this.contents[3].stackSize += itemstack.stackSize; } this.decrStackSize(0, 1); this.decrStackSize(1, 1); } } @SideOnly(Side.CLIENT) public int getCookProgress() { return this.workingTime * 24 / this.workingTimeNeeded; } }
-
La texture des flammes se réduit en commençant par le bas au lieu du haut de la texture
[font=Consolas**int **]**p **= this.tileAlloyer.%(#b871ff)getBurnTime;
[font=Consolasthis].drawTexturedModalRect(**k **+ 57, **l **+ 36, 176, 1, 14, **p **+ 1);Fonction getBurnTime()
%(#a9b7c6)[font=Consolas]@SideOnly
**public int **%(#b871ff)getBurnTime
{
return this.**burnTime *%(#aaa9a7) 14 / this.burnTimeTotal%(#aaa9a7)[;
]}le "14" correspond a la hauteur/largeur (Texture carré) de ma texture
-
Mets le v à 14 au lieu de 1 (comme la texture se dessine par le bas,il faut commencer en bas de celle-ci)
-
Si je change le 1 ça ne dessine pas la bonne texture
-
Le 1 après le 176 ?
Bizarre, je regarde ça dans une demi-heure -
oui ce “1” là
-
this.drawTexturedModalRect(k + 57, l + 37 + (14 - p), 176, 14 - p, 14, p);
-
Merci tout fonctionne maintenant !