Supprimer le craft d'un autre mod



  • Bonjour alors voila je voudrais supprimer des craft d'un autre mod dont je n'ai pas les sources, en gros supprimer des craft du mod IronChest en 1.7.10 seulement sur le github il n'y a pas de branche 1.7.10 je voulais savoir comment faire pour récuperer la recette et l'annuler.
    Supprimer un craft je sais faire je bloc ici :

    removeRecipe(new ItemStack(???));
    

    Je ne sais pas quoi mettre dans mon ItemStack.


  • Rédacteurs

    Là ça supprime TOUS les crafts du mod ironchest (plus précisément : tous les crafts qui ont pour résultat un objet du mod ironchest), si tu ne veux en supprimer que quelques-uns sans connaitre les noms des objets, ça va être compliqué

    
    Iterator <irecipe>it = CraftingManager.getInstance().getRecipeList().iterator();
    while(it.hasNext()) {
    IRecipe recipe = it.next();
    UniqueIdentifier uid = GameRegistry.findUniqueIdentifierFor(recipe.getRecipeOutput().getItem());
    if(uid.modId.equalsIgnoreCase("ironchest")) {
    it.remove();
    }
    }
    
    ```</irecipe>


  • je peux connaitre les noms en ouvrant avec JavaDecompiler


  • Rédacteurs

    Tu n'as qu'à modifier la condition :

    
    List <integer>metadatas = Arrays.asList(1);
    /**
    * Metadatas :
    * 0.Iron, 1.GOLD, 2.DIAMOND, 3.COPPER, 4.SILVER, 5.CRYSTAL, 6.OBSIDIAN, 7.DIRTCHEST9000, 8.WOOD
    * – il me semble que c'est ça --
    */
    Iterator <irecipe>it = CraftingManager.getInstance().getRecipeList().iterator();
    while(it.hasNext()) {
    IRecipe recipe = it.next();
    int metadata = recipe.getRecipeOutput().getItemDamage();
    UniqueIdentifier uid = GameRegistry.findUniqueIdentifierFor(recipe.getRecipeOutput().getItem());
    if(uid.modId.equalsIgnoreCase("ironchest") && uid.name.equalsIgnoreCase("blockironchest") && metadatas.contains(metadata)) {
    it.remove();
    }
    }
    
    ```</irecipe></integer>

  • Administrateurs

    Salut,
    Autre solution :

    removeRecipe(GameRegistry.findItemStack("modid", "nom de l'item ou du bloc"));
    


  • J'ai testé avec la solution de Robin et j'ai un crash:

    Mon code:

    removeRecipe(GameRegistry.findItemStack("IronChest", "ironchest:CRYSTAL", 0));
    

  • Administrateurs

    NullPointerException donc il n'a pas trouvé l'item, donc ce n'est pas le bon nom.
    Je pense que c'est plutôt comme ça :
    removeRecipe(GameRegistry.findItemStack("IronChest", "BlockIronChest", 5));
    (modid -> https://github.com/cpw/ironchest/blob/master/src/main/java/cpw/mods/ironchest/IronChest.java#L35)
    (nom du bloc dans le registre -> https://github.com/cpw/ironchest/blob/master/src/main/java/cpw/mods/ironchest/IronChest.java#L58)
    (et le metadata je crois que c'est 5, à vérifier)

    Sinon pour éviter le crash si l'item n'est pas trouvé, tu peux faire comme ça :

    ItemStack cystalChest = GameRegistry.findItemStack("IronChest", "BlockIronChest", 5);
    if(cystalChest != null)
    {
       removeRecipe(cystalChest );
    }
    else
    {
       System.out.println("cystal chest not found !");
    }
    

  • Rédacteurs

    Le troisième argument c'est le stackSize par contre, donc la solution de robin devrait être bonne :

    
    ItemStack stack = GameRegistry.findItemStack("IronChest", "BlockIronChest", 1);
    if(stack != null) {
    stack.setItemDamage(5);
    removeRecipe(stack);
    } else {
    // …
    }
    
    


  • Merci à vous deux, j'ai pas réussi avec le code de Robin je n'arrivais pas à récupérer le métadata avec :

    removeRecipe(GameRegistry.findItemStack("IronChest", "BlockIronChest", 5));
    

    j'ai testé:

    removeRecipe(GameRegistry.findItemStack("IronChest", "BlockIronChest", 1, 5));
    

    Comme on peut le faire pour une pomme en or par exemple:

    removeRecipe(new ItemStack(Items.golden_apple, 1 ,1));
    

    Mais le .findItemStack n'accepte pas le deuxième int qui corresponds au métadata il prend que le stackSize.

    J'ai donc pris le code BrokenSwing et niquel .

    Juste une petite précision le setDamageItem(5) permet de récupérer un métadata d'après ce que je vois? j'aurai pas cru dans ma tête setItemDamage c'était plus pour mettre des dommages….


  • Rédacteurs

    Métadata == durabilité (en gros)



  • Ah d'accord merci 🙂