Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/04/2012, à 22:05

compte supprimé

Script pour séparer les mods de Minecraft

[EDIT] : Topic à présent inutile depuis que le nouveau launcher de Minecraft supporte les profils séparés.

J'apprend à créer des scripts Bash avec le tuto du Site du Zéro. J'en suis aux conditions (if), et j'en profite pour créer un petit script auquel je pensais depuis pas mal de temps. Je m'explique.

Minecraftien depuis deux ans à peu près, j'ai toujours aimé tester des mods qui élargissent encore plus les possibilités du jeu. Mais après plusieurs mois d'installations/désinstallations en tous genres, de "Force update" pour supprimer les mods (qui ne l'étaient pas totalement), mon dossier .minecraft était devenu totalement corrompu par des fichiers obsolètes, des parties injouables, des paramètres dépassés, etc. Ajoutez à cela les snapshots (sortes de versions Bêta de la prochaine MàJ du jeu, souvent instables, publiées parfois à raison d'une par semaine) qui sortent régulièrement et que j'adore installer pour me faire une idée de la prochaine mise à jour - et qui m'empêchent également de me connecter à mes serveurs préférés -, et vous connaîtrez toutes les raisons qui m'ont poussé à me priver de mods, pour enfin avoir un jeu "sain".

Je trouve toutefois dommage de laisser tomber cet aspect du jeu uniquement pour des raisons techniques. J'ai donc prévu ce petit script, dont le fonctionnement est très simple : j'ai dans mon home deux dossiers .minecraft isolés, l'un "expérimental" avec mods et snapshots, et l'autre "sain" pour pouvoir jouer tranquillement et me connecter à tous les serveurs que je veux. Je crée artificiellement avec la commande touch un fichier "mod", sorte de témoin me permettant de vérifier que j'ai bien affaire au Minecraft expérimental. Je me contente d'échanger les noms des dossiers (chacun a un nom différent quand il n'est pas utilisé : .minecraft.norm pour le normal et .minecraft.mod pour les mods), et j'ai ainsi deux jeux complètement isolés l'un de l'autre, l'expérimental formant une sorte de sandbox.

Voici le code :

#!/bin/bash
if [ -e ~/.minecraft/mod ] ; then
    echo 'Mods -> Normal'
    mv ~/.minecraft ~/.minecraft.mod
    if [ -e ~/.minecraft.norm ] ; then
        mv ~/.minecraft.norm ~/.minecraft
    else
        echo "Le dossier normal n'existe pas."
    fi
elif [ -e ~/.minecraft ] ; then
    echo 'Normal -> Mods'
    mv ~/.minecraft ~/.minecraft.norm
    if [ -e ~/.minecraft.mod ] ; then
        mv ~/.minecraft.mod ~/.minecraft
    else
        "Le dossier mods n'existe pas. Création..."
        mkdir ~/.minecraft ;
        touch ~/.minecraft/mod ;
    fi
fi
echo 'Terminé !'

Je sais bien que ça n'intéressera pas grand-monde, mais au cas où quelqu'un en a besoin, je viens ici le partager. N'hésitez pas à me proposer des améliorations si vous avez des idées.

Dernière modification par Sga64 (Le 07/09/2013, à 01:15)

#2 Le 12/04/2012, à 22:41

Kanor

Re : Script pour séparer les mods de Minecraft

Sans regarder trop tu devrais  plus utiliser les lien symbolique que faire un mv
un truc comme ça

ln -s ~/.minecraft.mod ~/.minecraft

Hors ligne

#3 Le 13/04/2012, à 10:14

compte supprimé

Re : Script pour séparer les mods de Minecraft

Version 2 du script, avec liens symbolique et quelques améliorations :

#!/bin/bash

# Vérification de l'existence des dossiers
if [ ! -e ~/.minecraft.norm ] ; then
    echo "Le dossier .minecraft.norm n'existe pas."
    if [ -e ~/.minecraft ] && [ ! -L ~/.minecraft ] ; then
        echo "Le dossier .minecraft existe."
        echo "Renommage..."
        mv ~/.minecraft ~/.minecraft.norm
    else
        echo "Création..."
        mkdir ~/.minecraft.norm
    fi
fi
if [ ! -e ~/.minecraft.mod ] ; then
    echo "Le dossier .minecraft.mod n'existe pas."
    echo "Création..."
    mkdir ~/.minecraft.mod
    touch ~/.minecraft.mod/mod
fi

# Vérification de l'existence du lien
if [ ! -e ~/.minecraft ] || [ ! -L ~/.minecraft ] ; then
    echo "Le lien n'existe pas."
    if [ -e ~/.minecraft ] ; then
        echo "Le dossier .minecraft existe."
        echo "Renommage..."
        mv ~/.minecraft ~/.minecraft.save
    fi
    echo "Création du lien..."
    ln -s ~/.minecraft.norm ~/.minecraft
fi

# Changement du lien
if [ -e ~/.minecraft/mod ] ; then
    echo "Mods -> Normal"
    echo "Suppression du lien..."
    rm ~/.minecraft
    echo "Création du nouveau lien..."
    ln -s ~/.minecraft.norm ~/.minecraft
else
    echo "Normal -> Mods"
    echo "Suppression du lien..."
    rm ~/.minecraft
    echo "Création du nouveau lien..."
    ln -s ~/.minecraft.mod ~/.minecraft
fi

#4 Le 14/04/2012, à 02:10

neodc

Re : Script pour séparer les mods de Minecraft

Plutôt que de réinventer la roue je te conseil magic launcher qui fait je pense exactement se que tu veut et plus encore. Je l'utilise personnellement depuis déjà quelque mois et je le trouve parfait.

Hors ligne

#5 Le 12/09/2012, à 17:30

compte supprimé

Re : Script pour séparer les mods de Minecraft

Version 3 du script, en Python cette fois. Il gère désormais autant de dossiers .minecraft que voulu et l'utilisation reste assez simple. La syntaxe est :

./<nom_du_script> <nom_config>

La configuration par défaut est norm, les dossiers correspondants sont nommés suivant ce modèle dans le HOME :

~/.minecraft.<nom_config>

Si la configuration spécifiée n'existe pas, elle est créée automatiquement. La suppression se fait avec la commande :

./<nom_du_script> del <nom_config>

On peut lister les configurations avec :

./<nom_du_script> list

Les configurations disponibles sont listées dans le fichier ~/.mcconfig, le supprimer réinitialise le programme.

Voici donc le script :

#! /usr/bin/env python3

import os
import sys
import shutil

# Si sous Windows, .minecraft est dans APPDATA, sinon il est dans le HOME
if 'win' in sys.platform.lower():
    home = os.getenv('APPDATA')
else:
    home = os.getenv('HOME')

os.chdir(home)
del home

cffile = '.mcconfig'
link = '.minecraft'
rename = 0
configs = list()
actual = str()

# Renvoie le nom du dossier de la configuration cf
dir = lambda cf: '.minecraft.' + cf

def check():
    '''Prépare le lancement du script.'''
    testfiles()
    readconfig()
    testdirs()

def testfiles():
    '''Vérifie l'existence et le type du fichier de configuration et du lien.'''

    global rename

    if os.path.lexists(cffile) and not os.path.isfile(cffile):
        newname = cffile + '.save' + str(rename)
        print("{0} existe déjà et n'est pas un fichier. Renommage en\
 {1}...".format(cffile, newname))
        os.rename(cffile, newname)
        rename += 1

    if not os.path.exists(cffile):
        print("Le fichier {0} n'existe pas. Création...".format(cffile))
        open(cffile, 'w')

    if os.path.lexists(link) and not os.path.islink(link):
        newname = link + '.save' + str(rename)
        print("{0} existe déjà et n'est pas un lien. Renommage en\
 {1}...".format(link, newname))
        os.rename(link, newname)
        rename += 1

def testdirs():
    '''Vérifie l'existence du dossier de chaque configuration.'''

    global rename

    for el in configs:
        d = dir(el)
        if os.path.lexists(d) and not os.path.isdir(d):
            newname = '.minecraft.save' + str(rename)
            print("{0} existe déjà et n'est pas un dossier. Renommage en\
 {1}...".format(d, newname))
            os.rename(d, newname)
            rename += 1

        if not os.path.exists(d):
            print("Le dossier {0} n'existe pas. Création...".format(d))
            os.mkdir(d)

def readconfig():
    '''Lit le fichier, remplit la liste des configurations et supprime le
    lien.
    
    '''

    global configs, actual

    f = open(cffile)
    while True:
        ligne = f.readline()
        if len(ligne) == 0:
            break
        ligne = ligne[:-1]
        if ligne.startswith('#'):
            continue
        if ligne.startswith('*'):
            ligne = ligne[1:]
            actual = ligne
        configs.append(ligne)
    if len(configs) == 0:
        print('Aucune configuration enregistrée. Configuration par défaut :\
 norm.')
        configs.append('norm')
    if actual == '':
        actual = configs[0]
    print('Configuration actuelle : {0}'.format(actual))
    try:
        os.remove(link)
    except OSError:
        pass

def saveconfig():
    '''Écrit la liste des configurations dans le fichier et recrée le lien.'''

    f = open(cffile, 'w')
    for el in configs:
        if el == actual:
            f.write('*')
        f.write(el + '\n')
    os.symlink(dir(actual), link)

def changeactual(new):
    '''Change la configuration courante pour new et modifie le lien.'''

    global actual, configs

    if new == actual:
        print('Aucun changement.')
        return
    if '*' in new:
        raise ValueError("Le nom de la configuration ne doit pas contenir le\
 caractère '*'.")
    if not new in configs:
        configs.append(new)
        testdirs()
    actual = new
    print('Nouvelle configuration : {0}'.format(actual))

def listconfigs():
    '''Affiche la liste des configurations.'''

    print('*** Liste des configurations ***')
    for el in configs:
        print(el)

def delconfig(cf):
    '''Supprime la configuration cf.'''

    global configs, actual

    if not cf in configs:
        raise ValueError("La configuration {0} n'existe pas.".format(cf))
    shutil.rmtree(dir(cf))
    configs.remove(cf)
    if cf == actual:
        if len(configs) == 0:
            changeactual('norm')
        else:
            changeactual(configs[0])

# Exécution
try:
    check()
    args=sys.argv
    if len(args) == 1:
        pass
    elif len(args) == 2 and args[1] == 'list':
        listconfigs()
    elif len(args) == 2:
        changeactual(args[1])
    elif len(args) == 3 and args[1] == 'del':
        delconfig(args[2])
    else:
        raise ValueError('Arguments invalides.')
    saveconfig()
except KeyboardInterrupt:
    print('\nArrêt par le clavier.')
except ValueError as ex:
    print('Erreur : {0}'.format(ex))
except OSError as ex:
    print('Erreur lors de la manipulation des fichiers : {0}'.format(ex))
except Exception as ex:
    print('Erreur inconnue : {0}'.format(ex))

EDIT : Réécriture complète, changement de syntaxe.

Dernière modification par Sga64 (Le 10/10/2012, à 14:01)