• Bonjour, j’ai suivis le tutoriel de bodri afin de faire un nouveau four (ici un chaudron), je voudrais pouvoir créer des recettes a 5 ingrédients et d’autres a moins. J’enregistre alors mes recettes a moins de 5 ingrédients avec des “null” pour dire que le slot doit être vide, mais je crash:

    0
    
    1
    2
    3
    4
    5
    [16:41:45] [Server thread/ERROR]: Encountered an unexpected exception
    net.minecraft.util.ReportedException: Ticking block entity
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:709) ~[MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) ~[MinecraftServer.class:?]
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[IntegratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
    Caused by: java.lang.NullPointerException
    at fr.sosoh.hogsmod.common.recipes.CauldronRecipes.isSameKey(CauldronRecipes.java:66) ~[CauldronRecipes.class:?]
    at fr.sosoh.hogsmod.common.recipes.CauldronRecipes.getSmeltingResult(CauldronRecipes.java:55) ~[CauldronRecipes.class:?]
    at fr.sosoh.hogsmod.common.blocks.tileentity.TileEntityCauldron.canSmelt(TileEntityCauldron.java:196) ~[TileEntityCauldron.class:?]
    at fr.sosoh.hogsmod.common.blocks.tileentity.TileEntityCauldron.updateEntity(TileEntityCauldron.java:211) ~[TileEntityCauldron.class:?]
    at net.minecraft.world.World.updateEntities(World.java:2160) ~[World.class:?]
    at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515) ~[WorldServer.class:?]
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703) ~[MinecraftServer.class:?]
    … 4 more
    

    Voila ma classe:
    :::

    ​package fr.sosoh.hogsmod.common.recipes;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import fr.sosoh.hogsmod.common.Hogsmod;
    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;
    
    public class CauldronRecipes {
    
    private static final CauldronRecipes smeltingBase = new CauldronRecipes();
    private Map smeltingList = new HashMap();
    
    public CauldronRecipes()
    {
    this.addRecipe(Hogsmod.itemBottle, Items.coal, Items.apple, Items.apple, Items.apple, null, null, new ItemStack(Blocks.diamond_block));
    }
    
    public void addRecipe(ItemStack bottle, ItemStack coal, ItemStack ingredient1, ItemStack ingredient2,
    ItemStack ingredient3, ItemStack ingredient4, ItemStack ingredient5, ItemStack result) //Cette fonction de comprend que des ItemStack, c'est celle qui ajoute les recettes à la HashMap
    {
    ItemStack[] stackList = new ItemStack[]{bottle, coal, ingredient1, ingredient2, ingredient3, ingredient4, ingredient5};
    this.smeltingList.put(stackList, result);
    }
    
        public void addRecipe(Item bottle, Item coal, Item item1, Item item2, Item item3, Item item4, Item item5, ItemStack result) //Coal is item
    {
    this.addRecipe(new ItemStack(bottle), new ItemStack(coal), new ItemStack(item1), new ItemStack(item2), new ItemStack(item3), new ItemStack(item4), new ItemStack(item5), result);
    }
    
        public void addRecipe(Item bottle, Block coal, Item item1, Item item2, Item item3, Item item4, Item item5, ItemStack result) //Coal is block
    {
    this.addRecipe(new ItemStack(bottle), new ItemStack(Item.getItemFromBlock(coal)), new ItemStack(item1), new ItemStack(item2), new ItemStack(item3), new ItemStack(item4), new ItemStack(item5), result);
    }
    
    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;
    for(int i=0; i<=6; i++)
    {
    System.out.println(i);
    if(stackList*.getItem() == stackList2*.getItem())
    {
    isSame = true;
    }
    else
    {
    return false;
    }
    }
    return isSame;
    }
    
    public Map getSmeltingList()
    {
           return this.smeltingList;
        }
    
    public static CauldronRecipes smelting()
    {
    return smeltingBase;
    }
    }
    

    :::

    Merci de votre aide 🙂


  • Le copié-collé est une TRES TRES TRES TRES mauvaise idée premièrement.

    Deuxièmement, essaye avec çà :

    
    if(stackList* != null && stackList2* != null && stackList*.getItem() == stackList2*.getItem())
    {
    isSame = true;
    }
    else
    {
    return false;
    }
    
    

  • J’ai copié collé mais j’ai compris les méthodes, tu peux voir que les méthodes sont différentes car ce que je veux est différent, après les méthodes communes sont les mêmes… Avec ce code ça ne crash plus et ça ne cuit pas non plus 😕 J’ai reussi:

    ​if(stackList* == null && stackList2* == null)
    
    {
    isSame = true;
    }
    else if(stackList* != null && stackList2* != null && stackList*.getItem() == stackList2*.getItem())
    {
    isSame = true;
    }
    else
    {
    return false;
    }