AIO-Log, script de connexion à Dofus [windows]

Fil fermé
Partager Rechercher
DofusLog 1_10 est arrivé ! Heureusement que j'avais prévu de finir fin février 2009..
Coucou !

Citation :
Publié par Royaume (Raval)
Tu as une date à nous sortir, ou on attend comme pour la 2.0 ?
2 décembre pour la sortie des Skins sur le DofusLog, ça vous tente ?

En attendant, j'ai revu mon code pour la version 1_10 !
(Liens de téléchargement plus bas, pour les impatients. n_n)

Le DofusLog, c'est quoi ?
Toujours la même chose, un script pour me simplifier la vie, que je vous propose car peut-être que ça peut vous être utile aussi.
Il permet la connexion d'un ou plusieurs comptes au jeu Dofus de manière respectueuse avec le serveur, et simplifiée avec l'utilisateur.

Nan, ma question c'était que ton truc, il est pas légal ?
J'apporte un soin particulier à assurer la sécurité du script, et je vérifie régulièrement les CGU de Dofus. Par ailleurs, je fournis le code source comme seule version officielle, la version scriptée étant une copie parfaite de celui-ci (hébergée chez MegaUploads), alors que la version compilée n'est fournie qu'à titre indicatif (hébergée aussi chez MégaUploads) pour une utilisation autonome sans l'environnement AutoIt3 (disponible ).
J'ajoute une parenthèse pour dire que tout manquement à la sécurité de mon script doit être signalé, pour que je le corrige au plus vite.

Et Linux/MAC, alors ?
Pas de progression de ce côté, je ne peux que vous conseiller un émulateur Windows pour faire tourner le script.
À noter que je me suis penchée rapidement sur la programmation sous environnement (graphique) Ubuntu 8.04c, mais l'API est tellement mal documenté que j'ai laissé tomber. (Avis aux amateurs, si vous avez de la documentation dessus, je suis preneuse. )

Bon, t'as fini de causer ?
Version compilée : DofusLog-v1_10.exe - 297.79 kB
Version scripte : DofusLog-v1_10.au3 - 24.03 kB
Version source :
Code:
#include <GUIConstants.au3>	;Nécessaire surtout pour le $GUI_EVENT_CLOSE
#include <String.au3>	;Pour l'encryptage
AutoItSetOption ("GUIOnEventMode", 1)
Global	$Version = "1_10"
Global	$fichier, $prgChemin, $prgNom, $FenBase, $Label, $CFini, $fin, $Lancer, $Lance = 0, $Multico, $multi = 0, $Modifier, $Nouveau, $Supprimer, $Ajoute, $Retire, $Haut, $Bas, $Boutons, $Options, $OLog, $LLancer, $LModifier, $LNouveau, $LSupprimer,  $Fichiers, $FNouv, $FCharge, $FQuit, $ORaccourcis, $RNouveau, $RModifier, $RCharge, $RSupprime, $OSkin, $SCharger, $SNouveau, $SModifier, $SSauvegarder, $Aide, $ATuto, $aLog, $coListe, $Avatar, $Radio, $Skin, $suppr = -1
Global	$NbLignes = 2	;Nombre de lignes utilisées par entrée dans le fichier de Log
Global	$logChemin = @ScriptDir & "\Log.txt"
Global	$compte = 1, $compteBis
Dim	$coListe[1]
If	$CmdLine[0] > 0	Then	$logChemin = $CmdLine[1]
If	$CmdLine[0] > 1	Then
	$coListe = StringSplit ($CmdLine[2], ",")
	For	$n = 0	To	UBound ($coListe) - 2
		$coListe[$n] = $coListe[$n+1]
	Next
	ReDim	$coListe[UBound ($coListe) - 1]
	$Lance = 1
	$fin = $GUI_CHECKED	;Pas obligatoire, en fait, mais préférable, finalement.
EndIf
Global	$Hligne = 16	;hauteur présumée par ligne (13 pixels de haut, voire 14)
Global	$Separ = $Hligne / 2 - 10	;Séparateur, hauteur en pixels entre deux lignes
Global	$Ht = $Separ + 2 * $Hligne
Global	$msg
Dim	$aLog[3]
_FileReadToArray2 (@ScriptDir & "\SkinDB.txt", $Skin)	;rendre modifiable ce chemin

ChargeLog (0)
While	1
	Sleep(100)
	If	$Lance = 1	Then	Lance ()
WEnd
;==============================Fonctions totalement créées par Za====================================
Func	Recharge ()
	ChargeLog (1)
EndFunc
Func	ChargeLog ($nouv = 1)
	If	Not	FileExists ($logChemin)	Or	$nouv = 1	Then
		TrayTip (@ScriptName, "Veuillez sélectionner un fichier texte.", 0)
		$fichier = FileOpenDialog (@ScriptName & " - Sélectionnez ou créez un fichier contenant vos logs", $logChemin, "Text files (*.txt)|All files (*.*)", 8, "Log.txt")
		If	$fichier = ""	Then	Return
		TrayTip (@ScriptName, "Enregistrement de la place du Log en cours", 1, 16)
		_FileWriteToLine2 (@ScriptFullPath, 7,'Global	$logChemin = "' & $fichier & '"', 1)
		TrayTip ("", "", 0)
	Else
		$fichier = $logChemin
	EndIf
	$existe = _FileReadToArray2 ($fichier, $aLog)

	;$prgChemin et $prgNom n'ont rien à faire ici, normalement. Sauf pour utiliser le DofusLog comme gestionnaire de MDP cross-applications.)
	$prgChemin = RegRead ("HKEY_LOCAL_MACHINE\SOFTWARE\Ankama\Dofus", "Path") & "\"
	$prgNom = "Dofus.exe"
	If	Not	FileExists ($prgChemin & $prgNom)	Then
		If	Not	FileExists ($prgChemin & "Dofus_client.exe")	Then
			$prgChemin = "C:\Program Files\Dofus"
			If	Not	FileExists ($prgChemin & $prgNom)	Then
				If	Not	FileExists ($prgChemin & "Dofus_client.exe")	Then
					$prgNom = FileOpenDialog (@ScriptName & " - Sélectionnez votre lanceur de jeu Dofus", $prgChemin, "(*.exe; *.html)|Tous (*.*)", 1, "Dofus")
					$prgChemin = ""
				Else
					$prgNom = "Dofus_client.exe"
				EndIf
			EndIf
		Else
			$prgNom = "Dofus_client.exe"
		EndIf
	EndIf

	If	Not	$existe	Then
		Modifier (1, $fichier)
	EndIf

	_FileReadToArray2 ($fichier, $aLog)
	Dim	$Radio[(UBound ($aLog) + 1) / $NbLignes]
	Dim $Avatar[(UBound ($aLog) + 1) / $NbLignes]
	
	Fenetre ()
EndFunc
Func	Fenetre ($GUI = "FenBase")
	Global	$tFen = (UBound ($aLog) - 1) / $NbLignes
	If	$tFen < 2	Then	$tFen = 2
	Global	$lFen = 200
	If	$GUI = "FenBase"	Then
		;sauvegarde de la position entre deux redim' à faire
		GUIDelete ($FenBase)

		$FenBase = GUICreate (@ScriptName, $lFen, 19 + 50 + $tFen * $Ht + 30, -1, -1, 0x70000,0,0)
		GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")

		$Fichiers = GUICtrlCreateMenu ("Fichier", -1, 0)
		$FNouv = GUICtrlCreateMenuItem ("Nouveau", $Fichiers, 0)
		GUICtrlSetOnEvent ($FNouv, "Recharge")
		$FCharge = GUICtrlCreateMenuItem ("Charger", $Fichiers, 1)
		GUICtrlSetOnEvent ($FCharge, "Recharge")
		$FLigneVide = GUICtrlCreateMenuItem ("", $Fichiers, 2)
		$FQuit = GUICtrlCreateMenuItem ("Quitter", $Fichiers, 3)
		GUICtrlSetOnEvent ($FQuit, "Quit")

		$Options = GUICtrlCreateMenu ("Options", -1, 1)
		$OLog = GUICtrlCreateMenu ("Compte", $Options, 0)
		$LLancer = GUICtrlCreateMenuItem ("Lancer !", $OLog, 0)
		GUICtrlSetOnEvent ($LLancer, "Lance")
		$LNouveau = GUICtrlCreateMenuItem ("Nouveau", $OLog, 1)
		GUICtrlSetOnEvent ($LNouveau, "FNouveau")
		$LModifier = GUICtrlCreateMenuItem ("Modifier", $OLog, 2)
		GUICtrlSetOnEvent ($LModifier, "FModifier")
		$LSupprimer = GUICtrlCreateMenuItem ("Supprimer", $OLog, 3)
		GUICtrlSetOnEvent ($LSupprimer, "FSupprimer")
		$ORaccourcis = GUICtrlCreateMenu ("Raccourcis", $Options, 1)
		$RNouveau = GUICtrlCreateMenuItem ("Nouveau", $ORaccourcis, 0)
		GUICtrlSetOnEvent ($RNouveau, "RModif")
		$RCharge = GUICtrlCreateMenuItem ("Charger", $ORaccourcis, 1)
		GUICtrlSetOnEvent ($RCharge, "RCharge")
		$RModifier = GUICtrlCreateMenuItem ("Modifier", $ORaccourcis, 2)
		$RSupprime = GUICtrlCreateMenuItem ("Supprimer", $ORaccourcis, 3)
		GUICtrlSetOnEvent ($RSupprime, "RSuppre")
		;Les skins ne sont pas encore implémantés.
		$OSkin = GUICtrlCreateMenu ("Skins", $Options, 2)
		GUICtrlSetState ($OSkin, $GUI_DISABLE)
		$SNouveau = GUICtrlCreateMenuItem ("Nouveau", $OSkin, 0)
		GUICtrlSetState ($SNouveau, $GUI_DISABLE)
		$SSauvegarder = GUICtrlCreateMenuItem ("Sauver", $OSkin, 1)
		GUICtrlSetState ($SSauvegarder, $GUI_DISABLE)
		$SModifier = GUICtrlCreateMenuItem ("Modifier", $OSkin, 2)
		GUICtrlSetState ($Smodifier, $GUI_DISABLE)
		$SCharger = GUICtrlCreateMenuItem ("Charger", $OSkin, 3)
		GUICtrlSetState ($SCharger, $GUI_DISABLE)
		;Idem pour le Tutoriel.
		$Aide = GUICtrlCreateMenu ("Aide", -1, 3)
		$ATuto = GUICtrlCreateMenuItem ("Tutoriel", $Aide, 0)
		GUICtrlSetState ($ATuto, $GUI_DISABLE)
		GUICtrlCreateMenuItem("Version : " & $Version, GUICtrlCreateMenu("DofusLog By Za", $Aide, 1)) ;Petit Copyright. Huhu ^^

		$Label = GUICtrlCreateLabel ("Choisissez un compte à Logger :", 1, -2, -1, -1)
		GUICtrlSetResizing ($Label, 2 + 32 + 768)

		$Boutons = GUIStartGroup ($FenBase)	;Séparation des boutons. -utile pour la boucle de focus
		$Lancer = GUICtrlCreateButton ("Lancer !", $lFen - 50, $Ht / 2 + $Ht / 2 * $tFen, 47, 25)
		GUICtrlSetResizing ($Lancer, 8 + 768)
		GUICtrlSetOnEvent ($Lancer, "Lance")
		If	(UBound ($aLog)) / $NbLignes > 2	Then
			$Multico = GUICtrlCreateCheckbox ("Multi", $lFen - 50, 11 + $Ht + $Ht / 2 * $tFen, -1, $Hligne)
			GUICtrlSetResizing ($Multico, 8 + 768)
			GUICtrlSetState ($Multico, $multi)
			GUICtrlSetOnEvent ($Multico, "FMultico")
		EndIf
		$Modifier = GUICtrlCreateButton ("Modifier", $lFen - 50, 27 + $tFen * $Ht, 47, 25, 0x8000)
		GUICtrlSetResizing ($Modifier, 8 + 64 + 768)
		GUICtrlSetOnEvent ($Modifier, "FModifier")
		$Nouveau = GUICtrlCreateButton ("Nouveau", 1, 27 + $tFen * $Ht, -1, 25, 0x8000)
		GUICtrlSetResizing ($Nouveau, 8 + 64 + 768)
		GUICtrlSetOnEvent ($Nouveau, "FNouveau")
		$Supprimer = GUICTRLCreateButton ("Supprimer", 75, 27 + $tFen * $Ht, -1, 25, 0x8000)
		GUICtrlSetResizing ($Supprimer,	8 + 64 + 768)
		GUICtrlSetOnEvent ($Supprimer, "FSupprimer")
		$CFini = GUICtrlCreateCheckbox ("Fermer le script après ce compte", 15, $Hligne, -1, 13)
		GUICtrlSetResizing ($CFini, 2 + 32 + 768)
		GUICtrlSetState ($CFini, $fin)
		GUICtrlSetOnEvent ($CFini, "Fini")
		GUISetState ()

		Local $compteBis = 1, $compteTer
		While	$compteBis < (UBound ($aLog)) / $NbLignes
			If GUICtrlRead ($Multico) = $GUI_CHECKED Then
				$Radio[$compteBis] = GUICtrlCreateCheckbox ($aLog[$compteBis * $NbLignes - 1]& " .", 5, $Ht + ($compteBis - 1) * $Ht, 135, $Ht - 3, 0x2000)
				GUICtrlSetOnEvent($Radio[$compteBis], "FCheckBox")
				$compteTer = 0
				While $compteTer < UBound ($coListe)
					If $coListe[$compteTer] = $compteBis Then
						GUICtrlSetState($Radio[$compteBis], $GUI_CHECKED)
						GUICtrlSetFont($Radio[$compteBis], -1, 800)
					EndIf
					$compteTer += 1
				WEnd
			Else
				$Radio[$compteBis] = GUICtrlCreateRadio ($aLog[$compteBis * $NbLignes - 1]& " .", 5, $Ht + ($compteBis - 1) * $Ht, 135, $Ht - 3, 0x2000)
				GUICtrlSetOnEvent ($Radio[$compteBis], "FRadio")
			EndIf
			GUICtrlSetData ($Radio[$compteBis], $aLog[$compteBis * $NbLignes - 1])
			GUICtrlSetResizing ($Radio[$compteBis], 2 + 32 + 512)
			$compteBis += 1
		WEnd
		If GUICtrlRead ($Multico) = $GUI_UNCHECKED Then
			GUICtrlSetState ($Radio[$compte], $GUI_CHECKED + $GUI_FOCUS)
			GUICtrlSetFont($Radio[$compte], -1, 800)
		EndIf
	ElseIf	$GUI = "FenMod"	Then
		$FenMod = GUICreate("ajouter/modifier un compte", 200, $HLigne * 12)
		GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
		
		$LabelSurnom = GUICtrlCreateLabel("Veuillez entrer un" & @CRLF & " pseudonyme :", 1, 2, 100)
		$LabelClef = GUICtrlCreateLabel(@CRLF&"Clef de cryptage :", 120, 0)
		$LabelNDC = GUICtrlCreateLabel("Veuillez entrer le nom de compte Dofus :", 0, $HLigne * 4)
		$LabelMDP = GUICtrlCreateLabel("Veuillez entrer le mot de pass associé :", 0, $HLigne * 7)
		$InputPseudo = GUICtrlCreateInput($aLog[$compteTer], 2, $HLigne * 2, 125)
		$InputClef = GUICtrlCreateInput("", 149, $HLigne * 2, 50)
		$InputNDC = GUICtrlCreateInput("", 2, $Hligne * 5, 196)
		$InputMDP = GUICtrlCreateInput("", 2, $Hligne * 8, 196)
		$BValide = GUICtrlCreateButton("Valider", 2, $HLigne * 10)
		GUICtrlSetOnEvent ($BValide, "ModModifier")
		$BAnnule = GUICtrlCreateButton("Annuler", 100, $HLigne * 10)
		GUICtrlSetOnEvent ($BAnnule, "ModAnnule")
		
	ElseIf	$GUI = "FenRac"	Then
		$FenRac = GUICreate ("créer/modifier un raccourcis", 170, 5 * $Ht + $Hligne)
		GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
		
		GUICtrlCreateLabel("Sélectionnez le script :", 0, 0)
		$IScript = GUICtrlCreateInput(@ScriptFullPath, 5, $HLigne, 100)
		$BSParc = GUICtrlCreateButton("Parcourir", 110, $HLigne)
		GUICtrlSetOnEvent($BSParc, "ParcoureScript")
		GUICtrlCreateLabel("Sélectionnez le log :", 0, $Ht + $HLigne)
		$ILog = GUICtrlCreateInput($logChemin, 5, $Ht + 2 * $Hligne, 100)
		$BLParc = GUICtrlCreateButton("Parcourir", 110, $Ht + 2 * $Hligne)
		GUICtrlSetOnEvent($BLParc, "ParcoureLog")
		GUICtrlCreateLabel("Entrez les n° des comptes :", 0, 2 * $Ht + 2 * $Hligne)
		$Icomptes = GUICtrlCreateInput($compte, 5, 2 * $Ht + 3 * $Hligne, 100)
		$RBValide = GUICtrlCreateButton("Valider", 0, 3 * $Ht + 3 * $Hligne)
		GUICtrlSetOnEvent($RBValide, "RValide")
		$RBAnnule = GUICtrlCreateButton("Annuler", 110, 3 * $Ht + 3 * $Hligne)
		GUICtrlSetOnEvent($RBAnnule, "RFinir")
	EndIf
	GUISetState ()
	If	$GUI = "FenBase"	Then	DesAct ()
EndFunc
Func	DesAct ($DesActive = 0)	;Réactive les boutons par défaut
	If	$DesActive = 1	Then
		GUICtrlSetState ($Lancer, $GUI_DISABLE)
		GUICtrlSetState ($Modifier, $GUI_DISABLE)
		GUICtrlSetState ($Nouveau, $GUI_DISABLE)
		GUICtrlSetState ($Supprimer, $GUI_DISABLE)
		GUICtrlSetState ($Options, $GUI_DISABLE)
		GUICtrlSetState ($Fichiers, $GUI_DISABLE)
	Else
		GUICtrlSetState ($Lancer, $GUI_ENABLE)
		GUICtrlSetState ($Modifier, $GUI_ENABLE)
		GUICtrlSetState ($Nouveau, $GUI_ENABLE)
		GUICtrlSetState ($Supprimer, $GUI_ENABLE)
		GUICtrlSetState ($Options, $GUI_ENABLE)
		GUICtrlSetState ($Fichiers, $GUI_ENABLE)
	EndIf
EndFunc
Func	FSupprimer () ;Supprimer un surnom
	If	MsgBox (0x51, @ScriptName & " - Suppression", "Souhaitez-vous vraiment détruire cette entrée ?") = 2	Then	Return
	DesAct (1)
	TrayTip (@ScriptName, "Effacement en cours...", 10, 16)
	$ligne = $compte * $NbLignes + 1
	MRetire ($ligne)
	While	$ligne < UBound ($aLog)
		$aLog[$ligne - $NbLignes] = $aLog[$ligne]
		$ligne += 1
	WEnd
	ReDim	$aLog[UBound ($aLog) - $NbLignes]
	ReDim	$Radio[UBound ($Radio) - 1]
	If	$compte > (UBound ($aLog) - 1) / $NbLignes	Then	$compte -= 1
	_FileWriteFromArray2 ($fichier, $aLog, 1, UBound ($aLog) - 1)
	TrayTip ("", "", 0)

	Fenetre ()
EndFunc
Func	FModifier () ;Modifier un surnom
	DesAct (1)
	Modifier ($compte, $fichier)
EndFunc
Func	FNouveau () ;Ajouter un surnom
	DesAct (1)
	ReDim	$aLog[UBound ($aLog) + $NbLignes]
	ReDim	$Radio[UBound ($Radio) + 1]
	Modifier ((UBound ($aLog) - 1) / $NbLignes, $fichier)
EndFunc
Func	Modifier ($compteBis, $fich) ;fonction générique pour ajout/modif de surnom
	Global	$compteTer = $NbLignes * ($compteBis - 1) + 1
	Global	$FenMod, $LabelSurnom, $LabelClef, $LabelNDC, $LabelMDP, $InputPseudo, $InputClef, $InputNDC, $InputMDP, $BValide, $BAnnule, $Encrypt = StringSplit ($aLog[$compteTer + 1], "{TAB}")
	Fenetre ("FenMod")
EndFunc
Func	ModAnnule () ;Annuler la modification d'un surnom (devrait plutôt être fait par un $GUI_EVENT_CLOSE sur le bouton...)
	GUIDelete($FenMod)
	DesAct ()
EndFunc
Func	ModModifier () ;Modification effective du surnom
	If	MsgBox (0x51, @ScriptName & " - Modifications", "Attention, vous vous apprêtez à" & @CRLF & "modifier définitivement ces données." & @CRLF & "Êtes-vous sûr ?") = 2	Then	Return
	If	GUICtrlRead ($InputPseudo) <> ""	Then
		TrayTip (@ScriptName, "Écriture en cours...", 0, 16)
		$aLog[$compteTer] = GUICtrlRead ($InputPseudo)
		_FileWriteToLine2 ($fichier, $compteTer, $aLog[$compteTer], 1)
		If	GUICtrlRead ($InputNDC) <> ""	Then
			If	GUICtrlRead ($InputClef) = "" 	Then
				$Encrypt[1] = GUICtrlRead ($InputNDC)
			Else
				$Encrypt[1] = _StringEncrypt (1, GUICtrlRead ($InputNDC), GUICtrlRead ($InputClef))
			EndIf
		EndIf
		If	GUICtrlRead ($InputMDP) <> ""	Then
			If	GUICtrlRead ($InputClef) = "" 	Then
				$Encrypt[UBound ($Encrypt) - 1] = GUICtrlRead ($InputMDP)
			Else
				$Encrypt[UBound ($Encrypt) - 1] = _StringEncrypt (1, GUICtrlRead ($InputMDP), GUICtrlRead ($InputClef))
			EndIf
		EndIf
		$Encrypt = $Encrypt[1] & "{TAB}" & $Encrypt[UBound ($Encrypt) - 1]
		If	$Encrypt <> $aLog[$compteTer + 1] Then
			$aLog[$compteTer + 1] = $Encrypt
			_FileWriteToLine2 ($fichier, $compteTer + 1, $aLog[$compteTer + 1], 1)
		EndIf
		TrayTip ("", "", 0)
	EndIf
	GUIDelete ($FenMod)
	GUIDelete ($FenBase)
	Fenetre ()
EndFunc
Func	FRadio ($r = 0) ;Fonction de sélection du surnom dans la liste (sans Multico)
	Local	$mess, $r
	If $r = 0	Then
		$mess = @GUI_CtrlId
	Else
		$mess = $r
	EndIf
	If	$mess <> $Radio[$compte]	Then
		If GUICtrlRead ($Multico) = $GUI_UNCHECKED	or	GUICtrlRead($Radio[$compte]) = $GUI_UNCHECKED Then
			GUICtrlSetFont($Radio[$compte], -1, 400)
			GUICtrlSetState ($Radio[$compte], $GUI_NOFOCUS)
		EndIf
		While	$mess <> $Radio[$compte]
			$compte += 1
			If	$compte > (UBound ($Radio) - 1)	Then
				$compte = 1
			EndIf
		WEnd
		GUICtrlSetState ($Radio[$compte], $GUI_CHECKED + $GUI_FOCUS)
		GUICtrlSetFont($Radio[$compte], -1, 800)
	Else
		FLancer ($compte)
		If	$fin = $GUI_CHECKED	Then	Exit
	EndIf
EndFunc
Func	FCheckBox ($r = 0) ;Fonction de sélection de(s) surnom(s) (avec Multico)
	Local	$mess, $r
	If $r = 0	Then
		$mess = @GUI_CtrlId
	Else
		$mess = $r
	EndIf

	$r = 0
	While $mess <> $Radio[$r]
		$r += 1
	WEnd

	If	GUICtrlRead($mess) = $GUI_UNCHECKED	Then
		GUICtrlSetFont($mess, -1, 400)
		MRetire ($r)
	Else
		GUICtrlSetFont($mess, -1, 800)
		ReDim	$coListe[UBound ($coListe) + 1]
		$coListe[UBound ($coListe) - 1] = $r
	EndIf
EndFunc
Func	FMultico () ;Gestion de l'état du bouton Multico
	$multi = GUICtrlRead ($Multico)
	If	$coListe[0] = ""	Then	$coListe[0] = $compte
	Fenetre ()
EndFunc
Func	MRetire ($suppr = -1) ;Dé-sélection d'un surnom pré-sélectionné (sous Multico)
	Local	$n = 0, $q, $z
	If	$suppr = -1	Then
		MsgBox(0,"Erreur","Cette fonction MRetire ne doit pas être appellée directement.")
		Return
	EndIf
	$n = 0
	While $coListe[$n] <> $suppr
		$n += 1
	WEnd
	While $n < UBound ($coListe) - 1
		$coListe[$n] = $coListe[$n + 1]
		$n += 1
	WEnd
	If	UBound	($coListe) > 1	Then
		ReDim	$coListe[UBound ($coListe) - 1]
	Else
		$coListe[0] = ""
	EndIf
EndFunc
Func	RModif ($mod = 0) ;Fonction générique pour l'ajout/modification de raccourcis
	Global	$n, $r
	Global	$fenRac, $LabelSansNom, $modRac = 0, $IScript, $BSParc, $LabelSansNom2, $ILog, $BLParc, $LComptes, $LabelSansNom3, $IComptes, $RBValide, $RBAnnule
	Fenetre ("FenRac")
EndFunc
Func	ParcoureScript () ;Parcourir les dossiers par l'utilisateur pour désigner le script
	$n = FileOpenDialog (@ScriptName & " - Sélectionnez votre script :", @ScriptDir, "Scripts (*.au3	;*.exe)|Tous (*.*)", 8, @ScriptName)
	If	$n <> ""	Then	GUICtrlSetData ($IScript, $n)
EndFunc
Func	ParcoureLog () ;Parcourir les dossiers par l'utilisateur pour désigner le log
	$n = FileOpenDialog (@ScriptName & " - Sélectionnez le fichier contenant vos logs :", $logChemin, "Textes (*.txt)|Tous (*.*)", 8, "Log.txt")
	If	$n <> ""	Then	GUICtrlSetData ($ILog, $n)
EndFunc
Func	RValide () ;Créer/Modifier le raccourcis
	$n = FileOpenDialog (@ScriptName & " - Choissez le nom et répertoire du raccourcis :", @ScriptDir, "Raccourcis (*.lnk)", 8, @ScriptName & ".lnk")
	If	$n = ''	Then	Return
	If	StringInStr ($n, ".lnk") = 0	Then	$n &= ".lnk"
	FileCreateShortcut (GUICtrlRead ($IScript), $n, "", ' "' & GUICtrlRead ($ILog) & '" ' & GUICtrlRead ($IComptes))
	GUIDelete ($fenRac)
EndFunc
Func	RFinir () ;Annuler le raccourcis, idem que ModAnnule()
	GUIDelete ($fenRac)
EndFunc
Func	RCharge () ;Charger une liste de comptes pré-enregistrés en raccourcis
	$n = FileOpenDialog (@ScriptName & " - Sélectionnez votre raccourcis :", @ScriptDir, "Raccourcis (*.lnk)", 8, @ScriptName & ".lnk")
	If	$n = ""	Then	Return
	$r = FileGetShortcut ($n)
	$logChemin = StringMid ($r[2], 3, StringInStr ($r[2], '"', 2, 2) - 3)
	$coListe = StringSplit (StringMid ($r[2], StringInStr ($r[2], '"', 2, 2) + 2), ",")
	For	$n = 0	To	UBound ($coListe) - 2
		$coListe[$n] = $coListe[$n+1]
	Next
	ReDim	$coListe[UBound ($coListe) - 1]
	$Lance = 1
	GUIDelete ($fenBase)
	ChargeLog ()
	Return
EndFunc
Func	RSuppre () ;Supprimer le raccourcis sélectionné
	$Racc = FileOpenDialog (@ScriptName & " - Sélectionnez votre raccourcis :", @ScriptDir, "Raccourcis (*.lnk)", 8, @ScriptName)
	If	$Racc <> ""	Then	FileDelete ($Racc)
EndFunc
Func	Lance () ;Démarrer la connexion d'un surnom/d'une liste de surnoms
	Local	$err = 0
	If	GUICtrlRead($Multico) = $GUI_CHECKED	Or	$Lance = 1	Then
		For	$n = 0	To	UBound ($coListe) - 1
			If	$coListe[$n] <= ((UBound ($aLog) - 1) / $NbLignes) And	$coListe[$n] > 0	Then  $err = FLancer ($coListe[$n])
		Next
		$Lance = 0
	Else
		$err = FLancer ($compte)
	EndIf
	If	$fin = $GUI_CHECKED And $err = 0	Then	Exit
EndFunc
Func	FLancer ($compteBis = $compte) ;Lancement du jeu + traitement des identifiants pour la connexion au jeu
	DesAct (1)
	$compteBis = ($compteBis - 1) * $NbLignes + 1
	If	StringInStr ($aLog[$compteBis + 1], "{TAB}") = 0	Then
		MsgBox(80,"","Compte invalide, désolée.." &@CRLF&@CRLF& "Veuillez le modifier pour le mettre aux normes."&@crlf&"Erreur : pas de séparateur {TAB} entre compte et pass.")
		DesAct ()
		Return -1
	EndIf
	Local	$Clef = InputBox (@ScriptName & " - Code du compte " & $aLog[$compteBis], "Veuillez entrer la clef de " & $aLog[$compteBis]& " :", "", "°")
	If	@error = 1	Then
		DesAct ()
		Return -2
	EndIf
	Local	$NDCMDP = StringSplit ($aLog[$compteBis + 1], "{TAB}", 1)
	If	$Clef <> ""	Then
		$NDCMDP[1] = _StringEncrypt (0, $NDCMDP[1], $Clef)
		$NDCMDP[2] = _StringEncrypt (0, $NDCMDP[2], $Clef)
	EndIf
	If	MsgBox (0x51, @ScriptName, "Lancement de la fenêtre Dofus !" & @CRLF & "Cliquez sur Annuler pour fermer." & @CRLF & Message(), 2) <> 2	Then
		TrayTip (@Scriptname, "Lancement de la fenêtre Dofus.", 0)
		Run ($prgChemin & $prgNom, $prgChemin)
		AutoItSetOption ("WinTitleMatchMode", 3)
		Do
			Sleep (200)
		Until	WinActive ("Dofus  ")	Or	WinActive ("Dofus - Opera")	Or	WinActive ("Dofus - Windows Internet Explorer")	Or	WinActive ("Dofus - Mozilla Firefox")
		AutoItSetOption ("WinTitleMatchMode", 1)
		WinSetTitle ("Dofus", "", "Dofus - " & $aLog[$compteBis])
		TrayTip ("","",0)
		Sleep (1000)
		Traytip (@ScriptName, "Veuillez placer votre curseur" & @CRLF & 'sur la zone "Compte Ankama".', 10)
		AutoItSetOption ("MouseCoordMode", 0)
		$posDof = WinGetClientSize ("Dofus - " & $aLog[$compteBis])
		Do
			WinWaitActive ("Dofus - " & $aLog[$compteBis])
			$posCur = MouseGetPos ()
			Sleep(20)
		Until	(MouseGetCursor () = 5)	And	($posCur[0] < $posDof[0])	And	($posCur[1] < $posDof[1])	And	($posCur[0] > 0)	And	($posCur[1] > 0)
		MouseClick ("left")
		Send ($NDCMDP[1], 1)
		Send ("{TAB}")
		Send ($NDCMDP[2], 1)
		AutoItSetOption ("MouseCoordMode", 1)
		TrayTip (@Scriptname, "Veuillez passer votre souris" & @CRLF & 'sur le bouton "OK".', 0)
		Do
			WinWaitActive ("Dofus - " & $aLog[$compteBis])
			sleep (20)
			$cur = MouseGetPos ()
		Until	((MouseGetCursor () = 0)	And	(PixelGetColor ($cur[0], $cur[1]) = 0xFF9900))
		MouseClick ("left")
		TrayTip ("", "", 0)
	Else
		DesAct ()
		Return -3
	EndIf
	DesAct ()
	Return
EndFunc
Func	Message ()	;Le message débile qui ne sert à rien.
	Switch	Random (0, 4, 1)
		Case	0
			Return	"(\__/)" & @CRLF & "( ' . ' )" & @CRLF & '(")_(")'
		Case	1
			Return	@CRLF & "Vous pouvez aussi aller jouer dehors," & @CRLF & "avec les papillons, les fleurs et les oiseaux."
		Case	2
			Return	""
		Case	3
			Return	@CRLF & "Ou patientez 2 secondes," & @CRLF & "que la fenêtre se ferme d'elle-même."
		Case	4
			Return	@CRLF & "La Vie est comme cette boîte de dialogue :" & @CRLF & "C'est quand elle se ferme qu'on arrive à l'essentiel."
	EndSwitch
EndFunc
Func	Fini () ;Fermeture du script en fin de connexion
	$fin = GUICtrlRead ($CFini)
EndFunc
Func	Void () ;Fonction vide, utile pour tester si un bouton "répond" ou pas lors des tests de débug. ^^'
	MsgBox (80, @ScriptName, "L'objet cliqué (" & @GUI_CtrlId & ") n'a pas" & @CRLF & "d'action associée, désolée." & @CRLF & "contenu = " & GUIctrlread (@GUI_CtrlId))
EndFunc
Func	Quit () ;Fermeture de la fenêtre appelante, ou du script entier si il ne reste que la fenêtre de base. :)
	GUIDelete (@GUI_WinHandle)
	If	@GUI_WinHandle = $FenBase	Then	Exit
	DesAct ()
EndFunc
	;==========================Fonctions AutoIt 3 modifiées========================================
Func	_FileWriteToLine2 ($sFile, $iLine, $sText, $fOverWrite = 0) ;Ecrire une ligne particulière dans un fichier texte
	If	Not	FileExists ($sFile)	Then	FileWrite ($sFile, "")
	Local	$filtxt = FileRead ($sFile, FileGetSize ($sFile))
	$filtxt = StringSplit ($filtxt, @CRLF, 1)
	If	UBound ($filtxt) - 1 < $iLine	Then	ReDim	$filtxt[$iLine + 1]
	Local	$fil = FileOpen ($sFile, 2), $i, $limit = UBound ($filtxt) - 1, $file2write = ""
	For	$i = 1	To	$limit
		If	$i = $iLine	Then
			If	$fOverWrite = 1	Then
				If	$sText <> ""	Then
					If	$i < $limit	And	$sText <> @CRLF	Then
						$file2write &= $sText & @CRLF
					ElseIf	$i = $limit	Or	$sText = @CRLF	Then
						$file2write &= $sText
					EndIf
				Else
					If	$i < $limit	Then
						$file2write &= $sText
					EndIf
				EndIf
			EndIf
			If	$fOverWrite = 0	Then
				If	$i < $limit	Then
					If	$sText = @CRLF	Then
						$file2write &= @CRLF & $filtxt[$i] & @CRLF
					Else
						$file2write &= $sText & @CRLF & $filtxt[$i] & @CRLF
					EndIf
				ElseIf	$i = $limit	Then
					If	$sText = @CRLF	Then
						$file2write &= @CRLF & $filtxt[$i]
					Else
						$file2write &= $sText & @CRLF & $filtxt[$i]
					EndIf
				EndIf
			EndIf
		ElseIf	$i < $limit	Then
			$file2write &= $filtxt[$i] & @CRLF
		ElseIf	$i = $limit	Then
			$file2write &= $filtxt[$i]
		EndIf
	Next
	FileWrite ($fil, $file2write)
	FileClose ($fil)
	Return	1
EndFunc	;==>_FileWriteToLine2
Func _FileWriteFromArray2 ($File, $a_Array, $i_Base = 0, $i_UBound = -1) ;Transformer un Array (Liste) en fichier texte
	Local	$hFile, $x, $file2write = ""
	If	IsString ($File)	Then
		$hFile = FileOpen ($File, 2)
	Else
		$hFile = $File
	EndIf
	If	$hFile = -1	Then	Return	SetError (1, 0, 0)
	If	$i_UBound < 1	Then	$i_UBound = UBound ($a_Array)
	$x = $i_Base
	Do
		$file2write &= $a_Array[$x] & @CRLF
		$x += 1
	Until	$x = $i_UBound
	FileWrite ($hFile, $file2write & $a_Array[$i_UBound])
	If	IsString ($File)	Then	FileClose ($hFile)
EndFunc  	;==>_FileWriteFromArray2
Func	_FileReadToArray2 ($sFilePath, ByRef	$aArray) ;Transformer un fichier texte en Array (Liste)
	Local	$hFile
	$hFile = FileOpen ($sFilePath, 0)
	If	$hFile = -1	Then
		SetError (1)
		Return	0
	EndIf
	$aArray = StringSplit (StringStripCR (FileRead ($hFile, FileGetSize ($sFilePath))), @CRLF)
	FileClose ($hFile)
	Return	1
EndFunc	;==>_FileReadToArray2
24604 caractères, en 592 lignes.

Changement depuis la 1_9b : Beaucoup.
Majeur :
-> Meilleure prise en charge de la fonction Multico, en un seul affichage
-> Meilleur affichage, la fenêtre apparaît sans les surnoms d'abord, qui arrivent juste après. (Changement visible en cas de lag lourd.)
-> Disparition des boutons (devenus superflus) "Ajouter ->" et "<- Retirer"
-> Amélioration de l'appel des fonctions par un "OnEvent", plutôt que l'ancien "Getmsg()". (La bonne fonction est appelée directement au clic sur un objet donné, contrairement à "Bouton appuyé, recherche de la fonction qui lui correspond", ce qui diminue aussi la charge processeur.)
-> Refonte des fonctions AutoIt modifiées (en fin de code source), qui sont maintenant plus efficaces, mieux gérées et plus légères
-> Amélioration des conditions pour l'envoi des identifiants dans la fenêtre Dofus (sécurité augmentée)
Mineur :
-> Changement de l'apparence sur quelques points, ça devrait être plus joli.

Changement par rapport aux versions 1_10BêtaX précédentes :
-> Le module de skins n'est pas prêt, mais ce sera la réelle modification à venir sur le DofusLog (maintenant que le code est correct)
-> Lire les améliorations ci-dessus, cette version a été particulièrement travaillée pour ne plus contenir de bugs. N'hésitez pas à signaler tout comportement ou fonctionnalité qui ne vous paraît pas intuitive.

Et pour le futur :
-> Skinz à veniir, je prépare une (VRAIE) version bêta qui sera fonctionnelle, basée sur cette version 1_10. (Pas comme ces ersatz de 1_10BêtaX, qui étaient plus ou moins plantées. u_u)
-> Mémorisation d'une fenêtre lors de son rafraîchissement. (Oui, c'est désagréable de voir la fenêtre principale retourner au centre de l'écran au moindre clic sur Multico, je sais. :b)
-> Choix d'une clef unique à entrer dans un coin de fenêtre principale, pour connecter une série de comptes sans se faire agresser par des demandes de clefs en boucle.
-> Remettre les boutons "Haut" et "Bas", pour changer l'ordre de la liste des surnoms
-> Et intégration de ce qui vous plairait, n'hésitez surtout pas à demander la lune ! (Elle vous serait fournie comme image de fond du script pour les skins. o//)

Voilà, à bientôt pour de nouvelles aventures chocolatées..!

Za.
Oui, je sais que ça fait longtemps que mon script est en travaux. Merci de votre patience. ^^'
Et comme je viens d'obtenir ma clef pour la bêta de Dofus 2.0, voici un p'tit cadeau :

DofusLogv-1_10-DémoDofus2.0, la version compatible avec la démo de Dofus 2.0 !

Ca fonctionne comment ?
Pareil que le DofusLog normal, sauf l'intégration de "Dofus 2.0", à la place de "Dofus".

Version compilée : nan, y'a pas. (mais vous pouvez toujours en compiler une pour vous à partir de l'une des deux versions ci-dessous. n_n)
Version scripte : DofusLog-v1_10-DémoDofus2.0.au3 - 24.14 kB
Version source :
Code:
#include <GUIConstants.au3>	;Nécessaire surtout pour le $GUI_EVENT_CLOSE
#include <String.au3>	;Pour l'encryptage
AutoItSetOption ("GUIOnEventMode", 1)
Global	$Version = "1_10"
Global	$fichier, $prgChemin, $prgNom, $FenBase, $Label, $CFini, $fin, $Lancer, $Lance = 0, $Multico, $multi = 0, $Modifier, $Nouveau, $Supprimer, $Ajoute, $Retire, $Haut, $Bas, $Boutons, $Options, $OLog, $LLancer, $LModifier, $LNouveau, $LSupprimer,  $Fichiers, $FNouv, $FCharge, $FQuit, $ORaccourcis, $RNouveau, $RModifier, $RCharge, $RSupprime, $OSkin, $SCharger, $SNouveau, $SModifier, $SSauvegarder, $Aide, $ATuto, $aLog, $coListe, $Avatar, $Radio, $Skin, $suppr = -1
Global	$NbLignes = 2	;Nombre de lignes utilisées par entrée dans le fichier de Log
Global	$logChemin = @ScriptDir & "\Log.txt"
Global	$compte = 1, $compteBis
Dim	$coListe[1]
If	$CmdLine[0] > 0	Then	$logChemin = $CmdLine[1]
If	$CmdLine[0] > 1	Then
	$coListe = StringSplit ($CmdLine[2], ",")
	For	$n = 0	To	UBound ($coListe) - 2
		$coListe[$n] = $coListe[$n+1]
	Next
	ReDim	$coListe[UBound ($coListe) - 1]
	$Lance = 1
	$fin = $GUI_CHECKED	;Pas obligatoire, en fait, mais préférable, finalement.
EndIf
Global	$Hligne = 16	;hauteur présumée par ligne (13 pixels de haut, voire 14)
Global	$Separ = $Hligne / 2 - 10	;Séparateur, hauteur en pixels entre deux lignes
Global	$Ht = $Separ + 2 * $Hligne
Global	$msg
Dim	$aLog[3]
_FileReadToArray2 (@ScriptDir & "\SkinDB.txt", $Skin)	;rendre modifiable ce chemin

ChargeLog (0)
While	1
	Sleep(100)
	If	$Lance = 1	Then	Lance ()
WEnd
;==============================Fonctions totalement créées par Za====================================
Func	Recharge ()
	ChargeLog (1)
EndFunc
Func	ChargeLog ($nouv = 1)
	If	Not	FileExists ($logChemin)	Or	$nouv = 1	Then
		TrayTip (@ScriptName, "Veuillez sélectionner un fichier texte.", 0)
		$fichier = FileOpenDialog (@ScriptName & " - Sélectionnez ou créez un fichier contenant vos logs", $logChemin, "Text files (*.txt)|All files (*.*)", 8, "Log.txt")
		If	$fichier = ""	Then	Return
		TrayTip (@ScriptName, "Enregistrement de la place du Log en cours", 1, 16)
		_FileWriteToLine2 (@ScriptFullPath, 7,'Global	$logChemin = "' & $fichier & '"', 1)
		TrayTip ("", "", 0)
	Else
		$fichier = $logChemin
	EndIf
	$existe = _FileReadToArray2 ($fichier, $aLog)

	;$prgChemin et $prgNom n'ont rien à faire ici, normalement. Sauf pour utiliser le DofusLog comme gestionnaire de MDP cross-applications.)
;~ 	$prgChemin = RegRead ("HKEY_LOCAL_MACHINE\SOFTWARE\Ankama/\Dofus", "Path") & "\"
	$prgNom = "Dofus.exe"
;~ 	If	Not	FileExists ($prgChemin & $prgNom)	Then
;~ 		If	Not	FileExists ($prgChemin & "Dofus_client.exe")	Then
			$prgChemin = "C:\Program Files\Dofus 2 Online\app\"
			If	Not	FileExists ($prgChemin & $prgNom)	Then
;~ 				If	Not	FileExists ($prgChemin & "Dofus_client.exe")	Then
					$prgNom = FileOpenDialog (@ScriptName & " - Sélectionnez votre lanceur de jeu Dofus 2.0", $prgChemin, "(*.exe; *.html)|Tous (*.*)", 1, "Dofus")
					$prgChemin = ""
;~ 				Else
;~ 					$prgNom = "Dofus_client.exe"
;~ 				EndIf
			EndIf
;~ 		Else
;~ 			$prgNom = "Dofus_client.exe"
;~ 		EndIf
;~ 	EndIf

	If	Not	$existe	Then
		Modifier (1, $fichier)
	EndIf

	_FileReadToArray2 ($fichier, $aLog)
	Dim	$Radio[(UBound ($aLog) + 1) / $NbLignes]
	Dim $Avatar[(UBound ($aLog) + 1) / $NbLignes]
	
	Fenetre ()
EndFunc
Func	Fenetre ($GUI = "FenBase")
	Global	$tFen = (UBound ($aLog) - 1) / $NbLignes
	If	$tFen < 2	Then	$tFen = 2
	Global	$lFen = 200
	If	$GUI = "FenBase"	Then
		;sauvegarde de la position entre deux redim' à faire
		GUIDelete ($FenBase)

		$FenBase = GUICreate (@ScriptName, $lFen, 19 + 50 + $tFen * $Ht + 30, -1, -1, 0x70000,0,0)
		GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")

		$Fichiers = GUICtrlCreateMenu ("Fichier", -1, 0)
		$FNouv = GUICtrlCreateMenuItem ("Nouveau", $Fichiers, 0)
		GUICtrlSetOnEvent ($FNouv, "Recharge")
		$FCharge = GUICtrlCreateMenuItem ("Charger", $Fichiers, 1)
		GUICtrlSetOnEvent ($FCharge, "Recharge")
		$FLigneVide = GUICtrlCreateMenuItem ("", $Fichiers, 2)
		$FQuit = GUICtrlCreateMenuItem ("Quitter", $Fichiers, 3)
		GUICtrlSetOnEvent ($FQuit, "Quit")

		$Options = GUICtrlCreateMenu ("Options", -1, 1)
		$OLog = GUICtrlCreateMenu ("Compte", $Options, 0)
		$LLancer = GUICtrlCreateMenuItem ("Lancer !", $OLog, 0)
		GUICtrlSetOnEvent ($LLancer, "Lance")
		$LNouveau = GUICtrlCreateMenuItem ("Nouveau", $OLog, 1)
		GUICtrlSetOnEvent ($LNouveau, "FNouveau")
		$LModifier = GUICtrlCreateMenuItem ("Modifier", $OLog, 2)
		GUICtrlSetOnEvent ($LModifier, "FModifier")
		$LSupprimer = GUICtrlCreateMenuItem ("Supprimer", $OLog, 3)
		GUICtrlSetOnEvent ($LSupprimer, "FSupprimer")
		$ORaccourcis = GUICtrlCreateMenu ("Raccourcis", $Options, 1)
		$RNouveau = GUICtrlCreateMenuItem ("Nouveau", $ORaccourcis, 0)
		GUICtrlSetOnEvent ($RNouveau, "RModif")
		$RCharge = GUICtrlCreateMenuItem ("Charger", $ORaccourcis, 1)
		GUICtrlSetOnEvent ($RCharge, "RCharge")
		$RModifier = GUICtrlCreateMenuItem ("Modifier", $ORaccourcis, 2)
		$RSupprime = GUICtrlCreateMenuItem ("Supprimer", $ORaccourcis, 3)
		GUICtrlSetOnEvent ($RSupprime, "RSuppre")
		;Les skins ne sont pas encore implémantés.
		$OSkin = GUICtrlCreateMenu ("Skins", $Options, 2)
		GUICtrlSetState ($OSkin, $GUI_DISABLE)
		$SNouveau = GUICtrlCreateMenuItem ("Nouveau", $OSkin, 0)
		GUICtrlSetState ($SNouveau, $GUI_DISABLE)
		$SSauvegarder = GUICtrlCreateMenuItem ("Sauver", $OSkin, 1)
		GUICtrlSetState ($SSauvegarder, $GUI_DISABLE)
		$SModifier = GUICtrlCreateMenuItem ("Modifier", $OSkin, 2)
		GUICtrlSetState ($Smodifier, $GUI_DISABLE)
		$SCharger = GUICtrlCreateMenuItem ("Charger", $OSkin, 3)
		GUICtrlSetState ($SCharger, $GUI_DISABLE)
		;Idem pour le Tutoriel.
		$Aide = GUICtrlCreateMenu ("Aide", -1, 3)
		$ATuto = GUICtrlCreateMenuItem ("Tutoriel", $Aide, 0)
		GUICtrlSetState ($ATuto, $GUI_DISABLE)
		GUICtrlCreateMenuItem("Version : " & $Version, GUICtrlCreateMenu("DofusLog By Za", $Aide, 1)) ;Petit Copyright. Huhu ^^

		$Label = GUICtrlCreateLabel ("Choisissez un compte à Logger :", 1, -2, -1, -1)
		GUICtrlSetResizing ($Label, 2 + 32 + 768)

		$Boutons = GUIStartGroup ($FenBase)	;Séparation des boutons. -utile pour la boucle de focus
		$Lancer = GUICtrlCreateButton ("Lancer !", $lFen - 50, $Ht / 2 + $Ht / 2 * $tFen, 47, 25)
		GUICtrlSetResizing ($Lancer, 8 + 768)
		GUICtrlSetOnEvent ($Lancer, "Lance")
		If	(UBound ($aLog)) / $NbLignes > 2	Then
			$Multico = GUICtrlCreateCheckbox ("Multi", $lFen - 50, 11 + $Ht + $Ht / 2 * $tFen, -1, $Hligne)
			GUICtrlSetResizing ($Multico, 8 + 768)
			GUICtrlSetState ($Multico, $multi)
			GUICtrlSetOnEvent ($Multico, "FMultico")
		EndIf
		$Modifier = GUICtrlCreateButton ("Modifier", $lFen - 50, 27 + $tFen * $Ht, 47, 25, 0x8000)
		GUICtrlSetResizing ($Modifier, 8 + 64 + 768)
		GUICtrlSetOnEvent ($Modifier, "FModifier")
		$Nouveau = GUICtrlCreateButton ("Nouveau", 1, 27 + $tFen * $Ht, -1, 25, 0x8000)
		GUICtrlSetResizing ($Nouveau, 8 + 64 + 768)
		GUICtrlSetOnEvent ($Nouveau, "FNouveau")
		$Supprimer = GUICTRLCreateButton ("Supprimer", 75, 27 + $tFen * $Ht, -1, 25, 0x8000)
		GUICtrlSetResizing ($Supprimer,	8 + 64 + 768)
		GUICtrlSetOnEvent ($Supprimer, "FSupprimer")
		$CFini = GUICtrlCreateCheckbox ("Fermer le script après ce compte", 15, $Hligne, -1, 13)
		GUICtrlSetResizing ($CFini, 2 + 32 + 768)
		GUICtrlSetState ($CFini, $fin)
		GUICtrlSetOnEvent ($CFini, "Fini")
		GUISetState ()

		Local $compteBis = 1, $compteTer
		While	$compteBis < (UBound ($aLog)) / $NbLignes
			If GUICtrlRead ($Multico) = $GUI_CHECKED Then
				$Radio[$compteBis] = GUICtrlCreateCheckbox ($aLog[$compteBis * $NbLignes - 1]& " .", 5, $Ht + ($compteBis - 1) * $Ht, 135, $Ht - 3, 0x2000)
				GUICtrlSetOnEvent($Radio[$compteBis], "FCheckBox")
				$compteTer = 0
				While $compteTer < UBound ($coListe)
					If $coListe[$compteTer] = $compteBis Then
						GUICtrlSetState($Radio[$compteBis], $GUI_CHECKED)
						GUICtrlSetFont($Radio[$compteBis], -1, 800)
					EndIf
					$compteTer += 1
				WEnd
			Else
				$Radio[$compteBis] = GUICtrlCreateRadio ($aLog[$compteBis * $NbLignes - 1]& " .", 5, $Ht + ($compteBis - 1) * $Ht, 135, $Ht - 3, 0x2000)
				GUICtrlSetOnEvent ($Radio[$compteBis], "FRadio")
			EndIf
			GUICtrlSetData ($Radio[$compteBis], $aLog[$compteBis * $NbLignes - 1])
			GUICtrlSetResizing ($Radio[$compteBis], 2 + 32 + 512)
			$compteBis += 1
		WEnd
		If GUICtrlRead ($Multico) = $GUI_UNCHECKED Then
			GUICtrlSetState ($Radio[$compte], $GUI_CHECKED + $GUI_FOCUS)
			GUICtrlSetFont($Radio[$compte], -1, 800)
		EndIf
	ElseIf	$GUI = "FenMod"	Then
		$FenMod = GUICreate("ajouter/modifier un compte", 200, $HLigne * 12)
		GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
		
		$LabelSurnom = GUICtrlCreateLabel("Veuillez entrer un" & @CRLF & " pseudonyme :", 1, 2, 100)
		$LabelClef = GUICtrlCreateLabel(@CRLF&"Clef de cryptage :", 120, 0)
		$LabelNDC = GUICtrlCreateLabel("Veuillez entrer le nom de compte Dofus :", 0, $HLigne * 4)
		$LabelMDP = GUICtrlCreateLabel("Veuillez entrer le mot de pass associé :", 0, $HLigne * 7)
		$InputPseudo = GUICtrlCreateInput($aLog[$compteTer], 2, $HLigne * 2, 125)
		$InputClef = GUICtrlCreateInput("", 149, $HLigne * 2, 50)
		$InputNDC = GUICtrlCreateInput("", 2, $Hligne * 5, 196)
		$InputMDP = GUICtrlCreateInput("", 2, $Hligne * 8, 196)
		$BValide = GUICtrlCreateButton("Valider", 2, $HLigne * 10)
		GUICtrlSetOnEvent ($BValide, "ModModifier")
		$BAnnule = GUICtrlCreateButton("Annuler", 100, $HLigne * 10)
		GUICtrlSetOnEvent ($BAnnule, "ModAnnule")
		
	ElseIf	$GUI = "FenRac"	Then
		$FenRac = GUICreate ("créer/modifier un raccourcis", 170, 5 * $Ht + $Hligne)
		GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
		
		GUICtrlCreateLabel("Sélectionnez le script :", 0, 0)
		$IScript = GUICtrlCreateInput(@ScriptFullPath, 5, $HLigne, 100)
		$BSParc = GUICtrlCreateButton("Parcourir", 110, $HLigne)
		GUICtrlSetOnEvent($BSParc, "ParcoureScript")
		GUICtrlCreateLabel("Sélectionnez le log :", 0, $Ht + $HLigne)
		$ILog = GUICtrlCreateInput($logChemin, 5, $Ht + 2 * $Hligne, 100)
		$BLParc = GUICtrlCreateButton("Parcourir", 110, $Ht + 2 * $Hligne)
		GUICtrlSetOnEvent($BLParc, "ParcoureLog")
		GUICtrlCreateLabel("Entrez les n° des comptes :", 0, 2 * $Ht + 2 * $Hligne)
		$Icomptes = GUICtrlCreateInput($compte, 5, 2 * $Ht + 3 * $Hligne, 100)
		$RBValide = GUICtrlCreateButton("Valider", 0, 3 * $Ht + 3 * $Hligne)
		GUICtrlSetOnEvent($RBValide, "RValide")
		$RBAnnule = GUICtrlCreateButton("Annuler", 110, 3 * $Ht + 3 * $Hligne)
		GUICtrlSetOnEvent($RBAnnule, "RFinir")
	EndIf
	GUISetState ()
	If	$GUI = "FenBase"	Then	DesAct ()
EndFunc
Func	DesAct ($DesActive = 0)	;Réactive les boutons par défaut
	If	$DesActive = 1	Then
		GUICtrlSetState ($Lancer, $GUI_DISABLE)
		GUICtrlSetState ($Modifier, $GUI_DISABLE)
		GUICtrlSetState ($Nouveau, $GUI_DISABLE)
		GUICtrlSetState ($Supprimer, $GUI_DISABLE)
		GUICtrlSetState ($Options, $GUI_DISABLE)
		GUICtrlSetState ($Fichiers, $GUI_DISABLE)
	Else
		GUICtrlSetState ($Lancer, $GUI_ENABLE)
		GUICtrlSetState ($Modifier, $GUI_ENABLE)
		GUICtrlSetState ($Nouveau, $GUI_ENABLE)
		GUICtrlSetState ($Supprimer, $GUI_ENABLE)
		GUICtrlSetState ($Options, $GUI_ENABLE)
		GUICtrlSetState ($Fichiers, $GUI_ENABLE)
	EndIf
EndFunc
Func	FSupprimer () ;Supprimer un surnom
	If	MsgBox (0x51, @ScriptName & " - Suppression", "Souhaitez-vous vraiment détruire cette entrée ?") = 2	Then	Return
	DesAct (1)
	TrayTip (@ScriptName, "Effacement en cours...", 10, 16)
	$ligne = $compte * $NbLignes + 1
	MRetire ($ligne)
	While	$ligne < UBound ($aLog)
		$aLog[$ligne - $NbLignes] = $aLog[$ligne]
		$ligne += 1
	WEnd
	ReDim	$aLog[UBound ($aLog) - $NbLignes]
	ReDim	$Radio[UBound ($Radio) - 1]
	If	$compte > (UBound ($aLog) - 1) / $NbLignes	Then	$compte -= 1
	_FileWriteFromArray2 ($fichier, $aLog, 1, UBound ($aLog) - 1)
	TrayTip ("", "", 0)

	Fenetre ()
EndFunc
Func	FModifier () ;Modifier un surnom
	DesAct (1)
	Modifier ($compte, $fichier)
EndFunc
Func	FNouveau () ;Ajouter un surnom
	DesAct (1)
	ReDim	$aLog[UBound ($aLog) + $NbLignes]
	ReDim	$Radio[UBound ($Radio) + 1]
	Modifier ((UBound ($aLog) - 1) / $NbLignes, $fichier)
EndFunc
Func	Modifier ($compteBis, $fich) ;fonction générique pour ajout/modif de surnom
	Global	$compteTer = $NbLignes * ($compteBis - 1) + 1
	Global	$FenMod, $LabelSurnom, $LabelClef, $LabelNDC, $LabelMDP, $InputPseudo, $InputClef, $InputNDC, $InputMDP, $BValide, $BAnnule, $Encrypt = StringSplit ($aLog[$compteTer + 1], "{TAB}")
	Fenetre ("FenMod")
EndFunc
Func	ModAnnule () ;Annuler la modification d'un surnom (devrait plutôt être fait par un $GUI_EVENT_CLOSE sur le bouton...)
	GUIDelete($FenMod)
	DesAct ()
EndFunc
Func	ModModifier () ;Modification effective du surnom
	If	MsgBox (0x51, @ScriptName & " - Modifications", "Attention, vous vous apprêtez à" & @CRLF & "modifier définitivement ces données." & @CRLF & "Êtes-vous sûr ?") = 2	Then	Return
	If	GUICtrlRead ($InputPseudo) <> ""	Then
		TrayTip (@ScriptName, "Écriture en cours...", 0, 16)
		$aLog[$compteTer] = GUICtrlRead ($InputPseudo)
		_FileWriteToLine2 ($fichier, $compteTer, $aLog[$compteTer], 1)
		If	GUICtrlRead ($InputNDC) <> ""	Then
			If	GUICtrlRead ($InputClef) = "" 	Then
				$Encrypt[1] = GUICtrlRead ($InputNDC)
			Else
				$Encrypt[1] = _StringEncrypt (1, GUICtrlRead ($InputNDC), GUICtrlRead ($InputClef))
			EndIf
		EndIf
		If	GUICtrlRead ($InputMDP) <> ""	Then
			If	GUICtrlRead ($InputClef) = "" 	Then
				$Encrypt[UBound ($Encrypt) - 1] = GUICtrlRead ($InputMDP)
			Else
				$Encrypt[UBound ($Encrypt) - 1] = _StringEncrypt (1, GUICtrlRead ($InputMDP), GUICtrlRead ($InputClef))
			EndIf
		EndIf
		$Encrypt = $Encrypt[1] & "{TAB}" & $Encrypt[UBound ($Encrypt) - 1]
		If	$Encrypt <> $aLog[$compteTer + 1] Then
			$aLog[$compteTer + 1] = $Encrypt
			_FileWriteToLine2 ($fichier, $compteTer + 1, $aLog[$compteTer + 1], 1)
		EndIf
		TrayTip ("", "", 0)
	EndIf
	GUIDelete ($FenMod)
	GUIDelete ($FenBase)
	Fenetre ()
EndFunc
Func	FRadio ($r = 0) ;Fonction de sélection du surnom dans la liste (sans Multico)
	Local	$mess, $r
	If $r = 0	Then
		$mess = @GUI_CtrlId
	Else
		$mess = $r
	EndIf
	If	$mess <> $Radio[$compte]	Then
		If GUICtrlRead ($Multico) = $GUI_UNCHECKED	or	GUICtrlRead($Radio[$compte]) = $GUI_UNCHECKED Then
			GUICtrlSetFont($Radio[$compte], -1, 400)
			GUICtrlSetState ($Radio[$compte], $GUI_NOFOCUS)
		EndIf
		While	$mess <> $Radio[$compte]
			$compte += 1
			If	$compte > (UBound ($Radio) - 1)	Then
				$compte = 1
			EndIf
		WEnd
		GUICtrlSetState ($Radio[$compte], $GUI_CHECKED + $GUI_FOCUS)
		GUICtrlSetFont($Radio[$compte], -1, 800)
	Else
		FLancer ($compte)
		If	$fin = $GUI_CHECKED	Then	Exit
	EndIf
EndFunc
Func	FCheckBox ($r = 0) ;Fonction de sélection de(s) surnom(s) (avec Multico)
	Local	$mess, $r
	If $r = 0	Then
		$mess = @GUI_CtrlId
	Else
		$mess = $r
	EndIf

	$r = 0
	While $mess <> $Radio[$r]
		$r += 1
	WEnd

	If	GUICtrlRead($mess) = $GUI_UNCHECKED	Then
		GUICtrlSetFont($mess, -1, 400)
		MRetire ($r)
	Else
		GUICtrlSetFont($mess, -1, 800)
		ReDim	$coListe[UBound ($coListe) + 1]
		$coListe[UBound ($coListe) - 1] = $r
	EndIf
EndFunc
Func	FMultico () ;Gestion de l'état du bouton Multico
	$multi = GUICtrlRead ($Multico)
	If	$coListe[0] = ""	Then	$coListe[0] = $compte
	Fenetre ()
EndFunc
Func	MRetire ($suppr = -1) ;Dé-sélection d'un surnom pré-sélectionné (sous Multico)
	Local	$n = 0, $q, $z
	If	$suppr = -1	Then
		MsgBox(0,"Erreur","Cette fonction MRetire ne doit pas être appellée directement.")
		Return
	EndIf
	$n = 0
	While $coListe[$n] <> $suppr
		$n += 1
	WEnd
	While $n < UBound ($coListe) - 1
		$coListe[$n] = $coListe[$n + 1]
		$n += 1
	WEnd
	If	UBound	($coListe) > 1	Then
		ReDim	$coListe[UBound ($coListe) - 1]
	Else
		$coListe[0] = ""
	EndIf
EndFunc
Func	RModif ($mod = 0) ;Fonction générique pour l'ajout/modification de raccourcis
	Global	$n, $r
	Global	$fenRac, $LabelSansNom, $modRac = 0, $IScript, $BSParc, $LabelSansNom2, $ILog, $BLParc, $LComptes, $LabelSansNom3, $IComptes, $RBValide, $RBAnnule
	Fenetre ("FenRac")
EndFunc
Func	ParcoureScript () ;Parcourir les dossiers par l'utilisateur pour désigner le script
	$n = FileOpenDialog (@ScriptName & " - Sélectionnez votre script :", @ScriptDir, "Scripts (*.au3	;*.exe)|Tous (*.*)", 8, @ScriptName)
	If	$n <> ""	Then	GUICtrlSetData ($IScript, $n)
EndFunc
Func	ParcoureLog () ;Parcourir les dossiers par l'utilisateur pour désigner le log
	$n = FileOpenDialog (@ScriptName & " - Sélectionnez le fichier contenant vos logs :", $logChemin, "Textes (*.txt)|Tous (*.*)", 8, "Log.txt")
	If	$n <> ""	Then	GUICtrlSetData ($ILog, $n)
EndFunc
Func	RValide () ;Créer/Modifier le raccourcis
	$n = FileOpenDialog (@ScriptName & " - Choissez le nom et répertoire du raccourcis :", @ScriptDir, "Raccourcis (*.lnk)", 8, @ScriptName & ".lnk")
	If	$n = ''	Then	Return
	If	StringInStr ($n, ".lnk") = 0	Then	$n &= ".lnk"
	FileCreateShortcut (GUICtrlRead ($IScript), $n, "", ' "' & GUICtrlRead ($ILog) & '" ' & GUICtrlRead ($IComptes))
	GUIDelete ($fenRac)
EndFunc
Func	RFinir () ;Annuler le raccourcis, idem que ModAnnule()
	GUIDelete ($fenRac)
EndFunc
Func	RCharge () ;Charger une liste de comptes pré-enregistrés en raccourcis
	$n = FileOpenDialog (@ScriptName & " - Sélectionnez votre raccourcis :", @ScriptDir, "Raccourcis (*.lnk)", 8, @ScriptName & ".lnk")
	If	$n = ""	Then	Return
	$r = FileGetShortcut ($n)
	$logChemin = StringMid ($r[2], 3, StringInStr ($r[2], '"', 2, 2) - 3)
	$coListe = StringSplit (StringMid ($r[2], StringInStr ($r[2], '"', 2, 2) + 2), ",")
	For	$n = 0	To	UBound ($coListe) - 2
		$coListe[$n] = $coListe[$n+1]
	Next
	ReDim	$coListe[UBound ($coListe) - 1]
	$Lance = 1
	GUIDelete ($fenBase)
	ChargeLog ()
	Return
EndFunc
Func	RSuppre () ;Supprimer le raccourcis sélectionné
	$Racc = FileOpenDialog (@ScriptName & " - Sélectionnez votre raccourcis :", @ScriptDir, "Raccourcis (*.lnk)", 8, @ScriptName)
	If	$Racc <> ""	Then	FileDelete ($Racc)
EndFunc
Func	Lance () ;Démarrer la connexion d'un surnom/d'une liste de surnoms
	Local	$err = 0
	If	GUICtrlRead($Multico) = $GUI_CHECKED	Or	$Lance = 1	Then
		For	$n = 0	To	UBound ($coListe) - 1
			If	$coListe[$n] <= ((UBound ($aLog) - 1) / $NbLignes) And	$coListe[$n] > 0	Then  $err = FLancer ($coListe[$n])
		Next
		$Lance = 0
	Else
		$err = FLancer ($compte)
	EndIf
	If	$fin = $GUI_CHECKED And $err = 0	Then	Exit
EndFunc
Func	FLancer ($compteBis = $compte) ;Lancement du jeu + traitement des identifiants pour la connexion au jeu
	DesAct (1)
	$compteBis = ($compteBis - 1) * $NbLignes + 1
	If	StringInStr ($aLog[$compteBis + 1], "{TAB}") = 0	Then
		MsgBox(80,"","Compte invalide, désolée.." &@CRLF&@CRLF& "Veuillez le modifier pour le mettre aux normes."&@crlf&"Erreur : pas de séparateur {TAB} entre compte et pass.")
		DesAct ()
		Return -1
	EndIf
	Local	$Clef = InputBox (@ScriptName & " - Code du compte " & $aLog[$compteBis], "Veuillez entrer la clef de " & $aLog[$compteBis]& " :", "", "°")
	If	@error = 1	Then
		DesAct ()
		Return -2
	EndIf
	Local	$NDCMDP = StringSplit ($aLog[$compteBis + 1], "{TAB}", 1)
	If	$Clef <> ""	Then
		$NDCMDP[1] = _StringEncrypt (0, $NDCMDP[1], $Clef)
		$NDCMDP[2] = _StringEncrypt (0, $NDCMDP[2], $Clef)
	EndIf
	If	MsgBox (0x51, @ScriptName, "Lancement de la fenêtre Dofus !" & @CRLF & "Cliquez sur Annuler pour fermer." & @CRLF & Message(), 2) <> 2	Then
		TrayTip (@Scriptname, "Lancement de la fenêtre Dofus.", 0)
		Run ($prgChemin & $prgNom, $prgChemin)
		AutoItSetOption ("WinTitleMatchMode", 3)
		Do
			Sleep (200)
		Until	WinActive ("Dofus 2.0");	Or	WinActive ("Dofus - Opera")	Or	WinActive ("Dofus - Windows Internet Explorer")	Or	WinActive ("Dofus - Mozilla Firefox")
		AutoItSetOption ("WinTitleMatchMode", 1)
		WinSetTitle ("Dofus", "", "Dofus 2.0 - " & $aLog[$compteBis])
		TrayTip ("","",0)
		Sleep (1000)
		Traytip (@ScriptName, "Veuillez placer votre curseur" & @CRLF & 'sur la zone "Compte Ankama".', 10)
		AutoItSetOption ("MouseCoordMode", 0)
		$posDof = WinGetClientSize ("Dofus 2.0 - " & $aLog[$compteBis])
		Do
			WinWaitActive ("Dofus 2.0 - " & $aLog[$compteBis])
			$posCur = MouseGetPos ()
			Sleep(20)
		Until	(MouseGetCursor () = 5)	And	($posCur[0] < $posDof[0])	And	($posCur[1] < $posDof[1])	And	($posCur[0] > 0)	And	($posCur[1] > 0)
		MouseClick ("left")
		Send ($NDCMDP[1], 1)
		Send ("{TAB}")
		Send ($NDCMDP[2], 1)
		Send ("{TAB}{ENTER}")
;~ 		AutoItSetOption ("MouseCoordMode", 1)
;~ 		TrayTip (@Scriptname, "Veuillez passer votre souris" & @CRLF & 'sur le bouton "OK".', 0)
;~ 		Do
;~ 			WinWaitActive ("Dofus 2.0 - " & $aLog[$compteBis])
;~ 			sleep (20)
;~ 			$cur = MouseGetPos ()
;~ 		Until	((MouseGetCursor () = 0)	And	(PixelGetColor ($cur[0], $cur[1]) = 0xFF9900))
;~ 		MouseClick ("left")
		TrayTip ("", "", 0)
	Else
		DesAct ()
		Return -3
	EndIf
	DesAct ()
	Return
EndFunc
Func	Message ()	;Le message débile qui ne sert à rien.
	Switch	Random (0, 4, 1)
		Case	0
			Return	"(\__/)" & @CRLF & "( ' . ' )" & @CRLF & '(")_(")'
		Case	1
			Return	@CRLF & "Vous pouvez aussi aller jouer dehors," & @CRLF & "avec les papillons, les fleurs et les oiseaux."
		Case	2
			Return	""
		Case	3
			Return	@CRLF & "Ou patientez 2 secondes," & @CRLF & "que la fenêtre se ferme d'elle-même."
		Case	4
			Return	@CRLF & "La Vie est comme cette boîte de dialogue :" & @CRLF & "C'est quand elle se ferme qu'on arrive à l'essentiel."
	EndSwitch
EndFunc
Func	Fini () ;Fermeture du script en fin de connexion
	$fin = GUICtrlRead ($CFini)
EndFunc
Func	Void () ;Fonction vide, utile pour tester si un bouton "répond" ou pas lors des tests de débug. ^^'
	MsgBox (80, @ScriptName, "L'objet cliqué (" & @GUI_CtrlId & ") n'a pas" & @CRLF & "d'action associée, désolée." & @CRLF & "contenu = " & GUIctrlread (@GUI_CtrlId))
EndFunc
Func	Quit () ;Fermeture de la fenêtre appelante, ou du script entier si il ne reste que la fenêtre de base. :)
	GUIDelete (@GUI_WinHandle)
	If	@GUI_WinHandle = $FenBase	Then	Exit
	DesAct ()
EndFunc
	;==========================Fonctions AutoIt 3 modifiées========================================
Func	_FileWriteToLine2 ($sFile, $iLine, $sText, $fOverWrite = 0) ;Ecrire une ligne particulière dans un fichier texte
	If	Not	FileExists ($sFile)	Then	FileWrite ($sFile, "")
	Local	$filtxt = FileRead ($sFile, FileGetSize ($sFile))
	$filtxt = StringSplit ($filtxt, @CRLF, 1)
	If	UBound ($filtxt) - 1 < $iLine	Then	ReDim	$filtxt[$iLine + 1]
	Local	$fil = FileOpen ($sFile, 2), $i, $limit = UBound ($filtxt) - 1, $file2write = ""
	For	$i = 1	To	$limit
		If	$i = $iLine	Then
			If	$fOverWrite = 1	Then
				If	$sText <> ""	Then
					If	$i < $limit	And	$sText <> @CRLF	Then
						$file2write &= $sText & @CRLF
					ElseIf	$i = $limit	Or	$sText = @CRLF	Then
						$file2write &= $sText
					EndIf
				Else
					If	$i < $limit	Then
						$file2write &= $sText
					EndIf
				EndIf
			EndIf
			If	$fOverWrite = 0	Then
				If	$i < $limit	Then
					If	$sText = @CRLF	Then
						$file2write &= @CRLF & $filtxt[$i] & @CRLF
					Else
						$file2write &= $sText & @CRLF & $filtxt[$i] & @CRLF
					EndIf
				ElseIf	$i = $limit	Then
					If	$sText = @CRLF	Then
						$file2write &= @CRLF & $filtxt[$i]
					Else
						$file2write &= $sText & @CRLF & $filtxt[$i]
					EndIf
				EndIf
			EndIf
		ElseIf	$i < $limit	Then
			$file2write &= $filtxt[$i] & @CRLF
		ElseIf	$i = $limit	Then
			$file2write &= $filtxt[$i]
		EndIf
	Next
	FileWrite ($fil, $file2write)
	FileClose ($fil)
	Return	1
EndFunc	;==>_FileWriteToLine2
Func _FileWriteFromArray2 ($File, $a_Array, $i_Base = 0, $i_UBound = -1) ;Transformer un Array (Liste) en fichier texte
	Local	$hFile, $x, $file2write = ""
	If	IsString ($File)	Then
		$hFile = FileOpen ($File, 2)
	Else
		$hFile = $File
	EndIf
	If	$hFile = -1	Then	Return	SetError (1, 0, 0)
	If	$i_UBound < 1	Then	$i_UBound = UBound ($a_Array)
	$x = $i_Base
	Do
		$file2write &= $a_Array[$x] & @CRLF
		$x += 1
	Until	$x = $i_UBound
	FileWrite ($hFile, $file2write & $a_Array[$i_UBound])
	If	IsString ($File)	Then	FileClose ($hFile)
EndFunc  	;==>_FileWriteFromArray2
Func	_FileReadToArray2 ($sFilePath, ByRef	$aArray) ;Transformer un fichier texte en Array (Liste)
	Local	$hFile
	$hFile = FileOpen ($sFilePath, 0)
	If	$hFile = -1	Then
		SetError (1)
		Return	0
	EndIf
	$aArray = StringSplit (StringStripCR (FileRead ($hFile, FileGetSize ($sFilePath))), @CRLF)
	FileClose ($hFile)
	Return	1
EndFunc	;==>_FileReadToArray2
La très légère différence de taille avec la version "normale" du DofusLog 1_10, c'est à cause de la mise en commentaire d'une partie du source, qui ne pouvait pas être re-appliqué. (Notamment, le chemin d'installation depuis le registre Widows pour chercher "Dofus.exe", pour ne citer que lui.)

Et donc, votre DofusLog habituel est compatible avec vos comptes habituels, toutes les fonctionnalités sont de retour pour votre plus grand plaisir !
(Le script utilise le chemin d'installation par défaut $prgChemin = "C:\Program Files\Dofus 2 Online\app\", ou à entrer soi-même si non-trouvé pour lancer Dofus 2.0. //Si rien n'est demandé, c'est que le script a trouvé Dofus 2.0 à cet endroit. :])

Enjoy !

Za.
Et voilà la 2_0 pour moi aussi, youhou, presque du AG !
Et voilà, le DofusLog 2_0 est arrivé !

Comment le récupérer ?
Argh, le code source est passé trop long (j'en parle plus bas, il fait 47242 caractères !), le forum n'accepte plus de l'afficher dans son entier dans un post forum.. et ça se comprend !
Version Compilée :DofusLog-v2_0.exe - 291.35 kB
Version Scripte : DofusLog-v2_0.au3 - 46.1 kB
Version Source : Désolée, pas cette fois sur JoL, rendez-vous sur Pastebin -> http://pastebin.com/f51b4900a
47242 caractères pour 1097 lignes, vivement la prochaine !
J'ai changé d'hébergeur pour mes fichiers, il s'agit maintenant de Steekr (contre MegaUploads, avant), c'est mieux ?

Ce qui change depuis la version 1_10 ?
- Sécurité améliorée
Pour que le script accepte de lâcher les identifiants, il faut que la fenêtre active porte le bon titre ("Dofus - [Surnom]"), que la souris soit sur une zone de texte (le "Compte Ankama") dans la fenêtre, et que ça reste sans bouger pendant ~1 seconde. (La faille était de faire un alt-tab entre la "bonne" fenêtre Dofus et une autre fenêtre pour voir les identifiants. C'est corrigé.)
- Création (semi-automatique) d'un fichier "DofusLog.ini" contenant
-> Auteur ("Za"), Version ("2_0") par défaut
-> le chemin d'accès au fichier de Log (fixé à "Non Communiqué" par défaut, pour garder un anonymat complet sur vos fichiers)
-> le chemin d'accès au lanceur de Dofus (vide par défaut, pratique pour sauvegarder la place de l'exécutable Dofus à lancer)
-> le dernier fichier de skins utilisé (idem, par défaut vide)
-> l'option de sauvegarde de position de fenêtre principale (par défaut vide, voir dans les menus pour changer)
-> l'option de connexion en plein écran (attention, compatible Dofus 1.0 uniquement ! ~Ca m'apprendra à mettre 6 mois pour développer une interface de skins, tiens... ^^')
-> la dernière position connue de la fenêtre (colonne+ligne, par défaut à "-1")
- Système de clef Unique mis en place (permet de sélectionner une clef à utiliser "par défaut" pour les surnoms, elle est garantie sécurisée)
- Ajout de plein de "TrayTips" pour rendre le script plus convivial (Notament quand vous chargez le script, le mieux est d'avoir une machine un-peu lente pour tous les lire !)
- Gros ménage dans l'ordre des informations demandées à l'utilisateur : Maintenant le Log, puis l'exécutable Dofus. (Si vous ne voyez pas de différence avec 'avant', c'est bien.)
- La gestion des listes de connexions via les raccourcis a été super-simplifiée : c'est un menu à 2 entrées : créer/charger. Créer un raccourcis fait un nouveau fichier avec la liste de connexion active (c'est plus simple), et charger permet la connexion d'une team depuis le script déjà ouvert
- Gestion de si la fenêtre "Dofus - [Surnom]" existe déjà : le script demande à la réutiliser
- Nettoyage du code, toutes les variables Globales sont déclarées en début de script, et toutes les Locales en début de fonction.
- Nouvelles phrases aléatoires : y'en a plein en plus, dont certaines varient en fonction de l'heure, de la date... À chaque instant, le script a le choix entre 10 phrases différentes.
- Les Skins sont implémentés ! Stockés sous la forme d'un fichier ".ini" (Skin.ini, par exemple), ils sont échangeables, compatibles et roxatifs ! Pour le moment, la personnalisation se fait juste sur la fenêtre principale. J'étendrai bientôt à toutes les fenêtres du script.
- Le Script ne se "bloque" plus : il peut être fermé à tout instant avec alt-q ou la croix rouge en haut à droite. Si il ne se ferme pas directement, c'est qu'une question est posée à l'utilisateur (Il suffit alors de répondre nimporte-quoi pour fermer le script de manière brutale).
- Les informations super sensibles (la Clef du surnom et le mot de passe Dofus) sont "cachés" : les caractères sont remplacés par des "*" à l'affichage dans la fenêtre de Nouveau/Modification de compte. C'était le seul instant où mon script mettait en danger les informations utilisateur, c'est maintenant réparé.
(Je rappelle que seul le surnom du compte est une information visible par la modification d'un compte, et que les autres informations ne peuvent être que remplacées volontairement par l'utilisateur.)
- La création/chargement d'un fichier de Log depuis le menu "Fichier" fonctionne maintenant correctement.
- Le code source a dépassé les 1000 lignes (1097, précisément), à partir de cette limite les programmes se tapent à peu-près un bug de plus toutes les 10 lignes. Argh, j'ai besoin de vous pour les traquer ! Attrappez-les tous ! Pokémon !!

Donc, en parlant des bugs :
-> mettre un "&" devant une lettre dans un surnom permet un raccourcis rapide sur la lettre suivante.
Exemple : &Zamiza mettra un raccourcis pour le surnom "Zamiza" en appuyant sur la touche "z" dans le script.
Là où y'a un bug (car ça, c'est pas un bug, c'est une avancée utile !), c'est que la fenêtre dofus se retrouve avec un nom tout laid de type "Dofus - &Zamiza".
Je vais voir à virer dans ce cas le "&".
-> parfois (rarement), le script est trop méchant, et ne veut pas écrire les identifiants quand la souris est au bon endroit. Je suis au courant : c'est juste une preuve que la sécurité du script est trop efficace. Je n'ai pas encore de solution valable à vous proposer, sinon de quitter le script et de le relancer en utilisant la fenêtre déjà existante, ça devrait être bon.

Ce qui ne change pas depuis la version 1_10 ?
Le fonctionnement du script. Il se base toujours sur un fichier texte sélectionné par l'utilisateur, crypté, et gère la connexion d'un/plusieurs comptes au jeu Dofus de manière respectueuse.

Ce qui va changer pour la prochaine version ?
- Encore une refonte du code en vue, mais cette fois, je vais essayer de repasser en-dessous des 800 lignes ! è_é" (tout en gardant bien-sûr toutes les fonctionnalités actives.)
- Déplacement de quelques objets dans les fenêtres, vous pourrez le voir à travers le module de Skin (en utilisant les hauteurs de ligne et la séparation entre elles), c'est "pas top" pour l'instant. Ca sera "top" la prochaine fois !
- Ajout de vos idées ! Allez, à vos claviers, dites moi ce qui vous ferait le plus plaisir pour améliorer mon script ! Le "petit détail qui fâche", ou la grosse amélioration à quoi vous pensez, je me ferai une joie de l'ajouter !

Pour finir ce long post, je vous offre 2 images du DofusLog, avec un skin différent :
http://photomaniak.com/upload/out.php/i858346_Dofuslogv20.PNG http://photomaniak.com/upload/out.php/i858347_Dofuslogv20Skin.png

N'hésitez pas à parcourir le menu d'Options pour découvrir toutes les nouveautés !
Allez, Joyeux Noël, Bonne Année, Bonne Santé toussa, je soigne mon angine et je reviendrai encore plus en forme pour 2010 !

À bientôt,

Za.

P.S : Grand malheur prévu pour 2010, le premier Janvier sera un Vendredi 13 ! Fear.
Hello, j'ai un peu fait mon testeur et à chaque fois que je ferme et ré-ouvre le logiciel, il n'arrive pas à détecter Dofus.exe, même quand je lui demande de s'en souvenir.
Que faire ?

EDIT : Autre chose, on ne peut pas mettre en image de fond une image .png !
EDIT 2 : Autre bug, dans la fenêtre de modification du skin (ce qui m'importe le plus :P), quand on change la hauteur d'une ligne de texte et qu'on la met en dessous de 12, la hauteur s'applique aussi à la fenêtre de changement et on ne peut plus sélectionner la ligne pour l'agrandir, c'est assez embêtant :°
Je suis étonnée.. Vérifie que dans le répertoire du script, il y a le fichier "DofusLog.ini", et que les lignes "Exécuter=" et "Chemin=" forment bien ensemble le chemin vers ton exécutable Dofus ?

Exemple :
Exécutable=Dofus.exe
Chemin=C:\Program Files\Dofus
Ou :
Exécutable=D:\Jeux\Dofus\Dofus.exe
Chemin=

Te serait-il possible de me transmettre ces deux lignes ? (Par MP de pref, le Wiki commence à être chargé. ^^)

Et oui, les seuls formats acceptés sont BMP, JPG et GIF pour l'instant.. J'ai commencé à chercher comment faire pour les formats manquants !

Za.

Edition pour dessus :
Huhu, pour changer ça, tu peux éditer ton fichier "skin.ini" (enfin, le nom que tu lui as donné), pour changer la ligne "Hauteur d'une Ligne", et la mettre à la valeur désirée ("16", de base)

Edition pour dessous :
Erf, soucis de programmation, ça...
Bon, je vais faire un correctif ce soir, je le mettrai à disposition demain.
Merci d'avance Za !
Chez moi, ça donne ça, et j'aimerai bien un truc... mieux xD Encore des options à définir je pense, car quand j'élargis la fenêtre, les rectangles des pseudos gardent la même dimension...
http://img51.imageshack.us/img51/6382/dofuslog20bug.png
Serait-il possible qu'il enregistre l'état de la case "Fermer ce script après ce compte". Histoire qu'elle soit toujours activée quand on arrive dans le script.

Et à quoi sert la petite fenêtre après celle où l'on entre la clef ? Même sans cliquer elle disparait au bon de deux secondes, mais tant qu'a faire, autant la supprimer et afficher la fenetre Dofus directement.
Citation :
Publié par Clayman
La version 2.0 ne marche pas chez moi, il tape bien le nom de compte, mais oublie des caractères au mot de passe.
Les caractères spéciaux ne sont pas pris en compte je crois, si tu en as dans ton mdp.
[résolu]Fermer le script après ce compte : Ok pour sauvegarder dans le DofusLog.ini, ça devrait pas être très dur à faire.

[résolu]Le MDP sur Dofus 2.0 fonctionne mal : J'ai vu aussi, c'est à cause de la trop grande vitesse du script. Je vais ralentir pour donner une vitesse d'écriture plus lente, et ça devrait aller mieux.
Edit : Ha, et j'allais oublier : Les caractères spéciaux dans le Mot de Passe sont maintenant acceptés (depuis la v1_8), donc le soucis ne vient pas de ce côté. ^^

[laissée telle-que]La petite fenêtre débile : Elle ne sert à rien, si ce n'est offrir un petit message à l'utilisateur, pour le prévenir que le script charge sa commande.
À la base, je voulais faire un message du style "chargement en cours, cliquez sur annuler pour annuler", mais je ne savais pas faire.
Si votre ordinateur rame un-peu, vous avez pu voir que je sais maintenant le faire, donc je vais voir à changer de la même manière.
Ou alors je garde, pour des raisons "Historiques" ? Ha, j'hésite.

[résolution à confirmer]L'exécutable de Dofus : Je crois que j'ai comprit ce qui ne va pas, il s'agit de la zone "Chemin" qui n'est pas remise à 0 quand on change d'exécutable, demain ce sera réglé (si je prend le temps de le faire ce soir !).

[résolu avec l'idée n°2]La taille des "objets" est trop petite pour la police de caractère utilisée : rhaa, je me doutais bien que quelqu'un finirait par me le dire ! Bon, je vais ajouter une ligne "Largeur des noms de compte" dans le skin, ça fait environs 150 pixels de large pour le moment, je ferai bouger la taille de la fenêtre en même-temps pour le prendre en compte de manière dynamique.
Autre idée, c'est de laisser la taille des objets à "Par défaut", et de laisser la fenêtre se calibrer sur la taille des-dits objets. C'est compliqué à expliquer, c'est compliqué à faire, mais je sais le faire, donc je vais essayer.

Merci à vous,

Za.
Citation :
Publié par Royaume (Raval)
Les caractères spéciaux ne sont pas pris en compte je crois, si tu en as dans ton mdp.
Que des chiffres dans mon mdp . Le problème venait d'une exécution trop rapide su script ( confirmé par za )
Voilà, la version 2_1 est disponible !

Version compilée : DofusLog-v2_1.exe - 291.3 kB
Version script : DofusLog-v2_1.au3 - 46.1 kB
Version source : http://pastebin.com/f4c01bbb3
52828 caractères pour 1147 lignes.. J'espère que ça règle une bonne partie des soucis !

ChangeLog :
-> Application du skin sur la totalité du script
-> Affichage dynamique des fenêtres en fonction de la taille de la police utilisée
-> Meilleur affichage des objets sur les fenêtres, il me reste à fignoler la hauteur de la fenêtre principale
-> Réactivation de la boucle des objets sur la fenêtre principale : sisi, j'y tiens, c'est super-utile
-> Meilleure prise en charge du "Plein Écran" sous Dofus 1.X / 2.0, ça faisait interférence sur le mot de passe sous Dofus 2.0
-> Ralentissement de la vitesse d'écriture des informations dans la fenêtre Dofus : c'est une deuxième voie pour éviter les problèmes d'interférences
-> Disparition de la gestion de la Hauteur de Ligne par Skin : le script s'en charge tout seul maintenant
-> Ajout de transparence sur les fenêtres, c'est bien ? Ca change rien ? osef ? à désactiver de toute urgence ? Ou à activer/désactiver suivant le Skin ?
-> Implémentation des Avatars liés aux surnoms : le but de la prochaine version sera de changer l'icône de la fenêtre dofus en fonction du surnom choisit.
-> Sauvegarde auto de l'état du bouton "Fermer le script après ce compte" dans le dofusLog.ini
-> Légère modification au niveau de la sélection de l'exécutable dofus : Ca devrait régler le problème de chemins invalides ou non-mémorisés, mais ça demande une confirmation supplémentaire du script. Je dois me pencher sur la question de cette double-validation. (Première : le "nom" de l'exécutable a changé, ok, et deuxième c'est que le "nom+chemin" de l'exécutable a changé.. Mouais. ^^)

Voilà, merci de vos retours !
Et n'hésitez pas à vous échanger les Skins.ini, histoire de partager vos créations ! ^^

Za.
Cliquez sur le lien pour arriver sur SteekR.com, et ensuite cliquez sur le fichier pour l'enregistrer dans votre ordinateur.

J'en profite pour vous demander (puisque c'est faisable), si je fais un pack avec les versions compilée + script dans le même lien (les 2 fichiers présentés avec le même lien, vous choisissez la version que vous voulez télécharger), ça vous intéresse ?
(exemple avec le DofusLog-v2_1.)

Za.
MegaUploads, c'est fini pour moi.
Vite-fait : l'interface est moche, les pubs énervantes, le captcha désagréable, et l'attente au téléchargement trop limitative.

Je suis passée à SteekR qui répond à mes besoins : pas d'attente au téléchargement, pas de captcha, interface vraiment bien faite, et pubs discrètes.
En plus de quelques détails supplémentaires, comme la possibilité maintenant de partager plusieurs fichiers en un seul lien.

Pour l'affichage de la fenêtre principale, j'ai bougé quelques trucs pour la 2_1, c'était visiblement une mauvaise idée, pardon. ^^'
Je remettrai bien en place la prochaine fois.

Ha, une fonctionnalité que je n'ai pas documentée, mais implanté : il est possible de faire glisser directement un fichier sur une zone pour remplir le champs avec.
Les 3 zones "Avatar", "Image de fond", et "Police de caractère" ont cet ajout, vous pouvez juste glisser le fichier désiré dans la zone correspondante pour y mettre son nom. (Exemple : dans la zone "Avatar" vous désirez mettre le fichier "C:\Jeux\Dofus\MonPerso.bmp", il suffit de glisser le fichier dans la zone, et pouf. )

Za.
Bonjour,

J'ai l'impression que sur ce site de téléchargement, les connexions sont limitées.

Lors de mon premier download, j'ai pu récupérer correctement le fichier mais pour la mise à jour je n'ai pas pu

Moi aussi j'étais redirigé sur la page d'accueil du site sans préavis

Alors limitation sur 24h ou 48h, limitation par IP, je n'en sais rien, je ne me suis pas amusé à vérifier mais en tentant une nouvelle fois ce matin, j'ai bien pu récupérer la mise à jour du programme ... (soit plus de 48h après mon premier téléchargement mais je n'ai pas vérifié si mon IP avait changé depuis)

Bonne journée,

Hell.
Argh, je note que SteekR est foireux.
*retourne chercher un hébergeur valide*

Sinon pour ton erreur tazdu54, il semble que ça soit un soucis de dimension d'une liste qui est dépassée (soit que je demande l'élément "-1", soit je demande l'élément "max +1", l'erreur retournée est la même), pourrais-tu me dire à quel moment elle intervient ? (Qu'est-ce qui se charge en dernier, le surnom ciblé dans le fichier de Log [sans la ligne des identifiants cryptés], etc)

Peut-être est-ce dû à l'ajout des avatars pour les surnoms.

Merci pour vos retours, de mon côté j'ai fini de retoucher la fenêtre principale, je regarde ce bug signalé, je change d'hébergeur, et je vous met la version 2_1bis à disposition.

Za.
Fil fermé

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés