Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

Outil de création crclist pour patcher officiel (Python)


Cassegrain

Messages recommandés

Centre de Téléchargement

Hidden Content

    Give reaction to this post to see the hidden content.
( Interne )

Bonsoir,

 

Un petit outil que j'ai codé il y a quelques mois en python car mon anti virus n’appréciait pas un exécutable qui faisait le même genre de boulot.

 

Voici donc un compileur / décompileur .lz pour le patcher officiel qui créé également le crclist avec toutes ses fonctionnalités.

 

 

Utilisation:

 

 

L'outil est codé en python, il se lance donc soit en console soit avec un .bat.

Il prend 4 arguments.

  1. Dossier qui contient les fichiers sur lesquels l'action de compression ou décompression doit être effectuée
  2. Dossier qui contiendra les fichiers une fois l'action réalisée
  3. Nom de l'executable qui compresse les fichiers
  4. Action de l'outil ("pack" pour compresser ou "unpack" pour décompresser)

PatchCrc.bat:

REM "Path to Python Executable" "Path to Python Script" "Path to Input Directory" "Path to Output Directory" "Path to LZ converter" "Action (pack / unpack)"
"D:\Programmes\Python26\python.exe" "PatchCrc.py" "crc" "crclz" "mt2lz.exe" "pack"
pause
 

 

Explications:

 

 

La première ligne est un commentaire, pour se souvenir des arguments pour lancer l'outil.

La deuxième exécute le programme avec l'action de compression avec l'exécutable mt2lz.exe des fichiers qui se trouvent dans le dossier crc en mettant le résultat de l'opération dans le dossier crclz.

La 3ème ligne permet de ne pas fermer la fenêtre à la fin de l'exécution du programme.

 

 

Informations supplémentaires:

 

L'outil n'est pas récursif, il ne gèrera donc que les fichiers dans le dossier indiqué et n'ira pas dans les sous dossiers.

 

Le fichier crcList.txt est créé dans le dossier où l'outil est lancé et ai écrasé à chaque lancement de l'outil.

Si vous voulez faire plusieurs dossiers d'un coup avec un seul .bat, il faudra donc changer le mode d'ouverture du fichier (ligne 26), de "w" pour write en "a" pour append.

 

Le fichier crclist contient toutes les informations dont le patcher peut se servir, je n'ai pas trouvé d'autre tool qui le faisait les voici dans l'ordre des tabulations:

  • Signature crc32
  • Taille en byte
  • Date de dernière modification du fichier 1
  • Date de dernière modification du fichier 2 (fixe)
  • Chemin et nom du fichier

Attention, pour la date 1 et 2, lorsque j'ai codé cet outil je ne savais pas en quel format elle était.

J'ai donc fait pas mal de calculs pour arriver à reproduire la bonne date au format du patcher.

La valeur de date2 est fixe. Tout le calcul est réalisé sur Date1, et 1 sur Date1 équivaut à environ 3 minutes il me semble.

Du coup il peut y avoir un petit décalage de 3 minutes parfois, mais ça ne pose bien sûr aucun problème.

 

 

Screenshot:

 

https://metin2.download/picture/r3F9504x09DVmF8K988YXgTtGTP6KMUj/.gif

 

 

Téléchargement:

 

Inclus dans l'archive:

  • PatchCrc.py
  • PatchCrc.bat
  • mt2lz.ex
  • Fichiers de test
  • Python26 portable (qui se trouve dans le dossier extern/bin des sources, mais vous pouvez utiliser votre propre version si vous le souhaitez en changeant le chemin de l'exécutable dans le .bat comme expliqué au dessus.)

Virus total:

  • mt2lz.exe:

    Hidden Content

      Give reaction to this post to see the hidden content.
  • python26.exe:

    Hidden Content

      Give reaction to this post to see the hidden content.
  • python26.dll:

    Hidden Content

      Give reaction to this post to see the hidden content.

Liens:

  • Mega (rar):

    Hidden Content

      Give reaction to this post to see the hidden content.
  • Mega (zip):

    Hidden Content

      Give reaction to this post to see the hidden content.

Source du .py uniquement:

import sys
import os
import binascii
import subprocess

def DoPatchFromDir(inDir, outDir, lzexeDir, doAction):
curDir = os.getcwd() + "\\"
lzexeDir = os.path.join(curDir, lzexeDir)
inDir = os.path.join(curDir, inDir) + "\\"
outDir = os.path.join(curDir, outDir) + "\\"
fileDir = None
fileDirNew = None
print("// Infos:\nAction = %s\ninDir = \"%s\"\noutDir = \"%s\"\n" % (doAction, inDir, outDir))

if not os.path.isdir(inDir):
	print("!!! Fatal Error : Input directory does not exist\n")
	return
if not os.path.isdir(outDir):
	print("Warning : Output directory does not exist")
	print("Warning : Creating output directory \"%s\"...\n" % (outDir))
	os.mkdir(outDir)

if doAction == "pack":

	print("+ Opening crcList...")
	crcList = open(curDir + "crlist", "w")

	print("++ Scaning input directory \"%s\"..." % (inDir))
	for file in os.listdir(inDir):
		fileDir = os.path.join(inDir, file)
		print("\n+++ Found file \"%s\"" % (file))
		if os.path.isfile(fileDir):
			fileDirNew = os.path.join(outDir, file + ".lz")
			print("++++ Converting file \"%s\"..." % (file))
			subprocess.call([lzexeDir, "pack", fileDir, fileDirNew])
			print("+++++ Writing crcList for file \"%s\"..." % (file))
			crcList.write("%s %s %d %s %s\n" % (getCrc(fileDir), os.stat(fileDir).st_size, getTime(os.stat(fileDir).st_mtime), "2147483648", file))
		else:
			print("+++ Warning : Skipping Directory %s\n" % (file))

	crcList.close()

elif doAction == "unpack":

	print("+ Scaning input directory \"%s\"..." % (inDir))
	for file in os.listdir(inDir):
		fileDir = os.path.join(inDir, file)
		print("\n++ Found file %s" % (file))
		if os.path.isfile(fileDir):
			if file[-3:] == ".lz":
				fileDirNew = os.path.join(outDir, file[:-3])
			else:
				fileDirNew = os.path.join(outDir, file)
			print("+++ Converting file %s..." % (file))
			subprocess.call([lzexeDir, "unpack", fileDir, fileDirNew])
		else:
			print("++ Warning : Skipping Directory %s\n" % (file))

def getCrc(fileName):
prev = binascii.crc32(open(fileName, "rb").read())
return format(prev & 0xFFFFFFFF, '08x')

def getTime(modifiedTime):
return ((modifiedTime - 1442291965) / 429.5) + 30470000

if __name__ == "__main__":
if len(sys.argv) < 5:
	print "USAGE:"
	print "\t%s [input Directory] [Output Directory] [Converter to lz Directory] [Action (pack / unpack)]" % sys.argv[0]
else:
	DoPatchFromDir(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
 

Bonne chance !

Modifié par Funky Emulation
Core X - External 2 Internal
  • Metin2 Dev 4
  • Good 2
  • Love 5
Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 2
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet



  • brilliantdiscord_widget
  • Flux d'Activité

    1. 37
    2. 21

      Metin2 en 2020 peut-on en parler?

    3. 0

      METIN2Project

    4. 3

      Ressources - UnPack - Metin2 Client - Officiel

    5. 0

      Barre des tâches d'argent étendue

    6. 16

      Redémarrage automatique des channels

    7. 16

      Multi Logo GM / SGM / GA

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.