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

Metin2 Dev

Robot
  • Compteur de contenus

    3211
  • Inscription

  • Dernière visite

    jamais
  • Jours gagnés

    9

Tout ce qui a été posté par Metin2 Dev

  1. Salut, tu mets en événement sur un bouton la fonction pour ouvrir l'autre.
  2. Le tuto doit être mit à jour pour php7 déjà. Je m'en occuperais si je trouve l'envie
  3. Centre de Téléchargement Télécharger ( Interne ) Bonjour Dans le but de la "rénovation" du forum, j'essaye d'aider comme je peux, et ça semblait intéressant que je fasse une petite réécriture de certains tutoriels qui manquaient d'informations. Je vais commence donc mes réécriture avec celui la qui était partagé par Litchy qui lui même l'avait partagé d'autre part etc... Des nouveautés ? Je vous explique entièrement le code. L'objectif est certe de rénové les tutoriels, mais aussi de vous offrir un peu plus d'information. Vous voyez que en générale, je vais vous apprendre comment ajouter un bouton, pas quelque chose de spécifique en vous faisait suivre une procédure digne d'un vieux avec ses habitudes. Commençons ! Avant de commencer, je précise juste que le target c'est ça : Ou encore les différents boutons qui s'affichent dans la petite fenetre en haut quand vous cliquez sur un joueur contenant "MP", "Echange", "Groupe" etc.... Commencez par depack votre root : Je vous laissez ensuite ouvrir votre uitarget.py qui va contenir toutes les informations "système" du target. Vous allez ensuite cherchez ceci : class TargetBoard(ui.ThinBoard) : Tout ce qui se trouve derrière ceci, avec une tabulation va faire partie de sa class, c'est comme une catégorie si vous voulez ! Ensuite vous aurez une liste qui devrait ressembler à ceci : Si c'est ça, (surtout le "LocaleInfo"), ajoutez : localeInfo.TARGET_BUTTON_DC, --->Notez dans ce cas que vous avez des files 2014 ou plus. Si au contraire, vous avez des locale.TARGET_BUTTON...., ajoutez : locale.TARGET_BUTTON_DC, --->Notez dans ce cas que vous avez des files antérieur aux 2014. Ici, nous ajoutons un élément à une liste. Le changement entre local/localInfo dépend de la version de vos files. Effectivement, à partir des 2014 il y a eu un changement à ce niveau. Vous allez ensuite, toujours dans le même fichier chercher : -->Pour les files 2014 ou plus : self.buttonDict[localeinfo.TARGET_BUTTON_EMOTION_ALLOW].SAFE_SetEvent(self.__OnEmotionAllow) Ajoutez en dessous : self.buttonDict[localeInfo.TARGET_BUTTON_DC].SAFE_SetEvent(self.__OnDc) -->Pour les files antérieurs aux 2014 : self.buttonDict[locale.TARGET_BUTTON_EMOTION_ALLOW].SAFE_SetEvent(self.__OnEmotionAllow) Ajoutez en dessous : self.buttonDict[locale.TARGET_BUTTON_DC].SAFE_SetEvent(self.__OnDc) Pour les deux cas, faites que les tabulations au début correspondent. C'est à dire que vous devez mettre le même nombre de tabulation entre la recherche et l'ajout ici. Ici, nous avons dis au client que : Le button que l'on nomme par le nom que l'on a ajouté dans la liste à l'étape précédente, à pour événement/exécute quand on l'utilise notre fonction __OnDc. Ensuite, on va afficher le bouton, sous une condition, celle que le pseudo commence par un "[", vous devez donc le changer. Cherchez : def ShowDefaultButton(self): Vous trouverez ici la liste des boutons qui s'affichent. -->Pour les files 2014 et plus : Ajoutez : if str(player.GetName())[0] == "[": self.__ShowButton(localeInfo.TARGET_BUTTON_DC) ---> Pour les files antérieurs à 2014 : if str(player.GetName())[0] == "[": self.__ShowButton(locale.TARGET_BUTTON_DC) Cela donne : Bien ! On continue ? On va maintenant ajouter la fonction qui va permettre de déconnecter le joueur, ajoutons là en dessous de la fonction __OnEmotionAllow(self): Ajoutons en dessous : def __OnDc(self): net.SendChatPacket("/dc " + str(self.nameString)) Nous créons donc une fonction qui envoie dans le chat : -->le str() sert à préciser que on l'envoie en temps que string(texte). Cela donne : Bien ! On va finir par ajouter notre bouton déconnexion. Dépackez le local et rendez vous dans le locale_game.txt, ajoutez : TARGET_BUTTON_DC[TAB]Déconnexion N'oubliez pas de remplacer [TAB] par une tabulation. Et voilà. J'espère que la réécriture rend un peu plus propre. Cordialement.
  4. Salut ! Je vous apprends vite fait à ajouter de la couleur dans votre MakeFile pour qu'il soit plus lisible (enfin je trouve) : Pour ça, ouvrez votre MakeFile Cherchez : $(OBJDIR)/%.o: %.cpp Vous devriez avoir un truc comme ça : Changez : @echo compile $< En : @echo -e "\033[0;32m [OK] \033[0m \033[0;33m Compiling:\033[0m" $< Pour avoir : Faites ensuite la même chose pour : $(OBJDIR)/version.o: version.cpp Sans oublier : $(OBJDIR)/minilzo.o: minilzo.c Voilà, c'est tout. Vous pouvez faire la même chose pour le MakeFile de la db. Partage original : MichaelM Cordialement.
  5. Yop ! Autre partie, avec celle-ci vous allez pouvoir annuler presque tous les cheats pour les débutants (m2bob, lalaker etc....). Quel est le principe ? J'ai précisé "débutant" car on peut contourner cette méthode, mais peut évident pour les débutants. Notre client va scan en permanence les processus démarrés, et si il y en a un qui correspond à notre BlackList PAF ! :leloup: Pour ça, on va reprendre notre ancien fichier, aller tout à la fin, et on code ! Let's go ! D'abord, vous allez devoirs ajouter ces imports : import thread import time Si vous avez modifié le fichier, vérifiez que vous ne les avez pas déjà. Si vous commencez sur un nouveau fichier ajoutez aussi : import os On va créer une fonction qu'on va nommer processf : import osimport thread import timedef processf(): Bien, on va maintenant mettre tout dans une structure try pour éviter les erreurs : import os import thread import time def processf(): try: On crée aussi l'except: si ça échoue, et on dit au programme d'attendre, de "dormir" pendant 5 secondes : import os import thread import time def processf(): try: pass except: time.sleep(5) # attendre 5 secondes Bien, maintenant on va faire ce qu'on appelle une boucle infinie, avec un while. On va lui dire, "Le temps que 1 est égale à 1 tu fais ça !" Et comme vous vous doutez, un sera toujours égale à un, on appelle ça une boucle infinie. import os import thread import time def processf(): try: while 1 == 1: except: time.sleep(5) Tout ce qui va se trouver après le while et avec une tabulation en plus va se répéter à l'infini ! Bien, créons maintenant notre liste de processus,notre BlackList, vous allez vous même la remplir, je vais mettre deux trucs simples : import os import thread import time def processf(): try: while 1 == 1: Black_List = ["skype.exe", "chrome.exe"] except: time.sleep(5) Ici bien sûr les processus sont bidons ! Je ne connais pas les processus de Mt2bob etc, à voue de les chercher avec votre gestionnaire des tâches. Bien, maintenant, pour chaque membre, nous allons ouvrir notre liste de processus. Nous allons ensuite la mettre entièrement en minuscule. Cela vous donne l'avantage de ne pas être gêner avec la casse : import osimport thread import time def processf(): try: while 1 == 1: Black_List = ["inyector.exe","cheatengine-x86_64.exe","ollydbg.exe","skype.exe"] for p in os.popen("tasklist"): process = p.lower() except: time.sleep(5) Bien, maintenant nous allons devoir vérifier si pour chaque membre de notre Black_List on peut trouver son nom dans notre process qui contient la liste de tous les processus démarrés. for Member in Black_List: Ensuite, si il trouve le Member dans process : if process.find(Member) != -1: On isole le nom du processus : p = process.split() Puis on le ferme : os.popen("taskkill /im %s /f" % p[0]) Puis, on lui dit d'attendre 5 secondes avant de recommencer : time.sleep(5) Bien ! ça donne : import os import thread import time def processf(): try: while 1 == 1: Black_List = ["inyector.exe","cheatengine-x86_64.exe","ollydbg.exe","skype.exe"] for p in os.popen("tasklist"): process = p.lower() for Member in Black_List: if process.find(Member) != -1: p = process.split() os.popen("taskkill /im %s /f" % p[0]) time.sleep(5) except: time.sleep(5) Il ne nous reste plus car relancer la fonction en cas d'erreur, ajoutez alors: import os import thread import time def processf(): try: while 1 == 1: Black_List = ["inyector.exe","cheatengine-x86_64.exe","ollydbg.exe","skype.exe"] for p in os.popen("tasklist"): process = p.lower() for Member in Black_List: if process.find(Member) != -1: p = process.split() os.popen("taskkill /im %s /f" % p[0]) time.sleep(5) except:time.sleep(5)thread.start_new_thread(processf, ()) On utilisez ici les threads. C'est pour le lancer en parallèle par abus de langage on va dire. Voilà ! N'oubliez pas de l'import si ce n'est pas déjà fait. Je vous laisse le soin de remplir la liste de processus ! Bonne chance !
  6. Yop ! Je fais une troisième partie pour ma liste de tutos sur les anti-cheats. Aujourd'hui on va déjà étudier comment marche des cheats très fréquents, et que j'aime beaucoup, car c'est du Python :3 On va parler des injections Python. Pour faire une injection Python, les injecteurs vont se servir de deux fichier : python22.dll et python27.dll Pour ça, ils vont utiliser deux fonctions : PyRun_SimpleFile et PyRun_SimpleString. Nous allons donc modifier le nom de ses fonctions de façon que les injecteurs ne puissent pas y avoir accès. Pour cette manipulation, nous allons utiliser un éditeur Hexadécimal, pour ça je vous conseille d'utiliser HxD : Bien, ouvrons d'abord notre python22.dll avec HxD, glissez le de dans, et vous obtiendrez normalement ceci : Ne vous inquiétez pas, nous n'allons pas éditer la partie hexadécimal mais la "traduction" car sinon ça serait fastidieux pour rien. Faites : Ctrl + F. Cherchez PyRun_SimpleString avec cette configuration de recherche : Vous arrivez normalement ici : Maintenant vous allez modifier le nom des fonctions comme vous le souhaitez, par exemple moi je vais changer PyRun_SimpleString en PyRun_SimpllString. Vous devez en fait le modifier comme vous voulez, et essayer de mettre quelque chose d'aléatoire ! Moi je met quelques chose qui ressemble pour que vous compreniez bien. Faites attention, il y a quand même une règle, vous devez avoir le même nombre de caractère. C'est à dire que vous ne devez pas changer la taille du fichier. Placez vous devant la lettre que vous voulez changer, et pressez la touche qui doit la remplacer. Pour moi cela donne donc : Voilà. Vous sauvegardez avec Ctrl + S. Vous effectuez ensuite la même chose pour python27.dll. Je ne le refais pas avec vous. Bien, maintenant nous allons vérifier au lancement du client que ces fichiers n'ont pas été modifié pour être remis comme avant. Pour cela, nous allons utiliser des hash md5. Dépackez votre root. Ajoutez de dans ce fichier. Ajoutez ensuite dans votre prototype.py : import takuma Changez le nom du fichier si vous avez déjà un takuma.py pour je ne sais qu'elle raison. Packez. Ouvrez votre client et fermez le après. Vous pouvez voir que dans votre client deux fichiers se sont crées : python22.txt python27.txt Chacun d'entre eux contient le hash MD5 du fichier python22.dll ou python27.dll selon le nom du fichier, vous l'aurez compris. Maintenant réouvrez le fichier que vous aviez créer pour le scan MD5 des miles des anciens tutos, vous aurez : if VerifA != '7fa65499747607679068ce32e57735c4': dbg.LogBox("Une erreur est survenue le fichier : mssa3d.m3d est corrompu !") app.Abort() Vous allez faire la même chose avec les deux MD5 fournit dans les txts en adaptant le nom, et en mettant comme ceci le "VerifA" : if sumFileMD5("python27.dll") != '132f2361979ef7537ca0183492ff58ba': dbg.LogBox("Une erreur est survenue le fichier : python27.dll est corrompu !") app.Abort() Faites la même chose pour le python22.dll en remplaçant les deux python27.dll et sans oubliez le hash MD5 ! N'oubliez pas de repack ! Et voilà, vous êtes maintenant sécurisé contre les injections Python ! Félicitations ! Bonne chance.
  7. Je corrige, erreur d'inattention de ma part, merciii
  8. Plop ! Je vous partage une petite liste qu'avait donné Sanchez, qui contient une liste avec un assez grand nombre de commande et leur explication : exit - Fermer le client mvol - Changer le volume de la musique (0 à 100) svol - Changer les sons de 0 à 10 snds - Changer le volume des sons des mobs etc de 0 à 200 asnds - Changer le volume des sons d'ambiances 0 à 200 mspd -Changer la vitesse de mouvement de 0 à 1100 pwd - Montrer le fichier actuellement utilisé ls - Montrer le contenu du fichier utiliser shadow - Intensité des ombres de 0 à 5 splat - Réglez la distance de rendu entre le caractère et l'ambiance de 0 à l'infini distance - Changer la distance de vue, de 0 à 4 bgloading - Désactivé le binary transtree - Rentre transparent ou non les arbes 0/1 cd - Changer de fichier up - Aller dans le fichier du dessus dans la structure de fichier (mal expliqué je sais mais je sais lsd -Lister toute les fichiers dans la partition D: lsf - Liste tous les dossiers dans la partition D: lse - Montrer le chemin des effets (d:....) collision - Activer ou non les collisions (0 / 1) colli - La même qu'en haut, mais sans argument active/desactive disconnect - Fonction non terminée autorot - Changer la vitesse de rotation de la caméra 0/infini pickc - Montrer plus d'informations infoc - Montrer plus d'infos : infox regchre - Enregistrer un nouvel effet, usage: regchre and setchra - Mettre un autre effet, usage: setchra emoticon - Activer une émotion, usage: emotion perfinfo - Montrer les informations de performance reload_locale - Redémarrer le local re - Recharger les fichier uiInventory et uiGuild cooltime - Activer/désactiver le temps d'attente pour les skills hidecursor - Cacher le curseur showcursor - Afficher le curseur warp - Se téléporter aux coordonnées X-Y web - Faire apparaitre un navigateur web hideui - Cacher l'interface showui - Afficher l'interface setcspd - Changer la vitesse de la caméra 0 / 100 savecmr - Exporter la configuration actuelle de la caméra, usage: savecmr loadcmr - Importer les configurations d'une caméra, usage: loadcmr setdefcmr - Remettre les configurations de la caméra à 0 setsight - Changer la vue : 0 / 100 setcombotype - Changer le niveau des combos --> Risque de déco par le serveur 0 / 100 trans -Change the empire language converting, you can understand all empires without a ring 0 - 1 Petite précision venant de moi : Si vous souhaitez afficher la console, comme elle est désactivée sur 99% des clients, ajoutez cette ligne dans le game.py avec les autres lignes d'ouverture (elles se ressemblent toutes) : onPressKeyDict[app.DIK_COMMA] = lambda : self.ShowConsole() packez, appuyez sur virgule, et votre console s'ouvre. C'est tout :3 A plouche avek cargloushe
  9. M2 Download Center Download Here / Download Here / Download Here / Download Here / Download Here / Download Here Yop ! Bon ça va être trèèèèès court, mais bon... Je vais juste vous expliquer comment stopper les mobs pullers (ça cape les mobs, mais sans capes en gros) et le Watihack (attaquer, mais sans attaquer... je ne sais comment expliquer !) Bien, pour ça, allez dans vos sources, ouvrez : UserInterface/PythonNetworkStreamPhaseGame.cpp Vous y trouverez : TPacketCGAttack kPacketAtk; Ajoutez juste au dessus : if (!__IsPlayerAttacking()) return true; Compilez, et c'est bon, c'était pas plus dur que ça ! A plouche :3 Edit Kameyu : Cette modification permet uniquement de contrer les hacks qui passent par les fonctions du client. (Injection DLL, PE, ou Python). Des logiciels comme Lalaker ou M2Bob passent outre cette vérification car génèrent des packets simulés. Source: Koray @ Metin2Dev
  10. Bonjour à tous. Mais concrètement... Non. J'vais vous apprendre par cmdchat d'un côté comme de l'autre. Et le mien est je pense plus complet. Envoyé des informations LUA ---> Python : Côté serveur : Bien, pour l'exemple, on va commencer par créer notre quête TRRRRRRRES SIMPLE ! On va nommer notre quête... lua_python par exemple : quest lua_python begin state start begin end end Bien, de dans, nous allons créer notre liaison. Pour cela, on va se servir de cmdchat(). On va l'utiliser comme ça : quest lua_python begin state start begin when login begin local number = 5 cmdchat("lua_python_command " .. number ) end end end Bon, j'utilise un nombre pour vous montrer au passage qu'on peut additionner les chaines de texte et les variables sans problème, comme partout. C'est simple, un petit coup de make et un reload/reboot ! Côté client : Vous allez pour ça depack votre root, et vous rendre dans le game.py où toutes les liaisons se trouvent : Cherchez la fonction : def __ServerCommand_Build(self): Vous devriez avoir quelque chose comme ceci : Vous trouvez ici : "Nom que vous avez mit dans le cmdchat" ----------------- : fonction Python qui va s'exécuter, Mettez donc au milieu des autres, et en adaptant pour vous : "lua_python_command" : self.ma_fonction_python, Vous pouvez ensuite vous rendre à la fin de votre game.py, et ajouter : def ma_fonction_python(self): pass Et la remplir comme vous le souhaitez. Repackez, et c'est terminé. Félicitations ! Envoyé des informations Python ---> LUA : Bon, on a fait le plus simple, mais là, ça se corse ! Je vais reprendre notre ancienne quête, mais y ajouter quelque chose : quest lua_python begin state start begin when login begin cmdchat("quest_name_index "..q.getcurrentquestindex()) end when button or info begin say("CA MARCHE !") end end end Le quest_name_index est très important (dans le cmdchat()) ! C'est lui qui envoie les infos cruciales au client ! Retournons dans notre game.py, recherchons encore : def __ServerCommand_Build(self): Ajoutons cette fois : "quest_name_index" : self.FonctionLambda, Ajoutons à la fin de notre game.py : def FonctionLambda(self, questindex): constInfo.QUESTNAMEINDEX = questindex Ajoutons à notre constinfo.py ceci : QUESTNAMEINDEX = 0 Utilisons maintenant cette fonction pour faire appelle à notre quête : def ButtonFonction(self): import event import constInfo event.QuestButtonClick(int(constInfo.QUESTNAMEINDEX)) Vous avez déjà une bonne base ! Mais.. On va pas s'arrêter là ! Envoyé des informations Python ---> LUA, les variables : Prenons maintenant ceci comme quête : quest lua_python begin state start begin when login begin cmdchat("quest_name_index "..q.getcurrentquestindex()) end function GetFromClient() local variables = input(cmdchat("getInfo")) return variables end when button or info begin local things = lua_python.GetFromClient() say(things) end end end On a ici plusieurs choses : Un cmdchat() qui permet à notre client de savoir de quelle quête on parle, Une fonction (GetFromClient) Un cmdchat() qui permet de récupérer les bonnes informations, etc... Bien, retournons ensuite dans notre game.py, toujours dans la fonction : def __ServerCommand_Build(self): On va ajouter ça : "getInfo" : self.GetInfoFonction, Ajoutons dans le costinfo : INFORMATION_TO_SEND = "message de Takuma" Et ajoutez à la fin du game : def GetInfoTut(self): net.SendQuestInputStringPacket(str(constInfo.INFORMATION_TO_SEND)) Et normalement, à chaque fois que vous allez exécuter cette fonction, la valeur de la variable sera transmise. J'espère pas avoir fait de connerie Inspiration : Zetsu. Bonne chance !
  11. Tu devrais trouver largement de quoi faire ta propre fenetre, et la mettre sur F5. Si besoin, je peux t'aider^^'
  12. Si tes db sont nommées accout, common, et player, pas besoin de s'inquiéter pour le nom Data truncated for column 'setRaceFlag' at row ça par contre, c'est plus inquiétant j'pense^^'
  13. T'as bien rempli la cmd.cpp avec ACMD, les perms etc ? Le cmd_general.cpp avec les fonctions ? etc...
  14. Metin2 Dev

    Module ItemShop

    Pourquoi vérifier si le mot de passe n'est pas 00000 ?
  15. Metin2 Dev

    Nostalgie

    Bonjour, Je connais très bien Funky-Emu, j'étais sur un autre forum similaire il y a 10 ans environ, lorsque ça s'appelait encore Aidemu, je n'irai pas jusqu'à dire concurrent lol. J'étais principalement sur les serveurs privés Dofus 1.29. Ce que j'envisage de lancer prochainement. A bientôt.
  16. Metin2 Dev

    Module ItemShop

    Heu... Bon je fais ça de tête pendant que les TPE me soulent : Vérifier si le membre a assez de monnaie Vérifier la place qu'il a dans l'entrepôt de l'IS, voici une fonction simple : function verif_place_is($account_id, $nb_item = 1) { if (is_numeric($account_id)) { $donnees = bdd('player')->query("SELECT COUNT(*) AS nb_safebox FROM `safebox` WHERE account_id = '$account_id'")->fetch(); if ($donnees['nb_safebox'] == 1) {//Si l'user a bien un entrepôt $pos = 0; $go = false; while ($go == false) { $donnees = bdd('player')->query("SELECT COUNT(*) AS nb_pos FROM item WHERE owner_id = '$account_id' AND pos = '$pos' AND window = 'MALL'")->fetch(); if ($donnees['nb_pos'] >= 1) { $pos++; } else { $go = true; } } return $pos; if ($pos > (44 - $nb_item)) { $erreur = "L'entrepot est plein."; return $erreur.$pos; } // Si le MALL est plein else { return $pos; } // On renvoi le numéro de la position libre } else { $erreur = "Vous n'avez pas d'entrepot."; return $erreur; } } else { $erreur = "Une erreur c'est produite."; return $erreur; } // Si account n'est pas un chiffre} J'ai mis des heures à écrire ça avec un portable. Ça répond en même temps à ta question de l'entrepôt etc... (J'ai pas prepare et tout, c'était plus rapide de faire comme ça, surtout avec un portable ^^') Tu débites la monnaie Tu vérifies si l'item peut être groupé ou pas (avec son flag) Tu ajoutes l'item. Pour ajouter l'item, tu fais un INSERT INTO item et dans window tu mets MALL (je crois... à vérifier).Bon j'ai essayé de t'aider un minimum
  17. Une VM avec FreeBSD 9.3 Serais-ce un mensonge ? ---> "(On va test par ta méthode des sources, mais sans compilation etc)" "Remplace 192.168 par 999.999" Bon chui pas un génie, mais normalement c'est compréhensible. ------------------------ Ça me semble bon.
  18. Metin2 Dev

    CMS DarkWorld

    Merci du partage.
  19. j'avais la flemme de le faire passer par les sources je lui ai fait mettre une diff. Je lui ai en même temps dis comment le faire dans les sources ^^'
  20. si tu fais : # bsdconfig # truc netword je sais plus quoi (tu le vois pas tout de suite il faut descendre), puis la 3ème options, # Entrée Tu as quoi ? C'est clair comme du jus de chaussette mon truc...
  21. T'as mis ta carte réseaux dans les configurations de la VM ?
  22. Un chmod -R 777 metin2 est nécessaire car tes cores n'ont pas les permissions.

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.