1. Le forum de Minecraft-France va définitivement fermer ses portes. Celui-ci restera en lecture seule mais vous ne pourrez plus y apporter de nouveaux topics. Nous vous invitons à nous rejoindre sur le Discord de Minecraft-France qui permet de présenter vos projets, discuter avec la communauté etc.. Merci à tous d'avoir fait vivre ce forum de nombreuses années. Pour nous rejoindre sur Discord, Cliquez ici

Résolu Changer valeurs des outils dans Minecraft en 1.9.4

Discussion dans 'Aide à la création de mod' créé par Jean-Minecraft, 19 Août 2017.

  1. Jean-Minecraft

    Jean-Minecraft Nouveau

    Inscrit:
    19 Août 2017
    Messages:
    5
    Points:
    0
    Sexe:
    Homme
    Bonjour, je suis nouveau sur le forum.
    J'aurais une demande à vous faire, comme le titre l'indique, j'essaye de modifier la vitesse d'attaque et les dégâts donné par les outils en or. Le problème c'est que lorsque j'essaye mes outils avec le Minecraft lancé par éclipse, les valeurs sont modifié mais lorsque j'exporte mon mod, en jeu les outils ont leurs valeurs d'origine...

    Merci pour votre éclairage !
     
  2. robin4002

    robin4002 Support Technique
    Staff

    Inscrit:
    17 Août 2012
    Messages:
    5 478
    Points:
    229
    Sexe:
    Homme
    Salut,
    Quel code utilises-tu pour modifier les valeurs ?
     
  3. Jean-Minecraft

    Jean-Minecraft Nouveau

    Inscrit:
    19 Août 2017
    Messages:
    5
    Points:
    0
    Sexe:
    Homme
    Bonjour, merci de la réponse.
    Le code que j'utilise c'est celui là:

    Code (cpp):
    package monpaquet;

    import java.lang.reflect.Field;

    import net.minecraft.init.Items;
    import net.minecraft.item.ItemHoe;
    import net.minecraft.item.ItemSword;
    import net.minecraft.item.ItemTool;

    public class ToolEffect
    {
        public static void tooEffect()
        {
          try
           {
                Field field = ItemTool.class.getDeclaredField("damageVsEntity");
                field.setAccessible(true);
                try
                {
                    field.set(Items.GOLDEN_SHOVEL, 4.0F);
                }
                catch (IllegalArgumentException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
             
                try
                {
                    field.set(Items.GOLDEN_PICKAXE, 3.5F);
                }
                catch (IllegalArgumentException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
             
                try
                {
                    field.set(Items.GOLDEN_AXE, 8.0F);
                }
                catch (IllegalArgumentException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
                field.setAccessible(false);
             
                Field field2 = ItemSword.class.getDeclaredField("attackDamage");
                field2.setAccessible(true);
             
                try
                {
                    field2.set(Items.GOLDEN_SWORD, 5.5F);
                }
                catch (IllegalArgumentException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
                field2.setAccessible(false);
             
                Field field3 = ItemHoe.class.getDeclaredField("speed");
                field3.setAccessible(true);
             
                try
                {
                    field3.set(Items.GOLDEN_HOE, 3.5F);
                }
                catch (IllegalArgumentException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
                field3.setAccessible(false);
            }
           catch (NoSuchFieldException e)
            {
                e.printStackTrace();
            }
           catch (SecurityException e)
            {
                e.printStackTrace();
            }
        }
    }
    Désolé si l'apparence n'est pas très clair...
     
    #3 Jean-Minecraft, 20 Août 2017
    Dernière édition par un modérateur: 20 Août 2017
  4. robin4002

    robin4002 Support Technique
    Staff

    Inscrit:
    17 Août 2012
    Messages:
    5 478
    Points:
    229
    Sexe:
    Homme
    J'ai mis la balise code pour plus de lisibilité.

    Le problème est que les variables damageVsEntity, attackDamage et speed n'ont pas le même nom une fois le mod compilé, elles ont un nom obfusqué.

    Ouvres le dossier suivant : C:\Users\<nom de ta session>\.gradle\caches\minecraft\de\oceanlabs\mcp\
    dans ce dossier il y aura un dossier mcp_stable et/ou un dossier mcp_snapshot en fonction de ce que tu as dans le fichier build.gradle de ton mdk forge.

    Ensuite tu as un dossier ayant pour nom une date (pour le mcp_snapshot) ou un numéro (pour les mcp_stable) et enfin tu aura un fichier fields.csv que tu peux ouvrir avec excel / libre office calc ou n'importe quel éditeur de texte.

    Dans le fichier tu pourra chercher "damageVsEntity" et trouver une ligne comme ceci :
    "field_77865_bY,damageVsEntity,2,Damage versus entities."
    Ça c'est avec les mappings stable_20 (qui sont conçu pour la 1.10.2).

    Donc une fois compilé le nom de la variable est field_77865_bY.

    Note : tu peux utiliser ObfuscationReflectionHelper.setPrivateValue(ClasseAAcceder.class, instance, valeur, "nom de la variable normal", "nom de la variable obfusquée");
    pour avoir un code qui fonctionne à la fois sur eclipse et une fois le jeu compilé.
    Exemple :
    Code (cpp):
    ObfuscationReflectionHelper.setPrivateValue(ItemTool.class, Items.GOLDEN_SHOVEL, 4.0F, "damageVsEntity", "field_77865_bY");
     
  5. Jean-Minecraft

    Jean-Minecraft Nouveau

    Inscrit:
    19 Août 2017
    Messages:
    5
    Points:
    0
    Sexe:
    Homme
    Merci, cela fonctionne.
    Donc "damageVSEntity" = "field_77865_bY"
    "attackDamage" = "field_150934_a"
    "speed" = "field_185072_b".

    J'ai donc du recréer une classe pour le mod en jeu.
    Le problème est donc résolu.

    La variable que tu m'as donné:
    ObfuscationReflectionHelper.setPrivateValue(ItemTool.class, Items.GOLDEN_SHOVEL, 4.0F, "damageVsEntity", "field_77865_bY");
    Je l'avais essayé mais j'ai une erreur de disant que cela n'est pas applicable pour la classe ItemTool.
     

Partager cette page