SOLVED Erreur sur Classe de recettes


  • Bonjour, c’est encore moi Eryah. Maintenant que mon bloc PlateCrafter est fait ( Encore bugué… Mias bon ), j’aimerai qu’il remplisse sa fonction : Transformer des lingots de fer/acier en plaques.
    J’ai deux méthodes en têtes

    • La méthode ‘LeederPrice’ : ClickEvent avec le lingot - Supprime le lingot, give une plaque
    • La méthode ‘normale’ : Un GUI, tu place ton lingot, t’a une plaque

    Pour chacune des deux, j’ai tenté… Et je suis pas allé loin.
    Je sais que c’est plutôt basique un ClickEvent, mais je ne trouve aucun block Minecraft de base qui rempli cette fonction.
    Pour la méthode normale, il y a bien la table de craft, mais il faut créer mon propre GUI, et ça… Plutôt dur.

    Si possible ( Rien est impossible, mais presque tout l’est a mon niveau), j’aimerai que le bloc fabrique des plaques seulement sous une impulsion redstone

    Je demande donc de l’aide pour soit la méthode ‘LeederPrice’, soit la normale
    Le code actuel

    package eryah.usefulthings.blocks;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockDirectional;
    import net.minecraft.block.BlockRedstoneWire;
    import net.minecraft.block.material.Material;
    import net.minecraft.block.properties.IProperty;
    import net.minecraft.block.properties.PropertyDirection;
    import net.minecraft.block.properties.PropertyEnum;
    import net.minecraft.block.state.BlockState;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.resources.model.ModelResourceLocation;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.Item;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    import net.minecraftforge.fml.common.registry.GameRegistry;
    import eryah.usefulthings.Reference;
    import eryah.usefulthings.UsefulthingsMod;
    
    public class PlateCrafter extends BlockDirectional {
    
       public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
    public static Block platecrafter;    
    
      public PlateCrafter(Material material)
       {
            super(material);
            this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
       }
    
    public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
       {
           return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
       }
    
       public IBlockState getStateFromMeta(int meta)
       {
           return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta));
       }
    
       public int getMetaFromState(IBlockState state)
       {
           return ((EnumFacing)state.getValue(FACING)).getHorizontalIndex();
       }
    
       protected BlockState createBlockState()
       {
           return new BlockState(this, new IProperty[] {FACING});
       }
    
    public static void init()
    {
    platecrafter = new PlateCrafter(Material.rock).setUnlocalizedName("platecrafter").setCreativeTab(UsefulthingsMod.UTTab);
    }
    
    public static void register()
    {
    GameRegistry.registerBlock(platecrafter, platecrafter.getUnlocalizedName().substring(5));
    }
    
    public static void registerRenders()
    {
    registerRender(platecrafter);
    }
    
    public static void registerRender(Block block)
    {
    Item item = Item.getItemFromBlock(block);
    Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));
    }
    
    }
    
    

  • Serais-tu myope ? Car j’ai l’impression que tu ne cherches jamais très loin…
    Google : click block
    Google : gui

    Voir même, encore plus près :
    (https://www.youtube.com/watch?v=CHw5ri-QU6o)


  • Donc comme dit sur un autre topic, j’ai abandoné l’idée de faire un bloc sans TileEntity
    J’ai donc suivi ce tuto
    http://www.minecraftforgefrance.fr/showthread.php?tid=2017&highlight=type+four
    Et j’ai une erreur sur la classe des recettes
    Classe PlateCrafterRecipe

    package eryah.usefulthings.recipes;
    
    import java.util.HashMap;
    
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    
    import com.google.common.collect.Multiset.Entry;
    import com.ibm.icu.util.BytesTrie.Iterator;
    import com.sun.javafx.collections.MappingChange.Map;
    
    public class PlateCrafterRecipes {
    
    private static final PlateCrafterRecipes smeltingBase = new PlateCrafterRecipes(); //Permet d'instancier votre classe car vous le l'instancierez nul part ailleur
    private HashMap smeltingList = new HashMap(); //Ceci permet de mettre vos recettes
    
    public PlateCrafterRecipes()
    {
    this.addRecipe(Items.iron_ingot, 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) //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, stack1);
    }
    
            public void addRecipe(Item item1, ItemStack stack) //1er cas
    {
    this.addRecipe(new ItemStack(item1), stack);
    }
    
            public ItemStack getSmeltingResult(ItemStack[] stack) //En argument : un tableau avec le contenu des trois slots d'input
        {
            java.util.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
         }
    
            public Map getSmeltingList()
        {
               return this.smeltingList;
            }
    
       public static PlateCrafterRecipes smelting()
        {
        return smeltingBase;
        }
    
    }
    
    

    J’ai donc une erreur sur

    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
       }
    
           public Map getSmeltingList()
      {
              return this.smeltingList;
           }
    
    • isSameKey - The method isSameKey(ItemStack[], ItemStack[]) is undefined for the type PlateCrafterRecipes - Me demande de crée la méthode
    • .getKey - The method getKey() is undefined for the type Multiset.Entry - me demande d’ajout un cast to ‘entry’
    • getValue - The method getValue() is undefined for the type Multiset.Entry - me demande d’ajout un cast to ‘entry’
    • this.smeltingList - Type mismatch: cannot convert from HashMap to MappingChange.Map - Me demande de Add Cast to Mash ; Change method return to ‘HashMap’ ; change type of ‘SmeltingList’ to Map

  • Il te manque la fonction “isSameKey”, et ton remplace ton smeltingList : [size=small private Map smeltingList = new HashMap();]


  • J’ai pas trop compris il fallait rempalcer quoi
    Mais j’ai bien corriger quelques erreurs

    Classe actuelle

    package eryah.usefulthings.recipes;
    
    import java.util.HashMap;
    
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    
    import com.google.common.collect.Multiset.Entry;
    import com.sun.javafx.collections.MappingChange.Map;
    
    public class PlateCrafterRecipes {
    
    private static final PlateCrafterRecipes smeltingBase = new PlateCrafterRecipes(); //Permet d'instancier votre classe car vous le l'instancierez nul part ailleur
    private HashMap smeltingList = new HashMap(); //Ceci permet de mettre vos recettes
    
    public PlateCrafterRecipes()
    {
    this.addRecipe(Items.iron_ingot, 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) //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, stack1);
    }
    
           public void addRecipe(Item item1, ItemStack stack) //1er cas
    {
    this.addRecipe(new ItemStack(item1), stack);
    }
    
           public ItemStack getSmeltingResult(ItemStack[] stack) //En argument : un tableau avec le contenu des trois slots d'input
      {
          java.util.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
       }
    
           public HashMap getSmeltingList()
      {
              return this.smeltingList;
           }
    
      public static PlateCrafterRecipes smelting()
      {
      return smeltingBase;
      }
    
      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*.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;
    }
    
    }
    
    

  • Mauvais imports :

    
    import com.google.common.collect.Multiset.Entry;
    import com.ibm.icu.util.BytesTrie.Iterator;
    import com.sun.javafx.collections.MappingChange.Map;
    

  • Les erreus 
    getValue
    et getKey sont toujours là

    package eryah.usefulthings.recipes;
    
    import java.util.HashMap;
    
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import com.google.common.collect.Multiset.Entry;
    import com.ibm.icu.util.BytesTrie.Iterator;
    import com.sun.javafx.collections.MappingChange.Map;
    
    import com.google.common.collect.Multiset.Entry;
    
    public class PlateCrafterRecipes {
    
    private static final PlateCrafterRecipes smeltingBase = new PlateCrafterRecipes(); //Permet d'instancier votre classe car vous le l'instancierez nul part ailleur
    private HashMap smeltingList = new HashMap(); //Ceci permet de mettre vos recettes
    
    public PlateCrafterRecipes()
    {
    this.addRecipe(Items.iron_ingot, 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) //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, stack1);
    }
    
            public void addRecipe(Item item1, ItemStack stack) //1er cas
    {
    this.addRecipe(new ItemStack(item1), stack);
    }
    
            public ItemStack getSmeltingResult(ItemStack[] stack) //En argument : un tableau avec le contenu des trois slots d'input
        {
            java.util.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
         }
    
            public HashMap getSmeltingList()
        {
               return this.smeltingList;
            }
    
       public static PlateCrafterRecipes smelting()
        {
        return smeltingBase;
        }
    
       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*.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;
    }
    
    }
    
    

    The method getKey() is undefined for the type Multiset.Entry
    The method getValue() is undefined for the type Multiset.Entry


  • T’y est toujours pas :

    import com.google.common.collect.Multiset.Entry;
    import com.ibm.icu.util.BytesTrie.Iterator;
    import com.sun.javafx.collections.MappingChange.Map;
    
    import com.google.common.collect.Multiset.Entry;
    

    Il faut utiliser les imports de java. Il faut que tu y mettes du tiens si tu veux vraiment qu’on t’aide.


  • Après avoir testé 5/6 des imports possible, j’ai enfin trouvé ceului qu’il faut c’est bon
    ( Si il y a encore un problème… --’ ) Les Imports

    ​import java.util.HashMap;
    import java.util.Map.Entry;
    
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;