Non résolu Crash ouverture Gui
-
Comment ça comme combustible ? à quoi ressemble ton gui ?
-
Il ressemble à ça:
et il prends le slot de gauche c’est à dire celui de la patate comme combustible et allume le feu. Or j’aimerais que la pomme la flèche et la patate donne mon objet. -
J’ai modifié les lignes suivantes :
public boolean isItemValidForSlot(int index, ItemStack stack) { return true; }
et
public void update() { if (!this.world.isRemote) { /* Si le carburant brûle, on réduit réduit le temps restant */ if (this.isBurning()) { this.burningTimeLeft--; } /* * Si la on peut faire cuire la recette et que le four ne cuit pas * alors qu'il peut, alors on le met en route */ if (!this.isBurning() && this.canSmelt()) { this.burningTimeLeft = this.getFullBurnTime(); this.decrStackSize(2, 1); } /* Si on peut faire cuire la recette et que le feu cuit */ if (this.isBurning() && this.canSmelt()) { this.timePassed++; if (timePassed >= this.getFullRecipeTime()) { timePassed = 0; this.smelt(); } } else { timePassed = 0; } this.markDirty(); } }
Mais toujours le même soucis
-
C’est plutôt dans la fonction smelt qu’il faut changer le slot utilisé pour le carburant.
-
J’ai modifié la fonction smelt comme suit :
public void smelt() { if(this.canSmelt()) { ItemStack input1 = (ItemStack)this.stacks.get(0); ItemStack input2 = (ItemStack)this.stacks.get(1); ItemStack result = RecipesGloriumMachine.getInstance().getRecipeResult(input1); ItemStack output = (ItemStack)this.stacks.get(3); if(output.isEmpty()) this.stacks.set(3, result.copy()); else if(output.getItem() == result.getItem()) output.grow(result.getCount()); input1.shrink(1); input2.shrink(1); } }
mais j’ai une erreur à:
ItemStack result = RecipesGloriumMachine.getInstance().getRecipeResult(input1);
Qui me dit "the method getRecipeResult(ItemStack[]) in the type RecipesGloriumMachine is not applicable for the arguments (ItemStack).
La classe méthode en question :
public static ItemStack getRecipeResult(ItemStack[] ingredients) { Iterator<Entry<ItemStack[], ItemStack>> it = recipes.entrySet().iterator(); while(it.hasNext()) { Entry <ItemStack[], ItemStack>entry = it.next(); if(areKeysEqual(entry.getKey(), ingredients)) { return entry.getValue(); } } return null; }
-
Bha oui, ta fonction prend un array d’itemstack, pas un itemstack seul.
-
Ok j’ai modifié le code, ce qui donne:
public void smelt() { if(this.canSmelt()) { ItemStack input1 = (ItemStack)this.stacks.get(0); ItemStack input2 = (ItemStack)this.stacks.get(1); ItemStack result = RecipesGloriumMachine.getInstance().getRecipeResult(new ItemStack[] {this.stacks[0], this.stacks[1], this.stacks[2]); ItemStack output = (ItemStack)this.stacks.get(3); if(output.isEmpty()) this.stacks.set(3, result.copy()); else if(output.getItem() == result.getItem()) output.grow(result.getCount()); input1.shrink(1); input2.shrink(1); } }
mais j’ai une erreur ici:
{this.stacks[0], this.stacks[1], this.stacks[2]}
qui me dit:
The type of the expression must be an array type but it resolved to NonNullList<ItemStack>
Je ne vois pas pourquoi ça fait une erreur, alors que c’est sensé être un array. Merci de ton aide -
Non, stack c’est une non null list.
Un plus tu y accès juste au dessus …
C’est this.stacks.get(x) pour y accéder. -
Ok merci, j’ai plus d’erreur, la patate sert plus de carburant mais la recette marche toujours pas.
Ci-dessous ma classe recette:public class RecipesGloriumMachine { private static final RecipesGloriumMachine smeltingBase = new RecipesGloriumMachine(); private Map smeltingList = new HashMap(); public static RecipesGloriumMachine getInstance() { return getInstance(); } private static final HashMap <ItemStack[], ItemStack>recipes = new HashMap<ItemStack[], ItemStack>(); static { addRecipe(Items.APPLE, Items.ARROW, Items.BAKED_POTATO, new ItemStack(ItemsMod.lingot_glorium)); } private static void addRecipe(Item ingredient1, Item ingredient2, Item ingredient3, ItemStack resultat1) { addRecipe(new ItemStack(ingredient1), new ItemStack(ingredient2), new ItemStack(ingredient3), resultat1); } public static void addRecipe(ItemStack stack1, ItemStack stack2, ItemStack stack3, ItemStack stack4) { ItemStack[] stackList = new ItemStack[]{stack1, stack2, stack3}; recipes.put(stackList, stack4); } private static boolean areKeysEqual(ItemStack[] key1, ItemStack[] key2) { if(key1.length != key2.length) return false; for(int i = 0; i < key1.length; i++) { ItemStack s1 = key1[i]; ItemStack s2 = key2[i]; if(s1.isEmpty() && !s2.isEmpty()) return false; if(!s1.isEmpty() && s2.isEmpty()) return false; if(s1.getItem() != s2.getItem()) return false; if(s1.getItemDamage() != s2.getItemDamage()) return false; } return true; } public ItemStack getRecipeResult(ItemStack[] ingredients) { 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(ingredients, (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<=2; i++) // Pour les 3 items { if(stackList[i].getItem() == stackList2[i].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 static RecipesGloriumMachine smelting() { return smeltingBase; } }
Je me demande si la recette ne marche pas à cause de la dernière fonction ou si c’est autre chose.