Un fichier de configuration


  • Administrateurs

    Comme vous le savez sûrement, il est impossible de mettre deux blocs ou deux items sur un même id, donc si deux mods utilisent un même id ils seront incompatible entre eux.
    Heureusement, forge vous permet de créer facilement un fichier de configuration afin que les utilisateurs de votre mod puissent changer facilement les id de votre mod.

    Au tout début de votre méthode preInit, ajoutez ceci :

    //Configuration
    Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
    try
    {
        cfg.load();
    }
    catch(Exception ex)
    {
        event.getModLog().severe("Failed to load configuration");
    }
    finally
    {
        if(cfg.hasChanged())
        {
            cfg.save();
        }
    }
    

    Pensez à importer "net.minecraftforge.common.Configuration"
    On instancie la classe configuration de forge avec le fichier event.getSuggestedConfigurationFile(). Cette méthode renvoie sur <dossier .minecraft ou le dossier du serveur>/config/<votre modid>.cfg
    Vous pouvez utiliser new File(event.getModConfigurationDirectory() + "/nom.cfg") pour avoir un nom différent.
    Ensuite, on essaye de charger les configurations, à la suite de ce code on ajoutera toute les configurations. Si le chargement des configurations fail, ce sera signaler dans les logs grâce à ça :
    event.getModLog().severe("Failed to load configuration");
    Et pour finir, si les configuration ont changés, elles sont sauvegardés.

    Maintenant, à la suite de vos déclarations, déclarez des int qui fond correspondre à vos ids, par exemple dans mon cas :

    public static int BlockTutorialID, TutorialMetadataID, ItemTutorialID, ItemWithMetadataID, TutorialHelmetID,
    TutorialChestPlateID, TutorialLeggingsID, TutorialBootsID;
    

    Ensuite, après la méthode cfg.load(); ajoutez ceci :

    BlockTutorialID = cfg.getBlock("Block Tutoriel", 2000).getInt();
    TutorialMetadataID = cfg.getBlock("Block Tutoriel Metadata", 2001).getInt();
    
    ItemTutorialID = cfg.getItem("Item Tutoriel", 12000).getInt();
    ItemWithMetadataID = cfg.getItem("Item With Metadata", 12001).getInt();
    

    Si l'int de getBlock est supérieurs au maximum d'id de bloc disponible ou inférieur à 256, forge mettra automatiquement un autre id. Même chose pour le getItem, si l'id entre en conflit avec les id de bloc, il sera changé automatiquement.
    Au cas où vous ne l'aurez pas comprit, 2000 est la valeur par défaut.

    Vous pouvez également commenter vos configuration en ajoutant le commentaire en chaîne de caractère après l'id :

    BlockTutorialID = cfg.getBlock("Block Tutoriel", 2000, "ceci est un commentaire").getInt();
    

    getBlock met automatique dans la catégorie bloc, vous pouvez également me mettre dans un autre catégorie :

    BlockTutorialID = cfg.getBlock("Ma catégorie", "Block Tutoriel", 2000, "ceci est un commentaire").getInt();
    

    Il ne reste pluqu'à attribuer la valeur BlockTutorialID à l'id de mon bloc :

    BlockTutorial = new BlockTutorial(2000).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep)
    .setUnlocalizedName("BlockTutorial").setTextureName("modtutoriel:BlockTutorial");
    

    Devient :

    BlockTutorial = new BlockTutorial(BlockTutorialID).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep)
    .setUnlocalizedName("BlockTutorial").setTextureName"modtutoriel:BlockTutorial");
    

    Même chose pour les items :

    ItemTutorial = new ItemTutorial(ItemTutorialID).setUnlocalizedName("ItemTutorial").setTextureName("modtutoriel:ItemTutorial");
    

    Si vous utilisez un bloc dans la génération de biome, son id doit être inférieur à 255, vous ne pouvez donc pas utiliser getBlock, il faut utiliser :

    CustomTerrainBlockID = cfg.getTerrainBlock(cfg.CATEGORY_BLOCK, "Terrain Block", 250, "used in biome gen, id must be < 255").getInt();
    

    Pour un boolean il faut utiliser .getBoolean(valeur par défaut);, pour un nom .getString() et pour un double, .getDouble(valeur par défaut);

    Vous pouvez utiliser cfg.get(catégorie, clé, valeur par défaut, commentaire) ou juste cfg.get(catégorie, clé, valeur par défaut) pour utiliser une autre catégorie.

    Rendu final sur github



  • TRÈS utile !

    C'est quelque chose que tout les mods devraient avoir !



  • Très utile ! Juste que j'ai pas compris les 2 dernières phrases ^^ : Les boolean etc… c'est pour créer nos propres paramètres c'est ça ?
    Car si l'on ne peut pas faire des paramètres spécifiques à notre mod c'est pas si pratique que ça.


  • Administrateurs

    Oui, par exemple tu peux déclarer une boolean :
    public static boolean spawndemob;

    Ensuite dans le fichier de config :
    spawndemob = cfg.get("Mob spawn"), "Spawn de mon mob", true).getBoolean(true);
    Et pour finir, dans la déclaration de ton mob :
    if(spawndemob)
    {
    EntityRegistry.addSpawn(MonMob.class, …..
    }

    Même principe pour les double et les String

    Et puis sinon regardez les mods open source pour des bon exemple ^^ :
    https://github.com/robin4002/PlayerHeadDrop/blob/master/forge1.6.2/fr/mcnanotech/playerhead/PlayerHeadDrop.java#L32



  • Ah génial ça !! J'achète ! Merci !! (Et moi qui allais créer ma propre méthode cfg…)



  • Salut,

    Je n'ai pas compris cette partie :

    Maintenant, à la suite de vos déclarations, déclarez des int qui fond correspondre à vos ids, par exemple dans mon cas :

    public static int BlockTutorialID, TutorialMetadataID, ItemTutorialID, ItemWithMetadataID, TutorialHelmetID, TutorialChestPlateID, TutorialLeggingsID, TutorialBootsID;

    Ou faut-il déclarer la méthode?

    J'ai essayer dans plusieurs endroits mais j'ai une erreur " Illegal modifier for parameter CaisseDeBoisID; only final is permitted " qui me remplace mon " public static int CaisseDeBoisID; " par " int CaisseDeBoisID; ".

    Merci d'avance.


  • Administrateurs

    Dans ce genre de situation github est très pratique comme tu peux avoir un rendu de des lignes ajoutées/supprimées et tu peux voir clairement où. Donc tu peux cliquer sur "rendu final sur github" ou ici :
    https://github.com/MCNanotech/ModTutoriel/commit/522d57cbe78d87a0f15d3fe5daca608be3d8684e

    Et si github ne te conviens pas, il faut le placer après l'accolade de la classe :

    public class MaClassePrincipale
    {
    public static int exemple, exemple2;
    […]
    


  • Ah merci beaucoup !



  • Très bon tuto ! Petite question, peux-t-on modifier les valeurs via Java ?



  • @'MrAzErTy31':

    Très bon tuto ! Petite question, peux-t-on modifier les valeurs via Java ?

    Que veux tu dire par là ?



  • Editer les clés via du code Java


  • Administrateurs

    En 1.7.10, oui : http://minalien.com/minecraft-forge-feature-spotlight-config-guis/
    (j'avais pas compris ce que tu voulais dire au début).



  • Super tuto ^^

    Cepandant, comme ajouter des lignes de commentaire # dans le fichier config ?

    Merci



  • @'UnknowOrigin':

    Super tuto ^^

    Cepandant, comme ajouter des lignes de commentaire # dans le fichier config ?

    Merci

    En 1.7/1.8, ou 1.6 ?



  • en 1.7.10, j'ai pas pensé a préciser… Désolé ^^'


  • Administrateurs

    cfg.getInt("Ma catégorie", "nom", valeur, "ceci est un commentaire").getInt();



  • Ha ok d’accord… je pensais qu'il fallait utilisé un truc propre au commentaire, mais en faite non ^^, Merci

    Par contre, y'a pas moyen de les classers dans l'ordre ou il sont coder ? Et pourquoi certain on des "" et d'autre non ? oO

    ​ Config.modAdmin1 = cfg.get("Mod Admins", "Premier Admin", Config.modAdmin1,"Entrez le nom d'un admin qui aura l'accès aux blocs spawner").getString();
    
         Config.modAdmin2 = cfg.get("Mod Admins", "Deuxieme Admin", Config.modAdmin2,"Entrez le nom d'un admin qui aura l'accès aux blocs spawner").getString();
         Config.modAdmin3 = cfg.get("Mod Admins", "Troisieme Admin", Config.modAdmin3,"Entrez le nom d'un admin qui aura l'accès aux blocs spawner").getString();
    
         Config.ecosysteme = cfg.get("Ecosysteme", "Active", Config.ecosysteme).getBoolean();
         Config.repopBouftou = cfg.get("Ecosysteme", "Delais du spawner Bouftou en ticks", Config.repopBouftou).getInt();
    
         Config.nameMobs = cfg.get("Monstres", "Afficher les noms", Config.nameMobs).getBoolean();
         Config.dropMobs = cfg.get("Monstres", "Lacher les Drops", Config.dropMobs).getBoolean();
         Config.sizeGenMobs = cfg.get("Monstres", "Taille fixe", Config.sizeGenMobs).getBoolean();
         Config.diffSizeMobs = cfg.get("Monstres", "Difference de taille", Config.diffSizeMobs).getDouble();
    
         Config.forceBoufton = cfg.get("Boufton/Bouftou", "Force du Boufton", Config.forceBoufton).getDouble();
         Config.speedBoufton = cfg.get("Boufton/Bouftou", "Vitesse du Boufton", Config.speedBoufton).getDouble();
         Config.healthBoufton = cfg.get("Boufton/Bouftou", "Vie du Boufton", Config.healthBoufton).getDouble();
         Config.knockhBoufton = cfg.get("Boufton/Bouftou", "Resistance du Boufton", Config.knockhBoufton).getDouble();
         Config.forceBouftou = cfg.get("Boufton/Bouftou", "Force du Bouftou", Config.forceBouftou).getDouble();
         Config.speedBouftou = cfg.get("Boufton/Bouftou", "Vitesse du Bouftou", Config.speedBouftou).getDouble();
         Config.healthBouftou = cfg.get("Boufton/Bouftou", "Vie du Bouftou", Config.healthBouftou).getDouble();
         Config.knockhBouftou = cfg.get("Boufton/Bouftou", "Resistance du Bouftou", Config.knockhBouftou).getDouble();
         Config.rangeAggroBouftou = cfg.get("Boufton/Bouftou", "Portee d'agression", Config.rangeAggroBouftou).getDouble();
         Config.speedAggroBouftou = cfg.get("Boufton/Bouftou", "Vitesse de Poursuite", Config.speedAggroBouftou).getDouble();
         Config.sizeBouftou = (float) cfg.get("Boufton/Bouftou", "Taille", Config.sizeBouftou).getDouble();
         Config.vieillesseBouftou = cfg.get("Boufton/Bouftou", "Vieillit tout les X ticks", Config.vieillesseBouftou).getInt();
         Config.evolutionBouftou = cfg.get("Boufton/Bouftou", "Evolue au X ticks", Config.evolutionBouftou).getInt();
         Config.naissance1Bouftou = cfg.get("Boufton/Bouftou", "Premiere naissance au X ticks", Config.naissance1Bouftou).getInt();
         Config.naissance2Bouftou = cfg.get("Boufton/Bouftou", "Deuxieme naissance au X ticks", Config.naissance2Bouftou).getInt();
         Config.mortBouftou = cfg.get("Boufton/Bouftou", "Duree de vie en ticks", Config.mortBouftou).getInt();
         Config.aleaBouftou = cfg.get("Boufton/Bouftou", "Delais max des naissances", Config.aleaBouftou).getInt();
    
    # Configuration file
    
    "boufton/bouftou" {
       I:"Delais max des naissances"=500
       I:"Deuxieme naissance au X ticks"=1800
       I:"Duree de vie en ticks"=3600
       I:"Evolue au X ticks"=400
       D:"Force du Boufton"=1.0
       D:"Force du Bouftou"=2.0
       D:"Portee d'agression"=1.0
       I:"Premiere naissance au X ticks"=1200
       D:"Resistance du Boufton"=0.5
       D:"Resistance du Bouftou"=0.7
       D:Taille=0.949999988079071
       D:"Vie du Boufton"=16.0
       D:"Vie du Bouftou"=22.0
       I:"Vieillit tout les X ticks"=80
       D:"Vitesse de Poursuite"=1.26
       D:"Vitesse du Boufton"=0.26
       D:"Vitesse du Bouftou"=0.26
    }
    
    ecosysteme {
       B:Active=true
       I:"Delais du spawner Bouftou en ticks"=1200
    }
    
    "mod admins" {
       # Entrez le nom d'un admin qui aura l'accès aux blocs spawner
       S:"Deuxieme Admin"=
    
       # Entrez le nom d'un admin qui aura l'accès aux blocs spawner
       S:"Premier Admin"=Kujaroth
    
       # Entrez le nom d'un admin qui aura l'accès aux blocs spawner
       S:"Troisieme Admin"=
    }
    
    monstres {
       B:"Afficher les noms"=true
       D:"Difference de taille"=0.025
       B:"Lacher les Drops"=true
       B:"Taille fixe"=false
    }
    


  • @'UnknowOrigin':

    Ha ok d’accord… je pensais qu'il fallait utilisé un truc propre au commentaire, mais en faite non ^^, Merci

    Par contre, y'a pas moyen de les classers dans l'ordre ou il sont coder ? Et pourquoi certain on des "" et d'autre non ? oO

     Config.modAdmin1 = cfg.get("Mod Admins", "Premier Admin", Config.modAdmin1,"Entrez le nom d'un admin qui aura l'accès aux blocs spawner").getString();
    
         Config.modAdmin2 = cfg.get("Mod Admins", "Deuxieme Admin", Config.modAdmin2,"Entrez le nom d'un admin qui aura l'accès aux blocs spawner").getString();
         Config.modAdmin3 = cfg.get("Mod Admins", "Troisieme Admin", Config.modAdmin3,"Entrez le nom d'un admin qui aura l'accès aux blocs spawner").getString();
        
         Config.ecosysteme = cfg.get("Ecosysteme", "Active", Config.ecosysteme).getBoolean();
         Config.repopBouftou = cfg.get("Ecosysteme", "Delais du spawner Bouftou en ticks", Config.repopBouftou).getInt();
            
         Config.nameMobs = cfg.get("Monstres", "Afficher les noms", Config.nameMobs).getBoolean();
         Config.dropMobs = cfg.get("Monstres", "Lacher les Drops", Config.dropMobs).getBoolean();
         Config.sizeGenMobs = cfg.get("Monstres", "Taille fixe", Config.sizeGenMobs).getBoolean();
         Config.diffSizeMobs = cfg.get("Monstres", "Difference de taille", Config.diffSizeMobs).getDouble();
                    
         Config.forceBoufton = cfg.get("Boufton/Bouftou", "Force du Boufton", Config.forceBoufton).getDouble();
         Config.speedBoufton = cfg.get("Boufton/Bouftou", "Vitesse du Boufton", Config.speedBoufton).getDouble();
         Config.healthBoufton = cfg.get("Boufton/Bouftou", "Vie du Boufton", Config.healthBoufton).getDouble();
         Config.knockhBoufton = cfg.get("Boufton/Bouftou", "Resistance du Boufton", Config.knockhBoufton).getDouble();
         Config.forceBouftou = cfg.get("Boufton/Bouftou", "Force du Bouftou", Config.forceBouftou).getDouble();
         Config.speedBouftou = cfg.get("Boufton/Bouftou", "Vitesse du Bouftou", Config.speedBouftou).getDouble();
         Config.healthBouftou = cfg.get("Boufton/Bouftou", "Vie du Bouftou", Config.healthBouftou).getDouble();
         Config.knockhBouftou = cfg.get("Boufton/Bouftou", "Resistance du Bouftou", Config.knockhBouftou).getDouble();
         Config.rangeAggroBouftou = cfg.get("Boufton/Bouftou", "Portee d'agression", Config.rangeAggroBouftou).getDouble();
         Config.speedAggroBouftou = cfg.get("Boufton/Bouftou", "Vitesse de Poursuite", Config.speedAggroBouftou).getDouble();
         Config.sizeBouftou = (float) cfg.get("Boufton/Bouftou", "Taille", Config.sizeBouftou).getDouble();
         Config.vieillesseBouftou = cfg.get("Boufton/Bouftou", "Vieillit tout les X ticks", Config.vieillesseBouftou).getInt();
         Config.evolutionBouftou = cfg.get("Boufton/Bouftou", "Evolue au X ticks", Config.evolutionBouftou).getInt();
         Config.naissance1Bouftou = cfg.get("Boufton/Bouftou", "Premiere naissance au X ticks", Config.naissance1Bouftou).getInt();
         Config.naissance2Bouftou = cfg.get("Boufton/Bouftou", "Deuxieme naissance au X ticks", Config.naissance2Bouftou).getInt();
         Config.mortBouftou = cfg.get("Boufton/Bouftou", "Duree de vie en ticks", Config.mortBouftou).getInt();
         Config.aleaBouftou = cfg.get("Boufton/Bouftou", "Delais max des naissances", Config.aleaBouftou).getInt();
    
    # Configuration file
    
    "boufton/bouftou" {
       I:"Delais max des naissances"=500
       I:"Deuxieme naissance au X ticks"=1800
       I:"Duree de vie en ticks"=3600
       I:"Evolue au X ticks"=400
       D:"Force du Boufton"=1.0
       D:"Force du Bouftou"=2.0
       D:"Portee d'agression"=1.0
       I:"Premiere naissance au X ticks"=1200
       D:"Resistance du Boufton"=0.5
       D:"Resistance du Bouftou"=0.7
       D:Taille=0.949999988079071
       D:"Vie du Boufton"=16.0
       D:"Vie du Bouftou"=22.0
       I:"Vieillit tout les X ticks"=80
       D:"Vitesse de Poursuite"=1.26
       D:"Vitesse du Boufton"=0.26
       D:"Vitesse du Bouftou"=0.26
    }
    
    ecosysteme {
       B:Active=true
       I:"Delais du spawner Bouftou en ticks"=1200
    }
    
    "mod admins" {
       # Entrez le nom d'un admin qui aura l'accès aux blocs spawner
       S:"Deuxieme Admin"=
    
       # Entrez le nom d'un admin qui aura l'accès aux blocs spawner
       S:"Premier Admin"=Kujaroth
    
       # Entrez le nom d'un admin qui aura l'accès aux blocs spawner
       S:"Troisieme Admin"=
    }
    
    monstres {
       B:"Afficher les noms"=true
       D:"Difference de taille"=0.025
       B:"Lacher les Drops"=true
       B:"Taille fixe"=false
    }
    

    Il faut faire une liste de String et chaque fois tu mets cfg.getName() (je suis plus sur du nom de la fonction) et à la fin, tu fais cfg.orderList(liste) (quelque chose comme ça, au pire, regarde dans fml, il y a un exemple)


  • Administrateurs

    Pour l'ordre non, c'est trié par ordre alphabétique.
    Pour les " " qui apparaisse dès fois, c'est lorsque tu mets des espaces ou des / ou autres caractères qui ne font pas partie de l'alphabet dans le nom.



  • @'robin4002':

    Pour l'ordre non, c'est trié par ordre alphabétique.
    Pour les " " qui apparaisse dès fois, c'est lorsque tu mets des espaces ou des / ou autres caractères qui ne font pas partie de l'alphabet dans le nom.

    Par défaut c'est ranger par ordre alphabétique, mais lui veut le mettre dans l'ordre où il les mets dans sa classe.