Search the Community

Showing results for tags 'a corriger'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Register & Login
    • Register
    • Login
  • Espace Communautaire
    • Funky Emulation
    • Présentations
    • Services
    • Discussions Générales
    • Bureau de la Communauté
    • Espace Premium
  • Emulation & Co
    • Rewrite a Release / Tutorial
    • Suggest a Release / Tutorial
    • The Ideas Box
  • Emulation de jeux
    • RaiderZ
    • Aura Kingdom
    • Metin2
    • Dofus
    • World of Warcraft
    • Minecraft
    • Aion
    • Habbo
    • Voir plus...
  • Espace Divers
  • Internationnal Forum
  • PassionDev's Forum
  • M2Project - Metin2's M2SF
  • M2Project - Metin2's Aide / Questions / Support
  • M2Project - Metin2's Tutoriels & Partages
  • M2Project - Metin2's Suggestions
  • M2Project - Metin2's Report de Bugs

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Nationality


Sexe


Discord


Skype


Biographie


Site


Nombre

 
or  

Found 606 results

  1. Salut, Voici un Tuto pour changer les News ( Voir Pièce Jointe ).Dans un Premiers Temps, Télécharger ceci : News RSSEnsuite,Ouvrez le Dossier News RssOuvrez Ensuite Le Dossier RSSEnsuite Ouvrez config.phpFaites comme ceci : <?php define("DB_HOST","IP DE LA DB (PAR DÉFAUT 127.0.0.1)"); define("DB_LOGIN","root"); define("DB_PASS","MOT DE PASSE SI VOUS EN AVEZ UN"); define("DB_BDD","news");?> Enregistrez Puis fermezMaintenant Ouvrez RSS.PHPEt Remplissez Comme Ceci : <?php echo '<?xml version="1.0" encoding="utf-8"?>' ?>NOM DE VORE SERVEURURL DE VORE SERVEUR DESCRIPTION DE VORE SERVEUR<?php require "config.php"; mysql_connect(DB_HOST,DB_LOGIN,DB_PASS); mysql_select_db(DB_BDD); mysql_query("SET NAMES UTF8"); $sql="SELECT * FROM rss ORDER BY id DESC LIMIT 0, 6"; $req = mysql_query($sql) or die('Erreur SQL ! '.$sql.' '.mysql_error()); while($data=mysql_fetch_assoc($req)){ echo "\n"; echo "{$data["id"]}"; echo "{$data["title"]}\n"; echo "URL DE VORE SERVEUR\n"; echo "{$data["icon"]}\n"; echo "".date("D, d M Y H:i:s",strtotime($data["date"]))." +0200\n"; echo "\n"; }?> Enregistrez Puis FermezCopiez Rss.php et config.phpCollez-les dans votre dossier lang !- Ensuite, Ouvrez Sothink SWF QuickerAllez dans votre Dossier SWF et choisissez lang_fr_786Faites CTRL+F et dans la recherche tappez RSS_LINKVous devriez avoir une ligne ressemblant à ceci : Donc Replacez Comme Cela : Ensuite, Faites Export Et Fermer votre Sohtink SWF QuickerMaintenant, Retournez dans votre dossier de News RSS et ouvrez cette fois-ci le dossier News RSS ScriptOuvrez config.phpPuis Remplissez :<?php define("DB_HOST","IP DE LA DB (PAR DÉFAUT 127.0.0.1)"); define("DB_LOGIN","root"); define("DB_PASS","MOT DE PASSE SI VOUS EN AVEZ UN"); define("DB_BDD","news");?> Enregistrez Puis FermezEnsuite Copiez le dossier News RSS Script et collez-le dans votre dossier “www” De WampMaintenant Lancez Navicat, Créez une New Database Que vous appellerez "news"Une fois fait, executez le fichier sql "rss.sql" Qui se trouve dans le Dossier "RSS"Ajouter Une News :Ouvrez Navicat puis Double-clique sur NewsOuvrez la Table rsset Remplissez Comme ceci : Voici la liste des Icons : à écrire dans la colone Icon => Icon afficher Tuto By Icer Un Petit Merci ferai plaisir.
  2. Bonjour, Me voilà sur ce nouveau tutoriel pour vous apprendre à installer Ancestra Remake 54. Étant multi-serveur (peut gérer plusieurs serveurs), il est en effet plus compliqué à configurer que les précédents. Sans plus tarder, go go go 1 - Pré-Requis Disposer d'Ancestra Remake 54 Disposer d'une IP de connexion (Hamachi, No-Ip, dédié ...). Vous avez des tutoriels pour cela, je ferais comme si vous la connaissez Disposer de WampServer et de Navicat sauf si vous savez vous débrouiller avec PhpMyAdmin Disposer de Dofus 1.29 2 - Installer les base de données En premier lieu, l'émulateur a, pour fonctionner, besoin de deux bases de données. Je vais expliquer la procédure via Navicat, si vous utilisez PhpMyAdmin je pense que vous saurez vous débrouiller tout seul. Si ce n'est pas déjà fait, commencez par installer Wamp & Navicat. Lancez Wamp puis Navicat en attendant que Wamp passe au vert dans votre barre des tâches. Si Wamp ne passe pas vert (vous pouvez passer cette étape si c'est le cas), le problème vient probablement d'une interférence avec skype. Dans skype: Outils -> Options -> Avancées -> Connexion -> Décocher "Utiliser les ports 80 et 443 comme alternative". Redémarrez Skype & Wamp [*]Ouvrez Navicat, cliquez sur Connection -> MySQL [*]Mettez seulement localhost à Connection Name et un mot de passe de votre choix à Password. Ne touchez pas à ce qui est déjà rempli, faites Ok [*]Double cliquez sur localhost normalement apparu dans la colonne de gauche de Navicat. (Afin d'ouvrir la connection) [*]Click droit sur localhost (votre connection), puis clickez sur New Database [*]Ecrivez ancestra_realm dans Enter database name puis clickez sur OK. [*]Répétez la même opération pour une bdd du nom de ancestra_game [*]Comme pour la connection, double clickez sur vos deux bases de données afin de les "ouvrir" [*]On va maintenant importer des données dans nos deux bdd à partir de fichiers .sql: Click droit sur ancestra_realm, puis Execute Batch File et ciblez AncestraR_Realm.sql contenu dans le dossier AR54/BDD, puis faites Start [*]Répétez la même opération pour remplir ancestra_game à partir du fichier AncestraR_Game.sql, toujours situé dans le même dossier. Vous voilà maintenant avec vos deux bases de données crées, remplies, prêtes mais ... non à jours J'vous jure, j'vous ai pas fait faire de la *****, juste que les développeurs d'AR ont dû rectifier des choses sur les bases de données, et au lieu de mettre à jour les deux gros patchs qu'on vient d'exécuter, ont mis chaque rectification dans un fichier .sql à part. Tous ces fichiers .sql, vous pouvez les trouver dans le sous dossier BDD/Patchs. Attention ! Vous ne devez pas les exécuter n'importe comment. Vous pouvez observer que le nom de chaque fichier suit cette logique: AncestraR_Realm/Game - Patch revN°Patch - Infos sur contenu.sql Realm/Game correspond à la bdd sur laquelle doit être appliqué le patch. N°Patch correspond au numéro du patch (ils sont tous numérotés) Infos sur contenu correspond à quelques infos sur le contenu du patch. Vous devez exécuter tous ces patchs en faisant attention à le faire sur la bonne base de données, et dans l'ordre croissant des numéros. Exemple pour la db game: AncestraR_Game - Patch rev2 - Pets.sql en premier AncestraR_Game - Patch rev3 - Defenders of resources.sql en deuxième ... Au boulot ! Une fois ceci fait, vous aurez vos deux bases de données enfin prêtes et complètes. Nous pourrons alors passer à la configuration de l'émulateur en lui même 2 - Survol du fonctionnement d'un Emulateur La particularité d'AR54 qui m'a poussé à faire un tuto sur son installation (alors qu'il y a déjà des tutos pour d'autres versions d'AR), c'est que la différence de fonctionnement entre cette version et celles antérieures complique sa configuration. Voilà comment fonctionne normalement un émulateur, dissocié en deux parties realm et game : Le client se connecte sur la partie realm. Il choisit son serveur, et le realm lui renvoi l'ip et le port du game gérant le serveur demandé. Le client coupe alors la connection avec le realm pour se connecter au game Le game gère tout le reste du jeux. Il doit néanmoins communiquer avec le realm pour avoir certaine données. Dans les versions précédentes, le multi-serveur n'était pas géré: on ne pouvait alors avoir qu'un serveur, et il n'était plus utile d'avoir cette organisation avec une application realm et une autre pour chaque serveur. Les développeurs ont donc fusionné ces deux applications en une seule. De cette façon, le client restait tout le temps connecté sur la même application (pas tout à fait en réalité, mais on entrerait dans les détails techniques). Au niveau de la configuration; on n'avait qu'une config pour une application, avec une ip & un port à renseigner pour l'unique application. Avec le multi-serveur, les développeurs ont du dissocier le realm et le game : Un seul realm (serveur de connection), et un game par serveur. Il faut donc à présent une config par appli' (deux pour un seul serveur), et des ips & ports en plus. En résumé, il nous faut: L'ip du realm et son port de connection (celui sur lequel le client se connecte) L'ip de chaque serveur & leur port de connection (donnés par le realm au client). Pour ne pas compliquer les choses, nous allons gérer qu'un serveur Le port de communication utilisé entre le realm et les games. L'identifiant de chaque game ; c'est avec celui-ci que le realm s'assure qu'il à affaire aux games attendus. (Sinon n'importe quel personne tierce pourrait connecter son propre game modifié) 3 - Configurer Ancestra Remake 54 La partie précédente n'était pas vraiment prévue, mais j'ai trouvé intéressant de parler du fonctionnement de l'émulateur, ça peut aider certains à comprendre certains éléments. Bon, la première étape est de faire connaître au realm notre game. Et une table de notre db realm est prévue pour cela. Une table ??? Kézako !? Voilà une nouvelle notion pour nous, jeunes padawans que nous sommes. Une table n'est rien d'autre qu'une partie d'une base de données, regroupant donc un certains nombre d'informations à propos d'une chose précise, informations organisées comme un tableau. D'où le nom table, qui en anglais signifie tableau. 1 - Base de Données Rendez vous dans ancestra_realm Double clickez sur la table gameservers Une fenêtre s'ouvre alors. Voilà que s'affiche le contenu de notre table. L'unique ligne affichée devrait être celle-ci : Colonnes en italiques id | ServerIP | ServerPort | State | ServerBDD | ServerDBName | ServerUser | ServerPassword | key 1 | 127.0.0.1 | 5555 | 0 | 127.0.0.1 | ancestra_game | root | | server1 L'id correspond à l'id du serveur. Vous pouvez trouver tous les fichiers d’emblème des serveurs dans Dofus/clips/artworks/servers. Leur nom correspond à leur id. Pour ma part je m'en fou un peu donc je laisse 1. IP de la machine qui aura le game. Donc votre ip hamachi/no-ip/dédié ou 127.0.0.1 si vous voulez tester en localhost. On laisse aussi 5555 au ServerPort, c'est ce port ainsi que la serverIP que le realm enverra au client pour qu'il se connecte au game. State, c'est l'état du serveur: 0 pour hors ligne, 1 en ligne, 2 sauvegarde. On laisse 0, le realm s'occupe de le mettre à 1 quand il reçoit la connection du game. ServerBDD ; l'ip de notre db game. S'il est sur la même machine que le game vous pouvez laisser 127.0.0.1, sinon mettez son ip. ServerDbName ; le nom de la db game correspondante, on laisse ancestra_game (sauf si vous l'avez appelé autrement) ServerUser ; le nom d'utilisateur de la connection à la db. Si vous ne l'avez pas changé depuis l'installation, c'est toujours root ServerPassword ; le mot de passe de la connection à la db. Si vous n'en avez pas mit, il y en a pas. key ; c'est la clé qui identifie le game & qu'il devra donner au realm. Je décide de la laisser telle quelle, gardez la en mémoire si vous la changez. 2 - Configuration du realm A présent, direction AR54/Realm/Realm_Config.txt : REALM_PORT : Port de connection à mettre dans la config.xml, on va prendre 444 REALM_COM_PORT : Port de communication entre le realm & les game. On prend 489 Je vous laisse configurer les identifiants de votre db realm 3 - Configuration du game Direction AR54/Game/Game_Config.txt: REALM_IP : l'ip hamachi/no-ip/dédié de la machine hébergeant le realm. Configurez l'accès à la db realm. Comme pour la partie db, mettez 127.0.0.1 si la db est sur la même machine que le game. HOST_IP : Ip hamachi/no-ip/dédié de la machine hébergeant le game. AUTH_KEY : La clé que vous avez indiqué dans la colonne key de la db GAME_PORT: Le port de connexion du game, que vous avez indiqué dans la colonne ServerPort COM_PORT : Port de communication entre le game & le realm. Il doit être identique à celui que nous avons mis dans la config realm, soit 489 PLAYER_LMIT : Ne pas laisser -1, il provoque un bug à la connexion au serveur (Merci à Defense pour l'infos). Mettez donc une autre limite de joueurs, comme 100. Configurez l'accès à la db game de la même façon que pour la realm. Normalement, vous avez à présent Ancestra Remake bien installé et configuré. Il ne reste plus qu'à indiquer au client Dofus l'ip et le port de connexion du realm. 4 - Configuration du client DOFUS Ne vous inquiétez pas, c'est beaucoup plus simple que pour l'émulateur. Direction Dofus/config.xml, remplacez tout le contenu par ceci : <config> <delay value="500"/> <rdelay value="3000"/> <rcount value="10"/> <conf name="En ligne"> <connserver ip="Adresse ip du serveur" name="Nom de votre serveur" port="Port du realm"> <dataserver url="data/" type="local" priority="3" /> <dataserver url="[Hidden Content]" priority="1" /> <dataserver url="[Hidden Content]" priority="0" /> </conf> <conf name="En ligne (TEST)" type="test"> <dataserver url="data/" type="local" priority="3" /> <dataserver url="[Hidden Content]" priority="1" /> <dataserver url="[Hidden Content]" priority="0" /> </conf> <cacheasbitmap> <cache element="ExternalContainer/InteractionCell" value="false" /> <cache element="ExternalContainer/Ground" value="false" /> <cache element="ExternalContainer/Object1" value="false" /> <cache element="ExternalContainer/Object2" value="false" /> <cache element="ExternalContainer/Zone" value="false" /> <cache element="ExternalContainer/Select" value="false" /> <cache element="ExternalContainer/Grid" value="false" /> <cache element="ExternalContainer/Pointer" value="false" /> <cache element="GAPI/UI" value="false" /> <cache element="GAPI/UITop" value="false" /> <cache element="GAPI/Popup" value="false" /> <cache element="GAPI/UIUltimate" value="false" /> <cache element="GAPI/Cursor" value="false" /> <cache element="mapHandler/BACKGROUND" value="false" /> <cache element="mapHandler/Cell/Ground" value="false" /> <cache element="mapHandler/Cell/Object1" value="false" /> <cache element="mapHandler/Cell/Object2" value="false" /> <cache element="mapHandler/Cell/ObjectExternal" value="false" /> <cache element="Zone/Zone" value="true" /> <cache element="Zone/Pointers" value="true" /> </cacheasbitmap> </config> Remplacez de la ligne suivante par ce qui est demandé. <connserver ip="Adresse ip du serveur" name="Nom de votre serveur" port="Port du realm"> Si vous avez bien suivi ce tutoriel, vous devriez normalement mettre 444 pour le port du realm. A présent que tout est en place, il ne reste qu'à lancer l'émulateur : En premier le Realm en lançant AR54/Realm/start.bat puis le Game en lançant AR54/Game/start.bat. Et voilà, distribuez la config à vos joueurs, et votre serveur est en place ! Merci de respecter ce tutoriel qui m'a prit beaucoup de temps. Ainsi, je vous demanderai de ne pas le copier autre part et d'utiliser la section Aide / Question / Support si vous rencontrez des problèmes avec l'émulateur
  3. Bonjour, Granny 2.9.12 Granny 2.11.8 Granny 2.8.41 Cordialement, History. --- Download
  4. 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: [Hidden Content] --- Download
  5. Salut à tous, voici une petite API pour les votes sur RPG paradize. En gros elle fait : Récupère le captcha de la page de vote. Envoi le formulaire de vote. Regarde si le vote a été accepté et retourne true ou false. Donc au final plus besoin de faire une redirection vers RPG Paradize, et seul les bon votes seront comptés, et tout ça, très simplement ! RpgApi.php : ICI Exemple : ICI L'utilisation d'un tel système est relativement lourd, il est donc préférable de ne pas trop charger la page de vote. --- Download
  6. Bonjour ! Voyant que beaucoup d'entre vous (ou presque ) cherche à avoir les anciennes ailes de l'officiel pour leur serveur (celle ci dessous), je les partages. Je parle bien entendu des ailes où les ailes bontarien ont leur auréole ! C'est vrai que l'auréole des anges ça fais déjà plus ange . Téléchargement : Aile Démon Ange Version 1.18 Cordialement, --- Download
  7. Bonjour, Je vous partage un petit tutoriel rédigé par mes soins afin d'installer le système de bonus dans l'inventaire sur les files 2014 (et 2016 by FE). PS : Sur l'image le système est en espagnol mais dans ce tutoriel le système est traduit en français par Eristoff. Point positif : Système fonctionnel une fois adapté. Point négatif : Le bouton "Minimiser" ne fonctionne plus (Ce qui n'est pas très grave). Edit : Le bouton fonctionne ! Voir plus bas dans le tutoriel. Dans un premier temps vous devez vous munir d'un éditeur de texte et de vos fichiers "root" et "local_fr". Dans root : Trouvez et ouvrez le fichier "uiinventory.py" Trouvez ce bout de code : ## Refresh self.SetInventoryPage(0) self.SetEquipmentPage(0) self.RefreshItemSlot() self.RefreshStatus() Le remplacer par : ## Refresh self.SetInventoryPage(0) self.SetEquipmentPage(0) self.RefreshItemSlot() self.RefreshStatus() self.ActualizarBonus() def MinimizarBonus(self): if self.ESTADO_PAGINA_INVENTORY == False: #####Esta parte pertence en volver al estado original al inventory self.GetChild("board").SetSize(176,585) self.GetChild("TitleBar").SetWidth(161) self.GetChild("TitleName").SetPosition(77, 3) self.GetChild("OcultarTabla").SetPosition(161 - 30, 10) self.SetSize(176, 585) self.SetPosition(wndMgr.GetScreenWidth() - 176, wndMgr.GetScreenHeight() - 37 - 585) self.GetChild("Money_Slot").SetPosition(8, 28) #Tabla self.GetChild("txt_info_defenza").Hide() self.ESTADO_PAGINA_INVENTORY = True else: #####Esta parte pertence en volver al estado editado al inventory self.GetChild("board").SetSize(306,585) self.GetChild("TitleBar").SetWidth(161 + 130) self.GetChild("TitleName").SetPosition((161 + 130) / 2, 3) self.GetChild("OcultarTabla").SetPosition(161 + 130 - 30, 10) self.SetSize(306, 585) self.SetPosition(wndMgr.GetScreenWidth() - 176 - 130, wndMgr.GetScreenHeight() - 37 - 585) self.GetChild("Money_Slot").SetPosition(-55, 28) #Tabla self.GetChild("txt_info_defenza").Show() self.ESTADO_PAGINA_INVENTORY = False self.OcultarInfoTable(self.ESTADO_PAGINA_INVENTORY) if self.wndBelt: self.wndBelt.AdjustPositionAndSize() def OcultarInfoTable(self, arg): if arg == True: self.GetChild("txt_info_defenza").Hide() self.GetChild("txt_info_defenza_espada").Hide() self.GetChild("Thin_info_defenza_espada").Hide() self.GetChild("txt_info_defenza_2manos").Hide() self.GetChild("Thin_info_defenza_2manos").Hide() self.GetChild("txt_info_defenza_daga").Hide() self.GetChild("Thin_info_defenza_daga").Hide() self.GetChild("txt_info_defenza_Felcha").Hide() self.GetChild("Thin_info_defenza_Felcha").Hide() self.GetChild("txt_info_defenza_campana").Hide() self.GetChild("Thin_info_defenza_campana").Hide() self.GetChild("txt_info_defenza_fan").Hide() self.GetChild("Thin_info_defenza_fan").Hide() self.GetChild("txt_info_resist_Magia").Hide() self.GetChild("Thin_info_resist_Magia").Hide() self.GetChild("txt_info_resist_veneno").Hide() self.GetChild("Thin_info_resist_veneno").Hide() self.GetChild("txt_info_resist_guerrero").Hide() self.GetChild("Thin_info_resist_guerrero").Hide() self.GetChild("txt_info_resist_ninja").Hide() self.GetChild("Thin_info_resist_ninja").Hide() self.GetChild("txt_info_resist_sura").Hide() self.GetChild("Thin_info_resist_sura").Hide() self.GetChild("txt_info_resist_chaman").Hide() self.GetChild("Thin_info_resist_chaman_").Hide() self.GetChild("txt_info_onfensivo").Hide() self.GetChild("txt_info_criticos").Hide() self.GetChild("Thin_info_criticos").Hide() self.GetChild("txt_info_penetracion").Hide() self.GetChild("Thin_info_penetracion").Hide() self.GetChild("txt_info_danomedia").Hide() self.GetChild("Thin_info_danomedia").Hide() self.GetChild("txt_info_danohabilidad").Hide() self.GetChild("Thin_info_danohabilidad").Hide() self.GetChild("txt_info_fmediohumano").Hide() self.GetChild("Thin_info_fmediohumano").Hide() self.GetChild("txt_info_fnomuerto").Hide() self.GetChild("Thin_info_fnomuerto").Hide() self.GetChild("txt_info_fdemonio").Hide() self.GetChild("Thin_info_fdemonio").Hide() self.GetChild("txt_info_fguerrero").Hide() self.GetChild("Thin_info_fguerrero").Hide() self.GetChild("txt_info_fninja").Hide() self.GetChild("Thin_info_fninja").Hide() self.GetChild("txt_info_fsura").Hide() self.GetChild("Thin_info_fsura").Hide() self.GetChild("txt_info_fcham").Hide() self.GetChild("Thin_info_fcham").Hide() else: self.GetChild("txt_info_defenza").Show() self.GetChild("txt_info_defenza_espada").Show() self.GetChild("Thin_info_defenza_espada").Show() self.GetChild("txt_info_defenza_2manos").Show() self.GetChild("Thin_info_defenza_2manos").Show() self.GetChild("txt_info_defenza_daga").Show() self.GetChild("Thin_info_defenza_daga").Show() self.GetChild("txt_info_defenza_Felcha").Show() self.GetChild("Thin_info_defenza_Felcha").Show() self.GetChild("txt_info_defenza_campana").Show() self.GetChild("Thin_info_defenza_campana").Show() self.GetChild("txt_info_defenza_fan").Show() self.GetChild("Thin_info_defenza_fan").Show() self.GetChild("txt_info_resist_Magia").Show() self.GetChild("Thin_info_resist_Magia").Show() self.GetChild("txt_info_resist_veneno").Show() self.GetChild("Thin_info_resist_veneno").Show() self.GetChild("txt_info_resist_guerrero").Show() self.GetChild("Thin_info_resist_guerrero").Show() self.GetChild("txt_info_resist_ninja").Show() self.GetChild("Thin_info_resist_ninja").Show() self.GetChild("txt_info_resist_sura").Show() self.GetChild("Thin_info_resist_sura").Show() self.GetChild("txt_info_resist_chaman").Show() self.GetChild("Thin_info_resist_chaman_").Show() self.GetChild("txt_info_onfensivo").Show() self.GetChild("txt_info_criticos").Show() self.GetChild("Thin_info_criticos").Show() self.GetChild("txt_info_penetracion").Show() self.GetChild("Thin_info_penetracion").Show() self.GetChild("txt_info_danomedia").Show() self.GetChild("Thin_info_danomedia").Show() self.GetChild("txt_info_danohabilidad").Show() self.GetChild("Thin_info_danohabilidad").Show() self.GetChild("txt_info_fmediohumano").Show() self.GetChild("Thin_info_fmediohumano").Show() self.GetChild("txt_info_fnomuerto").Show() self.GetChild("Thin_info_fnomuerto").Show() self.GetChild("txt_info_fdemonio").Show() self.GetChild("Thin_info_fdemonio").Show() self.GetChild("txt_info_fguerrero").Show() self.GetChild("Thin_info_fguerrero").Show() self.GetChild("txt_info_fninja").Show() self.GetChild("Thin_info_fninja").Show() self.GetChild("txt_info_fsura").Show() self.GetChild("Thin_info_fsura").Show() self.GetChild("txt_info_fcham").Show() self.GetChild("Thin_info_fcham").Show() def ActualizarBonus(self): self.GetChild("bonus_1").SetText(str(player.GetStatus(69))) self.GetChild("bonus_2").SetText(str(player.GetStatus(70))) self.GetChild("bonus_3").SetText(str(player.GetStatus(71))) self.GetChild("bonus_4").SetText(str(player.GetStatus(74))) self.GetChild("bonus_5").SetText(str(player.GetStatus(72))) self.GetChild("bonus_6").SetText(str(player.GetStatus(73))) self.GetChild("bonus_7").SetText(str(player.GetStatus(77))) self.GetChild("bonus_8").SetText(str(player.GetStatus(81))) self.GetChild("bonus_9").SetText(str(player.GetStatus(59))) self.GetChild("bonus_10").SetText(str(player.GetStatus(60))) self.GetChild("bonus_11").SetText(str(player.GetStatus(61))) self.GetChild("bonus_12").SetText(str(player.GetStatus(62))) self.GetChild("bonus_13").SetText(str(player.GetStatus(40))) self.GetChild("bonus_14").SetText(str(player.GetStatus(41))) self.GetChild("bonus_15").SetText(str(player.GetStatus(122))) self.GetChild("bonus_16").SetText(str(player.GetStatus(121))) self.GetChild("bonus_17").SetText(str(player.GetStatus(43))) self.GetChild("bonus_18").SetText(str(player.GetStatus(47))) self.GetChild("bonus_19").SetText(str(player.GetStatus(48))) self.GetChild("bonus_20").SetText(str(player.GetStatus(54))) self.GetChild("bonus_21").SetText(str(player.GetStatus(55))) self.GetChild("bonus_22").SetText(str(player.GetStatus(56))) self.GetChild("bonus_23").SetText(str(player.GetStatus(57))) En suite rendez vous tout tout à la fin et ajoutez : def OnUpdate(self): self.ActualizarBonus() Pour faire fonctionner le bouton "Minimiser" il faut (toujours dans le même fichier) trouver : wndItem = self.GetChild("ItemSlot") wndEquip = self.GetChild("EquipmentSlot") Et ajouter juste en dessous : self.ButonMinimize = self.GetChild2("OcultarTabla") self.ButonMinimize.SetEvent(ui.__mem_func__(self.MinimizarBonus)) Dans locale_fr : Trouvez et ouvrez le fichier "inventorywindow.py" Sélectionnez tout le début jusqu'à la ligne : (Arrêtez votre sélection juste avant cette ligne) ## Equipment Slot Et remplacez par : import uiScriptLocale import item EQUIPMENT_START_INDEX = 180 SPACE_BONUS_INVENTORY = 130 IMAGE_CHELO = "d:/ymir work/ui/public/Parameter_Slot_01.sub" window = { "name" : "InventoryWindow", ## 600 - (width + 오른쪽으로 부터 띄우기 24 px) "x" : SCREEN_WIDTH - 176 - SPACE_BONUS_INVENTORY, "y" : SCREEN_HEIGHT - 37 - 585, "style" : ("movable", "float",), "width" : 176 + SPACE_BONUS_INVENTORY, "height" : 585, "children" : ( ## Inventory, Equipment Slots { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 176 + SPACE_BONUS_INVENTORY, "height" : 585, "children" : ( ## Title { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 8, "y" : 7, "width" : 161 + SPACE_BONUS_INVENTORY, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x": (161 + SPACE_BONUS_INVENTORY) / 2, "y":3, "text":uiScriptLocale.INVENTORY_TITLE, "text_horizontal_align":"center" }, ), }, ##Ocultar table de bonus { "name" : "OcultarTabla", "type" : "button", "x" : 161 + SPACE_BONUS_INVENTORY - 30, "y" : 10, "default_image" : "d:/ymir work/ui/public/minimize_button_01.sub", "over_image" : "d:/ymir work/ui/public/minimize_button_02.sub", "down_image" : "d:/ymir work/ui/public/minimize_button_03.sub", "tooltip_text" : "Bonus", }, ################################################### ################################################### ################################################### #############Tabla de Bonus @Chelo############ #Bonus de Defenza.......................... { "name" : "txt_info_defenza", "type" : "horizontalbar", "x" : 176 - 7, "y" : 33, "width" : 125, "children" : ( { "name" : "bonus_text_1", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "Defensif", }, ), }, ######################################## { "name" : "txt_info_defenza_espada", "type" : "text", "x" : 176 - 5, "y" : 55, "text" : "Epee:" }, { "name" : "Thin_info_defenza_espada", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 55 - 2, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_1", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_defenza_2manos", "type" : "text", "x" : 176 - 5, "y" : 75, "text" : "Lance:" }, { "name" : "Thin_info_defenza_2manos", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 - 2, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_2", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_defenza_daga", "type" : "text", "x" : 176 - 5, "y" : 75 + 20, "text" : "Dague:" }, { "name" : "Thin_info_defenza_daga", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_3", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_defenza_Felcha", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20, "text" : "Fleche:" }, { "name" : "Thin_info_defenza_Felcha", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_4", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_defenza_campana", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20, "text" : "Gong:" }, { "name" : "Thin_info_defenza_campana", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_5", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_defenza_fan", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20, "text" : "Eventail:" }, { "name" : "Thin_info_defenza_fan", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_6", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_resist_Magia", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20, "text" : "Magie:" }, { "name" : "Thin_info_resist_Magia", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_7", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## ######################################## { "name" : "txt_info_resist_veneno", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Poison:" }, { "name" : "Thin_info_resist_veneno", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_8", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_resist_guerrero", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Guerrier:" }, { "name" : "Thin_info_resist_guerrero", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_9", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_resist_ninja", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Ninja:" }, { "name" : "Thin_info_resist_ninja", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_10", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_resist_sura", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Sura:" }, { "name" : "Thin_info_resist_sura", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_11", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ######################################## { "name" : "txt_info_resist_chaman", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Shaman:" }, { "name" : "Thin_info_resist_chaman_", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_12", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### #Bonus de onfensivo.......................... { "name" : "txt_info_onfensivo", "type" : "horizontalbar", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "width" : 125, "children" : ( { "name" : "bonus_text_2", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "Offensif", }, ), }, ######################################## { "name" : "txt_info_criticos", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Critique:" }, { "name" : "Thin_info_criticos", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_13", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_penetracion", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Percant:" }, { "name" : "Thin_info_penetracion", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_14", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_danomedia", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Degats moyen:" }, { "name" : "Thin_info_danomedia", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_15", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_danohabilidad", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Degats comp.:" }, { "name" : "Thin_info_danohabilidad", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_16", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fmediohumano", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Demi humains:" }, { "name" : "Thin_info_fmediohumano", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_17", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fnomuerto", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Mort vivant:" }, { "name" : "Thin_info_fnomuerto", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_18", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fdemonio", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Mal:" }, { "name" : "Thin_info_fdemonio", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_19", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fguerrero", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Guerrier:" }, { "name" : "Thin_info_fguerrero", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_20", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fninja", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Ninja:" }, { "name" : "Thin_info_fninja", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_21", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fsura", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Sura:" }, { "name" : "Thin_info_fsura", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_22", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### { "name" : "txt_info_fcham", "type" : "text", "x" : 176 - 5, "y" : 75 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "text" : "Shaman:" }, { "name" : "Thin_info_fcham", "type" : "image", "x" : 176 + SPACE_BONUS_INVENTORY - 65, "y" : 75 + 20 - 2 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20, "image" : IMAGE_CHELO, "children" : ( { "name" : "bonus_23", "type" : "text", "x" : 26, "y" : 3, "text" : "999", "r" : 1.0, "g" : 1.0, "b" : 1.0, "a" : 1.0, "text_horizontal_align":"center" }, ), }, ################################################### Et le tour est joué Petite astuce dans Notepad++ si en copiant/collant il vous remplace les tabulations par des espaces : Placez votre curseur là ou devraient être les tabulations, appuyez sur la touche de tabulation et appuyez sur la touche précédent. En faisant cette manip Notepad++ remplacera les espaces par le nombre de tabulation qu'il faut. Ce tutoriel est à présent terminé. Merci d'avoir lu en espérant en aider certains. Source : FreakGamers, et un peu moi ^^
  8. Bonjour, Module Loader est un projet similaire à Adhons les principales différence sont les fonctions et les modules (qui sont plus difficile a trouvé que les addons). Module Loader entièrement gratuit et si vous voulez les sources je peut vous les envoyé Lien : [Hidden Content] Contenu de l'archive : Le dossier "dev" avec quelques fichiers expliquant les fonctions disponibles. Le dossier module avec un fichier loader.swf et un fichier de configuration modules.txt (les modules à charger sont dans ce fichier). Le fichier dofus.dll (pour le menu au clic droit). Le fichier Dofus.exe (j'ai juste oublié de le viré de l'archive). Le fichier loader.swf qui permet de charger modules/loader.swf. Merci, --- Download
  9. Bonjour, Avant toute chose, je précise que ce partage m'a été demandé par Zano directement (on me pourra pas me dire "wesh dou ta l'droit d'partage comme ça?") Voici le partage officiel de Zano, via GitHub, d'Astria Map Editor V2, avec les sources et aussi une version compilée, en mode totalement offline (pas besoin de wamp). Voici directement le copié/collé de son partage sur un autre forum (aucun Hide en place car ceci n'est pas de moi mais de Zano, merci quand même de poster un remerciement à son égard) Je pense qu'il serait judicieux, pour ceux ayant les compétences, de travailler directement sur GitHub afin de continuer son travail. Encore merci à lui pour ce cadeau --- Download
  10. 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
  11. Bonjour Je vous fais un cours tutoriel sur l'extraction des SWF de Dofus l'officiel, ce tutoriel va surtout servir à compléter le tutoriel que je vais réaliser prochainement qui s'intitulera "Tutoriel SWF, Adapter les SWF de Dofus l'officiel pour 1.29" et donc avant de réaliser un tel tutoriel il faut bien que je vous apprenne comment extraire les fichiers D2P de Dofus l'officiel pour les adapter ensuite sur 1.29 donc pour votre serveur ! Je précise que le tutoriel est entièrement de moi. À l'heure où j'écris ces lignes je le commence tout juste, j'autorise le partage partout je suis POUR essayer de faire avancer la communauté et ne rien garder dans mon coin surtout que je quitte l'émulation Dofus ce sont en quelque sorte mes derniers cadeaux ! On va commencer ce mini-tutoriel ! Étape 1 : Télécharger le décompilateur D2P Ici, puis une fois téléchargé je vous invite à extraire le contenue du décompilateur sur votre bureau avec Winrar pour s'y retrouver plus facilement. C'est quoi un décompilateur ? un décompilateur sert à convertir un format dans un autre, par exemple avec les SWF de Dofus l'officiel a comme format de base D2P comme je vous le disais juste avant, grâce au décompilateur on va convertir les fichiers D2P en format SWL et ensuite en SWF ! Ah mais c'est quoi un format , un format et une extension de fichier, par exemple regardez une image et regardez la fin, en général c'est mon_image.png le .png est le format, il y a bien sûr énormément d'extensions mais c'est pas le but de ce tutoriel de vous les apprendre ! Et pourquoi aussi on convertit le fichier D2P en SWL puis en SWF ? Il y a trop de questions à se poser mais c'est sûrement la meilleur solution. Étape 2 : Rendez-vous dans votre dossier Dofus 2 (dofus l'officiel), et si vous ne l'avez pas, installez le Dofus officiel. Étape 3 : Une fois dans le dossier de Dofus 2 rendez-vous à ce chemin on va prendre pour exemple un D2P bien précis : C:\Program Files (x86)\Dofus2\app\content\gfx\sprites\bones0.d2p Étape 4 : Copiez/collez bones0.d2p sur votre bureau. Étape 5 : Rendez-vous sur votre décompilateur et ouvrez : TenkUnpacker.exe Étape 6 : Cliquez sur Parcourir et trouvez le fichier bones0.d2p qui est normalement sur votre bureau si vous m'avez écouté, cliquez sur Ouvrir et pour finir Extraire ! Maintenant si vous regardez dans votre dossier du décompilateur un dossier appelé "data" s'est créé. C'est très intéressant car il contient tous les fichiers extraits du fichier D2P en format SWL vous suivez toujours ? Étape 7 : Donc on a ce fameux dossier avec pleins de fichiers au format SWL, on ne les touche surtout pas, et maintenant ont va simplement ouvrir le logiciel TenkSwl.exe qui va enfin convertir tout seul les fichiers SWL en SWF ! Étape 8 : Il n'y a pas d'étape 8 si vous avez suivi le tutoriel, maintenant il vous reste plus qu'à vous rendre dans le dossier de votre décompilateur et de regarder le deuxième dossier qui s'est créé ! Appelé "data2" et tous les fichiers SWF se trouvent tout simplement dedans. Le tutoriel est terminé, vous avez extrait les fichiers de Dofus l'officiel en format D2P en SWF ! Une question ? Je suis la. Un merci je vous en remercie, un message sur le sujet et encore mieux. [Tutoriel SWF] Adapter les fichiers SWF de Dofus l'officiel pour Dofus 1.29 : À venir
  12. Régler bonnus dommages: Salut tout le monde ! je partage un tutoriel pour débug les bonnus de dommages. Pourquoi ce tuto ? Car certains serveurs ne prennent pas en compte les bonus de dégâts infligés. PS : Ce tutoriel vous servira également à savoir comment décompiler / recompiler des sources avec Eclipse ! Requis: - Eclipse (Editeur Java) - Sources de l'émulateur - Un cerveau 1. Commencez par ouvrir eclipse.exe 2. Vous cliquez sur "File" => "New" => "Java Project" 3. Mettez un nom de projet (N'importe, ce n'est pas important) 4. Après avoir entré un nom, faites "Entrée" de votre clavier. Le bouton "Next" va s'activer. Cliquez dessus. 5. Vous arrivez dans une nouvelles interface, avec plusieurs onglets. Cliquez sur librairies. 6. Encore une autre interface, avec plusieurs boutons. Cliquez sur ADD External Jars. Un menu va s'ouvrir pour charger les fichiers. 7. Les fichiers à charger sont dans le dossier sources de l'émulateur => libs. Vous sélectionnez tout les fichiers en même temps et vous cliquez sur "Ouvrir" 8. Votre projet est créé. Maintenant, faites comme dans les images suivante. 9. Cliquez sur la petite flèche à gauche du projet : 10. Vous voyez le dossier "src" à l'intérieur du projet ? Il faudra y déplacer à l'intérer 4 dossiers qui se situent dans les sources de l'émulateur. (En les déplaçant eclipse vous demandera une confirmation. cliquez simplement sur "ok" sans rien toucher.) 11. Voilà, vous avez décompilé vos sources ! A présent cliquez sur la flèche à gauche de "src" => "common". Double-cliquez sur "Constants.java" 12. Maintenant faites "CTRL + F" et recherchez cette ligne "public static final int STATS_ADD_DOMA" 13. Vous arrivez à la ligne recherchée et si cette ligne affiche "public static final int STATS_ADD_DOMA = 112; remplacez "112" par "121" : 13. Maintenant enregistrez en cliquant sur la petite disquette en-dessous du bouton "Edit". 14. Maintenant cliquez sur "File" => "Run as" => "Java application". C'est pour vérifier s'il n'y pas d'erreur. 15. Maintenant recliquez sur "File" => "Export" => Runnable JAR file => "Next" => "Launch configuration" Sélectionnez le nom de votre projet. Et pour "Export destination" faites "Browse" => DossierDeVotreEmu => et si vous avez ancestra.jar dans le dossier, renommez le fichier à exporter en "ancestra.jar" faites "Finish". Faites toujours "Ok", et si vous avez renommé comme il faut, eclipse vous dira que le fichier existe déjà et si vous voulez le remplacer. Faites "oui". 16. Voilà les sources sont recompilées. Il ne reste plus qu'à lancer votre serveur et de profiter à fond le jeu !! P.S : Merci de respecter mon travail. Pour toutes questions mon skype est disponible sur mon profil. Cordialement, Xyuka alias YellowLean.
  13. Bonjour, C'est la première fois que j'écris dans cette catégorie, j’espère donc ne pas faire de grosse erreur, et ne rien oublier ! 1. Présentation du cheat : Les cheats s'utilisent tous de la même façon : Par injection. Ce sont donc des dll qui s'injectent. Cette archive contient : -Injecteur 32 bits -Injecteur 64 bits -InviDropper -PickUp-Bot -SendAttackToTarget -Spam-Bot -Switch-Bot -Tools einstellen -Upp-Tool De quoi bien vous amusez. 2. Comment l'utiliser ? Vous allez donc ouvrir l'injecteur qui correspond à votre version (si vous ne connaissez pas votre version, tutoriel à la fin de celui si !), (votre antivirus peut ne pas l'aimer, mais pas de panique !). Une fois ouvert : -Appuyez sur Browse dll et rendez vous sur les dll que je vous ai fournis. -Vérifiez que la case "Deactivate" n'est pas cocher, sinon votre dll ne serait pas injecter. -Sélectionnez ensuite votre processus selon votre client. -Pour finir appuyez sur le bouton "Inject", et voilà ! J'espere que ça vous plaira ! Téléchargement : ici Lien virustotal : ici Cordialement. --- Download
  14. Citation de Azendar. [glow=red]Lien remplacé et fonctionnel, merci Ebrius.[/glow] ---------------------------------------------------------------------- Je vous partage le célèbre crack.exe de Ygg pour éviter de mettre la licence. Je ne me souviens plus qui a fait ce magnifique crack, m'enfin, je souhaite vous le partager quand même. crack.exe à mettre dans votre dossier d'Ygg. *Modification* Lien : clique ici (MegaU) VirusScan : clique ici (VirusTotal) Cordialement, Spyrow. --- Download
  15. Bonjour, Je viens vous partager un CMS développer en Laravel 5.1 par Synthx sous un design réaliser par Nicow. Fonctionnalité : Pages classiques (CGU, Règlement, Staff, News, etc...) Gestion de compte Ladder Mises à jours Achat de points (Starpass) Mode VIP (désactivable) Loterie Vote par IP Confirmation du vote avec vérification de la valeur OUT Boutique avec stock Téléchargement : GitHub --- Download
  16. Coucou, Je viens vous montrer comment ajouter un format d'image supplémentaire lisible par votre lanceur. Dans le projet ScriptLib, ouvrez le dossier Resource.cpp et chercher: m_resManager.RegisterResourceNewFunctionPointer("bmp", NewImage); Ajouter en bas le format que vous voulez ajoutez ( donc pour moi png ): m_resManager.RegisterResourceNewFunctionPointer("png", NewImage);
  17. Bonjour, J'ai décidé de refaire ce tutoriel Aujourd'hui je vais vous expliquer comment ajouté l'option "détruire" lorsque vous voulez jeter un item. Ca va être assez long, mais facile si vous suivez bien le tutoriel. Commençons ______________________________________________________________________ PRÉREQUIS ______________________________________________________________________ 1.Des source Serveur 2.Des sources Client 3.Un client ______________________________________________________________________ 1.SOURCE SERVEUR ______________________________________________________________________ Ouvrez votre "packet.h" et recherchez: HEADER_CG_ITEM_DROP2 = 20, Ajoutez ceci juste en dessous: HEADER_CG_ITEM_DESTROY = 21, Recherchez maintenant: typedef struct command_item_drop2 { BYTE header; TItemPos Cell; DWORD gold; BYTE count; } TPacketCGItemDrop2; Ajoutez ceci juste en dessous: typedef struct command_item_destroy { BYTE header; TItemPos Cell; } TPacketCGItemDestroy; Ouvrez maintenant le fichier packet_info.cpp et recherchez: Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", true); Ajoutez ceci juste en dessous: Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", true); Ouvrez maintenant le fichier input_main.cpp et recherchez la fonction: void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) Ajoutez cette fonction juste après: void CInputMain::ItemDestroy(LPCHARACTER ch, const char * data) { struct command_item_destroy * pinfo = (struct command_item_destroy *) data; if (ch) ch->DestroyItem(pinfo->Cell); } Cherchez maintenant ceci: case HEADER_CG_ITEM_DROP2: if (!ch->IsObserverMode()) ItemDrop2(ch, c_pData); break; Et ajoutez: case HEADER_CG_ITEM_DESTROY: if (!ch->IsObserverMode()) ItemDestroy(ch, c_pData); break; Ouvrez maintenant le fichier char_item.cpp et recherchez la fonction: bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount) Ajoutez cette fonction juste au-dessus: bool CHARACTER::DestroyItem(TItemPos Cell) { LPITEM item = NULL; if (!CanHandleItem()) { if (NULL != DragonSoul_RefineWindow_GetOpener()) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°*È*âÀ» ¿¬ »óÅ¿¡¼*´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù.")); return false; } if (IsDead()) return false; if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell))) return false; if (item->IsExchanging()) return false; if (true == item->isLocked()) return false; if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true) return false; if (item->GetCount() <= 0) return false; SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255); ITEM_MANAGER::instance().RemoveItem(item); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("L'item %s est desormais detruit."), item->GetName()); return true; } Ouvrez maintenant le fichier char.h et recherchez: bool DropItem(TItemPos Cell, BYTE bCount=0); Ajoutez ceci juste au-dessus: bool DestroyItem(TItemPos Cell); Ouvrez maintenant le fichier input.h et recherchez: void ItemDrop2(LPCHARACTER ch, const char * data); Ajoutez ceci juste en dessous: void ItemDestroy(LPCHARACTER ch, const char * data); ______________________________________________________________________ 2. SOURCE CLIENT ______________________________________________________________________ Ouvrez le fichier packet.h et recherchez: HEADER_CG_ITEM_DROP2 = 20, Ajoutez ceci juste en dessous: HEADER_CG_ITEM_DESTROY = 21, Recherchez maintenant: typedef struct command_item_drop2 { BYTE header; TItemPos pos; DWORD gold; BYTE count; } TPacketCGItemDrop2; Ajoutez ceci juste en dessous: typedef struct command_item_destroy { BYTE header; TItemPos pos; }TPacketCGItemDestroy; Ouvrez maintenant le fichier PythonNetworkStreamPhaseGameItem.cpp et recherchez la fonction: bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count) Ajoutez cette fonction juste en dessous: bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos) { if (!__CanActMainInstance()) return true; TPacketCGItemDestroy itemDestroyPacket; itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY; itemDestroyPacket.pos = pos; if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket)) { Tracen("SendItemDestroyPacket Error"); return false; } return SendSequence(); } Ouvrez maintenant le fichier PythonNetworkStreamModule.cpp et recherchez la fonction: PyObject* netSendItemDropPacket(PyObject* poSelf, PyObject* poArgs) Ajoutez cette fonction juste en dessous: PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs) { TItemPos Cell; if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BuildException(); CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance(); rkNetStream.SendItemDestroyPacket(Cell); return Py_BuildNone(); } Recherchez maintenant: { "SendItemDropPacketNew", netSendItemDropPacketNew, METH_VARARGS }, Ajoutez ceci juste après: { "SendItemDestroyPacket", netSendItemDestroyPacket, METH_VARARGS }, Ouvrez maintenant le fichier PythonNetworkStream.h et recherchez la fonction: bool SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count); Ajoutez ceci juste après: bool SendItemDestroyPacket(TItemPos pos); ______________________________________________________________________ 3. PYTHON CLIENT ______________________________________________________________________ Ouvrez le fichier uicommon.py du pack root et recherchez la class: class QuestionDialog(ui.ScriptWindow): Juste après celle class, ajoutez la class suivante: class QuestionDialogItem(ui.ScriptWindow): def __init__(self): ui.ScriptWindow.__init__(self) self.__CreateDialog() def __del__(self): ui.ScriptWindow.__del__(self) def __CreateDialog(self): pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "uiscript/questiondialogitem.py") self.board = self.GetChild("board") self.textLine = self.GetChild("message") self.acceptButton = self.GetChild("accept") self.destroyButton = self.GetChild("destroy") self.cancelButton = self.GetChild("cancel") def Open(self): self.SetCenterPosition() self.SetTop() self.Show() def Close(self): self.Hide() def SetWidth(self, width): height = self.GetHeight() self.SetSize(width, height) self.board.SetSize(width, height) self.SetCenterPosition() self.UpdateRect() def SAFE_SetAcceptEvent(self, event): self.acceptButton.SAFE_SetEvent(event) def SAFE_SetCancelEvent(self, event): self.cancelButton.SAFE_SetEvent(event) def SetAcceptEvent(self, event): self.acceptButton.SetEvent(event) def SetDestroyEvent(self, event): self.destroyButton.SetEvent(event) def SetCancelEvent(self, event): self.cancelButton.SetEvent(event) def SetText(self, text): self.textLine.SetText(text) def SetAcceptText(self, text): self.acceptButton.SetText(text) def SetCancelText(self, text): self.cancelButton.SetText(text) def OnPressEscapeKey(self): self.Close() return True Ouvrez maintenant le fichier game.py et cherchez la def suivante: def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): Recherchez ce bout de code dans la fonction (2x): itemDropQuestionDialog = uiCommon.QuestionDialog() Remplacez par: itemDropQuestionDialog = uiCommon.QuestionDialogItem() Toujours dans la même fonction, recherchez: itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) Ajoutez ceci juste après: itemDropQuestionDialog.SetDestroyEvent(lambda arg=True: self.RequestDestroyItem(arg)) Recherchez maintenant la fonction: def RequestDropItem(self, answer): Ajoutez cette fonction juste après: def RequestDestroyItem(self, answer): if not self.itemDropQuestionDialog: return if answer: dropType = self.itemDropQuestionDialog.dropType dropNumber = self.itemDropQuestionDialog.dropNumber if player.SLOT_TYPE_INVENTORY == dropType: if dropNumber == player.ITEM_MONEY: return else: self.__SendDestroyItemPacket(dropNumber) self.itemDropQuestionDialog.Close() self.itemDropQuestionDialog = None constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) Recherchez ensuite la fonction: def __SendDropItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY): Et ajoutez celle-ci juste après: def __SendDestroyItemPacket(self, itemVNum, itemInvenType = player.INVENTORY): if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return net.SendItemDestroyPacket(itemVNum) Ouvrez maintenant le fichier locale_interface.txt et ajoutez ceci: DESTROY Destroy Placez le fichier questiondialogitem.py dans votre pack uiscript ! LIEN FE Screen du système: Voilà c'est fini ! Source du totoriel : .Avenue™ de Metin2Dev Traduction: moi Cordialement, #Saw.
  18. Verrouillage/Déverrouillage d'inventaire système de l'officiel. 1) Qu'est ce que c'est ? 2) Les Prérequis 3) Les téléchargements 1) Qu'est ce que c'est ? Le Système de Verrouillage/Déverrouillage d'inventaire est un verrou poser sur certains espaces de vos inventaire ( jusqu'à 4 inventaires ) Pour les déverrouiller il vous faut un item appeler Clé d'inventaire . Vidéos Screens Des images et vidéos valent mieux qu'un tas de mots sur une page blanche. 2) Les Prérequis Avoir des files et un client Disposez des 4 inventaires ( L'inventaires 3 et 4 doit être vide autrement cela vous empêchera de connecter le personnages en question.) Sources Client / Game / DB Les fichiers à télécharger et votre tête! 3) Les téléchargements Comme à mon habitude le tutoriel ce trouve à l'intérieur du .rar. Changelog : Sachez encore une fois que ce partage n'est pas de moi mais qu'il provient de TurkMmo. La traduction/réorganisation du tutoriel est cependant de moi. Lien mis à jour avec la correction : Cliquez ici FEV1 FEV2 GitHubV2 Cordialement, History.
  19. Salut à tous ! Je vous partage aujourd'hui une exclusivité de emulation-bay crée par Agronaque alias Rayz. Un petit bijoux attirant vos joueurs à voter ! Description : La quête Vote4BeTheBest.quest vous servira à faire voter vos joueurs pour votre serveur. En guise de récompense, ils gagneront un bonus simple dans une branche particulière (maxhp, def, attaque, magie) Version 1.0 Version 1.1 Vous vous loguez et vous recevez une lettre directement nommée "Votez et gagnez un bonus". Il vous suffit de cliquer dessus afin de voter dans le vote1, 2 ou 3 et ainsi gagner un petit bonus pour améliorer votre personnage. Si vous êtes GM, vous aurez droit au panel de configuration des adresses topsite et à une page internet Google simple. Vidéo :
  20. Bonjour, J'ai remarqué que beaucoup n'arrivaient plus à avoir la version v1.3 du repacker de Moustikk du à un problème de mises à jour... Bien à vous, --- Download
  21. Bonjour à tous, je vous partage donc un partage d'epvps pour ne plus avoir besoin de txt et reprendre donc l'ancien systeme via mysql. Pour ce faire on se rend donc dans ClientManagerBoot.cpp qui se trouve donc dans mainline/srcs/server/db/src. Ensuite il vous faudra remplacer bool CClientManager::InitializeItemTable() { //================== ÇÔ¼ö ¼³¸à ==================// //1. ¿ä¾à : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ÆÄÀÃÀ» ÀðÃ, // (TItemTable), ¿ÀºêçƮ¸¦ »ý¼ºÇÑ´Ù. //2. ¼ø¼ // 1) 'item_names.txt' ÆÄÀÃÀ» ÀÃ¾î¼ (a)[localMap](vnum:name) ¸ÊÀ» ¸¸µç´Ù. // 2) 'item_proto_text.txt'ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (b)[test_map_itemTableByVnum](vnum:TItemTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. // 3) 'item_proto.txt' ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (!)[item_table], À» ¸¸µç´Ù. // <Âü°Ã> // °¢ row µé Ãß, // (b)[test_map_itemTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_itemTableByVnum]ÀÇ °ÃÀ» »ç¿ëÇÑ´Ù. // 4) (b)[test_map_itemTableByVnum]ÀÇ rowÃß, (!)[item_table]¿¡ ¾ø´Â °ÃÀ» Ãß°¡ÇÑ´Ù. //3. Å×½ºÆ® // 1)'item_proto.txt' 亸°¡ item_table¿¡ Àß µé¾î°¬´ÂÃö. -> ¿Ã·á // 2)'item_names.txt' 亸°¡ item_table¿¡ Àß µé¾î°¬´ÂÃö. // 3)'item_proto_test.txt' ¿¡¼ [°ãÄ¡´Â] 亸°¡ item_table ¿¡ Àß µé¾î°¬´ÂÃö. // 4)'item_proto_test.txt' ¿¡¼ [»õ·Î¿î] 亸°¡ item_table ¿¡ Àß µé¾î°¬´ÂÃö. // 5) (ÃÖþ) °ÔÀÓ Ŭ¶óÀ̾ðÆ®¿¡¼ æ´ë·Î ÀÛµ¿ ÇôÂÃö. //_______________________________________________// //=================================================================================// // 1) 'item_names.txt' ÆÄÀÃÀ» ÀÃ¾î¼ (a)[localMap](vnum:name) ¸ÊÀ» ¸¸µç´Ù. //=================================================================================// bool isNameFile = true; map localMap; cCsvTable nameData; if(!nameData.Load("item_names.txt",'\t')) { fprintf(stderr, "item_names.txt was loaded successfully.\n"); isNameFile = false; } else { nameData.Next(); while(nameData.Next()) { localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1); } } //_________________________________________________________________// //=================================================================// // 2) 'item_proto_text.txt'ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (b)[test_map_itemTableByVnum](vnum:TItemTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. //=================================================================// map test_map_itemTableByVnum; //1. ÆÄÀà Àþî¿À±â. cCsvTable test_data; if(!test_data.Load("item_proto_test.txt",'\t')) { fprintf(stderr, "item_proto_test.txt was loaded successfully.\n"); //return false; } else { test_data.Next(); //¼³¸à ·Î¿ì ³Ñ¾î°¡±â. //2. Å×½ºÆ® ¾ÆÀÌÅÛ Å×ÀÌºà »ý¼º. TItemTable * test_item_table = NULL; int test_itemTableSize = test_data.m_File.GetRowCount()-1; test_item_table = new TItemTable[test_itemTableSize]; memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize); //3. Å×½ºÆ® ¾ÆÀÌÅÛ Å×À̺ÿ¡ °ªÀ» ³Ö°Ã, ¸Ê¿¡±îÃö ³Ö±â. while(test_data.Next()) { if (!Set_Proto_Item_Table(test_item_table, test_data, localMap)) { fprintf(stderr, "¾ÆÀÌÅÛ Ç÷ÎÅä Å×ÀÌºà ¼ÂÆà ½ÇÆÃ.\n"); } test_map_itemTableByVnum.insert(std::map::value_type(test_item_table->dwVnum, test_item_table)); test_item_table++; } } //______________________________________________________________________// //========================================================================// // 3) 'item_proto.txt' ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (!)[item_table], À» ¸¸µç´Ù. // <Âü°Ã> // °¢ row µé Ãß, // (b)[test_map_itemTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_itemTableByVnum]ÀÇ °ÃÀ» »ç¿ëÇÑ´Ù. //========================================================================// //vnumµéÀ» ÀúÀåÇÒ ¼Â. »õ·Î¿î Å×½ºÆ® ¾ÆÀÌÅÛÀ» ÆǺ°ÇÒ¶§ »ç¿ëµÈ´Ù. set vnumSet; //ÆÄÀà Àþî¿À±â. cCsvTable data; if(!data.Load("item_proto.txt",'\t')) { fprintf(stderr, "item_proto.txt was loaded successfully.\n"); return false; } data.Next(); //¸Ç ÀÃ٠æ¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸ÃÇô ºÎºÃ) if (!m_vec_itemTable.empty()) { sys_log(0, "RELOAD: item_proto"); m_vec_itemTable.clear(); m_map_itemTableByVnum.clear(); } //===== ¾ÆÀÌÅÛ Å×ÀÌºà »ý¼º =====// //»õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆľÇÇÑ´Ù. int addNumber = 0; while(data.Next()) { int vnum = atoi(data.AsStringByIndex(0)); std::map::iterator it_map_itemTable; it_map_itemTable = test_map_itemTableByVnum.find(vnum); if(it_map_itemTable != test_map_itemTableByVnum.end()) { addNumber++; } } //data¸¦ ´Ù½Ã ùÃÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àþî¿Â´Ù; data.Destroy(); if(!data.Load("item_proto.txt",'\t')) { fprintf(stderr, "item_proto.txt was loaded successfully.\n"); return false; } data.Next(); //¸Ç ÀÃ٠æ¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸ÃÇô ºÎºÃ) m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber); memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size()); int testValue = m_vec_itemTable.size(); TItemTable * item_table = &m_vec_itemTable[0]; while (data.Next()) { int col = 0; std::map::iterator it_map_itemTable; it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col))); if(it_map_itemTable == test_map_itemTableByVnum.end()) { //°¢ Ä®·³ µ¥ÀÌÅà ÀúÀå if (!Set_Proto_Item_Table(item_table, data, localMap)) { fprintf(stderr, "¾ÆÀÌÅÛ Ç÷ÎÅä Å×ÀÌºà ¼ÂÆà ½ÇÆÃ.\n"); } } else { //$$$$$$$$$$$$$$$$$$$$$$$ Å×½ºÆ® ¾ÆÀÌÅÛ Ã¤º¸°¡ ÀÖ´Ù! TItemTable *tempTable = it_map_itemTable->second; item_table->dwVnum = tempTable->dwVnum; strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName)); strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName)); item_table->bType = tempTable->bType; item_table->bSubType = tempTable->bSubType; item_table->bSize = tempTable->bSize; item_table->dwAntiFlags = tempTable->dwAntiFlags; item_table->dwFlags = tempTable->dwFlags; item_table->dwWearFlags = tempTable->dwWearFlags; item_table->dwImmuneFlag = tempTable->dwImmuneFlag; item_table->dwGold = tempTable->dwGold; item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice; item_table->dwRefinedVnum =tempTable->dwRefinedVnum; item_table->wRefineSet =tempTable->wRefineSet; item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct; item_table->cLimitRealTimeFirstUseIndex = -1; item_table->cLimitTimerBasedOnWearIndex = -1; int i; for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { item_table->aLimits.bType = tempTable->aLimits.bType; item_table->aLimits.lValue = tempTable->aLimits.lValue; if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType) item_table->cLimitRealTimeFirstUseIndex = (char)i; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType) item_table->cLimitTimerBasedOnWearIndex = (char)i; } for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { item_table->aApplies.bType = tempTable->aApplies.bType; item_table->aApplies.lValue = tempTable->aApplies.lValue; } for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i) item_table->alValues = tempTable->alValues; item_table->bGainSocketPct = tempTable->bGainSocketPct; item_table->sAddonType = tempTable->sAddonType; item_table->bWeight = tempTable->bWeight; } vnumSet.insert(item_table->dwVnum); m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); ++item_table; } //_______________________________________________________________________// //========================================================================// // 4) (b)[test_map_itemTableByVnum]ÀÇ rowÃß, (!)[item_table]¿¡ ¾ø´Â °ÃÀ» Ãß°¡ÇÑ´Ù. //========================================================================// test_data.Destroy(); if(!test_data.Load("item_proto_test.txt",'\t')) { fprintf(stderr, "item_proto_test.txt was loaded successfully.\n"); //return false; } else { test_data.Next(); //¼³¸à ·Î¿ì ³Ñ¾î°¡±â. while (test_data.Next()) //Å×½ºÆ® µ¥ÀÌÅà °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÃÀ» Ãß°¡ÇÑ´Ù. { //Ãߺ¹µÇ´Â ºÎºÃÀ̸é ³Ñ¾î°£´Ù. set::iterator itVnum; itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0))); if (itVnum != vnumSet.end()) { continue; } if (!Set_Proto_Item_Table(item_table, test_data, localMap)) { fprintf(stderr, "¾ÆÀÌÅÛ Ç÷ÎÅä Å×ÀÌºà ¼ÂÆà ½ÇÆÃ.\n"); } m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); item_table++; } } // QUEST_ITEM_PROTO_DISABLE // InitializeQuestItemTable(); // END_OF_QUEST_ITEM_PROTO_DISABLE m_map_itemTableByVnum.clear(); itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); while (it != m_vec_itemTable.end()) { TItemTable * item_table = &(*(it++)); sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u", item_table->dwVnum, item_table->szName, item_table->szLocaleName, item_table->alValues[0], item_table->alValues[1], item_table->alValues[2], item_table->alValues[3], item_table->alValues[4], item_table->alValues[5], item_table->dwWearFlags, item_table->dwAntiFlags, item_table->dwImmuneFlag, item_table->dwRefinedVnum, item_table->wRefineSet, item_table->bAlterToMagicItemPct); m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); } sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum()); return true; } par bool CClientManager::InitializeItemTable() { char query[2048]; fprintf(stderr,"Loading item_proto from MySQL"); snprintf(query, sizeof(query), "SELECT vnum,name,%s,type,subtype,weight,size,antiflag,flag,wearflag,immuneflag+0,gold,shop_buy_price,refined_vnum," "refine_set,magic_pct,limittype0,limitvalue0,limittype1,limitvalue1,applytype0,applyvalue0," "applytype1,applyvalue1,applytype2,applyvalue2,value0,value1,value2,value3,value4,value5,socket_pct,addon_type FROM item_proto%s ORDER BY vnum", g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) return false; int addNumber = pRes->uiNumRows; if (!m_vec_itemTable.empty()) { sys_log(0, "RELOAD: item_proto"); m_vec_itemTable.clear(); m_map_itemTableByVnum.clear(); } m_vec_itemTable.resize(addNumber-1); memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size()); TItemTable * item_table = &m_vec_itemTable[0]; MYSQL_ROW data; //return true; set vnumSet; while ((data = mysql_fetch_row(pRes->pSQLResult))) { str_to_number(item_table->dwVnum, data[0]); strlcpy(item_table->szName,data[1] , sizeof(item_table->szName)); strlcpy(item_table->szLocaleName, data[2], sizeof(item_table->szLocaleName)); str_to_number(item_table->bType, data[3]); str_to_number(item_table->bSubType, data[4]); str_to_number(item_table->bWeight, data[5]); str_to_number(item_table->bSize, data[6]); str_to_number(item_table->dwAntiFlags, data[7]); str_to_number(item_table->dwFlags, data[8]); str_to_number(item_table->dwWearFlags, data[9]); str_to_number(item_table->dwImmuneFlag, data[10]); str_to_number(item_table->dwGold, data[11]); str_to_number(item_table->dwShopBuyPrice, data[12]); str_to_number(item_table->dwRefinedVnum, data[13]); str_to_number(item_table->wRefineSet, data[14]); str_to_number(item_table->bAlterToMagicItemPct, data[15]); item_table->cLimitRealTimeFirstUseIndex = -1; item_table->cLimitTimerBasedOnWearIndex = -1; str_to_number(item_table->aLimits[0].bType, data[16]); str_to_number(item_table->aLimits[0].lValue, data[17]); if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[0].bType) item_table->cLimitRealTimeFirstUseIndex = (char)0; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[0].bType) item_table->cLimitTimerBasedOnWearIndex = (char)0; str_to_number(item_table->aLimits[1].bType, data[18]); str_to_number(item_table->aLimits[1].lValue, data[19]); if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[1].bType) item_table->cLimitRealTimeFirstUseIndex = (char)1; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[1].bType) item_table->cLimitTimerBasedOnWearIndex = (char)1; str_to_number(item_table->aApplies[0].bType, data[20]); str_to_number(item_table->aApplies[0].lValue, data[21]); str_to_number(item_table->aApplies[1].bType, data[22]); str_to_number(item_table->aApplies[1].lValue, data[23]); str_to_number(item_table->aApplies[2].bType, data[24]); str_to_number(item_table->aApplies[2].lValue, data[25]); str_to_number(item_table->alValues[0], data[26]); str_to_number(item_table->alValues[1], data[27]); str_to_number(item_table->alValues[2], data[28]); str_to_number(item_table->alValues[3], data[29]); str_to_number(item_table->alValues[4], data[30]); str_to_number(item_table->alValues[5], data[31]); str_to_number(item_table->bGainSocketPct, data[32]); str_to_number(item_table->sAddonType, data[33]); vnumSet.insert(item_table->dwVnum); m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); sys_log(0, "ITEM: #%-5lu %-24s %-24s VAL: %d %ld %d %d %d %d WEAR %d ANTI %d IMMUNE %d REFINE %lu REFINE_SET %u MAGIC_PCT %u", item_table->dwVnum, item_table->szName, item_table->szLocaleName, item_table->alValues[0], item_table->alValues[1], item_table->alValues[2], item_table->alValues[3], item_table->alValues[4], item_table->alValues[5], item_table->dwWearFlags, item_table->dwAntiFlags, item_table->dwImmuneFlag, item_table->dwRefinedVnum, item_table->wRefineSet, item_table->bAlterToMagicItemPct); item_table++; } fprintf(stderr," Complete! %d Items loaded.\r\n",addNumber); return true; } et bool CClientManager::InitializeMobTable() { //================== ÇÔ¼ö ¼³¸í ==================// //1. ¿ä¾à : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ÆÄÀÏÀ» Àаí, // (!)[mob_table] Å×ÀÌºí ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù. (ŸÀÔ : TMobTable) //2. ¼ø¼­ // 1) 'mob_names.txt' ÆÄÀÏÀ» Àо (a)[localMap](vnum:name) ¸ÊÀ» ¸¸µç´Ù. // 2) 'mob_proto_test.txt'ÆÄÀÏ°ú (a)[localMap] ¸ÊÀ¸·Î // (b)[test_map_mobTableByVnum](vnum:TMobTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. // 3) 'mob_proto.txt' ÆÄÀÏ°ú (a)[localMap] ¸ÊÀ¸·Î // (!)[mob_table] Å×À̺íÀ» ¸¸µç´Ù. // <Âü°í> // °¢ row µé Áß, // (b)[test_map_mobTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_mobTableByVnum]ÀÇ °ÍÀ» »ç¿ëÇÑ´Ù. // 4) (b)[test_map_mobTableByVnum]ÀÇ rowÁß, (!)[mob_table]¿¡ ¾ø´Â °ÍÀ» Ãß°¡ÇÑ´Ù. //3. Å×½ºÆ® // 1)'mob_proto.txt' Á¤º¸°¡ mob_table¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á // 2)'mob_names.txt' Á¤º¸°¡ mob_table¿¡ Àß µé¾î°¬´ÂÁö. // 3)'mob_proto_test.txt' ¿¡¼­ [°ãÄ¡´Â] Á¤º¸°¡ mob_table ¿¡ Àß µé¾î°¬´ÂÁö. // 4)'mob_proto_test.txt' ¿¡¼­ [»õ·Î¿î] Á¤º¸°¡ mob_table ¿¡ Àß µé¾î°¬´ÂÁö. // 5) (ÃÖÁ¾) °ÔÀÓ Å¬¶óÀ̾ðÆ®¿¡¼­ Á¦´ë·Î ÀÛµ¿ ÇÏ´ÂÁö. //_______________________________________________// //===============================================// // 1) 'mob_names.txt' ÆÄÀÏÀ» Àо (a)[localMap] ¸ÊÀ» ¸¸µç´Ù. //<(a)localMap ¸Ê »ý¼º> map localMap; bool isNameFile = true; //<ÆÄÀÏ Àбâ> cCsvTable nameData; if(!nameData.Load("mob_names.txt",'\t')) { fprintf(stderr, "mob_names.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); isNameFile = false; } else { nameData.Next(); //¼³¸írow »ý·«. while(nameData.Next()) { localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1); } } //________________________________________________// //===============================================// // 2) 'mob_proto_test.txt'ÆÄÀÏ°ú (a)localMap ¸ÊÀ¸·Î // (b)[test_map_mobTableByVnum](vnum:TMobTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. //0. set vnumSet; //Å×½ºÆ®¿ë ÆÄÀÏ µ¥ÀÌÅÍÁß, ½Å±Ô¿©ºÎ È®Àο¡ »ç¿ë. //1. ÆÄÀÏ Àоî¿À±â bool isTestFile = true; cCsvTable test_data; if(!test_data.Load("mob_proto_test.txt",'\t')) { fprintf(stderr, "Å×½ºÆ® ÆÄÀÏÀÌ ¾ø½À´Ï´Ù. ±×´ë·Î ÁøÇàÇÕ´Ï´Ù.\n"); isTestFile = false; } //2. (c)[test_map_mobTableByVnum](vnum:TMobTable) ¸Ê »ý¼º. map test_map_mobTableByVnum; if (isTestFile) { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. //¤¡. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí »ý¼º. TMobTable * test_mob_table = NULL; int test_MobTableSize = test_data.m_File.GetRowCount()-1; test_mob_table = new TMobTable[test_MobTableSize]; memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize); //¤¤. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí¿¡ °ªÀ» ³Ö°í, ¸Ê¿¡±îÁö ³Ö±â. while(test_data.Next()) { if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n"); } test_map_mobTableByVnum.insert(std::map::value_type(test_mob_table->dwVnum, test_mob_table)); ++test_mob_table; } } // 3) 'mob_proto.txt' ÆÄÀÏ°ú (a)[localMap] ¸ÊÀ¸·Î // (!)[mob_table] Å×À̺íÀ» ¸¸µç´Ù. // <Âü°í> // °¢ row µé Áß, // (b)[test_map_mobTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_mobTableByVnum]ÀÇ °ÍÀ» »ç¿ëÇÑ´Ù. //1. ÆÄÀÏ Àбâ. cCsvTable data; if(!data.Load("mob_proto.txt",'\t')) { fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¼³¸í row ³Ñ¾î°¡±â //2. (!)[mob_table] »ý¼ºÇϱâ //2.1 »õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆÄ¾Ç int addNumber = 0; while(data.Next()) { int vnum = atoi(data.AsStringByIndex(0)); std::map::iterator it_map_mobTable; it_map_mobTable = test_map_mobTableByVnum.find(vnum); if(it_map_mobTable != test_map_mobTableByVnum.end()) { addNumber++; } } //data¸¦ ´Ù½Ã ùÁÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àоî¿Â´Ù; data.Destroy(); if(!data.Load("mob_proto.txt",'\t')) { fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ) //2.2 Å©±â¿¡ ¸Â°Ô mob_table »ý¼º if (!m_vec_mobTable.empty()) { sys_log(0, "RELOAD: mob_proto"); m_vec_mobTable.clear(); } m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber); memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size()); TMobTable * mob_table = &m_vec_mobTable[0]; //2.3 µ¥ÀÌÅÍ Ã¤¿ì±â while (data.Next()) { int col = 0; //(b)[test_map_mobTableByVnum]¿¡ °°Àº row°¡ ÀÖ´ÂÁö Á¶»ç. bool isSameRow = true; std::map::iterator it_map_mobTable; it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col))); if(it_map_mobTable == test_map_mobTableByVnum.end()) { isSameRow = false; } //°°Àº row °¡ ÀÖÀ¸¸é (b)¿¡¼­ Àоî¿Â´Ù. if(isSameRow) { TMobTable *tempTable = it_map_mobTable->second; mob_table->dwVnum = tempTable->dwVnum; strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName)); strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName)); mob_table->bRank = tempTable->bRank; mob_table->bType = tempTable->bType; mob_table->bBattleType = tempTable->bBattleType; mob_table->bLevel = tempTable->bLevel; mob_table->bSize = tempTable->bSize; mob_table->dwAIFlag = tempTable->dwAIFlag; mob_table->dwRaceFlag = tempTable->dwRaceFlag; mob_table->dwImmuneFlag = tempTable->dwImmuneFlag; mob_table->bEmpire = tempTable->bEmpire; strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName)); mob_table->bOnClickType = tempTable->bOnClickType; mob_table->bStr = tempTable->bStr; mob_table->bDex = tempTable->bDex; mob_table->bCon = tempTable->bCon; mob_table->bInt = tempTable->bInt; mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0]; mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1]; mob_table->dwMaxHP = tempTable->dwMaxHP; mob_table->bRegenCycle = tempTable->bRegenCycle; mob_table->bRegenPercent = tempTable->bRegenPercent; mob_table->dwGoldMin = tempTable->dwGoldMin; mob_table->dwGoldMax = tempTable->dwGoldMax; mob_table->dwExp = tempTable->dwExp; mob_table->wDef = tempTable->wDef; mob_table->sAttackSpeed = tempTable->sAttackSpeed; mob_table->sMovingSpeed = tempTable->sMovingSpeed; mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct; mob_table->wAggressiveSight = tempTable->wAggressiveSight; mob_table->wAttackRange = tempTable->wAttackRange; mob_table->dwDropItemVnum = tempTable->dwDropItemVnum; mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum; for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) mob_table->cEnchants[i] = tempTable->cEnchants[i]; for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i) mob_table->cResists[i] = tempTable->cResists[i]; mob_table->fDamMultiply = tempTable->fDamMultiply; mob_table->dwSummonVnum = tempTable->dwSummonVnum; mob_table->dwDrainSP = tempTable->dwDrainSP; mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum; mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel; mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum; mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel; mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum; mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel; mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum; mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel; mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum; mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel; mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum; mob_table->bBerserkPoint = tempTable->bBerserkPoint; mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint; mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint; mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint; mob_table->bRevivePoint = tempTable->bRevivePoint; } else { if (!Set_Proto_Mob_Table(mob_table, data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n"); } } //¼Â¿¡ vnum Ãß°¡ vnumSet.insert(mob_table->dwVnum); sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } //_____________________________________________________// // 4) (b)[test_map_mobTableByVnum]ÀÇ rowÁß, (!)[mob_table]¿¡ ¾ø´Â °ÍÀ» Ãß°¡ÇÑ´Ù. //ÆÄÀÏ ´Ù½Ã Àоî¿À±â. test_data.Destroy(); isTestFile = true; test_data; if(!test_data.Load("mob_proto_test.txt",'\t')) { fprintf(stderr, "Å×½ºÆ® ÆÄÀÏÀÌ ¾ø½À´Ï´Ù. ±×´ë·Î ÁøÇàÇÕ´Ï´Ù.\n"); isTestFile = false; } if(isTestFile) { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. while (test_data.Next()) //Å×½ºÆ® µ¥ÀÌÅÍ °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÍÀ» Ãß°¡ÇÑ´Ù. { //Áߺ¹µÇ´Â ºÎºÐÀÌ¸é ³Ñ¾î°£´Ù. set::iterator itVnum; itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0))); if (itVnum != vnumSet.end()) { continue; } if (!Set_Proto_Mob_Table(mob_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n"); } sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } } sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum()); return true; } par bool CClientManager::InitializeMobTable() { char query[2048]; fprintf(stderr,"Loading mob_proto from MySQL "); snprintf(query, sizeof(query), "SELECT vnum,name,%s,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag," "empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min," "gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item," "resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate," "resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect," "resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0," "skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2," "skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s" ,g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) return false; if (!m_vec_mobTable.empty()) { sys_log(0, "RELOAD: mob_proto"); m_vec_mobTable.clear(); } int size = pRes->uiNumRows; m_vec_mobTable.resize(size); memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size()); TMobTable * mob_table = &m_vec_mobTable[0]; MYSQL_ROW data; //return true; set vnumSet; while ((data = mysql_fetch_row(pRes->pSQLResult))) { /* "SELECT vnum,name,locale_name,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag," "empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min," "gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item," "resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate," "resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect," "resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0," "skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2," "skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s */ int col = 0; str_to_number(mob_table->dwVnum, data[col++]); if(mob_table->dwVnum ==0) continue; strlcpy(mob_table->szName,data[col++] , sizeof(mob_table->szName)); strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName)); str_to_number(mob_table->bRank,data[col++]); str_to_number(mob_table->bType,data[col++]); str_to_number(mob_table->bBattleType,data[col++]); str_to_number(mob_table->bLevel,data[col++]); str_to_number(mob_table->bSize,data[col++]); //AI_FLAG mob_table->dwAIFlag = get_Mob_AIFlag_Value(data[col++]); //mount_capacity; col++; //RACE_FLAG mob_table->dwRaceFlag = get_Mob_RaceFlag_Value(data[col++]); //IMMUNE_FLAG mob_table->dwImmuneFlag = get_Mob_ImmuneFlag_Value(data[col++]); mob_table->bEmpire = atoi(data[col++]); strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder)); mob_table->bOnClickType = atoi(data[col++]); mob_table->bStr = atoi(data[col++]); mob_table->bDex = atoi(data[col++]); mob_table->bCon = atoi(data[col++]); mob_table->bInt = atoi(data[col++]); mob_table->dwDamageRange[0] = atoi(data[col++]); mob_table->dwDamageRange[1] = atoi(data[col++]); mob_table->dwMaxHP = atoi(data[col++]); mob_table->bRegenCycle = atoi(data[col++]); mob_table->bRegenPercent = atoi(data[col++]); mob_table->dwGoldMin = atoi(data[col++]); mob_table->dwGoldMax = atoi(data[col++]); mob_table->dwExp = atoi(data[col++]); mob_table->wDef = atoi(data[col++]); mob_table->sAttackSpeed = atoi(data[col++]); mob_table->sMovingSpeed = atoi(data[col++]); mob_table->bAggresiveHPPct = atoi(data[col++]); mob_table->wAggressiveSight = atoi(data[col++]); mob_table->wAttackRange = atoi(data[col++]); str_to_number(mob_table->dwDropItemVnum, data[col++]); //32 str_to_number(mob_table->dwResurrectionVnum, data[col++]); for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) str_to_number(mob_table->cEnchants[i], data[col++]); for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i) str_to_number(mob_table->cResists[i], data[col++]); str_to_number(mob_table->fDamMultiply, data[col++]); str_to_number(mob_table->dwSummonVnum, data[col++]); str_to_number(mob_table->dwDrainSP, data[col++]); //Mob_Color ++col; str_to_number(mob_table->dwPolymorphItemVnum, data[col++]); str_to_number(mob_table->Skills[0].bLevel, data[col++]); str_to_number(mob_table->Skills[0].dwVnum, data[col++]); str_to_number(mob_table->Skills[1].bLevel, data[col++]); str_to_number(mob_table->Skills[1].dwVnum, data[col++]); str_to_number(mob_table->Skills[2].bLevel, data[col++]); str_to_number(mob_table->Skills[2].dwVnum, data[col++]); str_to_number(mob_table->Skills[3].bLevel, data[col++]); str_to_number(mob_table->Skills[3].dwVnum, data[col++]); str_to_number(mob_table->Skills[4].bLevel, data[col++]); str_to_number(mob_table->Skills[4].dwVnum, data[col++]); str_to_number(mob_table->bBerserkPoint, data[col++]); str_to_number(mob_table->bStoneSkinPoint, data[col++]); str_to_number(mob_table->bGodSpeedPoint, data[col++]); str_to_number(mob_table->bDeathBlowPoint, data[col++]); str_to_number(mob_table->bRevivePoint, data[col++]); //ĽÂżˇ vnum Ăß°ˇ vnumSet.insert(mob_table->dwVnum); //fprintf(stderr, "MOB #%d %s %s level: %u rank: %u empire: %d\n", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } fprintf(stderr," Complete! %d/%d Mobs loaded.\r\n",size,vnumSet.size()); sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum()); return true; } Attention dans bool CClientManager::InitializeTables() vous devrez supprimez donc MirrorMobTableIntoDB() and MirrorItemTableIntoDB() Source : EPvP
  22. Bonjour, Vous allez ici apprendre à installer un système de news complet pour MT2-CMS. 1. Les fonctionnalités 2. Installation Vous pouvez copier/coller ce tutoriel mais vous avez l'obligation de citer l'auteur de manière visible.
  23. Bonjour, Aujourd'hui je vous partage une nouvelle fois quelque chose d'un peu exclusif et très sympa, c'est les classes de Dofus en graphisme 2.13 en mode créature quand une map et surcharger de personnes les classes ce transforme c'est donc ceci que je vous partage. Je précise que c'est moi qui les et fait, que j'autorise le partage sur tout forum cité juste mon pseudo par respect s'il vous plait. Voici quelques informations sur les swf Quand t'il reste Static = Fait Quand t'il marche = Fait Quand t'il cour = Fait Quand t'il ce font toucher = Fait Quand t'il meure = Fait Stopage des animations = Fait Rezise des 12 classes 2.13 pour 1.29 = Fait Sons des swf = Non Swf en 25 Fps et non en dessous. Et enfin le lien de téléchargement Télécharger le pack Sur ce je vous souhaite une très bonne journée, si vous avez des questions je suis là et n'hésitez pas à me laisser un petit message sur le sujet sa me ferais plaisir (plus qu'un j'aime), a bientôt pour de nouveau partages. Nairolf - Dofus64 --- Download
  24. Salut à tous, Dans ce tutoriel je vais vous apprendre à installer un serveur DNS (domain name system) pour lier votre nom de domaine à votre machine, ainsi qu'un serveur de mail des plus simple utilisant la fonction no-reply I Ce que nous allons apprendre : Je vais vous apprendre à installer et configurer un serveur DNS avec BIND9, pour faire pointer votre nom de domaine vers votre machine, pour exemple nous utiliserons un serveur dédié kimsufi et un nom de domaine enregistré chez ovh. Je vais vous apprendre à installer un serveur de mail avec postfix utilisant la fonction no-reply. La méthode la plus simple pour activer les compte de vos forumeur par e-mail, ou la récupération de mot de passe, si vous n'avez pas serveur mail, ou la fonction phpmail d'activé. Certes ce ne sont pas des méthodes ultra-conventionelle, mais quand vous n'avez l'utilité d'un webmail "pro" c'est la méthode la plus simple à mettre en oeuvre. Si vous êtes intéressé par le mailling de masse, le système de news letter, Vous avez deux solution soit passé par un hoster type Google Apps ou Zohoo voir plus bas ou créer le votre. (je ferai surement un tuto pour vous apprendre à créer votre propre serveur de mail) Utilisation d'un hoster : (google apps très bien, mais depuis peu payant 11€/mois, simple d'installation et d'utilisation, et de plus vos mails on une délivrabilité à 99.9%) Etre votre propre hoster : (Utiliser postfix, dovcot, spamassin, et un webmail du type roundcube ou rainloop) méthode très longue à mettre en oeuvre, le plus dur n'est pas d'installer les différents logiciel, mais c'est de parametrer à la perfection, il faut pas mal de certificat : opendkim, spf, openssl etc.. Sinon vos email ne verrons jamais la lueur d'une boîte mail. Donc ma méthode c'est no prise de tête et ça fonctionnera ! Vos membres pourront activer leur compte, vous pourrez les tenir informer par email de masse depuis votre forum, et il pourront utiliser le système de récupération. II Ce que nous allons faire : [1] Installation de bind. [2] Configuration de bind. [3] Installation de postfix. [4] Utilisation de no-reply. INFO : J'ai ajoutés des couleurs et des chiffres dans la checklist, pour vous repérer plus facilement III A vos console ssh et TOP DEPART ! [1] Rendez vous à la racine de votre système cd .. Comme d'habitude avant d'installer un nouveau paquets on met à jours le binz : apt-get dist-upgrade && apt-get update Installation de bind : apt-get install bind9 [2] Nous allons déclarer nos zones / zones de reversing, donc vous tapez : nano /etc/bind/named.conf.local Vous copiez ceci dans le fichier que vous venez d'ouvrir en édition, cela permet à notre domaine de pointer vers notre ip: zone "mon-ndd.com" { type master; file "/etc/bind/zones/db.mon-ndd.com"; }; A la suite vous copiez cela, qui vous permet de pointer votre ip vers votre domaine (reverse capito ?) : Attention tu dois mettre l'adresse ip de ta machine à l'envers soit par ex : 127.0.0.1 deviens : zone "1.0.0.127.in-addr.arpa" { type master; file "/etc/bind/zones/1.0.0.127.in-addr.arpa"; }; Ensuite nous enregistrons soit CTRL + X puis Y ensuite ENTRER Nous quittons la console pour ce connecter au manager kimsufi & ovh So, il nous faut un minimum d'information avant de continuer, donc je vous invites à vous connecter sur votre espace kimsufi manager et cliquez sur DNS : Ensuite vous cliquez sur AJOUTER DNS SECONDAIRE vous indiquez votre nom de domaine, vous sélectionnez l'ip de votre machine, vous confirmez. Nous avons besoin de 3 informations : Votre ownercheck : 8f7ae648 (code aléatoire qui prouve par A + B que vous êtes bien le proprio du ndd. Votre FQDN / serveur primaire : ns3XXX.ip-XXX.eu. Le serveur secondaire : ns.kimsufi.com. Relevez l'adresse en haut à gauche encadré du type ns3XXX.ip-XXX.eu c'est votre FQDN vous pouvez le modifier normalement mais là on s'égard jeune padawan Bon, désormais tu te connecte à ton espace manager OVH puis tu cliques sur ton nom de domaine à gauche, tu cliques sur ajouter une entrée et tu fais comme sur la screen mais avec ton code et ton ndd bien sur ^^ En suite nous cliquerons sur GESTION DNS vous supprimez les enregistrement actuelle et ajoutez les votres soit Votre FQDN / serveur primaire : ns3XXX.ip-XXX.eu. Votre serveur secondaire : ns.kimsufi.com. Retour à notre console, nous avons toutes les infos. Créons déjà le répertoire des fichiers de zones :: mkdir /etc/bind/zones Rendez vous dans le dossier /etc/bind/zones cd /etc/bind/zones Ensuite nous créons notre premier fichier de zones. Remplacez mon-ndd.com par votre ndd HEIN ! nano /etc/bind/zones/db.mon-ndd.com Vous copiez ceci, et vous remplacez biensur l'ip 127.0.0.1 par celle de votre machine, le FQDN par le votre, et le ndd ainsi que le code ownercheck : $TTL 12H $ORIGIN mon-ndd.com. @ IN SOA ns3XXX.ip-XXX.eu. postmaster.mon-ndd.com. ( 2015100701 ; Serial 8H ; Refresh 30M ; Retry 4W ; Expire 8H ; Minimum TTL ) IN NS ns3XXX.ip-XXX.eu. IN NS ns.kimsufi.com. IN MX 10 mail.mon-ndd.com. mon-ndd.com. IN A 127.0.0.1 ns IN A 127.0.0.1 mail IN A 127.0.0.1 www IN CNAME mon-ndd.com. ftp IN CNAME mon-ndd.com. ownercheck.mon-ndd.com. IN TXT "8f7ae648" Ensuite nous enregistrons soit CTRL + X puis Y ensuite ENTRER Good maintenant le fichier de reverse (remplacez 1.0.0.127 par votre ip à l'envers HEIN ! nano /etc/bind/zones/1.0.0.127.in-addr.arpa Vous collez ceci et le modifiez comme expliquez plus haut (c'est clair non ) $TTL 12H @ IN SOA ns3XXX.ip-XXX.eu. postmaster.mon-ndd.com. ( 2015100701 ; Serial 8H ; Refresh 30M ; Retry 4W ; Expire 8H ; Minimum TTL ) IN NS ns3XXX.ip-XXX.eu. IN NS ns.kimsufi.com. IN PTR mon-ndd.com. Idem nous enregistrons soit CTRL + X puis Y ensuite ENTRER Le seul truc qui nous intéresse ici c'est ça : 2015100701 ; Serial (car toi perso tu veux juste que ton ndd pointe sur ta machine le reste osef hein ? Année mois jours modification voila dans quel ordre il faut le remplir à chaque modification que tu entreprends il faut que tu incrémente le sérial c'est à dire que si tu le modifie après l'avoir reload, tu remplace le 01 par un 02 etc... A présent nous allons check notre config : named-checkconf /etc/bind/named.conf No error ? Good ! Error ? Go to support ! Testons à présent nos fichiers de zone : named-checkzone mon-ndd.com db.mon-ndd.com Réponse quand ça fonctionne : zone mon-ndd.com/IN: loaded serial 2015100701 OK le reverse now : named-checkzone mon-ndd.com 1.0.0.127.in-addr.arpa Reponse quand ça fonctionne : zone mon-ndd.com/IN: loaded serial 2015100701 OK Super aucune erreur ? On reload bind pour prendre en compte nos fichiers de zone : etc/init.d/bind9 reload etc/init.d/bind9 restart Voila maintenant, nous testons si notre serveur DNS répond : nslookup mon-ndd.com. ns3XXX.ip-XXX.eu Idem en solution inverse : nslookup 127.0.0.1 ns3XXX.ip-XXX.eu Parfait, si tout ce passe bien pas d'erreur ça répond, sinon je vous invite à créer un thread dans la catégorie support. [3] Installation de postfix : (Agent MTA de transfert de courrier (Evite que des spammeurs utilise votre machine pour envoyer du courrier indésirable)[/color][/color][/color] apt-get install postfix Maintenant direction votre forum exemple ci joint un forum phpbb : Vous remplissez comme sur la screen et vous pouvez envoyer vos mail YOUPI !
  25. Bonjour à tous chère WebMaster/Scripteur ! Voici le Gamemode D'Universal Role Play !!! Informations Du Script : -Version : 2 -Base : LARP -Bot : 1 ( Voir filterscript sf_bot pour bot TRAM ) -Objets : Environs 750 Objets -Véhicule : 305 Véhicule -Site/Production : [Hidden Content] Listes Des Améliorations/Modfication : Correction > - Les Différents de BUG du GM Larp on la plupart était corrigé comme par exemple : Le problème de Location, Problème D'achat de maison(quand on acheté une maison on restez bloqué à l'intérieur ! - Des Jobs Inutile Enlevé (Comme le balayeur qui consister à faire semblant de travailler en roulant ^^) ... Modification > -Chat Modifier ( Plus VIF ) -Gang Modifié ( Plus réel ) -Système de véhicule remplacer par celui de Mr Freedo ... Nouveauté > -Nouvelle commande ajouté : /aidemenu (Listes des commandes générale en menu) || /moi+ ( Action du personnage en Text 3D Label) || /acc ( Simule un Accident ) || /ceinture ( Met une ceinture de sécurité ) || /vmenu ( Vous affiche les commande de gestion de véhicule ) ... Les autres seront à découvrir par vous même -Système Anti-Pub : Une radio doit êtres obligatoirement acheté dans un 24/7 pour pouvoir utiliser les PM, Le OOC, le /b et le /sms, Les PM et /sms sont lisible par tout les admins connecté ! -Systeme de Click Button(BETA) : Quand vous monter dans un véhicule un mode de button click peut être activé les instructions sont marqué dns le cadre lors de la monter dans le véhicule ! (Quelque BUG ) -Système de Tunning fait maison par les nouveaux menu de sa-mp ( mettez vous devant la grille du garage de la gare est faite /tuning ) -Système de Braquage fait maison ... -Système de frontière : Vous devez payer lors du passage a frontière des mafias (Bayside) ! - Et le script à était complétement aménager ( Rangements ect ... ) ... à Découvrir par vous même Les défaut : - 2 boucle à corrigé ( La frontière et Les menu D'entré de bizz ) - Systeme de stats en mysql à retirer ! ( Plus d'info : [Hidden Content] ) Remerciements :- MrFreedo pour son système de véhicule - Xoss Pour le modèle de présentation ( Que j'ai quand même modifié ) - A tout le staff de Gta Online qui mon aidez dans l'apprentissage du pawn / allias C+++++++ ^^ Réalisation de vidéo RP et Fun de mon serveur : [Hidden Content] Téléchargement : [Hidden Content] > Mise à jour ! Version NO Mysql ... [Hidden Content] > Script PHP pour Web Stats (( Désolé je n'ai plus la version traduire sur mon pc ... )) Merci de laisser le copyright pour le respect du scripteur (même si c'est un peu débile de dire sa )