#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)