Aller au contenu

Classement


Contenu populaire

Affichage du contenu avec la meilleure réputation depuis le 03/16/19 dans toutes les zones

  1. 5 points
    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 !
  2. 3 points
    Bonjour, aujourd'hui je vous partage le logiciel Flash Decompiller Trillix 5.3.1370. Ce programme sert à ouvrir les fichiers en .swf Vous pouvez vous en servir pour changer l'image du chargement de votre rétro par exemple ! Liens mega : ici Scan : ici Tutoriel : Il est déjà intégré dans l'archive, mais je l'explique quand même ici avec quelques screens ! Vous allez installer le programme qui se trouve dans Setup en prenant soins de décocher la case pour le lancer à la fin ! Je vous détaille l'installation même si je pense que vous savez faire... Sélectionnez votre langue puis, puis faite "OK" Faites suivants : Faites ensuite l'installation standard, c'est très important ! Après, faite attention à ne pas cocher cette case : SURTOUT PAS Allez ensuite dans sur votre bureau : Faites CLIQUES DROIT sur "Flash Decompiler Trillix.exe" (un menu déroulant s'affichera), et cliquez sur "Ouvrir l'emplacement du fichier". maintenant, vous avez les deux dossier "Program Files (x86)\Eltima Software\Flash Decompiler Trillix" & "Flash Decompiler Trillix 5.3.1370 cracked" Dans le dossier "Flash Decompiler Trillix 5.3.1370 cracked", glissez le programme "FlashDecompiler.exe" dans le dossier "Program Files (x86)\Eltima Software\Flash Decompiler Trillix" Et voilà c'est cracker. Bon jeu à vous Cordialement. --- Download
  3. 2 points
    Mesdames, Messieurs, Bonjour, Bonsoir, Files Metin2 2016 La Team FE ( Funky Émulation ) vous propose aujourd'hui des Files Metin2 2016 de qualité avec la majorité des systèmes de l'officiel jusqu'à aujourd'hui ( 2016 ). Les Files sont actuellement en version 3.0. Les versions 1.0 et 2.0 ne sont plus disponible au téléchargement. Ces Files sont compatibles avec les serveurs en No-IP / Hamachi / Local, attention, pour permettent aux joueurs de rejoindre votre devrez rediriger les ports de box, en NO-IP / Hamachi les joueurs ne pourront pas rejoindre. Changelog 3.0 A Savoir Screenshots Téléchargements Machine Virtuelle FreeBSD 9.2 avec VirtualBox - All In One Pour aller plus loin Master Guide - Le Guide de l’Émulation Metin2 Cordialement, Team FE La vente de ces files est strictement interdite, si elles ont été mises en publique ce n'est pas pour les vendre mais pour faire profiter n'importe quelle communauté de ce travail.
  4. 2 points
    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. Ce tutoriel utilisera Hamachi. N'étant plus trop utiliser, je vous conseille de l'utiliser qu'en dernier recours (voir encadré bleu ci dessous). Information. Lors de ce tutoriel, vous allez apprendre à créer un serveur avec Hamachi. Vos amis pourront donc rejoindre le serveur pour jouer avec vous ! Cependant, ils devront tous télécharger Hamachi pour pouvoir rejoindre le réseau ainsi que votre serveur. Si vous souhaitez un serveur juste en local, utilisez ce tutoriel. Si vous souhaitez que vos amis puissent vous rejoindre mais ne pas utiliser Hamachi, dirigez vous vers ce tutoriel. 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. Hamachi qui permet de créer un réseau virtuel privé. C'est sur ce réseau et non le votre que l'on mettra votre serveur Metin2. Portmap (Fichier #138), qui va vous permettre d'ouvrir les ports pour que vos joueurs puissent se connecter au réseau. I. La machine virtuelle II. Configuration de la machine virtuelle III. Configuration de Portmap IV. Lancement du serveur Metin2 V. Créer le réseau Hamachi VI. Se connecter In Game VII. Accéder aux fichiers du serveur VIII. Accéder à la base de données 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 !
  5. 2 points
    Bonzoooooir ! Je viens aujourd'hui vous présentez un site que j'ai trouvé sur Metin2CMS -> Source. Je l'ai traduis moi même à 100% (Même si c'était pas très très compliqué à vrai dire... *sifflote*) . Il est semblable aux autres CMS basiques si ce n'est que je trouve le design vraiment joli ! Un aperçu : Option diverses : Le site est assez complet en soi, je n'ai pas tout testé. Il manque juste l'ItemShop. [Contenu Masqué] J'ai modif le logo par contre, mais j'ai le logo de base en PSD : [Contenu Masqué] Vérifiez quand même si il y'a des fautes niveau orthographes, j'ai parfois du mal.. Mdr --- Download
  6. 2 points
    Bonsoir, La Team FE est un projet communautaire qui a été suggéré il y a bien longtemps maintenant. Aujourd'hui, elle vous propose son premier projet: Les files 2014 de la team FE. L'objectif étant de vous proposer des files stables ouvertes à tous. MDP : teamfe (azerty) soit teq,fe (qwerty) Vous pouvez changer la disposition du clavier en tapant la commande : kbdmap puis choisir French ISO-8859-l (accent keys). La Team FE est composée de (je remercie prindo99 aussi qui a su nous faire un sauvetage de dernières minutes): Kijaru Ant0k Raptt Galet Calypso A différence des files 2014 françaises déjà partagé sur le forum, les files de la team FE ont été légèrement amélioré. De plus, nous avons compilé le game et le client de sorte que ceux-ci puissent être exploité plus facilement. Vous aurez donc la possibilité de retrouver les sources et de pouvoir les compiler sans aucune erreur. TÉLÉCHARGEMENT Virtual Machine FreeBSD 9.2 Files 2014 pré-installés + Sources Mainline du game Version 1.0: Cliquez ici pour télécharger LES FILES 2014 Modification côté File: Modifications côté game: En ce qui concerne le côté client, on a juste fait en sorte qu'il puisse être compilé (d'ailleurs le metin2client.exe compilé se trouve dans l'archive des sources). --- Download
  7. 2 points
    Salut tout le monde ! Etant donné que le topic des sources a été supprimé par son auteur, je vous donne un nouveau lien de téléchargement: Cliquez ici pour télécharger Vous pouvez y trouver toutes les branches. Ainsi, dans la catégorie Tutoriel, vous pouvez y trouver toutes les informations pour apprendre à compiler les sources de Metin2. Good Luck ! --- Download
  8. 2 points
    Yep, Vous connaissez sans doutes les fameuses file 2013, avec les tools qui permettent de générer le côté client grâce au côté serveur. Mais malheureusement, certains n'arrivent plus à dump ces protos car ils sont beaucoup trop récents ... Bah ici, c'est la même chose ! Il suffit de mettre l'exe dans un dossier avec l'item proto et l'item name txt (ou mob), de les faire glisser sur le exe le tour est joué ! De plus, il prend en compte les nouveaux mob proto donc les nouvelles colonnes ! Téléchargement: [Contenu Masqué] --- Download
  9. 2 points
    Bonjour, je vous partage emulateur 2.10 fonctionnel : Quelques debugs : L'émulateur est une amélioration d'Herozia et est codé en C# Auteur : ? Repartagé depuis DozenOfElites Téléchargement Edité par la modération --- Download
  10. 2 points
    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 !
  11. 2 points
    Niveau requis : Débutant Temps estimé : 15 minutes Réécriture by Xayah Ce tutoriel aura pour but de vous aider à installer le SwitchBot sur votre Client Metin2. Pré-requis : L'archive suivante : ICI ou ICI ou FE I. Installation Pour continuer: Si vous avez un soucis, n'hésitez pas à faire une demande d'aide dans l'AQS
  12. 2 points
    Salut , je vous partage emulateur symbioz 2.30 de skinz Lien : ICI l'emulateur est codé en C#, le site d'origine du partgae c'est DoE emulateur code par Skinz PS : Certaines parties sont a refaire: (les tools sont assez sale :3 et le fonctionnement de parser d'effet de sorts et d'item) Il est loin d'être terminé, et il y a beaucoup de travail a faire, fonctionne avec le client dofus 2.30 --- Download
  13. 2 points
    Bonjour, Voici quelques armures Téléchargement : ICI M89 Source : EPVP Cordialement, Download
  14. 2 points
    Bonjour à tous! Je partage 14CMS que j'avais dans mes fichiers sur mes fichiers! Peu-etre certain des 14CMS on deja ete connu ou meme utilisé.. mais, je voulais quand meme vous les partager sur Funky-Emulation!! Site Site2 Source : Epvp Bonne journée, Praxy --- Download
  15. 2 points
    Bonjour Funky! Je vous partage aujourd'hui un petit CMS avec 3 couleurs changeable que j'ai fais en 10 minutes, il ne comporte qu'un système d'inscription et de classement. Pour la configuration de la base de données, c'est dans config/db.php, pas besoin de vous montrez comment configurer ça j'espère Téléchargement: Clique ici A+ --- Download
  16. 1 point
    Niveau requis : Débutant Salut les gens, aujourd'hui on se retrouve pour un partage qui va en faire sourire plus d'un, c'est le client 2004, datant de la beta du jeu, il y a 10 ans maintenant... Il est utilisable avec des files 2006, il possède l'aura de l'épée Blanc, les ponts plus petits, les textures changées etc... Je trouve que ce partage vaut de l'or, faites-en bon usage. Téléchargement : ICI ICI ICI ICI ICI Old, but Gold, Hey hey --- Download
  17. 1 point
    Niveau requis Débutant Temps estimé : Entre 15 et 30 minutes Bonjour à tous, Tu souhaites installer un serveur Metin2 sur un serveur dédié ? Alors ce tutoriel est fait pour toi ! Information. Ce tutoriel vous permettra de mettre un serveur privé Metin2 sur un serveur dédié. Cela veut dire que votre serveur pourra être ouvert 24/24H car il se trouve sur une machine externe que vous avez loué (ou acheté Pré-requis: Un dédié que vous avez loué (chez Kimsufi ou SoYouStart par exemple). Vous pouvez aussi utiliser ce tutoriel pour installer un serveur sur une machine virtuelle FreeBSD. Un système d'exploitation FreeBSD récent installé sur votre machine dédié. Dans ce tutoriel, nous utiliserons la version 11.2 PuTTY, qui vous permettra de vous connecter en SSH à votre machine. Téléchargez putty.exe I. Se connecter à votre machine II. Installation de MySQL III. Configurez MySQL pour Metin2 Votre dédié est maintenant complètement installé. Il ne vous reste plus qu'à y installer vos fichiers Metin2 pour pouvoir l'utiliser. 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 ! Tutoriel ré-écrit par Calypso
  18. 1 point
    Bonjour à tous. Certains seront contents, car ils l'attendaient tous, d'autres pas et auront peut-être une dent contre moi. J'ai beaucoup réfléchi après avoir discuté avec deux staffiens de FunkyEmu et je me suis rendu compte que si personne ne veut poster des tutoriels sur le mapping, ça n'avancera pas. Il faut me comprendre Alors, comme vous l'avez compris, je vais vous apprendre à créer une map de A à Z. Je dis bien de A à Z. Je vais même vous apprendre à faire les ombres, que la quasi-totalité des personnes ici ne savent pas faire. Je l'accorde, c'est quelque chose de très complexe. Remarque avant de débuter Il ne suffit pas de savoir mapper pour être mappeur, il faut aussi savoir bien le faire. Il est quand même préférable de ne rater aucune étape, cela peut vous coûter cher.On ne fait pas une map en 2 heures, loin de là .. Aucun logiciel ne permet de faire une map de A à Z, ne rêvez pas trop ^^ La grottes de l'exil, donjon, etc .. ne sont pas des maps mais de la 3D empilé sur une mapOn ne peut pas faire de tunnel sur une map. Je dis ça pour certains ^^Pendant tout le tutoriel, je vais faire une map en même temps que vous. N'essayez pas de faire la même que moi Puis je vais faire un truc moche, c'est seulement pour que vous comprenez la chose.J'utiliserai cette ressource pendant ce tutoriel : ICI I. Une map, c'est quoi ? Pour ceux qui ne le savent pas, une map est une carte ou une aire de jeu. Pour être plus précis, c'est l'endroit où vous marchez dans Metin2. La carte principale avec les chiens errants, c'est une map. Pareil pour les autres cartes. La constitution d'une map Ici, nous allons dépacker la map 1 du royaume Jinno (Royaume bleu). Voilà ce que nous avons: Vous voyez donc plusieurs dossiers (Ne vous préoccupez pas des fichiers texte). Votre map est donc constituée de carrés, mais vous vous demandez surement comment sont placés tous ces carrés ? Les dossiers sont bien rangés et n'ont pas de nombre au hasard. Des dossiers n'ont que des nombres 0 au milieu, d'autres ont le nombre 1, d'autres ont le nombre 2, etc . Plus il y a de dossier, plus la map est grande. Alors, ceux qui ont le nombre 0, correspondent à une colonne, ceux avec le nombre 1, à une colonne, etc . Voici une petite image récapitulative, car cela m'étonnerait que vous ayez compris par du texte: Même avec ça, je pense que vous n'avez pas compris. Donc en gros, voilà à quoi ressemble la map 1 si on assemble tous les carrés: Le village, se trouve entre le carré 001001 et 002002, par là. Voilà pour cette partie, il faut essayer de bien la comprendre. Même si cela vous semble encore un peu vague, vous pourrez mieux comprendre cela dans la partie suivante. Car oui, de quoi sont composés ces carrés ? De quoi sont composés ces carrés ? Vous avez vu qu'une map, c'est en quelque sorte des carrés. Mais s'il y a plusieurs dossiers, donc plusieurs carrés, que contiennent-ils ? C'est simple, ouvrez n'importe quel dossier et ne prenez pas en compte les fichiers textes. Voici l'utilité de chaque fichier sachant que chacun est une image: attr.atr (Attribute): C'est une image qui définit les zones, sur la map, où le joueur peut marcher, accéder. Vous ne pouvez pas monter sur les montagnes, car l'image Attribute dit qu'à cet endroit là, le joueur n'a pas le droit de le faire. height.raw: Sans doute le plus important dans une map, c'est une image (composé de deux couches) qui définit la hauteur de la map dans laquelle il y a des montées, descentes, montagnes, etc .. Enfin, tout ce qui est relief. Les montagnes sont définies dans cette image. minimap.dds: C'est l'image qui comporte la carte complète de votre map. Pas besoin d'explication là dessus shadowmap.dds: Une image qui définit les ombres sur la map. L'une des images les plus complexes à faire, ça reste quand même indispensable pour une map crédible. Les ombres des bâtiments sont définies dans ce fichier.tile: Cette image permet de voir la texture sur votre map. Elle définit les endroits où il y a telle texture. Par exemple, vous avez un chemin à un endroit précis, c'est dans ce fichier qu'il est définit.water.wtr: Pas plus simple que la minimap, c'est l'image qui définit l'eau. Si à un endroit vous avez une rivière, c'est dans ce fichier que cette rivière est définie et surtout, à quelle hauteur est l'eau. Et voilà, vous savez tout sur ce qu'est une map et surtout, comment les maps de Metin2 sont composées. Passons maintenant, dans le vif du sujet, tenez vous prêts II. La conversion des maps Convertir une map est l'une des choses des plus importantes dans le mapping. Si vous ne savez pas le faire, vous n'irez nulle part. Convertir une map, ça sert tout simplement à convertir vos fichiers en image à part ou toutes assemblées (Les carrés regroupés) Deux choix s'offrent à vous. Soit vous convertissez tout avec des logiciels différents ou alors un magnifique logiciel se présente devant vous : ICI Tout est expliqué mais je pense qu'il est nécessaire de faire un petit récapitulatif de tout ça. Comment convertir une map? Ce logiciel est fait exclusivement pour Metin2, donc vous avez de la chance. Donc imaginons que vous voulez convertir une map déjà existante (peut-être la vôtre), il va falloir commencer par la dépacker si cette dernière se trouve en eix/epk. Pas besoin de le faire si la map est dans season1.Une fois que c'est fait, ouvrez MapConverter et cliquez sur import. Il faut choisir le dossier de la map, le dossier dans lequel se trouve la totalité des dossiers avec numéros. Vous importez alors toutes les images et comme par magie vous avez les images.Je vous vois partir, donc revenez, ce n'est pas si difficile que ça Vous pouvez regarder un peu tout ça mais ce n'est pas nécessaire pour l'instant. Après il va falloir sauvegarder les images, donc cliquez sur Save puis choisissez la destination Voici ce que j'obtiens en convertissant la Map 1 du royaume Jinno: Ne vous occupez pas des fichiers texte pour l'instant. Le fichier map.ini sert juste pour la ré-conversion de la map. On va dire que vous avez modifié des images et que vous voulez les ré-convertir. Donc sur Map Converter, vous cliquez sur load, choisissez le fichier map.ini de la map, vous chargez toutes les images puis vous n'avez plus qu'à exporter la map en prenant toutes les images et aussi, cocher la case: Create empty files for objects Je fais une partie là dessus pour éviter d'y retourner après. Comme ça vous aurez tout centré quelque part et en plus, vous aurez même un deuxième tutoriel Quand vous exportez la map, on ne créé pas de fichier eix/epk dessus. Le mieux est d'implanter sa propre map dans le season1 puis ceux qui souhaitent vraiment implanter dans pack, vous aurez une partie consacrée à ça. C'est plus compliqué. Je rappelle que si vous voulez commencer à créer une map, vous n'aurez pas forcément eu le besoin de faire cette étape. C'est seulement pour que dans le futur, vous sachez convertir et ré-convertir votre map. Maintenant, rentrons encore dans le vif du vif du sujet: La création III. Le relief: Height Je rappelle que le height, c'est le fichier ou l'image, qui définit le relief de la map. En convertissant la map, vous pouvez voir les deux images (les deux couches) du height.raw, c'est-à-dire Height CH1 et Height CH2. L'un définit le relief et l'autre la hauteur du relief. Le Height, c'est la première chose à faire quand on fait une map. Donc commençons tout de suite À la main ou avec un logiciel ? Vous avez plusieurs façons de faire un height, soit vous faites tout sur Photoshop ou alors avec un logiciel 3D. Certains sont nuls en 3D donc ce qu'il font, c'est de le faire sur Photoshop. Mais franchement, c'est plus simple de le faire par le biais d'un logiciel 3D. Le voici:L3DT: [Contenu Masqué] Un logiciel créé par BundySoft qui va vous permettre de créer un height.raw en 3D. Téléchargez-le donc dans la section Dowloads --> Standard Edition --> L3DT Standard Edition - v13.01 dev build 0 Avant de commencer quoi que ce soit, il faut que vous sachiez quelque chose: Le principe des dimensions. Ne commencez pas sans avoir compris ceci car sinon la plupart des choses, vous allez rien comprendre. Choisir les dimensions pour sa map Si vous avez déjà ouvert un fichier setting.txt, vous avez dû voir une ligne MapSize avec deux chiffres à côté. C'est tout simplement la MapSize. Si on reprend l'image de tout à l'heure: Il y a 5 dossiers par colonne et 4 colonne. Donc la map size est de 4 x 5 . Le nombre de colonne avant et le nombre de dossier par colonne après. Le problème, c'est qu'avec L3DT, il n'est pas possible de faire des maps en rectangle (2x5, 3x4, 6x1), on ne peut faire que des maps carrés,c'est-à-dire 2x2, 3x3, 4 x4, etc ..) Mais vous allez me dire, comment savoir les dimensions des images ? C'est simple, sur MapConverter, cliquez sur MapSize Calculator. Je veux faire une map 2x2 donc: Vous avez toutes les dimensions. Maintenant je sais que pour faire une map 2 x 2, il faut que le height fasse 259x259. On a maintenant toutes les informations pour faire un height. On va maintenant commencer par présenter et commencer à faire son height sur L3DT. Création du projet L3DT Lancez donc L3DT. Faîtes File puis New Project. Choisissez Blank heightmap puis cliquez sur next. Je mets alors les dimensions que Map Converter m'a donné, c'est-à-dire 259x259. Je ne touche à rien d'autre, je coche seulement la case Edge wrapping. Ça doit donner cela: Cliquez sur OK et normalement, vous tombez directement sur l'interface 3D, où vous allez faire votre map ECHAP pour quitter cette interface et le bouton 3-D, pour y retourner. Puis dans l'interface 3D, Edit puis Heightfield tool pour la fenêtre des outils. Pour de déplacer, il faut appuyer sur Alt+Shift pour être en clavier AZERTY, car c'est en clavier QWERTY par défaut. Voilà ce que moi, j'ai: Vous avez une sorte de sphère que vous pouvez agrandir avec la molette de la souris. Clic gauche pour utiliser l'outil et clic droit pour tourner la caméra. Sur L3DT, le terrain est considéré comme une sphère, c'est comme si c'était la planète terre mais en plus petit. C'est pour ça que si vous faites une montagnes sur la gauche, sur le terrain soit modifié à droite. Voici l'utilité de chaque outil (Je ne les décris pas tous, juste ceux qui peuvent servir pour faire une map: Point grab: Pour faire des pointes. Restez appuyé puis lever ou baisser la souris en fonction de votre volonté. Raise brush: Pour faire des montagnes. C'est celui qu'on utilise le plus. Lower brush: Pour faire des montagnes mais ancrées dans le sol. Pour faire des creux Set to: Pour faire des plates-formes plus ou moins grandes. Suffit de rentrer le numéro. Vous pouvez mettre des nombres négatifs pour faire des plates-formes dans le sol. Raise to: Même chose que Set to sauf que lorsque vous mettez la plate-forme sur une montagne, ça ne l'écrase pas. Ça écrase seulement la partie qui est inférieure à la plate-forme. Lower to: Même chose que Raise to sauf que c'est pour le sol. N'oubliez pas le - avant vos nombres Cliffs: Pour faire des trous dans le sol. Très utile pour débuter une rivière. Bulldozer: Pour faire des pentes. Vous avez deux montagnes de hauteur différentes, vous voulez les faire se rejoindre. Cliquez sur la montagne la plus haute, puis glisser jusqu'à l'endroit où la pente doit s'arrêter. Vous pouvez agrandir la pente sur sa largeur avec la molette de la souris. Leveller: Pareil que Bulldozer sauf que c'est pour faire un sol plat en longueur à partir d'une montagne. Level at: Même chose que Set to sauf que c'est pour faire des plate-formes en longueur. Smooth: Pour lisser le terrain. Indispensable Une partie relativement longue mais indispensable. Il ne vous reste plus qu'à exporter votre map en deux couches. Exporter sa map Vous avez essayé de faire un truc, donc voici ce que moi j'ai fais: IMPORTANT: Toujours enregistrer son projet L3DT au cas où on voudrait modifier quelque chose une fois avoir vu la map IG. C'est relativement simple mais c'est pour l'exemple. Appuyez sur ECHAP puis Layer ---> Export layers (Exporter les couches). Choisissez le format raw puis le nom du fichier et enfin, cliquez sur OK. Il faut maintenant posséder Adobe Photoshop, donc si vous ne l'avez pas, téléchargez le. Ouvrez votre raw avec Photoshop. Faîtes Windows ---> Channels comme ceci: Vous avez deux couches. Supprimez Alpha2 puis enregistrez Alpha1 au format raw en Height CH1.raw. Vous faîtes de même avec Alpha 2, vous l'enregistrez en Height CH2.raw. Vous ouvrez Height CH1.raw et vous l'enregistrez en PNG. Et vous faites de même pour Height CH2.png Faites un dossier pour votre map, c'est mieux Voilà, vous avez fini le height d'une map. On ne va pas la tester tout de suite, car il manque quelque chose de plus ou moins important. Félicitations IV. La texture: Tile Le tile, c'est le fichier qui permet de définir la texture, où elle est placé en gros. Ouvrez le Tile de la map 1, vous voyez que c'est tout noir. Augmentez ou baissez la luminosité de votre écran pour voir la différence Allons-y Comment faire un Tile Il existe plusieurs façons de faire un tile, mais je vais vous faire part de ma soluce . Si vous avez fait un trou avec des montagnes à côté, il va falloir utiliser le Height CH2. Si au contraire, vous avez un sol avec des collines et pas beaucoup de creux, il va falloir utiliser Height CH1. Sur Map Converter, on me dit que pour une map 2x2, le tile doit faire 516 x 516 donc sur Photoshop, je crée un fichier 516 x 516. Sachant que je suis très nulle sur Photoshop, je vais utiliser GIMP pour faire le Tile. Donc je vais créer le fichier sur Gimp. Dessus, j'importe le fichier height en fonction de sa map (voir plus haut). Dans mon cas, j'utilise le Height CH1. Après, j'agrandis le height en fonction de la taille du tile, pour moi c'est 516 x 516. Il ne manque plus qu'à colorier dessus avec des couleurs RGB. Sur GIMP, c'est dans la modification de la couleur du premier plan et sur Photoshop, c'est dans la palette. Voici les couleurs: L'herbe: 040404 La pierre (Montagne): 080808 La SafeZone: 0c0c0c Les chemins: 010101 Enfin bref, ce ne sont que quelques exemples. Si vous voulez d'autres textures, allez sur le tile d'une map et piochez Il vous manque plus qu'à colorier votre height, vous devez normalement reconnaître les formes Pour moi c'est fait, ça donne ça: Important: Je ne testerais pas la map. Mais pour vous, il vaut mieux la tester régulièrement. Rendez vous dans la partie Tester sa map pour pouvoir la tester =D Certains ont peut être le bug des traits décalés, par exemple vous avez un chemin mais il est décalé.. Je vais quand même une partie là-dessus car c'est assez moche. Régler le problème du tile Ce n'est pas très compliqué, seulement un problème de pixel. Ouvrez donc votre tile avec Photoshop. Faites View ---> Show ---> Pixel Grid. Faites un zoom très fort sur l'image pour voir les pixels. Puis View ---> Rulers puis faites clic droit sur la règle, puis choisissez pixel. Vous avez un quadrillage avec numéroté en pixel. Le but ici est de faire une symétrie inverse tous les 258 pixels. Faites marcher votre petite cervelle pour trouver où c'est. Voilà ce qu'il faut faire: Vous l'avez compris. C'est une symétrie mais à l'envers. Par exemple, si un pixel est à coller sur la droite (qui est imaginaire elle est pas à rajouter), bah le pixel doit être répété de l'autre côté mais à l'inverse de la symétrie. Cela veut dire qu'au lieu que le pixel soit collé à la droite sur le côté droit, le pixel est juste après. En gros, la ligne que j'ai rajouté, c'est la frontière entre les deux carrés. IMPORTANT: Vous devez le faire sur la partie verticale mais aussi sur la partie horizontale. Les pixels rouges ont été rajoutés. C'est seulement pour que vous voyez comment ça fonctionne. Voilà, vous avez déjà fait les deux parties les plus importantes d'une map. Maintenant, nous allons nous occuper de l'Attribute. V. Les zones accessibles: l'Attribute Comme dit plus haut, l'Attribute définit les zones où le joueur peut marcher, où il peut accéder. Ne pas confondre avec les bâtiments. C'est dans le fichier 3D du bâtiment que c'est dit qu'il ne faut pas qu'il traverse le mur de la maison. C'est très simple Créer un Attribute Map Converter me dit que l'Attribute pour une map 2 x 2 doit faire 512 x 512. Je créé donc sur Photoshop, un fichier 512x512. J'importe le tile et je le réduis à 512x512. Même principe que le tile, il faut colorier par dessus avec des couleurs RGB: Zone où l'on peut accéder: 404040 Zone non accessible: cbcbcb Faites donc Pour moi, ça ressemble à ça: Là, c'était vite fait mais c'est quand même important. Car vous verrez après, c'est plus compliqué (il y a un rapport avec l'attribute) Normalement vous avez votre height, votre tile, votre Attribute, il manque plus grand chose Passons maintenant à l'eau VI. L'eau: Water Ici, nous allons mettre de l'eau sur la map. C'est très simple. Vous avez juste à colorier dans le creux à l'endroit où il doit y avoir de l'eau. Comment mettre de l'eau sur sa map ? Map Converter me dit que mon Water doit faire 256x256. Je crée un fichier puis j'importe mon Height CH1/Height CH2 en fonction de votre relief (Voir plus haut). Je réduis le height en 256x256. Voici les couleurs: Où il n'y a pas d'eau: ffffff Où il y a de l'eau: 004da8 Tout simple Bientôt, je ferai un truc un peu plus poussé pour le water. Voilà, une bonne partie de faite. On va dire que vous avez les principales images pour faire une map, côté client bien sûr. VII. Placement d'objet Pour placer des objets, il faut télécharger deux choses: In Game Place Oject Editor: [Contenu Masqué] Les objets des Files 2012 (Supprimer le dossier map_object_editor, et mettez le nouveau): [Contenu Masqué] Merci à Galet pour la vidéo présentation ! Placer des objets In Game Vous mettez le contenu de l'archive à la racine de votre client. Une fois cela fait, lancez votre client puis WinJect.exe, c'est ce que vous avez rajoutez dans votre dossier à l'instant. Dans Target Process, vous prenez metin2.bin qui se trouve dans votre client et dans DLL to Inject, vous prenez m2PythonLoader.dll, qui se trouve aussi à la racine de votre client. Vous faites Inject et ça va vous ouvrir Metin2PythonLoader, là vous choisissez mapeditor.py. N'appuyez sur le bouton Run que lorsque votre personnage est connecté dans le jeu ! Une fois fini, cliquez sur Export, ce qui va être enregistré dans le dossier mytestmap, à la racine de votre disque dur. Vous aurez le nombre de dossier que comporte votre map. Donc il suffit de faire glisser fichier par fichier dans le dossier correspondant (Je sais c'est chiant) CONSEIL: Enregistrez de temps en temps votre travail, car il en faut peu pour que ce logiciel crash et perdre tout votre travail ... Petite partie mais quelque chose de très intéressant. N'oubliez pas d'exporter plusieurs fois pour ne pas perdre vos données. VIII. La mini-carte Certains connaissent la solution, d'autres pas. On dit qu'il faut faire des screens de très haut et de les empiler. Mais le problème, c'est comment on peut savoir la limite du carré ? Avec ce tutoriel, vous allez voir, ça va devenir simple Créer une Minimap Vous allez tout simplement créer une map 1x1 avec comme seul dossier, le premier dossier de votre map (Vous pouvez voir toutes les dimensions sur MapConverter). Le mieux, ce serait d'avoir le logiciel que j'ai donné plus haut pour le zoom infini. Donc IG, vous faites un screen de votre carré, puis vous l'enregistrez sur le Bureau. Vous faites de même avec tous les autres carrés puis sous Photoshop, vous avez plus qu'à empiler vos screens et ça vous fait une minimap Il ne suffit pas d'avoir mis la minimap dans le dossier de la map pour la voir IG, il faut aussi qu'elle soit dans le fichier etc. IX. Les ombres Les ombres sont quelque chose de facultatif et ne détruisent pas une map si elle n'en a pas. C'est juste un poil plus joli. Même aujourd'hui, les ombres sont quelque chose qui reste relativement difficile à faire. Je vais commencer par vous donner une solution plus ou moins difficile. L'autre, je la mettrais plus tard car elle n'est pas encore au point. Créer des ombres Vous avez votre mini-carte ? Bah alors il suffit de créer votre fichier shadowmap puis d'importer le minimap. Important: Il faut savoir qu'il y a trois images shadowmap, il faut donc faire la même chose sur les trois sachant que chacune, à un fond de couleur différente. Soit vous faites un truc relativement simple, vous faites bêtement une ombre derrière chaque bâtiment (Vu que vous avez les bâtiments sur la minimap). C'est déjà pas mal du tout, mêmes les joueurs ne s'en rendront même pas compte Ou alors, vous exportez chaque ombre d'un shadowmap d'une map puis vous la mettez derrière le bâtiment que vous souhaitez sur votre shadowmap Très bien pour les bâtiments existant mais pas pour les nouveaux. Bientôt, je ferais une partie pour dessiner correctement son ombre X. Le Setting Le Setting est un fichier indispensable pour votre map. Sans ça vous ne pourrez pas vous téléporter sur votre map. Créer un Setting.txt Le mieux quand on veut faire un setting.txt, c'est de prendre un déjà existant et de le modifier. Voilà à quoi ressemble un Setting: On va faire simple, je vais dire que ce que l'on peut modifier. Les lignes que je n'ai pas cité, laissez-les dormir: HeightScale: Vous avez une map avec des montagnes qui font 3 km de hauteur ? Alors changez la valeur de cette ligne. Par exemple, sur le screen, j'ai baissé le relief en mettant 0.0003. Vous pouvez aussi le monter. L'avantage est donc de ne pas avoir à re-modifier le height pour baisser toutes les montagnes. Map Size: La taille de votre map. Dans mon cas, c'est 2x2. Base Position: La position de la map parmi tant d'autres. Beaucoup ont des problèmes pour la choisir. Donc téléchargez une map sur Internet puis prenez leur BasePosition ou créez les vôtres TextureSet: La texture que la map doit utiliser. Vous pouvez toutes les trouver dans le fichier textureset. Environment: C'est le ciel de la map. Je ne suis pas là pour vous apprendre à faire un ciel. Il suffit de prendre celui d'une autre map. Vous y êtes presque, allez. C'est parti pour la dernière étape. XI. Implanter sa map Vous savez tous implanter une map quand vous avez les bons fichiers, mais quand vous ne les avez pas, vous faites quoi ?Les fichiers côté serveur Vous avez tout ce qu'il faut pour le côté client maintenant pour le côté serveur il faut au moins: Le setting: vous savez tous ce que c'est. Le Town.txt: C'est le fichier qui définit le point de respawn. Vous devez seulement ajouter les coordonnées dedans Le server_attr: Je ferais une partie pour faire son propre server_attr mais vous pouvez pendre celui d'une autre map de même taille, ce qui suffit amplement. Si vous avez ça, vous pouvez implanter votre map Je pense faire un server_attr pour chaque map jusqu'à 6x6. Il est inutile pour moi, de faire un server_attr pour sa map. Autant dire au server_attr de marcher partout vu que l'Attribute bloque déjà les zones. XII. Conclusion Et voilà, mon tutoriel est fini =D Enfin, vous avez tout ce qu'il faut pour faire une map. Je rajouterai des choses plus tard comme je vous l'ai dit en haut. Ce tutoriel m'a pris énormément de temps à le faire. J'ai commencé il y a trois 3 jours et j'ai passé toute l'après-midi dessus. J'accepte toutes sortes de critique tant que c'est courtois. Si vous avez vu des fautes, des erreurs ou vous voulez me demander de modifier quelque chose pour que le tutoriel soit plus lisible, n'hésitez pas à le faire Cordialement Calypso --- Download
  19. 1 point
    Bonjour à tous, Naviguant sur divers forum, j'ai trouvé l'interface Illumina codée par "Robert". Cette interface, designée par King Sora, a été adaptée et codée par Robert ( du moins c'est un code qu'il nous propose, je pense qu'il existe bien d'autre façon de la coder ou autre ). L'ayant essayée, elle est fonctionnelle, mais il y a quelques détails à régler ou quelques petits défauts, mais rien de bien grave. Voici un aperçu de son design: Implantation: ( je vous conseille de faire une sauvegarde de votre client avant d'essayer d'implanter cette interface ) -Etape 1: Commencez par télécharger cette archive: Illumina Interface Lien FE Mettez la dans le dossier "pack" de votre client. Ouvrez le fichier "Index" présent dans "pack", à la fin de celui-ci, ajoutez: * illumina_robert - Etape 2: Là on va s'attaquer aux codes à mettre dans vos différents fichiers. Dépackez alors " Root " et "Uiscript ". Avant de commencer, faites très attention aux Tabulations /!\ Une seule erreur et votre client pourrait ne plus fonctionner ou ne plus se lancer Si c'est le cas, recommencez et vérifiez avant de poster dans A/Q/S, parfois il suffit de pas grand chose ! Je vais numéroter les parties à coder: I. BOARD: Root -> ui.py Cherchez: class Board(Window): Remplacez ceci: class Board(Window): CORNER_WIDTH = 32 CORNER_HEIGHT = 32 LINE_WIDTH = 128 LINE_HEIGHT = 128 LT = 0 LB = 1 RT = 2 RB = 3 L = 0 R = 1 T = 2 B = 3 def __init__(self): Window.__init__(self) self.MakeBoard("d:/ymir work/ui/pattern/Board_Corner_", "d:/ymir work/ui/pattern/Board_Line_") self.MakeBase() def MakeBoard(self, cornerPath, linePath, decorPath): CornerFileNames = [ cornerPath+dir+".tga" for dir in ("LeftTop", "LeftBottom", "RightTop", "RightBottom", ) ] LineFileNames = [ linePath+dir+".tga" for dir in ("Left", "Right", "Top", "Bottom", ) ] self.Corners = [] for fileName in CornerFileNames: Corner = ExpandedImageBox() Corner.AddFlag("not_pick") Corner.LoadImage(fileName) Corner.SetParent(self) Corner.SetPosition(0, 0) Corner.Show() self.Corners.append(Corner) self.Lines = [] for fileName in LineFileNames: Line = ExpandedImageBox() Line.AddFlag("not_pick") Line.LoadImage(fileName) Line.SetParent(self) Line.SetPosition(0, 0) Line.Show() self.Lines.append(Line) self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT) self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0) def MakeBase(self): self.Base = ExpandedImageBox() self.Base.AddFlag("not_pick") self.Base.LoadImage("d:/ymir work/ui/pattern/Board_Base.tga") self.Base.SetParent(self) self.Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Base.Show() def __del__(self): Window.__del__(self) def SetSize(self, width, height): width = max(self.CORNER_WIDTH*2, width) height = max(self.CORNER_HEIGHT*2, height) Window.SetSize(self, width, height) self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT) self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0) self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) if self.Base: self.Base.SetRenderingRect(0, 0, horizontalShowingPercentage, verticalShowingPercentage) Par ceci: class Board(Window): CORNER_WIDTH = 55 CORNER_HEIGHT = 55 LINE_WIDTH = 128 LINE_HEIGHT = 128 UT = 0 UB = 1 UR = 2 UL = 3 ULT = 0 ULB = 1 URT = 2 URB = 3 D = 0 LT = 0 LB = 1 RT = 2 RB = 3 L = 0 R = 1 T = 2 B = 3 def __init__(self): Window.__init__(self) self.MakeBoard("kanort_work/images/controls/common/board/shadow_bar_", "kanort_work/images/controls/common/board/shadow_corner_", "kanort_work/images/controls/common/board/corner_", "kanort_work/images/controls/common/board/bar_", "kanort_work/images/controls/common/board/decoration_" ) self.MakeBase() self.MakeShadow() def MakeBoard(self, shadowbarPath, shadowcornerPath, cornerPath, linePath, decorPath): ShadowbarFileNames = [ shadowbarPath+dir+".tga" for dir in ("top", "bottom", "right", "left", ) ] ShadowcornerFileNames = [ shadowcornerPath+dir+".tga" for dir in ("lefttop", "leftbottom", "righttop", "rightbottom", ) ] CornerFileNames = [ cornerPath+dir+".tga" for dir in ("lefttop", "leftbottom", "righttop", "rightbottom", ) ] LineFileNames = [ linePath+dir+".tga" for dir in ("left", "right", "top", "bottom", ) ] DecorFileNames = [ decorPath+dir+".tga" for dir in ("leftbottom", ) ] self.Shadowbar = [] for fileName in ShadowbarFileNames: Shadowbar = ExpandedImageBox() Shadowbar.AddFlag("not_pick") Shadowbar.LoadImage(fileName) Shadowbar.SetParent(self) Shadowbar.SetPosition(0, 0) Shadowbar.Show() self.Shadowbar.append(Shadowbar) self.Shadowcorner = [] for fileName in ShadowcornerFileNames: Shadowcorner = ExpandedImageBox() Shadowcorner.AddFlag("not_pick") Shadowcorner.LoadImage(fileName) Shadowcorner.SetParent(self) Shadowcorner.SetPosition(0, 0) Shadowcorner.Show() self.Shadowcorner.append(Shadowcorner) self.Corners = [] for fileName in CornerFileNames: Corner = ExpandedImageBox() Corner.AddFlag("not_pick") Corner.LoadImage(fileName) Corner.SetParent(self) Corner.SetPosition(0, 0) Corner.Show() self.Corners.append(Corner) self.Lines = [] for fileName in LineFileNames: Line = ExpandedImageBox() Line.AddFlag("not_pick") Line.LoadImage(fileName) Line.SetParent(self) Line.SetPosition(0, 0) Line.Show() self.Lines.append(Line) self.Decor = [] for fileName in DecorFileNames: Decor = ExpandedImageBox() Decor.AddFlag("not_pick") Decor.LoadImage(fileName) Decor.SetParent(self) Decor.SetPosition(0, 0) Decor.Show() self.Decor.append(Decor) self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT) self.Shadowbar[self.UL].SetPosition(-18, self.CORNER_HEIGHT) self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0) self.Shadowbar[self.UT].SetPosition(self.CORNER_WIDTH, -18) def MakeBase(self): self.Base = ExpandedImageBox() self.Base.AddFlag("not_pick") self.Base.LoadImage("kanort_work/images/controls/common/board/fill.tga") self.Base.SetParent(self) self.Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Base.Show() def MakeShadow(self): self.Shadow = ExpandedImageBox() self.Shadow.AddFlag("not_pick") self.Shadow.LoadImage("kanort_work/images/controls/common/board/shadow_fill.tga") self.Shadow.SetParent(self) self.Shadow.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Shadow.Show() def __del__(self): Window.__del__(self) def SetSize(self, width, height): width = max(self.CORNER_WIDTH*2, width) height = max(self.CORNER_HEIGHT*2, height) Window.SetSize(self, width, height) self.Shadowcorner[self.ULT].SetPosition(-18,-18) self.Shadowcorner[self.ULB].SetPosition(-18, height - self.CORNER_HEIGHT) self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT) self.Shadowcorner[self.URT].SetPosition(width - self.CORNER_WIDTH, -18) self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0) self.Shadowcorner[self.URB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Decor[self.D].SetPosition(0 - 5, height - self.CORNER_HEIGHT) self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Shadowbar[self.UR].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) self.Shadowbar[self.UB].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Shadowbar[self.UL].SetRenderingRect(0, 0, 0, height - self.CORNER_HEIGHT*2 - 1) self.Shadowbar[self.UR].SetRenderingRect(0, 0, 0, height - self.CORNER_HEIGHT*2 - 1) self.Shadowbar[self.UT].SetRenderingRect(0, 0, width - self.CORNER_WIDTH*2 - 1, 0) self.Shadowbar[self.UB].SetRenderingRect(0, 0, width - self.CORNER_WIDTH*2 - 1, 0) if self.Base: self.Base.SetRenderingRect(0, 0, horizontalShowingPercentage, verticalShowingPercentage) if self.Shadow: self.Shadow.SetRenderingRect(0, 0, horizontalShowingPercentage, verticalShowingPercentage) II. THINBOARD: Root -> ui.py Cherchez : class ThinBoard(Window): Remplacez ceci: class ThinBoard(Window): CORNER_WIDTH = 16 CORNER_HEIGHT = 16 LINE_WIDTH = 16 LINE_HEIGHT = 16 BOARD_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.51) LT = 0 LB = 1 RT = 2 RB = 3 L = 0 R = 1 T = 2 B = 3 def __init__(self, layer = "UI"): Window.__init__(self, layer) CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ] LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ] self.Corners = [] for fileName in CornerFileNames: Corner = ExpandedImageBox() Corner.AddFlag("attach") Corner.AddFlag("not_pick") Corner.LoadImage(fileName) Corner.SetParent(self) Corner.SetPosition(0, 0) Corner.Show() self.Corners.append(Corner) self.Lines = [] for fileName in LineFileNames: Line = ExpandedImageBox() Line.AddFlag("attach") Line.AddFlag("not_pick") Line.LoadImage(fileName) Line.SetParent(self) Line.SetPosition(0, 0) Line.Show() self.Lines.append(Line) Base = Bar() Base.SetParent(self) Base.AddFlag("attach") Base.AddFlag("not_pick") Base.SetColor(self.BOARD_COLOR) Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT) Base.Show() self.Base = Base self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT) self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0) def __del__(self): Window.__del__(self) def SetSize(self, width, height): width = max(self.CORNER_WIDTH*2, width) height = max(self.CORNER_HEIGHT*2, height) Window.SetSize(self, width, height) self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT) self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0) self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) if self.Base: self.Base.SetSize(width - self.CORNER_WIDTH*2, height - self.CORNER_HEIGHT*2) def ShowInternal(self): self.Base.Show() for wnd in self.Lines: wnd.Show() for wnd in self.Corners: wnd.Show() def HideInternal(self): self.Base.Hide() for wnd in self.Lines: wnd.Hide() for wnd in self.Corners: wnd.Hide() Par ceci: class ThinBoard(Window): CORNER_WIDTH = 21 CORNER_HEIGHT = 21 LINE_WIDTH = 21 LINE_HEIGHT = 21 UL = 0 UR = 1 UT = 2 UB = 3 ULT = 0 ULB = 1 URT = 2 URB = 3 LT = 0 LB = 1 RT = 2 RB = 3 L = 0 R = 1 T = 2 B = 3 def __init__(self, layer = "UI"): Window.__init__(self, layer) ShadowbarFileNames = [ "kanort_work/images/controls/common/thinboard_transparent/shadow_bar_"+dir+".tga" for dir in ["left","right","top","bottom"] ] ShadowcornerFileNames = [ "kanort_work/images/controls/common/thinboard_transparent/shadow_corner_"+dir+".tga" for dir in ["lefttop","leftbottom","righttop","rightbottom"] ] CornerFileNames = [ "kanort_work/images/controls/common/thinboard_transparent/corner_"+dir+".tga" for dir in ["lefttop","leftbottom","righttop","rightbottom"] ] LineFileNames = [ "kanort_work/images/controls/common/thinboard_transparent/bar_"+dir+".tga" for dir in ["left","right","top","bottom"] ] self.Shadowbars = [] for fileName in ShadowbarFileNames: Shadowbar = ExpandedImageBox() Shadowbar.AddFlag("attach") Shadowbar.AddFlag("not_pick") Shadowbar.LoadImage(fileName) Shadowbar.SetParent(self) Shadowbar.SetPosition(0, 0) Shadowbar.Show() self.Shadowbars.append(Shadowbar) self.Shadowcorners = [] for fileName in ShadowcornerFileNames: Shadowcorner = ExpandedImageBox() Shadowcorner.AddFlag("attach") Shadowcorner.AddFlag("not_pick") Shadowcorner.LoadImage(fileName) Shadowcorner.SetParent(self) Shadowcorner.SetPosition(0, 0) Shadowcorner.Show() self.Shadowcorners.append(Shadowcorner) self.Corners = [] for fileName in CornerFileNames: Corner = ExpandedImageBox() Corner.AddFlag("attach") Corner.AddFlag("not_pick") Corner.LoadImage(fileName) Corner.SetParent(self) Corner.SetPosition(0, 0) Corner.Show() self.Corners.append(Corner) self.Lines = [] for fileName in LineFileNames: Line = ExpandedImageBox() Line.AddFlag("attach") Line.AddFlag("not_pick") Line.LoadImage(fileName) Line.SetParent(self) Line.SetPosition(0, 0) Line.Show() self.Lines.append(Line) Base = ExpandedImageBox() Base.SetParent(self) Base.AddFlag("attach") Base.AddFlag("not_pick") Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT) Base.LoadImage("kanort_work/images/controls/common/thinboard_transparent/fill.tga") Base.Show() self.Base = Base self.Shadowbars[self.UL].SetPosition(-11, self.CORNER_HEIGHT) self.Shadowbars[self.UT].SetPosition(self.CORNER_WIDTH, -11) self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT) self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0) def __del__(self): Window.__del__(self) def SetSize(self, width, height): width = max(self.CORNER_WIDTH*2, width) height = max(self.CORNER_HEIGHT*2, height) Window.SetSize(self, width, height) self.Shadowcorners[self.ULT].SetPosition(-11, -11) self.Shadowcorners[self.ULB].SetPosition(-11, height - self.CORNER_HEIGHT) self.Shadowcorners[self.URT].SetPosition(width - self.CORNER_WIDTH, -11) self.Shadowcorners[self.URB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Shadowbars[self.UR].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Shadowbars[self.UB].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT) self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0) self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Base.SetRenderingRect(0, 0, width - self.CORNER_WIDTH*2 - 1, height - self.CORNER_HEIGHT*2 - 1) self.Shadowbars[self.UT].SetRenderingRect(0, 0, width - self.CORNER_WIDTH*2 - 1, 0) self.Shadowbars[self.UB].SetRenderingRect(0, 0, width - self.CORNER_WIDTH*2 - 1, 0) self.Shadowbars[self.UR].SetRenderingRect(0, 0, 0, height - self.CORNER_HEIGHT*2 - 1) self.Shadowbars[self.UL].SetRenderingRect(0, 0, 0, height - self.CORNER_HEIGHT*2 - 1) def ShowInternal(self): self.Base.Show() for wnd in self.Lines: wnd.Show() for wnd in self.Corners: wnd.Show() for wnd in self.Shadowbars: wnd.Show() for wnd in self.Shadowcorners: wnd.Show() def HideInternal(self): self.Base.Hide() for wnd in self.Lines: wnd.Hide() for wnd in self.Corners: wnd.Hide() for wnd in self.Shadowbars: wnd.Hide() for wnd in self.Shadowcorners: wnd.Hide() III. BOARD WITH TITLEBAR: Root -> ui.py Cherchez: class BoardWithTitleBar(Board): Remplacez ce code: class BoardWithTitleBar(Board): def __init__(self): Board.__init__(self) titleBar = TitleBar() titleBar.SetParent(self) titleBar.MakeTitleBar(0, "red") titleBar.SetPosition(8, 7) titleBar.Show() titleName = TextLine() titleName.SetParent(titleBar) titleName.SetPosition(0, 4) titleName.SetWindowHorizontalAlignCenter() titleName.SetHorizontalAlignCenter() titleName.Show() self.titleBar = titleBar self.titleName = titleName self.SetCloseEvent(self.Hide) def __del__(self): Board.__del__(self) self.titleBar = None self.titleName = None def SetSize(self, width, height): self.titleBar.SetWidth(width - 15) #self.pickRestrictWindow.SetSize(width, height - 30) Board.SetSize(self, width, height) self.titleName.UpdateRect() def SetTitleColor(self, color): self.titleName.SetPackedFontColor(color) def SetTitleName(self, name): self.titleName.SetText(name) def SetCloseEvent(self, event): self.titleBar.SetCloseEvent(event) Par ceci: class BoardWithTitleBar(Board): def __init__(self): Board.__init__(self) titleBar = TitleBar() titleBar.SetParent(self) titleBar.MakeTitleBar(0, "red") titleBar.SetPosition(8, 7) titleBar.Show() titleName = TextLine() titleName.SetParent(titleBar) titleName.SetPosition(0, 8) titleName.SetWindowHorizontalAlignCenter() titleName.SetHorizontalAlignCenter() titleName.SetFontColor(0.9020, 0.8157, 0.6353) titleName.Show() self.titleBar = titleBar self.titleName = titleName self.SetCloseEvent(self.Hide) def __del__(self): Board.__del__(self) self.titleBar = None self.titleName = None def SetSize(self, width, height): self.titleBar.SetWidth(width - 18) Board.SetSize(self, width, height) self.titleName.UpdateRect() def SetTitleColor(self, color): self.titleName.SetPackedFontColor(color) def SetTitleName(self, name): self.titleName.SetText(name) def SetCloseEvent(self, event): self.titleBar.SetCloseEvent(event) IV. TitleBar: Root -> ui.py Cherchez ceci: class TitleBar(Window): Remplacez ceci: class TitleBar(Window): BLOCK_WIDTH = 35 BLOCK_HEIGHT = 28 def __init__(self): Window.__init__(self) self.AddFlag("attach") def __del__(self): Window.__del__(self) def MakeTitleBar(self, width, color): ## 현재 Color는 사용하고 있지 않음 width = max(self.BLOCK_WIDTH*2, width) imgLeft = ImageBox() imgCenter = ExpandedImageBox() imgRight = ImageBox() imgDecor = ImageBox() imgLeft.AddFlag("not_pick") imgCenter.AddFlag("not_pick") imgRight.AddFlag("not_pick") imgDecor.AddFlag("not_pick") imgLeft.SetParent(self) imgCenter.SetParent(self) imgRight.SetParent(self) imgDecor.SetParent(self) if localeInfo.IsARABIC(): imgLeft.LoadImage("locale/ae/ui/pattern/titlebar_left.tga") imgCenter.LoadImage("locale/ae/ui/pattern/titlebar_center.tga") imgRight.LoadImage("locale/ae/ui/pattern/titlebar_right.tga") else: imgLeft.LoadImage("d:/ymir work/control/altele/titlu/stanga.tga") imgCenter.LoadImage("d:/ymir work/control/altele/titlu/centru.tga") imgRight.LoadImage("d:/ymir work/control/altele/titlu/dreapta.tga") imgDecor.LoadImage("d:/ymir work/control/altele/titlu/decor_dreapta.tga") imgLeft.Show() imgCenter.Show() imgRight.Show() imgDecor.Show() btnClose = Button() btnClose.SetParent(self) btnClose.SetUpVisual("d:/ymir work/control/altele/buton/board_inchide_01.tga") btnClose.SetOverVisual("d:/ymir work/control/altele/buton/board_inchide_02.tga") btnClose.SetDownVisual("d:/ymir work/control/altele/buton/board_inchide_03.tga") btnClose.SetToolTipText(localeInfo.UI_CLOSE, 0, -23) btnClose.Show() self.imgLeft = imgLeft self.imgCenter = imgCenter self.imgRight = imgRight self.btnClose = btnClose self.imgDecor = imgDecor self.SetWidth(width) def SetWidth(self, width): self.imgLeft.SetPosition(0, 4) self.imgCenter.SetRenderingRect(0, 0, float((width - self.BLOCK_WIDTH*4) - self.BLOCK_WIDTH) / self.BLOCK_WIDTH, 0) self.imgCenter.SetPosition(self.BLOCK_WIDTH, 4) self.imgRight.SetPosition(width - self.BLOCK_WIDTH, 4) self.imgDecor.SetPosition(width - 47, -14) if localeInfo.IsARABIC(): self.btnClose.SetPosition(0, 0) else: self.btnClose.SetPosition(width - self.btnClose.GetWidth(), 1) self.SetSize(width, self.BLOCK_HEIGHT) def SetCloseEvent(self, event): self.btnClose.SetEvent(event) Par ceci: class TitleBar(Window): BLOCK_WIDTH = 35 BLOCK_HEIGHT = 28 LINE_WIDTH = 152 def __init__(self): Window.__init__(self) self.AddFlag("attach") def __del__(self): Window.__del__(self) def MakeTitleBar(self, width, color): width = max(self.BLOCK_WIDTH*2, width) imgLeft = ImageBox() imgCenter = ExpandedImageBox() imgRight = ImageBox() imgDecor = ImageBox() imgLeft.AddFlag("not_pick") imgCenter.AddFlag("not_pick") imgRight.AddFlag("not_pick") imgDecor.AddFlag("not_pick") imgLeft.SetParent(self) imgCenter.SetParent(self) imgRight.SetParent(self) imgDecor.SetParent(self) imgLeft.LoadImage("kanort_work/images/controls/common/titlebar/left.tga") imgCenter.LoadImage("kanort_work/images/controls/common/titlebar/center.tga") imgRight.LoadImage("kanort_work/images/controls/common/titlebar/right.tga") imgDecor.LoadImage("kanort_work/images/controls/common/titlebar/decoration_right.tga") imgLeft.Show() imgCenter.Show() imgRight.Show() imgDecor.Show() btnClose = Button() btnClose.SetParent(self) btnClose.SetUpVisual("kanort_work/images/controls/common/buton/board_close_01_normal.tga") btnClose.SetOverVisual("kanort_work/images/controls/common/buton/board_close_02_hover.tga") btnClose.SetDownVisual("kanort_work/images/controls/common/buton/board_close_03_active.tga") btnClose.SetToolTipText(localeInfo.UI_CLOSE, 0, -23) btnClose.Show() self.imgLeft = imgLeft self.imgCenter = imgCenter self.imgRight = imgRight self.btnClose = btnClose self.imgDecor = imgDecor self.SetWidth(width) def SetWidth(self, width): self.imgLeft.SetPosition(0, 3) self.imgCenter.SetRenderingRect(0.0, 0.0, float((width - self.BLOCK_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH, 0.0) self.imgCenter.SetPosition(self.BLOCK_WIDTH, 3) self.imgRight.SetPosition(width - self.BLOCK_WIDTH, 3) self.btnClose.SetPosition(width - self.btnClose.GetWidth(), 3) self.imgDecor.SetPosition(width - 47, -15) self.SetSize(width, self.BLOCK_HEIGHT) def SetCloseEvent(self, event): self.btnClose.SetEvent(event) A. Quest Icon: Root -> local.py ou localinfo.py selon vos versions de files Cherchez ceci: def GetLetterImageName(): return "season1/icon/scroll_close.tga" def GetLetterOpenImageName(): return "season1/icon/scroll_open.tga" def GetLetterCloseImageName(): return "season1/icon/scroll_close.tga" Remplacez les lignes du dessus par ceci: def GetLetterImageName(): return "kanort_work/images/icons/special/quest_closed.tga" def GetLetterOpenImageName(): return "kanort_work/images/icons/special/quest_open.tga" def GetLetterCloseImageName(): return "kanort_work/images/icons/special/quest_closed.tga" B. " Plus " Button : uiscript -> gamewindow.py Cherchez: import uiScriptLocale En dessous de cette ligne ajoutez: ROBERT_WORK_F = "kanort_work/images/controls/common/buton/" ---- Cherchez: "name":"HelpButton", En dessous vous trouverez: "default_image" : "d:/ymir work/ui/game/windows/btn_bigplus_up.sub", "over_image" : "d:/ymir work/ui/game/windows/btn_bigplus_over.sub", "down_image" : "d:/ymir work/ui/game/windows/btn_bigplus_down.sub", Changez ces lignes du dessous par celles-ci: "default_image" : ROBERT_WORK_F + "stats_increase_01_normal.tga", "over_image" : ROBERT_WORK_F + "stats_increase_02_hover.tga", "down_image" : ROBERT_WORK_F + "stats_increase_03_active.tga", Cherchez: "name":"StatusPlusButton", Vous trouverez en dessous: "default_image" : "d:/ymir work/ui/game/windows/btn_bigplus_up.sub", "over_image" : "d:/ymir work/ui/game/windows/btn_bigplus_over.sub", "down_image" : "d:/ymir work/ui/game/windows/btn_bigplus_down.sub", Changez ces lignes par: "default_image" : ROBERT_WORK_F + "stats_increase_01_normal.tga", "over_image" : ROBERT_WORK_F + "stats_increase_02_hover.tga", "down_image" : ROBERT_WORK_F + "stats_increase_03_active.tga", Cherchez: "name":"SkillPlusButton", En dessous vous trouverez: "default_image" : "d:/ymir work/ui/game/windows/btn_bigplus_up.sub", "over_image" : "d:/ymir work/ui/game/windows/btn_bigplus_over.sub", "down_image" : "d:/ymir work/ui/game/windows/btn_bigplus_down.sub", Changez ces lignes par: "default_image" : ROBERT_WORK_F + "stats_increase_01_normal.tga", "over_image" : ROBERT_WORK_F + "stats_increase_02_hover.tga", "down_image" : ROBERT_WORK_F + "stats_increase_03_active.tga", C. Emoticon icon: root -> emoticon.py Cherchez et remplacez ceci: ICON_DICT = { EMOTION_CLAP : "d:/ymir work/ui/game/windows/emotion_clap.sub", EMOTION_CHEERS_1 : "d:/ymir work/ui/game/windows/emotion_cheers_1.sub", EMOTION_CHEERS_2 : "d:/ymir work/ui/game/windows/emotion_cheers_2.sub", EMOTION_DANCE_1 : "icon/action/dance1.tga", EMOTION_DANCE_2 : "icon/action/dance2.tga", EMOTION_CONGRATULATION : "icon/action/congratulation.tga", EMOTION_FORGIVE : "icon/action/forgive.tga", EMOTION_ANGRY : "icon/action/angry.tga", EMOTION_ATTRACTIVE : "icon/action/attractive.tga", EMOTION_SAD : "icon/action/sad.tga", EMOTION_SHY : "icon/action/shy.tga", EMOTION_CHEERUP : "icon/action/cheerup.tga", EMOTION_BANTER : "icon/action/banter.tga", EMOTION_JOY : "icon/action/joy.tga", EMOTION_DANCE_1 : "icon/action/dance1.tga", EMOTION_DANCE_2 : "icon/action/dance2.tga", EMOTION_DANCE_3 : "icon/action/dance3.tga", EMOTION_DANCE_4 : "icon/action/dance4.tga", EMOTION_DANCE_5 : "icon/action/dance5.tga", EMOTION_DANCE_6 : "icon/action/dance6.tga", EMOTION_KISS : "d:/ymir work/ui/game/windows/emotion_kiss.sub", EMOTION_FRENCH_KISS : "d:/ymir work/ui/game/windows/emotion_french_kiss.sub", EMOTION_SLAP : "d:/ymir work/ui/game/windows/emotion_slap.sub", } Par ceci: ICON_DICT = { EMOTION_CLAP : "kanort_work/images/icons/aplauze.tga", EMOTION_CHEERS_1 : "kanort_work/images/icons/bucurie1.tga", EMOTION_CHEERS_2 : "kanort_work/images/icons/bucurie2.tga", EMOTION_CONGRATULATION : "kanort_work/images/icons/acord.tga", EMOTION_FORGIVE : "kanort_work/images/icons/iertare.tga", EMOTION_ANGRY : "kanort_work/images/icons/neplacut.tga", EMOTION_ATTRACTIVE : "kanort_work/images/icons/tentatie.tga", EMOTION_SAD : "kanort_work/images/icons/trist.tga", EMOTION_SHY : "kanort_work/images/icons/refuz.tga", EMOTION_CHEERUP : "kanort_work/images/icons/bucuros.tga", EMOTION_BANTER : "kanort_work/images/icons/rautacios.tga", EMOTION_JOY : "kanort_work/images/icons/fericire.tga", EMOTION_DANCE_1 : "kanort_work/images/icons/dans1.tga", EMOTION_DANCE_2 : "kanort_work/images/icons/dans2.tga", EMOTION_DANCE_3 : "kanort_work/images/icons/dans3.tga", EMOTION_DANCE_4 : "kanort_work/images/icons/dans4.tga", EMOTION_DANCE_5 : "kanort_work/images/icons/dans5.tga", EMOTION_DANCE_6 : "kanort_work/images/icons/dans6.tga", EMOTION_KISS : "kanort_work/images/icons/sarut.tga", EMOTION_FRENCH_KISS : "kanort_work/images/icons/sarutfr.tga", EMOTION_SLAP : "kanort_work/images/icons/lovitura.tga", } V. CostumeWindow: uiscript -> costumewindow.py Remplacez TOUT le code présent dans costumewindow.py par celui-ci: import uiScriptLocale import item COSTUME_START_INDEX = item.COSTUME_SLOT_START window = { "name" : "CostumeWindow", "x" : SCREEN_WIDTH - 175 - 147, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 147, "height" : 188, "children" : ( { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 147, "height" : 188, "children" : ( { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 8, "y" : 7, "width" : 131, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x":60, "y":7, "r" : 0.9020, "g": 0.8157, "b" : 0.6353, "a" : 1.0, "text":uiScriptLocale.COSTUME_WINDOW_TITLE, "text_horizontal_align":"center" }, ), }, { "name" : "Costume_Base", "type" : "image", "x" : 14, "y" : 38, "image" : "d:/ymir work/ui/costume_bg.dds", "children" : ( { "name" : "CostumeSlot", "type" : "slot", "x" : 3, "y" : 3, "width" : 127, "height" : 145, "slot" : ( {"index":COSTUME_START_INDEX+0, "x":50, "y":42, "width":32, "height":64}, {"index":COSTUME_START_INDEX+1, "x":50, "y": 5, "width":32, "height":32}, {"index":COSTUME_START_INDEX+4, "x":10, "y":10, "width":32, "height":96}, ), }, ), }, ), }, ), } VI. CostumeWindow: root -> uiinventory.py Cherchez: import grp Ajoutez juste en dessous ceci: import playerSettingModule Cherchez ITEM_FLAG_APPLICABLE = 1 << 14 Ajoutez en dessous de ceci ce code: ROBERT_WORK_BG_IMG_COSTUME = { playerSettingModule.RACE_WARRIOR_M : "kanort_work/images/controls/special/inventory/costume_m.tga", playerSettingModule.RACE_WARRIOR_W : "kanort_work/images/controls/special/inventory/costume_w.tga", playerSettingModule.RACE_ASSASSIN_M : "kanort_work/images/controls/special/inventory/costume_m.tga", playerSettingModule.RACE_ASSASSIN_W : "kanort_work/images/controls/special/inventory/costume_w.tga", playerSettingModule.RACE_SURA_M : "kanort_work/images/controls/special/inventory/costume_m.tga", playerSettingModule.RACE_SURA_W : "kanort_work/images/controls/special/inventory/costume_w.tga", playerSettingModule.RACE_SHAMAN_M : "kanort_work/images/controls/special/inventory/costume_m.tga", playerSettingModule.RACE_SHAMAN_W : "kanort_work/images/controls/special/inventory/costume_w.tga", playerSettingModule.RACE_WOLFMAN_M : "kanort_work/images/controls/special/inventory/costume_m.tga", } Cherchez: def RefreshCostumeSlot(self): getItemVNum=player.GetItemIndex Ajoutez en dessous de ce code ceci: race = net.GetMainActorRace() ## BackgroundImage try: BackGroundImageName = ROBERT_WORK_BG_IMG_COSTUME[race] try: self.BackGroundImage.LoadImage(BackGroundImageName) except: self.BackGroundImage.Hide() except KeyError: self.BackGroundImage.Hide() Cherchez: wndEquip = self.GetChild("CostumeSlot") Et ajoutez en dessous de ce code ceci: self.BackGroundImage = self.GetChild("Costume_Base") Vous n'avez maintenant qu'à repack root et uiscript et les mettre où il faut ! L'implantation est terminée. Je rappelle qu'il faut faire très attention aux TABS ! Le travail n'a nullement été produis ou effectué par moi ( voir sources ci-dessous ), je n'ai fait que traduire un tutoriel trouvé sur epvp, afin que celui-ci vous soit partagé et disponible pour vous ! Les remerciements ne sont donc pas à faire pour moi, mais aux créateurs de ceci: Sources: - Design par King Sora - Codé par Robert - Tutoriel et adapté, trouvé sur epvp
  20. 1 point
    Bonjours je vous release encore une fois mon tools qui avait disparus apparemment , pour rappelle il sert a sniffer les apparence ID des items dofus 2.0 , inutile si vous n'êtes pas développeur. DL ICI --- Download
  21. 1 point
    Bonsoir, Une petite trouvaille sur epvp. Une page d'accueil que j'ai traduit, pour l'installer tout est indiqué dans l'index.html. Bon courage. Cordialement. --- Download
  22. 1 point
    Niveau requis : Débutant Temps estimé : 30 minutes Je ne vous incite en aucun cas à créer un serveur à but lucratif, je vous invite à faire un serveur en local afin de n'avoir aucun problème avec ATELIER 801. Tout d'abord c'est quoi Transformice ? Il te faut : Donc on commence ? Vous voulez modifier le titre de l'interface de connexion ? Vous voulez modifier les titres en jeu ? Téléchargement : FE 1.96Debug 1.96Sources 1.96Titres 1.96All Tutoriel pour la version en .EXE : Créer une version .EXE
  23. 1 point
    Bonjour, Je viens vous présentez ma première quête, c'est un regroupement de quête déjà existante que j'ai légèrement modifier... Elle se nomme Anneau Magique et regroupe les fonctions suivantes : - Gestion Expérience - Gestion des Skills - Gestion des Skills secondaires - Gestion du Grade - Gestion des Téléportation - Gestion de la Banque - Gestion Entrepôt - Gestion Annonce - Gestion Trailer - Gestion Règlement Cette Anneau est destiné au joueurs et convient plutôt au serveur Fun et plus... Détails sur l'installation : - Tout d’abord depacker icon.eix/epk, locale.eix/epk. - Mettez l'icon nommer 2202.tga dans votre dossier icon: <-- Ne prenez pas cette image, c'est juste pour vous montrez, la bonne icon se trouve dans l'archive suivante: cliquez ici! - Ouvrer votre item_list et coller cette ligne a la fin, en pensant a laisser une ligne vide a la fin du fichier : 2202 ETC icon/item/2202.tga - Ouvrer votre item_proto client et coller cette ligne - Vous pouvez repacker icon et locale en pensant a bien actualiser et enregistrer les nouvelles données. - Dans navicat, allez sur player ensuite Query puis New Query et copier ceci: INSERT INTO `item_proto` VALUES ('2202', 'Anneau Magique', 'Anneau Magique', '18', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0', '0'); Et enfin faite " Run " et ensuite " save " - Dans WinSCP allez dans le répertoire de vos quête c'est a dire : /usr/metin2/share/locale/france/quest - Crée un nouveau fichier que vous nommer: anneau_magique.quest - Ensuite copier cette quête dedans : ------------------------------------- -- Quete cree par Wiizko -- -- Information Pour Source-Online -- ------------------------------------- quest anneau_magique begin state start begin when 2202.use begin say_title("Anneau Magique") say("Veuillez choisir une fonction :") local a=select("Gestion dexp", "Skill", "Skill divers", "Grade", "Téléporteur", "Banque", "Continuer") if a== 7 then say_title("Anneau Magique") say("Veuillez choisir une fonction :") a=select ( "Entrepôt", "Annonce" , "Trailer", "Règlement", "Fermer" ) + 6 if 12==a then return end end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion de lexperience -- ---------------------------------------------------------------------------------------------------------------------------------------- if a == 1 then say_title("Gestion Exp") say("Veuillez choisir une fonction :") local e=select("Bloquer Exp", "Débloquer Exp", "Vider Exp", "Quitter") if e == 1 then say_title("Gestion Exp") say("Voulez-vous bloquer votre expérience,") say("pour pouvoir dropper tranquillement ?") say("") local q=select("Bloquer", "Ne pas bloquer") if q == 1 then say_title("Gestion Exp") say("Votre expérience est désormais bloquée !") wait() pc.setqf("lock_exp", 1) pc.setqf("exp_lock", pc.get_exp()) else say_title("Gestion Exp") say("Votre expérience n'a pas été bloquée.") end elseif e==2 then say_title("Gestion Exp") say("Voulez-vous débloquer votre expérience?") say("") local w=select("Débloquer","Ne rien changer") if w==1 then say_title("Gestion Exp") say("Votre expérience est désormais débloquée.") wait() pc.setqf("lock_exp", 0) pc.setqf("exp_lock", 0) else return end elseif e == 3 then say_title("Gestion Exp") say("Voulez-vous vider votre expérience?") say_reward("Attention, Il ny aura aucun retour possible !") local qs=select("Vider","Ne rien faire") if qs==2 then return else pc.give_exp2(-pc.get_exp()) end if pc.getqf("lock_exp") == 1 then if pc.get_exp() > pc.getqf("exp_lock") then pc.give_exp2(-pc.get_exp()) pc.give_exp2(pc.getqf("exp_lock")) else pc.setqf("exp_lock", 0) end end else return end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion des skills -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a == 2 then say_title("Skills") say("Veuillez choisir une fonction :") local s=select("Skills pour Guerrier", "Skills pour Sura", "Skills pour Ninja", "Skills pour Shaman", "Fermer" ) if 5==s then return -------------------------------------------------- -- Skills Guerrier -- -------------------------------------------------- elseif 1==s then say_title("Skills pour Guerrier") say("Veuillez choisir votre classe : ") local m=select("Guerrier CaC","Guerrier Mental","Fermer") if 3==m then return -- Skills Guerrier CaC -- elseif 1==m then pc.set_skill_level() pc.set_skill_level(1, 59) pc.set_skill_level(2, 59) pc.set_skill_level(3, 59) pc.set_skill_level(4, 59) pc.set_skill_level(5, 59) pc.set_skill_level(6, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") -- Skills Guerrier Mental -- else pc.set_skill_level(16, 59) pc.set_skill_level(17, 59) pc.set_skill_level(18, 59) pc.set_skill_level(19, 59) pc.set_skill_level(20, 59) pc.set_skill_level(21, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") end -------------------------------------------------- -- Skills Sura -- -------------------------------------------------- elseif 2==s then say_title("Skills pour Sura") say("Veuillez choisir votre classe : ") local n=select("Sura AM","Sura MN","Fermer") if 3==n then return -- Skills Sura AM -- elseif 1==n then pc.set_skill_level(61, 59) pc.set_skill_level(62, 59) pc.set_skill_level(63, 59) pc.set_skill_level(64, 59) pc.set_skill_level(65, 59) pc.set_skill_level(66, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") -- Skills Sura MN -- else pc.set_skill_level(76, 59) pc.set_skill_level(77, 59) pc.set_skill_level(78, 59) pc.set_skill_level(79, 59) pc.set_skill_level(80, 59) pc.set_skill_level(81, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") end -------------------------------------------------- -- Skills Ninja -- -------------------------------------------------- elseif 3==s then say_title("Skills pour Ninja") say("Veuillez choisir votre classe :") local r=select("Ninja Archer","Ninja Assassin","Fermer") if 3==r then return -- Skills Ninja Archer -- elseif 1==r then pc.set_skill_level(46, 59) pc.set_skill_level(47, 59) pc.set_skill_level(48, 59) pc.set_skill_level(49, 59) pc.set_skill_level(50, 59) pc.set_skill_level(51, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") -- Skills Ninja Assassin -- else pc.set_skill_level(31, 59) pc.set_skill_level(32, 59) pc.set_skill_level(33, 59) pc.set_skill_level(34, 59) pc.set_skill_level(35, 59) pc.set_skill_level(36, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") end -------------------------------------------------- -- Skills Shaman -- -------------------------------------------------- else say_title("Skills pour Shaman") say("Veuillez choisir votre classe :") local p=select("Shaman Dragon","Shaman Soin","Fermer") if 3==p then return -- Skills Shaman Dragon -- elseif 1==p then pc.set_skill_level(91, 59) pc.set_skill_level(92, 59) pc.set_skill_level(93, 59) pc.set_skill_level(94, 59) pc.set_skill_level(95, 59) pc.set_skill_level(96, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") -- Skills Shaman Soin -- else pc.set_skill_level(106, 59) pc.set_skill_level(107, 59) pc.set_skill_level(108, 59) pc.set_skill_level(109, 59) pc.set_skill_level(110, 59) pc.set_skill_level(111, 59) say("Voila vos skills sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") end end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion des skills secondaires -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a == 3 then say_title("Skills Secondaires") say("Veuillez choisir une fonction :") local az=select("Raffineur", "Montures", "Commandement", "Polymorphie", "Languages", "Fermer" ) -- Raffineur -- if 1==az then say_title("Raffineur") say("Voulez-vous améliorer vos compétences de pioche ?") local aze=select("Oui", "Non") if 1==aze then pc.set_skill_level() pc.set_skill_level(124, 50) say("Vos skills secondaire sont désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end -- Montures -- elseif 2==az then say_title("Montures") say("Voulez-vous améliorer vos compétences de cheval ?") local azer=select("Oui", "Non") if 1==azer then pc.set_skill_level(131, 50) say("Votre skill secondaire est désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end -- Commandements -- elseif 3==az then say_title("Commandements") say("Voulez-vous améliorer vos compétences de commandement") say("") local azert=select("Oui", "Non") if 1==azert then pc.set_skill_level(121, 50) say("Votre skill secondaire est désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end -- Polymorphie -- elseif 4==az then say_title("Polymorphie") say("Voulez-vous améliorer vos compétences en polymorphie ?") say("") local azerty=select("Oui", "Non") if 1==azerty then pc.set_skill_level(129, 50) say("Votre skill secondaire est désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end -- Language -- elseif 5==az then say_title("Language") say("Veuillez choisir le language que vous voulez apprendre:") say("") local lang=select("Parler Jaune","Parler Rouge","Parler Bleu") -- Parler Jaune -- if 1==lang then say_title("Parler le Jaune") say("Voulez-vous améliorer votre language jaune ?") local d=select("Oui", "Non") if 1==d then pc.set_skill_level(127, 50) say("Votre skill secondaire est désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end -- Parler Rouge -- elseif 2==lang then say_title("Parler le Rouge") say("Voulez-vous améliorer votre language rouge ?") local h=select("Oui", "Non") if 1==h then pc.set_skill_level(126, 50) say("Votre skill secondaire est désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end else say_title("Parler le Bleu") say("Voulez-vous améliorer votre language bleu ?") local g=select("Oui", "Non") if 1==g then pc.set_skill_level(128, 50) say("Votre skill secondaire est désormais en P !") say_reward("Veuillez deco reco pour valider les changements.") else return end end else return end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion du Grade -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==4 then say_title("Grade") say("Voulez-vous avoir votre grade au maximum ?") local b=select ( "Oui" , "Non" ) if 1==b then pc.change_alignment(200000) say("Votre grade est désormais au maximum. ") else return end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion Teleporteur -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==5 then say_title("Téléporteur") say("Voulez-vous être téléporter ?") local main_set = select("Oui","Non") if main_set == 2 then return else say_title("Téléporteur :") say("Veuillez choisir une map :") sub_set = select ( "Map 1 Rouge" , "Map 2 Rouge" , "Map 1 Jaune" , "Map 2 Jaune" , "Map 1 Bleu" , "Map 2 Bleu" ,"Continuer") if sub_set == 7 then say_title("Téléporteur :") say("Veuillez choisir une map :") sub_set = select ( "Vallée de Seungryoung", "Désert de Yongbi" , "Mont Sohan", "Terre de feu" , "Tour du demon" , "Forêt" , "Bois Rouge" ,"Continuer" ) + 6 if sub_set == 14 then say_title("Téléporteur :") say("Veuillez choisir une map :") sub_set = select ( "Temple", "Cave 1", "Cave 2", "Geant", "Grotte de lExil" , "Fermer" ) + 13 if sub_set == 19 then return end end end local warp = { -- Map 1 Rouge -- { { 474300 , 954800 }, { 474300 , 954800 }, { 474300 , 954800 }, }, -- Map 2 Rouge -- { { 353100 , 882900 }, { 353100 , 882900 }, { 353100 , 882900 }, }, -- Map 1 Jaune -- { { 63800 , 166400 }, { 63800 , 166400 }, { 63800 , 166400 }, }, -- Map 2 Jaune -- { { 145500 , 240000 }, { 145500 , 240000 }, { 145500 , 240000 }, }, -- Map 1 Bleu -- { { 959900 , 269200 }, { 959900 , 269200 }, { 959900 , 269200 }, }, -- Map 2 Bleu -- { { 863900 , 246000 }, { 863900 , 246000 }, { 863900 , 246000 }, }, -- Map Orc -- { { 402100, 673900 }, { 270400, 739900 }, { 321300, 808000 }, }, -- Map Désert -- { { 217800, 627200 }, { 221900, 502700 }, { 344000, 502500 }, }, -- Mont Sohan -- { { 434200, 290600 }, { 375200, 174900 }, { 491800, 173600 }, }, -- Map Volcan -- { { 599400, 756300 }, { 597800, 622200 }, { 730700, 689800 }, }, -- Tour du demon -- { { 590500, 110500 }, { 590500, 110500 }, { 590500, 110500 }, }, -- Map Foret -- { { 288700 , 5700 }, { 288700 , 5700 }, { 288700 , 5700 }, }, -- Map Bois rouge -- { { 1119500 , 701 }, { 1119500 , 701 }, { 1119500 , 701 }, }, -- Map Temple -- { { 553600 , 144100 }, { 553600 , 144100 }, { 553600 , 144100 }, }, -- Cave 1 -- { { 60000 , 496000 }, { 60000 , 496000 }, { 60000 , 496000 }, }, -- Cave 2 -- { { 704100 , 464200 }, { 704100 , 464200 }, { 704100 , 464200 }, }, -- Geant -- { { 828300 , 763500 }, { 828300 , 763500 }, { 828300 , 763500 }, }, -- Grotte de lExil -- { { 10000 , 1207800 }, { 10000 , 1207800 }, { 10000 , 1207800 }, }, } local old_vid = pc.select(u_vid) local empire = pc . get_empire ( ) test_chat ( warp [ sub_set ] [ empire ] [ 1 ] .. warp [ sub_set ] [ empire ] [ 2 ] ) pc . warp ( warp [ sub_set ] [ empire ] [ 1 ] , warp [ sub_set ] [ empire ] [ 2 ] ) pc.select(old_vid) say("Téléportation éffectuée avec succès ! ") end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion Banque -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==6 then say_title("Banque") say("Veuillez choisir une fonction :") local s = select("Stocker des yangs", "Retirer des yangs", "Voir létat de mon compte", "Fermer") -- Stock yangs -- if s == 1 then say_title("Banque") say("Combien de yangs voulez-vous stocker ?") say_reward("Vous avez : "..pc.gold.." yangs.") say("") i = tonumber(input()) if i <= 0 or i == "" then return end if i > pc.gold then i = pc.gold end j = i + pc.getqf("nb_yang") while j >= 1000000000 do pc.setqf("nb_milliard", pc.getqf("nb_milliard")+1) j = j - 1000000000 end pc.setqf("nb_yang", j) pc.change_gold(-i) syschat(i.." yangs stockés.") -- Retire et voir le compte -- elseif s == 2 or s == 3 then say_title("Banque") say("") say("Yangs sur votre compte :") a = "" c = "" if pc.getqf("nb_milliard") > 0 then a = pc.getqf("nb_milliard") b = 100000000 while b > pc.getqf("nb_yang") and b != 1 do c = c.."0" b = b/10 end end say_reward(a..""..c..""..pc.getqf("nb_yang")) say("") if s == 3 then return end say("Combien de yangs voulez-vous retirer ?") say("") i = tonumber(input()) if i <= 0 or i == "" then return end if i > pc.getqf("nb_milliard")*1000000000 + pc.getqf("nb_yang") then i = pc.getqf("nb_milliard")*1000000000 + pc.getqf("nb_yang") end if pc.gold + i > 1999999999 then syschat("Action impossible vous allez dépasser les 2 milliards.") return end pc.change_gold(i) if i >= 1000000000 then pc.setqf("nb_milliard", pc.getqf("nb_milliard")-1) i = i - 1000000000 end pc.setqf("nb_yang", pc.getqf("nb_yang")-i) if pc.getqf("nb_yang") < 0 then pc.setqf("nb_yang", pc.getqf("nb_yang")+1000000000) pc.setqf("nb_milliard", pc.getqf("nb_milliard")-1) end end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion Entrepot -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==7 then say_title("Entrepôt") say("") say("Si cest la première fois que vous ouvrez") say("votre entrepot, rappeler vous que votre") say("code par default est 000000.") say("Voulez-vous ouvrir votre entrepôt ?") local v = select ( "Oui" , "Non", "Activer lentrepôt" ) -- Ouvrir Entrepot -- if 1 == v then game.open_safebox() return -- Quitter -- elseif 2 == v then return -- Activer Entrepot -- else say_title("Entrepôt") say("Voulez-vous activer votre entrepôt ?") local t = select ("Oui", "Non") if 1 == t then say_title("Entrepôt") say("Votre entrepôt à été activer avec succès !") --stash.setlevel(1) game.set_safebox_level(1) say(locale.stash.first_open) else return end end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion Annonce -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==8 then if get_time() > pc.getqf("duration") then --- l say_title("Annonce") say("Voulez-vous passer une annonce a travers tout") say("les royaumes, et ainsi pouvoir vendre ou acheter") say("tout type d'objet, d'items ou autres?") local a = select("Passer une annonce", "Comment utiliser le système d'annonce?", "Fermer") if a == 3 then return -- Passer Annonce -- elseif a == 1 then --- l say_title("Annonce") say("Ecrivez votre annonce maintenant:") notice_all(pc.get_name(), ": ", input(), input()) pc.setqf("duration",get_time()+60*15*1) return -- Regles -- else --- l say_title("Annonce") say_reward("Pour passer une annonce vous avez en tout") say_reward("deux champs pour écrire votre texte,") say_reward("qui défileront après avoir fini de remplir") say_reward("un champ. Si vous avez finit de taper") say_reward("l'annonce est qui reste des champs vide") say_reward("ne mettez rien et apuyez sur 'OK'.") end -- Anti Flood -- else --- l say_title("Annonce") say("Pour éviter le flood et les annonces répétitives") say("Un système de temps a été mise en place.") say_reward("Veuillez attendre une quinzaine de minutes.") say_reward("Avant de pouvoir passer une autres annonces.") end ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion Trailer -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==9 then cmdchat("showtrailer [Contenu Masqué]") setskin(NOWINDOW) ---------------------------------------------------------------------------------------------------------------------------------------- -- Gestion Reglement -- ---------------------------------------------------------------------------------------------------------------------------------------- elseif a==10 then say_title("Règlement du jeu") say("Vous allez avoir accès au règlement du jeu.") say("Prenez le temps de le lire!") say("Voulez-vous voir le règlement?") local vbn = select("Oui","Non") if vbn== 1 then say_title("Règlement du jeu:") say_reward("Conditions Générales") say("Veuillez vous respecter les uns les autres.") say("Tout harcèlement et insulte sont interdit.") say("Le harcèlement se définit comme le fait :") say("De gêner un joueur dans sa progression.") say("Le don ou échange de compte est autorisée.") say("mais ceci est à vos risques et périls.") say("Toutes plaintes concernant :") say("La récupération de compte ne sera pas accepté.") say("Le staff ne s'en tiendra en aucun cas responsable") local page=select("Page suivante","Quitter") if page==2 then return else say_title("Règlement du jeu:") say_reward("Mode de jeu") say("Le Chain kill est autorisé,vous pouvez toujours :") say("Vous reco-citer ou mettre le mode fantôme.") say("Il est interdit de frapper d'autres joueurs si :") say("Ils sont en train de parler ou proche d'un PNJ.") say("Tout pseudo comportant des propos :") say("Raciste, pornographique sont interdits.") say("Le staff est reconnaissable grâce à leur préfixe :") say("[CoMa] [GA] [sGM] [GM] ou [bGM].") say("L'usurpation d'identité est interdits.") local pag=select("Page suivante","Quitter") if pag==2 then return else say_title("Règlement du jeu:") say_reward("Conversation") say("La langue de Source-Online est le Français.") say("Le langage SMS est toléré mais est interdit lors :") say("De la communication avec un membre du staff.") say("Le flood est interdit.") say("Les phrases en majuscules sont interdites.") say("Toute publicité envers un autre serveur sera :") say("Puni d'un bannissement définitif.") local bu=select("Page suivante","Quitter") if bu==2 then return else say_title("Règlement du jeu:") say_reward("Le client") say("Toute modification du client est interdite.") say("L'utilisation de bot, cheat ou autres sera :") say("Puni d'un bannissement définitif.") say("L'exploitation de bug ou usebug est interdite.") local cu=select("Page suivante","Quitter") if cu==2 then return else say_title("Règlement du jeu:") say_reward("Gestion magasin") say("Tout magasin proche d'un PNJ est interdit.") say("Sauf ceux se trouvant sur la place.") say("Les nom de magasins vulgaires sont interdits.") say_reward("Le staff vous souhaites :") say_reward("Bon jeu") select("Fermer") end end end end else return end else return end end end end - Mettez les droits 0777 sur la quête - Et enfin allez dans locale_list et rajoutez ceci a la fin, en pensant a laisser une ligne vide a la fin : anneau_magique.quest - Compiler la quête, ensuite un reboot ou un /reload q InGame et sa devrai être bon ! Pour ceux qui ne veulent pas implanter cet item, vous pouvez toujours mettre la quête sur " l'anneau de levi " qui de base n'est pas utiliser il me semble. Pour se faire vous avez juste a changé la ligne 8 de la quête : when 2202.use begin par when 40002.use begin Dernière chose, pour faire fonctionner la partie " Trailer ", il faut faire les modifications suivantes : Étape 1 : Télécharger les fichiers python : Lien du téléchargement : Cliquez ici. Étape 2 : Intégration des fichiers téléchargés : Vous verrez en faisant l'extraction de l'archive que vous aurez un dossier "root" et un autre "uiscript". Vous allez donc devoir dépacker le root et le uiscript de votre client afin de mettre les fichiers a l'intérieur. En clair, vous mettez "uitrailer.py" dans votre dossier root et le fichier "trailerwindow.py" dans le dossier uiscript. Étape 3 : Intégration du module dans le game.py : Maintenant que vos fichiers sont placés au bonne endroit, profitez en pour vous rendre dans le root et cherchez le fichier "game.py"! Éditez ce fichier avec notepad++ et cherchez la ligne (CTRL+F) "mall" : self.__InGameShop_Show, Ensuite, mettez cette ligne à la suite de celle cité ci dessus : "showtrailer" : self.Trailer_Show, Bien! Ce n'est pas terminé, il reste à annoncer le module. Pour cela, allez tout en bas du game.py (descendez avec la roulette). Vous devez ajouter ceci : def Trailer_Show(self, url): import uitrailer self.wndtrailer = uitrailer.WebWindow() self.wndtrailer.LoadWindow() self.wndtrailer.Hide() self.wndtrailer.Open(url) EXEMPLE avec client 2012 vierge : Pour modifier l'url de la video, cela se passe dans la quete ligne 660: cmdchat("showtrailer [Contenu Masqué]") Enfin repacker root et uiscript. Source pour le tuto concernant le trailer: Emulation-bay Source pour le tuto concernant la quete: Wiizko Je remercie toutes les personnes qui ont crée les quête, dont je me suis servi ! Je remercie aussi Prindo99 pour m'avoir ""aider""! Voila j'espere que cette quete vous conviendras, je précise qu'elle est fonctionnelle ( je l'ai actuellement sur mon serveur ) Cordialement, Wiizko
  24. 1 point
    Je vais ouvrir mon serveur, mais actuellement je me base sur les sources 1.81 en Python et je les recodes en C#.net. Ce qui a l'avantage d'être plus stable qu'un script en Python. Peut-être que je proposerais les sources à tous, ou alors un fichier de config pour configurer son ému. Oui, ce ne sera plus une source. Mais vraiment un ému. Avec un système d'ajout de commandes. Et un système pour scripter des fonctions. Avec ajout d'objets dans le shop, des tools pour modifier son interface, etc. Mais du coup, ça veut dire qu'il faut que je développe un language de scipt. Le TFM Script. Ce qui risque d'être long, je pense faire en premier lieu l'émulateur en C#.net puis l'amelliorer et enfin le release afin de permettre à tous d'avoir un serveur 1.81 sans beugs. Cordialement, ThanosS.
  25. 1 point
    À quoi sa peux servir un serveur privé transformé ? Il y doit pas avoir grand truc à modifier/Ajouter.. ^^'
Ce classement est défini par rapport à Paris/GMT+01:00
×

Information importante

By using this site, you agree to our Conditions d’utilisation.