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

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation depuis le 04/19/24 dans Messages

  1. Centre de Téléchargement Télécharger ( Interne ) M2KSF Project Bonjour tout le monde, après plusieurs semaines de travail sur mon projet ci-dessous V2.1.0.0 - Télécharger Offline Shop & Search shop Version ----------------------------------------------------------------------------------------------------- V2.0.0.0 - Télécharger New Version ----------------------------------------------------------------------------------------------------- V1.4.6.0 - Télécharger Old Version Discord M2KSF Mon discord : Kuroko#9845
    5 points
  2. M2 Download Center Download Here ( Mega.nz, Future updates will also be here) Client & Serverfiles + VDI ( Internal / Backup ) L'objectif est de proposer des serverfiles de référence 40250, aucun nouveau système n'a été ajouté, uniquement des corrections de bugs. Langues disponibles : EN/DE/HU/FR/CZ/DK/ES/GR/IT/NL/PL/PT/RO/RU/TR Langue par défaut : Anglais SSH / VM : root/123456789 MySQL : root/123456789 IG : admin/123456789 Commandes & Alias start cd /usr/metin2/server && sh start.sh close cd /usr/metin2/server && sh close.sh clear cd /usr/metin2/server && sh clear.sh backup cd /usr/metin2/server && sh backup.sh questcompile cd /usr/metin2/server/share/locale/english/quest && python make.py dbclean cd /usr/metin2/src/db/src && gmake clean dbcompile cd /usr/metin2/src/db/src && gmake gameclean cd /usr/metin2/src/game/src && gmake clean gamecompile cd /usr/metin2/src/game/src && gmake Remerciement @Mali pour les sources mises à jours : client & server @Sanchez pour le client de base 2014 base client. @Veltor88 pour les traductions avec translate.lua @Fazer pour le pack locale_string By TMP4
    4 points
  3. Niveau requis : Débutant Temps estimé : 30 minutes Salut à toi ! Tu n'as jamais fait de serveur Metin2 ? Ce tutoriel est fait pour toi ! Je vais t'expliquer comment créer un serveur de A à Z ! Tu pourras ensuite le modifier à ta guise et le mettre à ton image. Information. Lors de ce tutoriel, vous allez apprendre à créer un serveur en local. Vous serez le seul à pouvoir vous y connecter. Information. Les fichiers utilisés sont les files 2014. Vous pourrez à l'avenir les changer sans aucun problème Pré-requis: Virtual Box, qui nous permettra de virtualiser un système d'exploitation. En effet, un serveur Metin2 fonctionne sous FreeBSD, il sera plus simple pour vous de virtualiser ce système sur votre Windows que de faire une deuxième installation sur votre ordinateur. Navicat, un client Mysql. Il vous permettra de vous connecter à la base de données de votre serveur Metin2. On y retrouveras toutes les informations liées aux joueurs, aux items, aux comptes des utilisateurs, etc ... WinSCP, un client SFTP. Similaire au FTP, il vous permettra de naviguer sur les différents fichiers de votre serveur (maps, configurations, etc ..) Le serveur VDI tout prêt pour vous qui possède déjà tous les fichiers du serveur avec FreeBSD d'installé. Il ne nous manquera plus qu'à le lancer avec Virtual Box. Le client metin2 qui vous permettra de vous connecter en jeu à votre serveur. I. La machine virtuelle II. Lancement du serveur Metin2 III. Se connecter In Game IV. Accéder aux fichiers du serveur V. Accéder à la base de données Succès ! Vous venez de créer un serveur Metin2 en local. Vous pouvez maintenant vous amuser sur votre serveur ou tout simplement y rajouter des fonctionnalités sympas. Pour continuer: Vous trouverez de nombreux partages et de tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Vous pouvez créer un compte GM en suivant ce tutoriel Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande ! Bon courage à vous et bienvenue dans le monde des serveurs privés Metin2 !
    4 points
  4. Centre de Téléchargement Télécharger ( VDI Serveur 2014 ) Télécharger ( Client 2014 ) HelloW, Metin2 - Server Files 2014 Cordialement, ASIKOO
    4 points
  5. Download Metin2 Download Jackwork Interface Interface Mass Import Script
    4 points
  6. Niveau requis Débutant Temps estimé : Entre 15 et 30 minutes Bonjour à toi, Tu souhaites installer des files Metin2 sur ta machine ? Ou tout simplement les changer ? Alors ce tutoriel est fait pour toi ! Pré-requis: Il vous faut des Files Metin2 que vous avez trouvez je ne sais où. Vous pouvez en trouver dans la section File WinSCP, un client SFTP qui vous permettra de vous connecter en SFTP à votre serveur pour pouvoir modifier les fichiers du serveur. Navicat pour vous connecter à votre base de données de votre serveur. Une machine FreeBSD prête à l'emploi Attention ! Pour réaliser ce tutoriel, il vous faut une machine avec FreeBSD et MySQL. Si ce n'est pas le cas, je vous invite à suivre l'un de ces tutoriels si vous êtes débutant: - Créer un serveur Metin2 - Créer un serveur Metin2 avec No-IP - Créer un serveur Metin2 avec Hamachi - Créer un serveur Metin2 sous Windows - Installer un serveur dédié Metin2 I. Installer les fichiers serveurs II. Installation de la base de données MySQL III. Connecter le serveur à la base données Pour continuer: Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Pour configurer votre client pour connecter à votre serveur, suivez ce tutoriel Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
    4 points
  7. Niveau requis Débutant Temps estimé : Entre 3 et 5 minutes Bonjour à tous, Tu souhaites créer un compte GM ? Alors ce tutoriel est fait pour toi. Il vous expliquera comment créer un compte et comment mettre votre personnage GM. Pré-requis: Navicat, un client MySQL qui vous permettra de vous connecter à votre base de données (serveur MySQL). Il vous permet de modifie de nombreuses informations comme les comptes utilisateurs. Un serveur ouvert, de toute évidence. I. Créer son compte de manière manuelle II. Mettre un personnage avec les droits de modération (GM) Pour continuer: Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
    3 points
  8. Centre de Téléchargement Télécharger ( Interne ) Bonjour, voici le switchbot développé par Sanii, l'archive est complète, bon jeu. L'archive contient : - Les modification coté client - Les modifications coté base de donée - Mes modification coté source client et serveur
    2 points
  9. Centre de Téléchargement Télécharger ( Interne ) Plop, je vous partage un système que j'ai trouvé avec l'aide de Franch <fileStore.core_Emoticons>/emoticons/wink.png Chaque grade comporte un grade IMPLEMENTOR = GA HIGH_WIZARD = SGM GOD = GM LOW_WIZARD = MOD Il faudra modifier la partie Source serveur ( tutoriel dans le fichier rar ) Il faudra modifier la partie source client ( tutoriel dans le fichier rar ) Il faudra modifier la partie root.eix Il faudra modifier la partie locale_fr.eix Toute les informations ce trouve dans le fichiers rar, Le partage vient du forum turkmmo l'auteur c'est Suky Voici les screens qui vont avec : Révélation Virus Total : ICI Download : ICI J’espère que sa pourra vous intéressé
    2 points
  10. Centre de Téléchargement Télécharger (mega.nz) or Metin2 Download Bonjour, Aujourd'hui je vous propose de passer votre serveur en mode maintenance pour vos joueurs mais restera accessible pour les joueurs autorisé : Pré-requis Avoir un serveur avec sont client. Savoir implanter une quêtes. Ressource pour ce tuto. [Hidden Content]
    2 points
  11. Niveau requis : Débutant Temps estimé : 30 minutes Salut à toi ! Tu n'as jamais fait de serveur Metin2 ? Ce tutoriel est fait pour toi ! Je vais t'expliquer comment créer un serveur de A à Z ! Tu pourras ensuite le modifier à ta guise et le mettre à ton image. Information. Lors de ce tutoriel, vous allez apprendre à créer un serveur en No-IP. Vos amis pourront donc rejoindre le serveur pour jouer avec vous ! Attention ! Les files utilisés pendant ce tutoriel sont les 2014. Cependant, sur les 2014+, un bug survient à la sélection du personnage quand un ami souhaite se connecter quand le serveur est sur une machine virtuelle. Il faudra appliquer ce patch pour corriger ce problème. Pré-requis: Virtual Box, qui nous permettra de virtualiser un système d'exploitation. En effet, un serveur Metin2 fonctionne sous FreeBSD, il sera plus simple pour vous de virtualiser ce système sur votre Windows que de faire une deuxième installation sur votre ordinateur. Navicat, un client Mysql. Il vous permettra de vous connecter à la base de données de votre serveur Metin2. On y retrouveras toutes les informations liées aux joueurs, aux items, aux comptes des utilisateurs, etc ... WinSCP, un client SFTP. Similaire au FTP, il vous permettra de naviguer sur les différents fichiers de votre serveur (maps, configurations, etc ..) Le serveur VDI tout prêt pour vous qui possède déjà tous les fichiers du serveur avec FreeBSD d'installé. Il ne nous manquera plus qu'à le lancer avec Virtual Box. Le client metin2 qui vous permettra de vous connecter en jeu à votre serveur. No-IP, un outil qui va vous permettre d'avoir une IP fixe si votre fournisseur d'accès vous donne une IP dynamique. Sinon, les joueurs devront changer l'IP du client à chaque fois que la votre change. Pas très pratique, non ? I. La machine virtuelle II. Configuration de la machine virtuelle III. Installation de No-IP IV. Configuration des ports sur la box V. Lancement du serveur Metin2 VI. Se connecter In Game VII. Accéder aux fichiers du serveur VIII. Accéder à la base de données Vous pouvez maintenant vous amuser sur votre serveur ou tout simplement y rajouter des fonctionnalités sympas. Pour continuer: Vous trouverez de nombreux partages et de tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Vous pouvez créer un compte GM en suivant ce tutoriel Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande ! Bon courage à vous et bienvenue dans le monde des serveurs privés Metin2 !
    2 points
  12. Download Metin2 Download
    2 points
  13. Download Metin2 Download
    2 points
  14. Download Metin2 Download
    2 points
  15. Download Metin2 Download Lysium Loginterface Interface Mass Import Script
    2 points
  16. Download Metin2 Download Ying Yang GM Effect 3D Effects Mass Import Script
    2 points
  17. Download Metin2 Download Boss Map 2018 Maps Mass Import Script
    2 points
  18. Download Metin2 Download Property Indexer Tools Mass Import Script
    2 points
  19. Centre de Téléchargement Télécharger ( Interne ) HelloW, Je vous partage WorldEditor, un tool qui vous permet de modifier, créer des maps pour votre serveur Metin2. Un tutoriel de Calypso vous guide pour utiliser WorldEditor pour la première fois ! Merci à MartySama Bonne création à tous ! Cordialement, ASIKOO...
    2 points
  20. F Download Center Télécharger ( Interne ) Bonjour à tous [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] Lien de téléchargement : Clique ici
    2 points
  21. F Download Center Télécharger ( 102241 + Source ) Mot de passe : metin2 Salut à toi ! Le Client Metin2 est composé d'un dossier pack, comportant plusieurs fichiers qui sont cryptés. Dans ces fichiers, on y retrouve toutes sortes de ressources comme les fichiers python, les maps, les modèles 3D, les textures etc... EterManager est un outil similaire à EterNexus qui est selon moi plus rapide, plus fluide et permet de repack / depack plusieurs archives en simultanée ! Vous avez la possibilité de gérer des profils dans le cas ou avez plusieurs clients et bien plus encore ! Pré-requis : Il vous faut un Client Metin2. C'est celui que vous utilisez pour vous connecter à votre serveur. EterManager I. EterManager Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Émulation dans la section Metin2. La FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande ! Cordialement, ASIKOO...
    2 points
  22. Centre de Téléchargement Télécharger ( Interne ) Salut tout le monde ! Je me suis permit de faire une mise à jour concernant les commandes GM de Metin2. Elle n'est surement pas complète, donc si vous avez des améliorations à proposer, n'hésitez pas ! Merci à metin2 referata pour m'avoir aidé à compléter la liste, à Emulateur aussi et aux sources pour certaines commandes. Le reste, j'ai tout organisé dans un fichier texte. Good Luck !
    2 points
  23. Centre de Téléchargement Télécharger ( Interne ) Skill Sage Grand Maître. 1) Qu'est ce que cela? 2) Les Prérequis. 3) Le téléchargement. 1) Qu'est ce que cela? Alors, les skill Sage Grand Maître sont des skills au-dessus de P ( Oui vous l'avez compris, vous pourrez up vos skills plus de P) Les skills s'upent de la même manière que pour up en P (de G1 à P ) Ils s'up de P1 à S Pour up vos skills vous aurez besoin de lire des Sage Pierre d'âme (Oh non pas encore des PA !!!!!!!!!!!!!!!!) Vidéos Une vidéo est toujours explicite que quelques mots sur une page blanche. 2) Les Prérequis. Des Files et un client Sources Client/Game/Db De l'archive en téléchargement et votre tête. Sachez encore une fois que ce partage n'est pas de moi et provient de Board Legend, ce système à été créé par Lennt. La traduction est cependant de moi. (Si quelqu'un pourrais traduire le skilldesc.txt je suis preneur.) 3) Le téléchargement. Cliquez ici Cordialement, History.
    2 points
  24. Centre de Téléchargement Télécharger ( Interne ) Salut à tous, aujourd'hui, je vais vous faire un petit tutoriel sur comment implanter le BonusPage, alors commençons d'abord, téléchargez le fichier suivant : ICI Ouvrez votre game.py Cherchez la ligne import chat Ajoutez en dessous import uibonuspage Cherchez la ligne onPressKeyDict[app.DIK_F4] = lambda : self.__PressQuickSlot(7) Ajoutez en dessous onPressKeyDict[app.DIK_U] = lambda : self.__BonusPage() Allez à la fin de votre game.py et ajoutez # Page de bonus def __showbonus(self): import uiBonusPage global bonuspp try: if bonuspp != 1: exec 'uiBonusPage.BonusBoardDialog().Show()' else: pass except ImportError: import dbg,app dbg.Trace('uiBonusPage.py Importing error') app.Abort() def __BonusPage(self): import uibonuspage self.wndBonus = uibonuspage.BonusBoardDialog() self.wndBonus.Show() Enregistrez votre game.py, fermez le et ouvrez ui.py Cherchez la ligne def SetOverVisual(self, filename): wndMgr.SetOverVisual(self.hWnd, filename) Ajoutez en dessous en sautant une ligne # Page de bonus def GetText(self): if not self.ButtonText: return return self.ButtonText.GetText() Voilà, le tutoriel est fini, le BonusPage apparaîtra quand vous appuierez sur la touche U Le BonusPage est totalement traduit en français, il n'y aura donc pas besoin de le traduire Sources : J'ai copié ce système sur le client de Metin2 World Bonne journée !
    2 points
  25. Salut! Après avoir regardé mes anciens tutoriels, et voulant en refaire d'autre, j'ai conclu que certains manquaient vraiment d'informations, donc une petite rénovation ne lui fera pas de mal à celui la non plus. Le python est facilement compréhensible pour certain, pour d'autre non (cc @Kijaru, me demande pas pourquoi j'ai pensé à toi). Quelques explications ne seraient donc pas de refus. Objectifs : Comprendre comment marche un système, Connaître les principales fonctions essentielles à n'importes quelles interfaces. Réalisez vous même votre interface. Partie 1 : Comprendre comment marche un système : Pour bien comprendre comment marche un système, il faut déjà comprendre ce que c'est, et combien de partie le compose. Il faut savoir qu'un système, si nous suivons la manière de coder de ymir, est composé de deux parties : Les éléments et leurs positions : Dans ce fichier, on va répertorier dans un dictionnaire tous les éléments qui vont composer notre interface, comme des boutons, etc. Mais plus en général, c'est ici que nous allons définir la taille de la fenêtre, des boutons, et le texte. Le système : C'est la partie qui va gérer le tout. Il va afficher l'interface, et dire "si il clique là, tu fais ça" etc... Quand je vous dis que c'est "si nous respectons le format de ymir" c'est qu'il existe une autre façon. Effectivement, il vous est possible de tout regrouper en un fichier, et de définir "sur le tas" tous les éléments nécessaire. Je pourrais si vous le voulez vous faire un autre tutoriel pour vous présenter l'autre méthode. C'est notre partie système qui va être chargé en première, c'est elle même qui ira chercher la partie interface afin de s'en servir. On dispose généralement les parties comme ceci dans nos packs : Système : ui[nom système].py ---> root Interface: [nom système].py -----> uiscript Partie 2 : L'interface : Bien, pour créer une interface, nous allons créer un nouveau fichier dans le uiscript je vais l'appeler takuma.py de mon côté. Je vous invite à ouvrir le fichier que vous venez de créer. Nous pouvons commencer ! Avant, comme je compte vous apprendre à coder un minimum proprement, nous allons utiliser le uiScriptLocale, c'est un module qui permet de récupérer les phrases qui seront déclarées dans notre locale_interface, nous verrons ça plus tard. Pour l'ajouter à notre projet, tapez : import uiScriptLocale Bien. Maintenant, nous allons dès maintenant définir une variable qui va contenir le chemin d'accès aux différents éléments, je vous expliquerais ceci au moment venu, pour l'instant, tapez à la ligne : ROOT_PATH = "d:/ymir work/ui/public/" Bien ! Nous pouvons enfin commencer notre interface. Nous allons maintenant créer un dictionnaire que nous allons nommé "window" (fenêtre) : window = {} C'est ce dictionnaire qui va contenir toute notre interface, je vous invite à l'écrire comme ceci pour une meilleur lisibilité : window = { } Maintenant, tous les éléments se trouvant de dans seront devancés d'au moins une tabulation. Nous devons donc maintenant donner des propriétés à notre window, sinon, comment pourrait-on connaitre comment il est fait etc... ? Pour cela nous allons définir 6 propriétés : name : Tout simplement le nom de notre fenêtre, style : Le modèle utilisé pour notre fenêtre, x : L'apparition de la fenêtre sur l'axe des abscisses sachant qu'il démarre en haut à gauche de l'écran. y : L'apparition de la fenêtre sur l'axe des ordonnées. width : La largeur de la fenêtre height : la haute de la fenêtre. Bien, commençons par le nom : window = { "name" : "TakumaDialog", } Retenez la syntaxe elle est sensiblement la même pour tous les éléments. Maintenant pour le style, nous allons utiliser un tuple (liste immuable) qui va contenir nos deux propriétés : movable et float : "style" : ("movable", "float",), Pourquoi mettre une virgule à la fin me direz-vous ? C'est les tuples, ils doivent être défini comme ceci. Sinon python va enlever les parenthèses et considéré ça comme une variable lambda. Ensuite, pour x et y nous allons mettre 0 : window = { "name" : "TakumaDialog", "style" : ("movable", "float",), "x" : 0, "y" : 0, } Ajoutons maintenant les deux derniers paramètres : "width" : 305, "height" : 255+25, Compléter avec la taille que vous voulez généralement, on adapte au fur à mesure ! Nous allons ajouter "des enfants" à notre fenêtre sinon, on doit s'arrêter là... Autant vous dire que ça ne ressemble à rien ! Pour ça, nous allons ajouter une nouvelle balise : "chlidren" : window = { "name" : "TakumaDialog", "style" : ("movable", "float",), "x" : 0, "y" : 0, "width" : 305, "height" : 255+25, "children" : } Pour celle-ci, nous allons devoir mettre les parenthèses pour le tupples, puis ajouter des guillemets pour recréer un dictionnaire, les éléments qui seront de dans. Cela donne : window = { "name" : "TakumaDialog", "style" : ("movable", "float",), "x" : 0, "y" : 0, "width" : 305, "height" : 255+25, "children" : ( { }, ), } Bien ! Nous allons maintenant dans les childs définir le tableau en lui même "board", il aura les mêmes balises si ce n'est "style" qui va passer en "type", je le fais d'un coup pour abréger un peu : Maintenant dans notre board, nous allons ajouter tous les éléments que va contenir notre fenêtre. Cependant, n'oubliez pas un élément important : La barre de titre et le titre ! Vous ne pouvez pas deviner le code, je vous le donne : Oui, ça largeur doit être de 4 plus grande que le board. Maintenant, j'attire votre attention sur deux choses : J'ai définie les propriétés en ligne pour les chlidrens de titlebar, comme ça vous voyez comment cela se passe, La balise text à la fin, va nous renvoyer une valeur ("texte" ici). Cependant, nous allons faire de façon qu'elle nous renvoie une valeur de notre locale_interface. Pour cela, nous allons taper : "text": uiScriptLocale.TAKUMA_TITLE, Vous devrez ensuite ajouter une ligne dans votre locale_interface (locale/xx/) et taper : TAKUMA_TITLE valeur Ceci, bien séparer par une tabulation. Et votre fichier récupérera tout seul la variable comme un grand afin de la faire correspondre à la propriété texte. Et bien voilà, vous avez votre base. Il ne vous manque plus que un élément, les types qui existent et vous pourrez finir la partie interface tout seul. les éléments suivant vont se placer sur le board, il faut donc sortir de titlebar, et repartir dans board, pour cela, j'ai déjà comme vous pouvez le voir sur le screen du haut remis des autres balises au même niveau que titlebar. Et bien c'est elles qui vont contenir un nouvel élément, par exemple, un bouton : Quant au trois nouvelles propriétés apparues ici : defaut_image: Chemin d'accès de l'image du bouton par défaut, over_image : Chemin d'accès de l'image du bouton quand la souris passe dessus, down_image : Chemin d'accès de l'image du bouton quand on clique dessus. Notez qu'on utilise la variable ROOT_PATH afin de ne pas avoir à taper à chaque fois "d:/ymir work/ui/public/" Si vous voulez ajouter d'autres éléments, il vous suffit de procéder au même niveau que le bouton, et de répéter cette opération. Nous découvririons d'autres types plus tard. Vous avez donc à la fin de cette partie : Partie 3 : Le système : Enfin la troisième partie ! La plus sympa ! Pour celle-ci vous allez créer un fichier ui[nomsystème].py, pour moi, cela sera uitakuma.py. Nous repartons d'un fichier vide ! Comme l'autre, nous avons des importations à effectuer ! Elles ajoutent selon ce que vous voulez faire, mais vous aurez en général besoin de celles-ci : import ui import app Nous allons maintenant créer une class, nommée TakumaDialog qui prendra en paramètre ui.ScriptWindow : Nous allons ensuite créer la fonction init, c'est une fonction assez spéciale. C'est une fonction qui s'exécute automatiquement quand on fait appel à la class. Pour faire comme ymir, et respecter son caractère privé, elle va en réalité s'appeler __init__, tapez : Pourquoi utiliser self dans init me direz vous ? Et bien, outre que ce soit une norme, il va nous permettre si vous allez plus loin dans le Python de créer des instances. Bref, nous allons ensuite créer deux fonctions importantes : __Initialize, __Load, Je ne l'ai pas précisé jusque là, les deux tirets du huit devant marque le caractère privée de la fonction. Chaque fonction va avoir un but très précis : La fonction Initialize va créer toutes les variables, les listes, etc... nécessaires au bon fonctionnement du programme. Vous verrez plus tard que les listes seront très importantes quand vous utiliserez des radio_buttons (bouton donc un seul est actionnable). Je ne vous en ai pas parlé tout de suite car nous devons évoquer une histoire d'index avec eux. je vous en parlerai plus tard. Dans la fonction Initialize vous allez mettre par exemple pour l'interface que j'ai faite : self.takumaButton = 0 Cette fonction ne servira que à ça. Profitons en pour finir notre fonction __init__ : Maintenant avant de commencer notre fonction __Load(), nous allons en créer deux autres (oui ça fait beaucoup, je sais, mais plus tard ça sera automatique chez vous. Si vous voulez, je vous fournirai un .py avec toutes les fonctions essentielles pour coder proprement) : __Load_LoadScript() __Load_BindObject() La fonction LoadScript est toujours la même, la voici : def __Load_LoadScript(self, fileName): try: pyScriptLoader = ui.PythonScriptLoader() pyScriptLoader.LoadScriptFile(self, fileName) except: import exception exception.Abort("System.TakumaDialog.__Load_LoadScript") Je vous explique ne tombez pas de votre chaise ! try signifie "essayer", ici on essaye de faire ce qu'il y a après le try, et s'il n'y arrive pas, il envoie le except. Ici, nous utilisons en réalité cette fonction crée dans notre ui.py : def LoadScriptFile(self, window, FileName): import exception import exceptions import os import errno self.Clear() print "===== Load Script File : %s" % (FileName) try: # chr, player µîÀº sandbox ³»¿¡¼­ import°¡ Çã¿ëµÇÁö ¾Ê±â ¶§¹®¿¡,(º¿ÀÌ ¾Ç¿ëÇÒ ¿©Áö°¡ ¸Å¿ì Å­.) # ¹Ì¸® script dictionary¿¡ ÇÊ¿äÇÑ »ó¼ö¸¦ ³Ö¾î³õ´Â´Ù. import chr import player import app self.ScriptDictionary["PLAYER_NAME_MAX_LEN"] = chr.PLAYER_NAME_MAX_LEN self.ScriptDictionary["DRAGON_SOUL_EQUIPMENT_SLOT_START"] = player.DRAGON_SOUL_EQUIPMENT_SLOT_START self.ScriptDictionary["LOCALE_PATH"] = app.GetLocalePath() execfile(FileName, self.ScriptDictionary) except IOError, err: import sys import dbg dbg.TraceError("Failed to load script file : %s" % (FileName)) dbg.TraceError("error : %s" % (err)) exception.Abort("LoadScriptFile1") except RuntimeError,err: import sys import dbg dbg.TraceError("Failed to load script file : %s" % (FileName)) dbg.TraceError("error : %s" % (err)) exception.Abort("LoadScriptFile2") except: import sys import dbg dbg.TraceError("Failed to load script file : %s" % (FileName)) exception.Abort("LoadScriptFile!!!!!!!!!!!!!!") ##### Body = self.ScriptDictionary["window"] self.CheckKeyList("window", Body, self.BODY_KEY_LIST) window.ClearDictionary() self.InsertFunction = window.InsertChild window.SetPosition(int(Body["x"]), int(Body["y"])) if localeInfo.IsARABIC(): w = wndMgr.GetScreenWidth() h = wndMgr.GetScreenHeight() if Body.has_key("width"): w = int(Body["width"]) if Body.has_key("height"): h = int(Body["height"]) window.SetSize(w, h) else: window.SetSize(int(Body["width"]), int(Body["height"])) if True == Body.has_key("style"): for StyleList in Body["style"]: window.AddFlag(StyleList) self.LoadChildren(window, Body) Assez complexe, je vous l'accorde. Je vais donc vous simplifiez la chose : Elle permet de charger un fichier d'interface et ses éléments. Du côté de la fonction __Load_BindObject, elle va de son côté charger tous les éléments de notre interface et les stocker dans des variables. Bien, si on résume pour nous, nous avons : Retenez la manière de charger des éléments, avec le GetObject = self.GetChild c'est la manière la plus propre à mon goût. Bien, maintenant complétons la fonction __Load : Dans Load nous allons maintenant attribuer tous les événements(ce qu'il se passe quand on clique sur quelque chose) et la position de la fenêtre car si vous vous souvenez nous avions mis x = y = 0 pour coordonnées d'apparition de la fenêtre. Pour cela, ajoutons : self.SetCenterPosition() Tapez aussi cette ligne, qui ne change quelque soit la gui, sauf si elle n'a pas de titlebar ou que vous avez changé le nom des éléments : self.titleBar.SetCloseEvent(ui.__mem_func__(self.Close)) Ce qui nous donne en tout : Définissons maintenant un événement à notre bouton. Pour cela nous allons utiliser la fonction SAFE_SetEvent(), renvoyant sur cette fonction : def SAFE_SetEvent(self, func, *args): self.eventFunc = __mem_func__(func) self.eventArgs = args Enfin, bref, je vous donne la syntaxe, cela donne : self.takumaButton.SAFE_SetEvent() Nous entrons ensuite entre les parenthèses la fonction qui va s'exécuter quand l'événement sera lancé, par exemple : self.takumaButton.SAFE_SetEvent(self.maFonction) Par exemple, nous allons faire que cette fonction envoie "Bonjour !" dans le chat à la place de celui qui déclenche l'événement. Créons la fonction : def maFonction(self): import net net.SendChatPacket("Bonjour ! ") Il ne vous manque plus qu'une seule fonction pour que votre système soit prêt, la fonction pour l'afficher ! Et la voici : def Show(self): ui.ScriptWindow.Show(self) Félicitation, vous avez maintenant les bases pour créer votre système ! Je vous ferais d'autre tutoriel, pour par exemple évoquer les radio_buttons, les images, etc. Je vous invite à essayer de découvrir par vous même en regardant dans votre fichier ui.py qui contient tout ce qu'il faut ! Vous obtenez donc à la fin : Comme promis, un fichier neutre contenant les fonctions minimums : ICI ! Bon développement !
    1 point
  26. Download Metin2 Download
    1 point
  27. Download Metin2 Download
    1 point
  28. Download Metin2 Download
    1 point
  29. Download Metin2 Download Nature MDE Set - Ridack 3D Weapons Mass Import Script
    1 point
  30. Download Metin2 Download Artvertino Set - DZekon Studio 3D Weapons Mass Import Script
    1 point
  31. Download Metin2 Download Gold Royal Set 3D Armors Mass Import Script
    1 point
  32. Download Metin2 Download Armors Pack 3 3D Armors Mass Import Script
    1 point
  33. Download Metin2 Download Skybox - Reco 3D Others Mass Import Script
    1 point
  34. Download Metin2 Download HD Texture Pack 2D Mass Import Script
    1 point
  35. Download Metin2 Download Loading Bar 2 2D Mass Import Script
    1 point
  36. Download Metin2 Download Costumes Male Set 2D Mass Import Script
    1 point
  37. Download Metin2 Download Smoke Black Platypus 3D Effects Mass Import Script
    1 point
  38. Download Metin2 Download Ridack - Rainbow Weapon & Armor 3D Effects Mass Import Script
    1 point
  39. Download Metin2 Download Theru - Farm Orc Maps Mass Import Script
    1 point
  40. Download Metin2 Download Kidro - Farm Maps Mass Import Script
    1 point
  41. Download Metin2 Download Hash Generator Tools Mass Import Script
    1 point
  42. Salut, Un petit outil que je préfère mettre en avant pour tout le monde, cet outil vous permet de générer et ce rapidement un mot de passe pour votre serveur Metin2 sans avoir besoin spécialement d'un site internet. Outil : ICI Exoti'quement, ASIKOO
    1 point
  43. Centre de Téléchargement Télécharger ( Interne ) Local_inc.h Service.h
    1 point
  44. Centre de Téléchargement Télécharger ( Interne ) Pack d'armes provenant de Metin3Game (H1N1). Holà, Il me semble que quelqu'un les recherchait, ayant dépack le client, je les ai trouvées et vous ai upload le pack. Par contre, il y'a énormément d'armes dedans, je n'ai pas pris le temps de trié les "nouvelles" des armes officielles, à vous de regarder chaque texture avec Granny Viewer, les icônes portent en théorie de le même nom que chaque arme correspondante (ID de l'arme) --- Aperçus --- Download
    1 point
  45. Niveau requis : Débutant Temps estimé : Entre 5 et 10 minutes Réécriture by Xayah Pré-requis: Les sources : HERE (Au préalable vous avez suivi ce tutoriel pour obtenir une VM prête à compiler : Créer un environnement pour Metin2) (Facultatif) Un VDI avec sources pré-installées : VDI by Team FE I. Compiler son Game II. Compiler sa DB Pour continuer : Si vous souhaitez compiler votre lanceur je vous renvoie vers ce tutoriel : Compiler le Client Binary Vous pouvez aussi compiler votre DumpProto qui servira à créer vos protos clients : Compiler & Utiliser un DumpProto Vous pouvez désormais ajouter des systèmes dans les sources : Section Système & Programmation Si vous avez un soucis n'hésitez pas à poster vos demandes d'aide dans l'AQS !
    1 point
  46. Centre de Téléchargement Télécharger ( Interne ) Ces files sont susceptibles de ne pas fonctionner correctement sans y apporter des corrections. Ces files peuvent être utilisés pour y récupérer des ressources. Ces Files Server ne sont pas recommandés. Bonjour, J'aimerais vous faire part de mon partage d'un très gros pack complet de serveur metin 2 ou j ai passer presque 6 mois a bosser dessus suite , a ma reprise de boulot dans la vie actif je n'est plus le temps de m'occuper de tout sa et je trouve sa dommage de faire dormir sa sur mon pc donc je laisse un lien de dl pour récupéré tout sa en espérant que vous ailler une bonne connexion car le dossier et très gros en espérant que vous me laisserez des bon coms et oublier pas un pouce bleu Merci. Source=moi Lien de dl=Cliquez ici pour télécharger Le fichier a dl comporte : Client Lib source Files Se sont des files 2014 toute debug , tout l interface et modifier le client et en qualité hd , ce qui de l implantation dans le client tout et implanter les magasin hors ligne , le switchbot, interface inédite en jeu et plein autre surprise je vous laisse découvrir, je vous laisse un gros partage prenez en par que c'est beaucoup de boulot et que je partage tout sa avec plaisir pour ma part!
    1 point
  47. F Download Center Télécharger ( Interne ) Bonjour, J'ai décidé de refaire ce tutoriel Aujourd'hui je vais vous expliquer comment ajouté l'option "détruire" lorsque vous voulez jeter un item. Ca va être assez long, mais facile si vous suivez bien le tutoriel. Commençons ______________________________________________________________________ PRÉREQUIS ______________________________________________________________________ 1.Des source Serveur 2.Des sources Client 3.Un client ______________________________________________________________________ 1.SOURCE SERVEUR ______________________________________________________________________ Ouvrez votre "packet.h" et recherchez: HEADER_CG_ITEM_DROP2 = 20, Ajoutez ceci juste en dessous: HEADER_CG_ITEM_DESTROY = 21, Recherchez maintenant: typedef struct command_item_drop2 { BYTE header; TItemPos Cell; DWORD gold; BYTE count; } TPacketCGItemDrop2; Ajoutez ceci juste en dessous: typedef struct command_item_destroy { BYTE header; TItemPos Cell; } TPacketCGItemDestroy; Ouvrez maintenant le fichier packet_info.cpp et recherchez: Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", true); Ajoutez ceci juste en dessous: Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", true); Ouvrez maintenant le fichier input_main.cpp et recherchez la fonction: void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) Ajoutez cette fonction juste après: void CInputMain::ItemDestroy(LPCHARACTER ch, const char * data) { struct command_item_destroy * pinfo = (struct command_item_destroy *) data; if (ch) ch->DestroyItem(pinfo->Cell); } Cherchez maintenant ceci: case HEADER_CG_ITEM_DROP2: if (!ch->IsObserverMode()) ItemDrop2(ch, c_pData); break; Et ajoutez: case HEADER_CG_ITEM_DESTROY: if (!ch->IsObserverMode()) ItemDestroy(ch, c_pData); break; Ouvrez maintenant le fichier char_item.cpp et recherchez la fonction: bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount) Ajoutez cette fonction juste au-dessus: bool CHARACTER::DestroyItem(TItemPos Cell) { LPITEM item = NULL; if (!CanHandleItem()) { if (NULL != DragonSoul_RefineWindow_GetOpener()) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°*È*âÀ» ¿¬ »óÅ¿¡¼*´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù.")); return false; } if (IsDead()) return false; if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell))) return false; if (item->IsExchanging()) return false; if (true == item->isLocked()) return false; if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true) return false; if (item->GetCount() <= 0) return false; SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255); ITEM_MANAGER::instance().RemoveItem(item); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("L'item %s est desormais detruit."), item->GetName()); return true; } Ouvrez maintenant le fichier char.h et recherchez: bool DropItem(TItemPos Cell, BYTE bCount=0); Ajoutez ceci juste au-dessus: bool DestroyItem(TItemPos Cell); Ouvrez maintenant le fichier input.h et recherchez: void ItemDrop2(LPCHARACTER ch, const char * data); Ajoutez ceci juste en dessous: void ItemDestroy(LPCHARACTER ch, const char * data); ______________________________________________________________________ 2. SOURCE CLIENT ______________________________________________________________________ Ouvrez le fichier packet.h et recherchez: HEADER_CG_ITEM_DROP2 = 20, Ajoutez ceci juste en dessous: HEADER_CG_ITEM_DESTROY = 21, Recherchez maintenant: typedef struct command_item_drop2 { BYTE header; TItemPos pos; DWORD gold; BYTE count; } TPacketCGItemDrop2; Ajoutez ceci juste en dessous: typedef struct command_item_destroy { BYTE header; TItemPos pos; }TPacketCGItemDestroy; Ouvrez maintenant le fichier PythonNetworkStreamPhaseGameItem.cpp et recherchez la fonction: bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count) Ajoutez cette fonction juste en dessous: bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos) { if (!__CanActMainInstance()) return true; TPacketCGItemDestroy itemDestroyPacket; itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY; itemDestroyPacket.pos = pos; if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket)) { Tracen("SendItemDestroyPacket Error"); return false; } return SendSequence(); } Ouvrez maintenant le fichier PythonNetworkStreamModule.cpp et recherchez la fonction: PyObject* netSendItemDropPacket(PyObject* poSelf, PyObject* poArgs) Ajoutez cette fonction juste en dessous: PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs) { TItemPos Cell; if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BuildException(); CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance(); rkNetStream.SendItemDestroyPacket(Cell); return Py_BuildNone(); } Recherchez maintenant: { "SendItemDropPacketNew", netSendItemDropPacketNew, METH_VARARGS }, Ajoutez ceci juste après: { "SendItemDestroyPacket", netSendItemDestroyPacket, METH_VARARGS }, Ouvrez maintenant le fichier PythonNetworkStream.h et recherchez la fonction: bool SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count); Ajoutez ceci juste après: bool SendItemDestroyPacket(TItemPos pos); ______________________________________________________________________ 3. PYTHON CLIENT ______________________________________________________________________ Ouvrez le fichier uicommon.py du pack root et recherchez la class: class QuestionDialog(ui.ScriptWindow): Juste après celle class, ajoutez la class suivante: class QuestionDialogItem(ui.ScriptWindow): def __init__(self): ui.ScriptWindow.__init__(self) self.__CreateDialog() def __del__(self): ui.ScriptWindow.__del__(self) def __CreateDialog(self): pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "uiscript/questiondialogitem.py") self.board = self.GetChild("board") self.textLine = self.GetChild("message") self.acceptButton = self.GetChild("accept") self.destroyButton = self.GetChild("destroy") self.cancelButton = self.GetChild("cancel") def Open(self): self.SetCenterPosition() self.SetTop() self.Show() def Close(self): self.Hide() def SetWidth(self, width): height = self.GetHeight() self.SetSize(width, height) self.board.SetSize(width, height) self.SetCenterPosition() self.UpdateRect() def SAFE_SetAcceptEvent(self, event): self.acceptButton.SAFE_SetEvent(event) def SAFE_SetCancelEvent(self, event): self.cancelButton.SAFE_SetEvent(event) def SetAcceptEvent(self, event): self.acceptButton.SetEvent(event) def SetDestroyEvent(self, event): self.destroyButton.SetEvent(event) def SetCancelEvent(self, event): self.cancelButton.SetEvent(event) def SetText(self, text): self.textLine.SetText(text) def SetAcceptText(self, text): self.acceptButton.SetText(text) def SetCancelText(self, text): self.cancelButton.SetText(text) def OnPressEscapeKey(self): self.Close() return True Ouvrez maintenant le fichier game.py et cherchez la def suivante: def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): Recherchez ce bout de code dans la fonction (2x): itemDropQuestionDialog = uiCommon.QuestionDialog() Remplacez par: itemDropQuestionDialog = uiCommon.QuestionDialogItem() Toujours dans la même fonction, recherchez: itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) Ajoutez ceci juste après: itemDropQuestionDialog.SetDestroyEvent(lambda arg=True: self.RequestDestroyItem(arg)) Recherchez maintenant la fonction: def RequestDropItem(self, answer): Ajoutez cette fonction juste après: def RequestDestroyItem(self, answer): if not self.itemDropQuestionDialog: return if answer: dropType = self.itemDropQuestionDialog.dropType dropNumber = self.itemDropQuestionDialog.dropNumber if player.SLOT_TYPE_INVENTORY == dropType: if dropNumber == player.ITEM_MONEY: return else: self.__SendDestroyItemPacket(dropNumber) self.itemDropQuestionDialog.Close() self.itemDropQuestionDialog = None constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) Recherchez ensuite la fonction: def __SendDropItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY): Et ajoutez celle-ci juste après: def __SendDestroyItemPacket(self, itemVNum, itemInvenType = player.INVENTORY): if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return net.SendItemDestroyPacket(itemVNum) Ouvrez maintenant le fichier locale_interface.txt et ajoutez ceci: DESTROY Destroy Placez le fichier questiondialogitem.py dans votre pack uiscript ! Screen du système: [Hidden Content] Voilà c'est fini ! Source du totoriel : .Avenue™ de Metin2Dev Traduction: moi Cordialement, #Saw.
    1 point
  48. Centre de Téléchargement Télécharger ( Interne ) HelloW, Voici un partage d'un très vieux client de Metin2... Le Client de l'année 2007 ! Il est en anglais. Cordialement, ASIKOO
    1 point
  49. Centre de Téléchargement Télécharger ( Interne ) HelloW, Installation Implémenter une Map Metin2 Téléchargement : ICI Source : Plechito et trouver sur forum just4metin
    1 point
  50. Centre de Téléchargement Télécharger ( Interne ) Bonjour/soir à toutes et à tous ! Vos joueurs ne se sont jamais plaint du manque de place dans l'inventaire ? entre les stuff PVP, le stuff PVE, les potions etc, on ne sait plus mettre les items ! Un très aimable allemand nous a donc partagé son système de "coffre portable" (qu'ils sont gentils nos confrères allemands !) Comment ça fonctionne ? très simple. Vous parlez pour commencer à un PNJ qui vous donne un coffre qui pourra ensuite contenir 10 items (vous pouvez demander plusieurs coffres ayant chacun son propre ID). Pour faire fonctionner tout ça, on a besoin de requête SQL, il vous faut donc le système de requête SQL installé sur votre serveur. Votre coffre peut être protégé par un mot de passe, si c'est pas beau ! Pour commencer, voilà le lien de téléchargement de la bête traduite par moi-même: Téléchargement : ICI Nous voilà fin prêt pour l'installation. A vrai dire faire un tuto pour ça n'est pas très utile, dans l'archive .rar tout est placé là où il faut le mettre, mais comme je n'aime pas les partages de 2 lignes, j'écris tout un tuto (et je comble les trous avec des phrases plus inutiles les unes que les autres ) Pour commencer: pas de secret, téléchargez l'archive .rar On va commencer par le clientside, il vous faut donc "icon" ainsi que "local_fr" de depack puis dans l'archive, allez dans Coffre de Stockage\Clientside\icon puis déplacez l'icône dans depack\icon\item. Allez ensuite dans "Coffre de Stockage\Clientside\locale" pour y trouver 3 fichiers. Faites donc simplement des copier/coller des lignes présente dans ces fichiers dans les différents fichiers indiqués. C'est le moment de repack ! n'oubliez pas de faire "recréer" pour l'item_proto avant de repack ainsi que "modifier" pour le fichier "icon". Le côté client est déjà fini, vous voyez que c'était pas compliqué ! Passons maintenant côté serveur, rien de très compliqué non plus, ne vous en faites pas ! Allez maintenant dans "Coffre de Stockage\Serverside\mysql" pour y trouver 3 fichiers avec l'extension .sql. Lancez Navicat puis allez dans "Player". Faites un clic droit dans le vide puis "Execute Biatch file" pour tomber sur une nouvelle page. Au bout de la ligne "File" cliquez sur " ... " puis choisissez le premier fichier se trouvant dans le dossier précédemment ouvert (c'est à ce moment que je me rend compte l'inutilité de vous avoir fait ouvrir ce dossier via l'explorer ) à savoir "chest_storage.sql" ce qui doit vous donner: [Hidden Content] Faites ensuite "Start" puis une fois que c'est fini "Close" (c'était l'instant Captain Obvious, par Craven.) Recommencez pour les 2 autres fichiers "chest_storage_properties.sql" ainsi que "item_proto.sql". Si vous souhaitez voir le résultat, faites un clic droit puis "refresh" pour voir 2 nouvelles tables servant à la quête ainsi que le nouvel item dans l'item proto. C'est maintenant fini sur Navicat ! allez sur votre FTP puis dans le dossier des quêtes. Uploadez les fichiers "chest_storage_nu.quest" et "chest_storage_nu.lua" dans le dossier. N'oubliez d'ajouter "chest_storage_nu.quest" à votre locale_list. Nul besoin d'ajouter le second fichier à votre locale_list. Ouvrez "quest_functions" de votre FTP pour y mettre les fonctions se trouvant dans le fichier "questfunctions.txt": Coffre de Stockage\Serverside\quest. Enregistrez le tout. Ouvrez ensuite "questlib.lua" de votre FTP pour ajouter à la fin du fichier la ligne se trouvant dans le fichier "questlib.txt". Puis pour finir, enregistrez. Un reboot avec une recompilation des quêtes et c'est fini ! /!\N'oubliez pas que vous devez avoir le système de requête SQL installé/!\ Si, lorsque vous voulez stocker une arme ou une armure, vous recevez le message "*Nom de l'item* ne peut être ranger dans le coffre." c'est parce qu'on peut choisir quel item a le droit d'être stocké ou non. Ouvrez la quête "chest_storage_nu.quest" puis allez à la ligne 132, vous verrez ça: if itemType != 1 and itemType != 2 and itemType != 16 and itemVnum != 999985 then --keine Special Items/Ruestungsteile/Waffen Il vous suffit de supprimer le itemType de l'item que vous voulez rendre stockable, par exemple pour rendre les armes stockable supprimez "itemType !=1 ": if itemType != 2 and itemType != 16 and itemType != 5 and itemVnum != 999985 then --keine Special Items/Ruestungsteile/Waffen Bon, je sens que vous avez été sage tout le long de ce tuto, je vous ai donc préparé une vidéo pour que vous puissiez voir à quoi ça ressemble en jeu: [video=youtube] Sur ce, bonne émulation à toutes et à tous et bonne chance ! Source: epvp
    1 point

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.