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

Cassegrain

Membre
  • Compteur de contenus

    9
  • Inscription

  • Dernière visite

  • Jours gagnés

    1

Cassegrain a gagné pour la dernière fois le 9 mars

Cassegrain a eu le contenu le plus aimé !

À propos de Cassegrain

Visiteurs récents du profil

Le bloc de visiteurs récents est désactivé et il n’est pas visible pour les autres utilisateurs.

Cassegrain's Achievements

Apprentice

Apprentice (3/14)

  • First Post
  • Collaborator
  • Conversation Starter
  • Week One Done
  • One Month Later

Recent Badges

17

Réputation sur la communauté

1

Community Answers

  1. Pas de souci. Les coordonnées de ta map ne sont pas bonnes, puisqu'elles ne sont pas divisibles par 256 comme je te l'ai indiqué. 77452 / 256 = 302,8984375 Corrige ça partout (Setting.txt serveur, setting.txt et atlasinfo.txt client) et ça devrait fonctionner.
  2. [Hidden Content] Voilà un outil qui te sera utile pour gérer ton atlasinfo et les coordonnées de tes maps. Les map fonctionnent même si leurs coordonnées ne sont pas divisibles par 256, le problème est lié aux attributs de la map. Les maps sont divisées en carrés de 256x256 (qui équivaut à une map 1x1). Comme sur l'outil d'au dessus, imagine les maps sur une grille de ces carrés. Lorsque tu mets une map dans la grille, les attributs de la map vont se positionner dans le coin en haut à gauche du carré dans laquelle elle se trouve, même si la map n'est pas dans le coin. Ce qui fait que toutes les safezone / zone passables / non passables sont décalées. Ca n'affecte que la partie serveur, tu pourras faire le test si tu veux.
  3. Yop, Il faut savoir que les safezone client et serveur ont deux actions différentes. Celle du serveur fait en sorte qu'un personnage à l'intérieur d'une safezone ne puisse pas recevoir de dégâts d'autres joueurs ou d'attaques de monstres. Par contre, celle du client empêche un joueur d'infliger des attaques. Comme on peut le voir sur ta vidéo, lorsque le personnage est en safezone, il continue de recevoir des attaques mais ne reçoit plus de dégâts. C'est donc la partie client qui pose problème. En premier lieu vérifie que la version de la map dans ton client est bien la dernière. Ensuite, tu peux vérifier les coordonnées sur lesquelles tu as mis ta map, il faut qu'elles soient divisibles par 256, si ça ne l'est pas, il peut y avoir un décalage des attributs de la map; et identiques (Setting.txt serveur, setting.txt et atlasinfo.txt client)
  4. Cassegrain

    systeme pet officiel

    Yop, Il te manque la class ExpandedTaskBar qui, sur l'interface de l'offi, est accessible en cliquant sur le bouton au centre de la barre de skill et qui permet d'ouvrir un menu contenant des boutons. Tu es en train d'essayer d'ajouter le bouton permettant d'ouvrir la fenêtre de familier à l'intérieur de cette extension. Sur l'interface Illumina, le bouton au centre est sensé simplement ouvrir / fermer le chat comme c'était le cas sur l'interface de l'offi avant l'alchimie des pierres dragon. Tu as donc plusieurs options. Soit tu ajoutes la class qu'il te manque en la reprenant de l'offi et tu modifies l'action du bouton du chat pour permettre de l'ouvrir; ou alors tu mets ton bouton ailleurs, comme par exemple sur le bord de l'inventaire. N'hésite pas à lire le code pour essayer de comprendre. Si tu as changé ton interface et qu'un tuto s'adapte à celle de l'offi, essayer de comparer les fichiers de l'offi et les tiens pour voir ce qu'il te manque me semble être une bonne démarche lorsque tu rencontres un souci tel que celui-ci. Tu vas y arriver !
  5. Bonne initiative, surtout au niveau des explications. Je pense que pas mal de personnes ne prennent pas la peine d'essayer de comprendre ce qu'ils font en suivant un tuto, au moins ici, chaque chose est expliquée. Niveau compression du client, je crois qu'il faut pas chercher trop loin. Après quelques comparaisons, je suis passé sous LZ4 surtout pour ne plus utiliser l'algo de base et compliquer la tâche à quelqu'un qui voudrait faire un depacker. Le client est légèrement plus lourd qu'en LZO (+8% environ). Le premier chargement est plus rapide (-15%) environ. La fluidité en jeu reste la même, à l'oeil nu on ne voit pas beaucoup la différence sur quelques centièmes de seconde. Il y a beaucoup d'outils pour compresser. Moi je suis parti vers LZ4 qui a été celui qui offrait les meilleurs performances en terme de décompression pour le client. La compression en LZMA est plus optimale, mais la décompression est plus longue. Faut peser le pour et le contre et voir ce qui compte le plus. Je ne me suis pas encore tourné sur l'encryption des fichiers, mais oui, regrouper les packs et index ou compiler les index dans le lanceur est un bon moyen d'empêcher de les avoir. Les clés de cryptages sont jamais très sûres, peu importe les efforts que vous fournirez à les cacher. Le mieux est de refaire un algo unique. C'est beaucoup plus dur à reverse. Il faudra par contre, comme l'a dit Kijaru, penser à désactiver / retirer les fonctions pack du python dans le lanceur au cas où quelqu'un injecterait un script python dans le client. Comme d'habitude, il faut éviter de trop compter sur l'anti cheat pour ce genre de choses. Au lieu des pyc, compiler son root / uiscript en C avec cython ? Y'a des tutos depuis pas mal de temps. Les fichiers python sont convertis en C puis compilés en lib qui finit dans le lanceur. On gagne environ 10% de performance globale sur l'interface du jeu. Même si certains fichiers en C font + de 50.000 lignes, c'est bien plus rapide qu'en python. Là encore, à l'oeil nu, à moins d'avoir une fenêtre d'interface très chargées, on ne remarque pas vraiment la différence, mais y'a pas mieux pour obfusquer ses scripts. (A moins d'oublier de le faire avant de faire une mise à jour, comme l'a fait l'offi il y a peu...) C'est tout ce qui me vient pour l'instant ! Le mieux, c'est de ne pas batifoler dans tous les sens. Gardez un jeu à peu près fluide et réfléchissez avant de vous lancer dans de grosses modifications comme ça. Voyez si ça vaut le coup, comparez différentes méthodes etc... Bon chance !
  6. Hello, C'est se compliquer un peu la tâche pour pas grand chose. L'ajout d'une simple variable dans le constInfo modifiée à l'ouverture et fermeture de l'entrepôt suffirait, comme c'est le cas pour la variable isItemQuestionDialog. Toutes ces modifications ne me semblent pas nécessaires. L'utilisation que tu en fais est bonne cependant !
  7. Attention aux failles de sécurité ! Le string de raison n'est pas escapé et il n'y a visiblement aucune restriction sur les caractères que l'on peut y mettre. Même si cette commande ne peut logiquement être utilisée que par un Game Master, il serait tout de même dommage de laisser une vulnérabilité capable de supprimer ou modifier l'ensemble de vos données sql ! Voici la commande corrigée: ACMD(do_ban) { // Args char arg1[256], arg2[256], arg3[256]; // Local variables const char* szName; const char* szReason; char szReasonEscape[1024]; int iDuration; one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3)); // Invalid syntax if (!*arg1 || !*arg2 || !*arg3) { ch->ChatPacket(CHAT_TYPE_INFO, "Invalid Syntax, usage: tip: don't use spaces in the reason, use _"); return; } szName = arg1; iDuration = atoi(arg2); szReason = arg3; // Escape szReason to szReasonEscape DBManager::instance().EscapeString(szReasonEscape, sizeof(szReasonEscape), szReason, strlen(szReason)); if (iDuration <= 0) { ch->ChatPacket(CHAT_TYPE_INFO, "Duration can't be 0 or minus."); return; } LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(szName); if (!tch) { ch->ChatPacket(CHAT_TYPE_INFO, "%s is not playing", szName); return; } if (!tch->GetDesc()) { ch->ChatPacket(CHAT_TYPE_INFO, "%s don't have desc", szName); return; } if (tch == ch) { ch->ChatPacket(CHAT_TYPE_INFO, "What's wrong with you? Don't ban yourself"); return; } if (tch->GetGMLevel() > GM_PLAYER) { ch->ChatPacket(CHAT_TYPE_INFO, "Do not ban GMs"); return; } std::auto_ptr msg(DBManager::instance().DirectQuery("INSERT INTO account.ban_ingame (id, name, begins, finish, reason) VALUES ('%d', '%s', NOW(), FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) + %i), '%s')", tch->GetAID(), tch->GetName(), iDuration * 3600, szReasonEscape)); DBManager::instance().DirectQuery("UPDATE account.account SET status = 'BLOCK' WHERE id = %d", tch->GetAID()); tch->GetDesc()->DelayedDisconnect(5); sys_log(0, "%s[%d] banned %s for %i hours with reason: %s", ch->GetName(), ch->GetPlayerID(), szName, iDuration, szReasonEscape); ch->ChatPacket(CHAT_TYPE_INFO, "%s has been banned for %i hours with reason: %s", szName, iDuration, szReasonEscape); } Je n'ai pas testé mais ça devrait fonctionner. De plus, je n'ai pas compris pourquoi le status du compte est mis à BLOCK alors que seul availDt pourrait directement avoir la date de fin du bannissement pour que le débannissement soit automatique. Il faudrait remplacer : DBManager::instance().DirectQuery("UPDATE account.account SET status = 'BLOCK' WHERE id = %d", tch->GetAID()); par : DBManager::instance().DirectQuery("UPDATE account.account SET availDt = FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) + %i) WHERE id = %d", iDuration * 3600, tch->GetAID()); Petite remarque supplémentaire, il me semble qu'il n'est pas nécessaire de sélectionner la table account dans les query. Pour ceux qui ont modifié le nom des tables, je pense, mais sans certitude, que l'on peut simplement retirer "account." des deux query. Merci tout de même !
  8. Centre de Téléchargement Télécharger ( 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. Dossier qui contient les fichiers sur lesquels l'action de compression ou décompression doit être effectuée Dossier qui contiendra les fichiers une fois l'action réalisée Nom de l'executable qui compresse les fichiers 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: [Hidden Content] 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] python26.exe: [Hidden Content] python26.dll: [Hidden Content] Liens: Mega (rar): [Hidden Content] Mega (zip): [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 !
  9. Centre de Téléchargement Télécharger ( Interne ) Bonjour, C'est plutôt un partage de connaissances que je vous propose aujourd'hui en vous présentant un outil pour améliorer la lisibilité du code. Cet outil c'est Artistic Style. Un formatter / beautifier de code dont je n'ai trouvé aucun équivalent. Le code source est disponible ici: [Hidden Content] La documentation ici: [Hidden Content]astyle.html Utilisation: Vous pouvez l'utiliser sur différents supports, Freebsd, Windows, ou même Linux. Un package déjà compilé est disponible en plus de la source complète que vous pourrez compiler par vous même après l'avoir adapté à vos besoins si vous le souhaitez. - 1: Windows: il faudra se servir d'un fichier batch pour lancer l'exécution. exemple.bat: AStyle.exe --style=allman test.cpp test.h pause Cette ligne de commande mettra les fichiers test.cpp et test.h du répertoire courant à la norme allman. La deuxième ligne "pause" permet de laisser la fenêtre de commande ouverte une fois l'exécution terminée. - 2: Freebsd / Linux: Il faudra se servir d'un fichier shell. exemple.sh: #!/bin/sh astyle --style=allman test.cpp test.h Cette commande donnera le même résultat que celle pour windows. La première ligne est un shebang, qui permet au système de savoir avec quel exécutable le script doit s'exécuter. Les arguements: Comme vous pouvez le voir sur la documentation, il existe beaucoup d'arguments qui ont chacun leur spécificités. Changer le type d'indentation, changer la position des accolades, aligner les définitions de variables ou de fonctions et d'autres. Mais le mieux pour ça, c'est d'essayer par vous même pour que vous trouviez la combinaison qui vous correspond afin d'éclaircir votre code et d'optimiser votre travail. Je vais jsute faire un petit point sur la récursivité que propose le logiciel sur le traitement des fichiers, qui permet de modifier un dossier complet, par type de fichier. Exemple.bat: AStyle.exe --style=allman --recursive E:\work\src\*.cpp AStyle.exe --style=java --recursive E:\work\include\*.h pause Exemple.sh: #!/bin/sh astyle --style=allman --recursive '/work/src/*.cpp' astyle --style=java --recursive '/work/include/*.h' Ces lignes de commandes permettent de: Mettre tous les fichiers .cpp à la norme allman dans les chemins indiqués. Mettre tous les fichiers .h à la norme java dans les chemins indiqués. Recommandations: Pour les codes source C / C++ voici les arguments que je recommande: --style=allman --indent=force-tab --indent-namespaces --indent-switches --indent-modifiers --indent-classes --indent-preproc-block --pad-oper --remove-brackets --break-after-logical Pour les fichiers headers (moins de saut de ligne et meilleur lisibilité pour les fonctions sans déclaration): --style=java --indent=force-tab --indent-namespaces --indent-switches --indent-modifiers --indent-classes --indent-preproc-block --pad-oper --remove-brackets --break-after-logical Attention, lorsqu'un fichier est modifié par le logiciel, une copie avant modification est créée et l'extension '.orig' (par défaut) y est ajoutée. Pour éviter de devoir tout trier sur un gros projet, il est préférable de faire une sauvegarde au préalable et d'ajouter l'argument suivant qui désactivera la sauvegarde faite par le logiciel: --suffix=none N'oubliez pas que la documentation est toujours très utile et qu'il y a beaucoup de fonctionnalités utiles à exploiter ! Bon code !

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.