Crash ouverture Gui
-
Merci de ton aide. Ca marche, mais j’ai désormais un problème avec les recettes. Aucune erreur dans la console ni dans les logs pourtant le code semble bon.
public class RecipesGloriumMachine { private static final RecipesGloriumMachine smeltingBase = new RecipesGloriumMachine(); private Map smeltingList = new HashMap(); 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 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; } } -
Lances ton jeu en debug, mets un point d’arrêt dans la fonction canSmelt de ton four et regardes la valeur des variables.
-
Ces valeurs là ?

-
regardes surtout le résultat de this.getStackInSlot(0), this.getStackInSlot(1) et de ItemStack result = this.getRecipeResult();
-
Il faut que je rajoute ?
this.getStackInSlot(0), this.getStackInSlot(1), this.getStackInSlot(2) }); -
Non, que tu regardes via le débugueur leur valeur quand tu es sur le point d’arrêt, pour comprendre ce qu’il se passe.
Dans l’onglet expression de débugueur tu peux y mettre des fonctions à interpréter, afin de récupérer la valeur.
-
J’ai regardé, et j’en déduis que:
le slot 0 enregistre un ItemFood
le slot 1 un ItemArrow
le slot 2 un ItemFood
et le slot 3 il est null -
Ok je crois avoir trouvé où est le problème.
C’est dans la classe de ton tile entity :
public ItemStack getRecipeResult() { return RecipesGloriumMachine.getRecipeResult(new ItemStack[] { this.getStackInSlot(0), this.getStackInSlot(1) }); }ici tu appels ta fonction getRecipeResult avec deux items stack, or tes recettes prennent 3 items. Je pense que cela devrait être plutôt comme ceci :
return RecipesGloriumMachine.getRecipeResult(new ItemStack[] { this.getStackInSlot(0), this.getStackInSlot(1), this.getStackInSlot(2) }); -
Le Gui semble marcher mais pour une raison inconnu, le slot 3 récupére l’item comme combustible ce qui fait que la recette ne marche pas. Une idéé ?
-
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.