Jump to content

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

  • Espace Communautaire
    • Funky Emulation
    • Services
    • Bureau de la Communauté
    • Espace Premium
  • Emulation & Co
    • Suggest a Release / Tutorial
    • M2 Project
  • Emulation de jeux
    • Metin2
    • Metin2 Dev
    • Minecraft
    • Dofus
    • World of Warcraft
    • Voir plus...
  • Espace Divers
  • PassionDev's Forum
  • EmuTarkov's Liens importants
  • EmuTarkov's Discussions

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


Site


Steam ID


Minecraft


Dofus


Metin2


RaiderZ


X


World of Warcraft


Aion


Habbo


GTA


Roblox


Wakfu


PHP


SQL


HTML


CSS


JavaScript


Java


LUA


Python


VisualBasic


C++


c#


C


3D


2D


Mapper


PHP

Found 494 results

  1. Bonjour / Bonsoir, Voici une nouvelle maj de DzEmµ (v 0.4.2.7) avec comme nouveauté la bource aux points qui permet de vendre/acheter des points en ligne grace a vos kamas (le même système que la bource aux ogrines de la 2.0) Changelog v 0.4.5.7: =========== - Ajout d'un système de bource aux points (Comme la bource aux ogrines de la 2.0) avec sauvegarde dans la BDD - Début des HDV - Début du Mode Marchand - Correction du START_SIZE - Ajout d'une possibilité de mette le lien de vote pour votre serveur dans le message d'accueil (configurable depuis le fichier config) - Il est désormais impossible a un joueur en prison de rejoindre un tournois - Un message est envoyé aux admins une fois le nombre maximum de joueur est atteint pour un tournois - Correction des commandes : Console: ========= - Points - Boutique - Ajout des commandes : Console: ======== - Out (qui permet de se téléporter hors de la prison pour les MJs) Chat: ===== - !addbap - !bapinfo - !buybap Téléchargement : ICI --- Download
  2. SharkEmu est un émulateur codé en C# par Bouh2. Il à été repris par la Sharkteam, mais est actuellement stoppé. Il utilise peux de ram (moins de 900mo). Un tutoriel complet est inclu, ainsi qu'un CMS. Télécharger SharkEmu v0.8.2.2.rar et Database RC3.rar. Téléchargement : ICI 2 - Avancement : POST ORIGINALE Bonjour à tous, Aujourd'hui je vous présente mon projet longuement développé et qui est déjà publique. SharkEmu développé en C# est un émulateur Dofus stable et déjà très complet. Je le développe depuis maintenant 6 mois à peu près et il avance pourtant assez vite. SharkEmu a le privilège d'être entièrement Opensource sous license GNU. Cela signifie que les sources sont disponibles et publiques pour tout le monde et que c'est totalement gratuit ! SharkEmu est axé sur la personnalisation et la simplicité. Cela signifie que l'emulateur est prêt en main et permet en 10 minutes de créer son serveur, mais aussi que il est prévu pour être entièrement modifiable et modeler le serveur à votre guise. Ce qui permet de créer un gameplay tout à fait inédit et d'ajouter du contenu complétement personnaliser. L'avancé de SharkEmu (5.02.10) A l'heure où j'écris ces lignes, l'émulateur est en version 0.6.3.0 car je n'est peut être pas modifier ce post. Voici les fonctions majeurs disponibles : -Gestion de connexion -Gestion des comptes/ et joueurs -Gestion du monde et des maps -Gestion de transfert des données entre joueurs (affichage, déplacement, chat ...) -Gestion des inventaires -Gestion des items -Gestion des 90% effets des items -Gestion des drops d'items -Gestion des combats inter-joueurs (PvP) -Gestion des abandons -Gestion des sorts principaux (voir liste ci-dessous) -Gestion des buffs -Gestion des scores de fin de combat (Kamas & Experience) -Gestion des niveaux -Gestion de l'expérience -Gestion des statistiques -Gestion de commandes (voir ci-dessous) -Gestion des Pnjs -Gestion des Pnj-vendeur -Gestion d'achat/vente d'objet -Gestion d'actions Pnj Spéciales (téléportation, dons de kamas...) Effet sorts implantés (Tiré des SpellActions -> Game/SpellAction.cs) : InflictDamage RestoreHealth StolenLife Push ChangeCase Buff Les fonctions majeurs qui seront implantés : -Créatures & Intelligence artificiel -Quêtes -Métiers La base de donnée est elle aussi bien remplie (merci à Ancestra) -Maps : 4000 -Items : 100% -Monstres : 1200 -Pnj : 600 -Spell : 100% L'emulateur comprend quelques commandes de base, il se va de soit que l'on peut en ajouter à sa guise info Information sur l'état du serveur pos Position actuelle du personnage go Se téléporte sur la map et case choisi gopos Se téléporte selon les coordonnés choisis avec option de map intérieur ou non help Affiche l'aide d'une commande command Affiche la liste des commandes world Envois un message à tout le monde start Vous téléporte au point de départ goname Vous téléporte sur le joueur namego Téléporte le joueur à vous save Sauvegarde les informations du personnages saveworld Sauvegarde chaque joueur shutdown Arrête le serveur après le temps donné; "shutdown stop" pour annuler morph Change le skin du joueur additem Ajoute un objet à la cible; cible : %target%, %me% ou le nom d'un joueur fillmap Rempli une map avec un item target Active le mode target settarget Défini la cible; cible : %target%, %me% ou le nom d'un joueur Dofus 2.0 Le noyau de l'emulateur sera repris pour faire une version approprié pour Dofus 2.0. Cette version ne verra pas le jour avant la release 1.0 Anecdote La première fois que j'ai entendu d'émulateur c'était sur britania 3 avec DofusEmu de Elxior dont j'ai participer à la bêta. J'ai commencer à programmer en C# cela fait tout juste 1 an. J'ai développé sur le cheat WoW, créer 2 programmes tiers pour le même jeu et beaucoup contribuer au cheat wow français (notamment en developpement de cheat). Avant les vacances d'été 2009, on m'a proposé de reprendre les sources d'Elxior en Team et de faire un premier émulateur dofus. Mi Juillet / Aout j'ai commencer SharkEmu, car je voyais que le projet n'avancer pas et que les sources était irrécupérable, tout d'abords en Team de 4 (je peux citer Air5 et Antique) puis fin été j'ai continuer le développement seul. Je décide alors de faire un émulateur Opensource. Projet : ICI Je cherche des codeurs qui serais prêt à m'aider pour commenter le code et le documenter ainsi que coder d'autres commandes et sorts. De plus chaque bug reporté contribue au développement de SharkEmu et m'aide énormément alors n'hésitez pas. Pensez à faire un don car c'est ma seule source de contribution de cet énorme projet. J'espère que vous soutiendrez mon projet. Merci de votre lecture, et merci d'utiliser SharkEmu. --- Download
  3. 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
  4. 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
  5. Bonjour à tous , j'ai décidé de partagé et d'expliquer comment implanter les systèmes que j'ai sur mon DD. (Tous fonctionnel) Aujourd'hui , ce sera un système qui vous permet de voir ce que drop le mob que vous pointez. !!!!! ATTENTION AUX TABULATIONS!!!!! 1) Pré-requis: -Source Server/Client -Un client On va commencer par les sources Serveur: Ouvre le fichier service.h qui ce trouve dans le dossier common : Ajouter: #define __SEND_TARGET_INFO__ Maintenant aller dans game/src puis ouvrez le fichier char.h: Cherchez: ////////////////////////////////////////////////////////////////////////////////// // Basic Points Ajoutez en dessous : #ifdef __SEND_TARGET_INFO__ private: DWORD dwLastTargetInfoPulse; public: DWORD GetLastTargetInfoPulse() const { return dwLastTargetInfoPulse; } void SetLastTargetInfoPulse(DWORD pulse) { dwLastTargetInfoPulse = pulse; } #endif Ouvrez le dossier char.cpp: Cherchez: #include "DragonSoul.h" Puis ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ #include #include using namespace std; #endif Cherchez: m_dwKillerPID = 0; Puis ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ dwLastTargetInfoPulse = 0; #endif Maintenant , ouvrez le fichier input.h Cherchez: void Roulette(LPCHARACTER ch, const char* c_pData); Ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ void TargetInfoLoad(LPCHARACTER ch, const char* c_pData); #endif Ouvrez le dossier input_main.cpp: Cherchez: static int __deposit_limit() { return (1000*10000); // 1õ¸¸ } Ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData) { TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData; TPacketGCTargetInfo pInfo; pInfo.header = HEADER_GC_TARGET_INFO; static std::vector s_vec_item; s_vec_item.clear(); LPITEM pkInfoItem; LPCHARACTER m_pkChrTarget = CHARACTER_MANAGER::instance().Find(p->dwVID); // if (m_pkChrTarget && (m_pkChrTarget->IsMonster() || m_pkChrTarget->IsStone())) // { // if (thecore_heart->pulse - (int) ch->GetLastTargetInfoPulse() < passes_per_sec * 3) // return; // ch->SetLastTargetInfoPulse(thecore_heart->pulse); if (ITEM_MANAGER::instance().CreateDropItemVector(m_pkChrTarget, ch, s_vec_item) && (m_pkChrTarget->IsMonster() || m_pkChrTarget->IsStone())) { if (s_vec_item.size() == 0); else if (s_vec_item.size() == 1) { pkInfoItem = s_vec_item[0]; pInfo.dwVID = m_pkChrTarget->GetVID(); pInfo.race = m_pkChrTarget->GetRaceNum(); pInfo.dwVnum = pkInfoItem->GetVnum(); pInfo.count = pkInfoItem->GetCount(); ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo)); } else { int iItemIdx = s_vec_item.size() - 1; while (iItemIdx >= 0) { pkInfoItem = s_vec_item[iItemIdx--]; if (!pkInfoItem) { sys_err("pkInfoItem null in vector idx %d", iItemIdx + 1); continue; } pInfo.dwVID = m_pkChrTarget->GetVID(); pInfo.race = m_pkChrTarget->GetRaceNum(); pInfo.dwVnum = pkInfoItem->GetVnum(); pInfo.count = pkInfoItem->GetCount(); ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo)); } } } // } } #endif Cherchez: case HEADER_CG_XTRAP_ACK: { TPacketXTrapCSVerify* p = reinterpret_cast((void*)c_pData); CXTrapManager::instance().Verify_CSStep3(d->GetCharacter(), p->bPacketData); } break; Mettez en dessous : #ifdef __SEND_TARGET_INFO__ case HEADER_CG_TARGET_INFO_LOAD: { TargetInfoLoad(ch, c_pData); } break; #endif Ouvre le fichier item_manager.cpp: Cherchez: bool ITEM_MANAGER::GetDropPct(LPCHARACTER pkChr, LPCHARACTER pkKiller, OUT int& iDeltaPercent, OUT int& iRandRange) Ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ bool ITEM_MANAGER::CreateDropItemVector(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::vector & vec_item) { if (pkChr->IsPolymorphed() || pkChr->IsPC()) { return false; } int iLevel = pkKiller->GetLevel(); BYTE bRank = pkChr->GetMobRank(); LPITEM item = NULL; std::vector::iterator it = g_vec_pkCommonDropItem[bRank].begin(); while (it != g_vec_pkCommonDropItem[bRank].end()) { const CItemDropInfo & c_rInfo = *(it++); if (iLevel < c_rInfo.m_iLevelStart || iLevel > c_rInfo.m_iLevelEnd) continue; TItemTable * table = GetTable(c_rInfo.m_dwVnum); if (!table) continue; item = NULL; if (table->bType == ITEM_POLYMORPH) { if (c_rInfo.m_dwVnum == pkChr->GetPolymorphItemVnum()) { item = CreateItem(c_rInfo.m_dwVnum, 1, 0, true); if (item) item->SetSocket(0, pkChr->GetRaceNum()); } } else item = CreateItem(c_rInfo.m_dwVnum, 1, 0, true); if (item) vec_item.push_back(item); } // Drop Item Group { itertype(m_map_pkDropItemGroup) it; it = m_map_pkDropItemGroup.find(pkChr->GetRaceNum()); if (it != m_map_pkDropItemGroup.end()) { typeof(it->second->GetVector()) v = it->second->GetVector(); for (DWORD i = 0; i < v.size(); ++i) { item = CreateItem(v[i].dwVnum, v[i].iCount, 0, true); if (item) { if (item->GetType() == ITEM_POLYMORPH) { if (item->GetVnum() == pkChr->GetPolymorphItemVnum()) { item->SetSocket(0, pkChr->GetRaceNum()); } } vec_item.push_back(item); } } } } // MobDropItem Group { itertype(m_map_pkMobItemGroup) it; it = m_map_pkMobItemGroup.find(pkChr->GetRaceNum()); if ( it != m_map_pkMobItemGroup.end() ) { CMobItemGroup* pGroup = it->second; // MOB_DROP_ITEM_BUG_FIX // 20050805.myevan.MobDropItem ? ???? ?? ?? CMobItemGroup::GetOne() ??? ?? ?? ?? if (pGroup && !pGroup->IsEmpty()) { const CMobItemGroup::SMobItemGroupInfo& info = pGroup->GetOne(); item = CreateItem(info.dwItemVnum, info.iCount, 0, true, info.iRarePct); if (item) vec_item.push_back(item); } // END_OF_MOB_DROP_ITEM_BUG_FIX } } // Level Item Group { itertype(m_map_pkLevelItemGroup) it; it = m_map_pkLevelItemGroup.find(pkChr->GetRaceNum()); if ( it != m_map_pkLevelItemGroup.end() ) { if ( it->second->GetLevelLimit() <= (DWORD)iLevel ) { typeof(it->second->GetVector()) v = it->second->GetVector(); for ( DWORD i=0; i < v.size(); i++ ) { DWORD dwVnum = v[i].dwVNum; item = CreateItem(dwVnum, v[i].iCount, 0, true); if ( item ) vec_item.push_back(item); } } } } // BuyerTheitGloves Item Group { // by mhh ?? ??? ??? ?? drop ? ???? ?? if (pkKiller->GetPremiumRemainSeconds(PREMIUM_ITEM) > 0 || pkKiller->IsEquipUniqueGroup(UNIQUE_GROUP_DOUBLE_ITEM)) { itertype(m_map_pkGloveItemGroup) it; it = m_map_pkGloveItemGroup.find(pkChr->GetRaceNum()); if (it != m_map_pkGloveItemGroup.end()) { typeof(it->second->GetVector()) v = it->second->GetVector(); for (DWORD i = 0; i < v.size(); ++i) { DWORD dwVnum = v[i].dwVnum; item = CreateItem(dwVnum, v[i].iCount, 0, true); if (item) vec_item.push_back(item); } } } } // ?? if (pkChr->GetMobDropItemVnum()) { itertype(m_map_dwEtcItemDropProb) it = m_map_dwEtcItemDropProb.find(pkChr->GetMobDropItemVnum()); if (it != m_map_dwEtcItemDropProb.end()) { item = CreateItem(pkChr->GetMobDropItemVnum(), 1, 0, true); if (item) vec_item.push_back(item); } } if (pkChr->IsStone()) { if (pkChr->GetDropMetinStoneVnum()) { item = CreateItem(pkChr->GetDropMetinStoneVnum(), 1, 0, true); if (item) vec_item.push_back(item); } } return vec_item.size(); } #endif Ouvrez le fichier item_manager.h Cherchez: bool CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::vector & vec_item); Ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ bool CreateDropItemVector(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::vector & vec_item); #endif Ouvrez le fichier packet.h Cherchez: HEADER_GC_TARGET = 63, Mettez en dessous: #ifdef __SEND_TARGET_INFO__ HEADER_GC_TARGET_INFO = 58, HEADER_CG_TARGET_INFO_LOAD = 59, #endif Cherchez: typedef struct packet_target Ajoutez apres la fonction: #ifdef __SEND_TARGET_INFO__ typedef struct packet_target_info { BYTE header; DWORD dwVID; DWORD race; DWORD dwVnum; BYTE count; } TPacketGCTargetInfo; typedef struct packet_target_info_load { BYTE header; DWORD dwVID; } TPacketCGTargetInfoLoad; #endif Ouvre le fichiez packet_info.cpp Cherchez: Set(HEADER_CG_STATE_CHECKER, sizeof(BYTE), "ServerStateCheck", false); Ajoutez en dessous: #ifdef __SEND_TARGET_INFO__ Set(HEADER_CG_TARGET_INFO_LOAD, sizeof(TPacketCGTargetInfoLoad), "TargetInfoLoad", true); #endif Voilà on en a fini avec la partie "Source Server" , maintenant attaquons la partie "Source client": Aller dans le dossier UserInterface: Cherchez le fichier Locale_inc.h Ajoutez: #define ENABLE_SEND_TARGET_INFO Ouvrez le fichier Packet.h Cherchez: HEADER_GC_TARGET = 63, Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO HEADER_GC_TARGET_INFO = 58, HEADER_CG_TARGET_INFO_LOAD = 59, #endif Cherchez: typedef struct packet_target Ajoutez après la fonction: #ifdef ENABLE_SEND_TARGET_INFO typedef struct packet_target_info { BYTE header; DWORD dwVID; DWORD race; DWORD dwVnum; BYTE count; } TPacketGCTargetInfo; typedef struct packet_target_info_load { BYTE header; DWORD dwVID; } TPacketCGTargetInfoLoad; #endif Ouvrez le fichier PythonApplicationModule.cpp Cherchez: #ifdef ENABLE_COSTUME_SYSTEM Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO PyModule_AddIntConstant(poModule, "ENABLE_SEND_TARGET_INFO", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_SEND_TARGET_INFO", 0); #endif Ouvrez le fichier PythonNetworkStream.cpp Cherchez: Set(HEADER_GC_TARGET, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTarget), STATIC_SIZE_PACKET)); Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO Set(HEADER_GC_TARGET_INFO, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTargetInfo), STATIC_SIZE_PACKET)); #endif Ouvrez le fichier PythonNetworkStream.h Cherchez: bool RecvDamageInfoPacket(); Inserez en dessous : #ifdef ENABLE_SEND_TARGET_INFO bool RecvTargetInfoPacket(); public: bool SendTargetInfoLoadPacket(DWORD dwVID); protected: #endif Ouvre le fichier PythonNetworkStreamModule.cpp Cherchez: PyObject* netConnectToAccountServer(PyObject* poSelf, PyObject* poArgs) Ajoutez après la fonction : #ifdef ENABLE_SEND_TARGET_INFO PyObject* netTargetInfoLoad(PyObject* poSelf, PyObject* poArgs) { DWORD dwVID; if (!PyArg_ParseTuple(poArgs, "i", &dwVID)) { return Py_BuildException(); } if (dwVID < 0) { return Py_BuildNone(); } CPythonNetworkStream& rns = CPythonNetworkStream::Instance(); rns.SendTargetInfoLoadPacket(dwVID); return Py_BuildNone(); } #endif Cherchez: { "ConnectToAccountServer", netConnectToAccountServer, METH_VARARGS }, Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO { "SendTargetInfoLoad", netTargetInfoLoad, METH_VARARGS }, #endif Ouvrez le fichier PythonNetworkStreamPhaseGame.cpp Cherchez: case HEADER_GC_TARGET: Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO case HEADER_GC_TARGET_INFO: ret = RecvTargetInfoPacket(); break; #endif Cherchez : bool CPythonNetworkStream::RecvTargetPacket() Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO bool CPythonNetworkStream::RecvTargetInfoPacket() { TPacketGCTargetInfo pInfoTargetPacket; if (!Recv(sizeof(TPacketGCTargetInfo), &pInfoTargetPacket)) { Tracen("Recv Info Target Packet Error"); return false; } CInstanceBase * pInstPlayer = CPythonCharacterManager::Instance().GetMainInstancePtr(); CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(pInfoTargetPacket.dwVID); if (pInstPlayer && pInstTarget) { if (!pInstTarget->IsDead()) { if (pInstTarget->IsEnemy() || pInstTarget->IsStone()) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AddTargetMonsterDropInfo", Py_BuildValue("(iii)", pInfoTargetPacket.race, pInfoTargetPacket.dwVnum, pInfoTargetPacket.count)); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_RefreshTargetMonsterDropInfo", Py_BuildValue("(i)", pInfoTargetPacket.race)); } else PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()")); // m_pInstTarget = pInstTarget; } } else { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()")); } return true; } #endif Cherchez : bool CPythonNetworkStream::RecvObserverAddPacket() Ajoutez après la fonction: #ifdef ENABLE_SEND_TARGET_INFO bool CPythonNetworkStream::SendTargetInfoLoadPacket(DWORD dwVID) { TPacketCGTargetInfoLoad TargetInfoLoadPacket; TargetInfoLoadPacket.header = HEADER_CG_TARGET_INFO_LOAD; TargetInfoLoadPacket.dwVID = dwVID; if (!Send(sizeof(TargetInfoLoadPacket), &TargetInfoLoadPacket)) return false; return SendSequence(); } #endif Ouvrez le fichier PythonNonPlayer.cpp Cherchez: void CPythonNonPlayer::GetMatchableMobList(int iLevel, int iInterval, TMobTableList * pMobTableList) Ajoutez après la fonction: #ifdef ENABLE_SEND_TARGET_INFO DWORD CPythonNonPlayer::GetMonsterMaxHP(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD dwMaxHP = 0; return dwMaxHP; } return c_pTable->dwMaxHP; } DWORD CPythonNonPlayer::GetMonsterRaceFlag(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD dwRaceFlag = 0; return dwRaceFlag; } return c_pTable->dwRaceFlag; } DWORD CPythonNonPlayer::GetMonsterLevel(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD level = 0; return level; } return c_pTable->bLevel; } DWORD CPythonNonPlayer::GetMonsterDamage1(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD range = 0; return range; } return c_pTable->dwDamageRange[0]; } DWORD CPythonNonPlayer::GetMonsterDamage2(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD range = 0; return range; } return c_pTable->dwDamageRange[1]; } DWORD CPythonNonPlayer::GetMonsterExp(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD dwExp = 0; return dwExp; } return c_pTable->dwExp; } float CPythonNonPlayer::GetMonsterDamageMultiply(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD fDamMultiply = 0; return fDamMultiply; } return c_pTable->fDamMultiply; } DWORD CPythonNonPlayer::GetMonsterST(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD bStr = 0; return bStr; } return c_pTable->bStr; } DWORD CPythonNonPlayer::GetMonsterDX(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD bDex = 0; return bDex; } return c_pTable->bDex; } bool CPythonNonPlayer::IsMonsterStone(DWORD dwVnum) { const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum); if (!c_pTable) { DWORD bType = 0; return bType; } return c_pTable->bType == 2; } #endif Ouvrez le fichier PythonNonPlayer.h Cherchez: const char* GetMonsterName(DWORD dwVnum); Ajoutez en dessous : #ifdef ENABLE_SEND_TARGET_INFO // TARGET_INFO DWORD GetMonsterMaxHP(DWORD dwVnum); DWORD GetMonsterRaceFlag(DWORD dwVnum); DWORD GetMonsterLevel(DWORD dwVnum); DWORD GetMonsterDamage1(DWORD dwVnum); DWORD GetMonsterDamage2(DWORD dwVnum); DWORD GetMonsterExp(DWORD dwVnum); float GetMonsterDamageMultiply(DWORD dwVnum); DWORD GetMonsterST(DWORD dwVnum); DWORD GetMonsterDX(DWORD dwVnum); bool IsMonsterStone(DWORD dwVnum); #endif Enfin , ouvrez le fichier PythonNonPlayerModule.cpp Cherchez: PyObject * nonplayerLoadNonPlayerData(PyObject * poSelf, PyObject * poArgs) Ajoutez après la fonction: #ifdef ENABLE_SEND_TARGET_INFO PyObject * nonplayerGetMonsterMaxHP(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.GetMonsterMaxHP(race)); } PyObject * nonplayerGetRaceNumByVID(PyObject * poSelf, PyObject * poArgs) { int iVirtualID; if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) return Py_BuildException(); CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); if (!pInstance) return Py_BuildValue("i", -1); const CPythonNonPlayer::TMobTable * pMobTable = CPythonNonPlayer::Instance().GetTable(pInstance->GetVirtualNumber()); if (!pMobTable) return Py_BuildValue("i", -1); return Py_BuildValue("i", pMobTable->dwVnum); } PyObject * nonplayerGetMonsterRaceFlag(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.GetMonsterRaceFlag(race)); } PyObject * nonplayerGetMonsterLevel(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.GetMonsterLevel(race)); } PyObject * nonplayerGetMonsterDamage(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); DWORD dmg1 = rkNonPlayer.GetMonsterDamage1(race); DWORD dmg2 = rkNonPlayer.GetMonsterDamage2(race); return Py_BuildValue("ii", dmg1,dmg2); } PyObject * nonplayerGetMonsterExp(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.GetMonsterExp(race)); } PyObject * nonplayerGetMonsterDamageMultiply(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("f", rkNonPlayer.GetMonsterDamageMultiply(race)); } PyObject * nonplayerGetMonsterST(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.GetMonsterST(race)); } PyObject * nonplayerGetMonsterDX(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.GetMonsterDX(race)); } PyObject * nonplayerIsMonsterStone(PyObject * poSelf, PyObject * poArgs) { int race; if (!PyTuple_GetInteger(poArgs, 0, &race)) return Py_BuildException(); CPythonNonPlayer& rkNonPlayer = CPythonNonPlayer::Instance(); return Py_BuildValue("i", rkNonPlayer.IsMonsterStone(race) ? 1 : 0); } #endif Cherchez: { "GetMonsterName", nonplayerGetMonsterName, METH_VARARGS }, Ajoutez en dessous: #ifdef ENABLE_SEND_TARGET_INFO // TARGET_INFO { "GetRaceNumByVID", nonplayerGetRaceNumByVID, METH_VARARGS }, { "GetMonsterMaxHP", nonplayerGetMonsterMaxHP, METH_VARARGS }, { "GetMonsterRaceFlag", nonplayerGetMonsterRaceFlag, METH_VARARGS }, { "GetMonsterLevel", nonplayerGetMonsterLevel, METH_VARARGS }, { "GetMonsterDamage", nonplayerGetMonsterDamage, METH_VARARGS }, { "GetMonsterExp", nonplayerGetMonsterExp, METH_VARARGS }, { "GetMonsterDamageMultiply", nonplayerGetMonsterDamageMultiply, METH_VARARGS }, { "GetMonsterST", nonplayerGetMonsterST, METH_VARARGS }, { "GetMonsterDX", nonplayerGetMonsterDX, METH_VARARGS }, { "IsMonsterStone", nonplayerIsMonsterStone, METH_VARARGS }, #endif Voilà , nous avons enfin terminez la partie Source , pour le coté Client , vous devez depacker locale et root , les choses à modifier sont dans l'archive à télécharger : [Hidden Content] EDIT: Screen: Source: FreaksGamers
  6. UPLAUNCHER MAJ AUTO [VB+SOURCE] & MultiCompte Via un dofus Tout d'abord , toutes les explications sont dans le titre , donc place au screen , puis au lien et explication Screen : [Hidden Content] (le multi compte) Screen : (design pas de moi , de Adrien je pense) Tout d'abord quelques explication sur le multi compte : pour le faire fonctionner ajouter dans votre config.xml tout à la fin c'était une sécurité anti leech un peu obsolète. Pour faire fonctionner le multi compte , il faut le mettre dans dofus avec les 2 dll correspondant , et pour l'uplauncher , mettre les fichiers de configuration nécessaire , càd les dll et le version.txt , le reste sur le ftp , le lien du site est à modifié dans les sources. Sur le screen 1 , on vois un loader , si vous pouviez donner votre avis celà me ferais plaisir. Et maintenant place au lien : [Hidden Content] Il contient le uplauncher + source en VB ( maj auto , new via site , lien , bouton jouer ,etc) + le multi compte (sans les sources) Crdlmt Anthogame PS :Je demande à ce que se partage reste sur Funky-emu et que dans le cas ou vous ne pourriez pas vous en empêchez , citez moi. --- Download
  7. Bonjour, 1. Dépackez root. 2. Direction uiminimap.py 3. Ajoutez: import time 4. Sous le: __init__ Ajoutez ce code : t = time.time() 5. Allons à la ligne 355. Modifier ce code: self.positionInfo.SetText Vous devriez obtenir quelque chose comme ceci : self.positionInfo.SetText(time.strftime('[%X]')) 6. Nous allons aux lignes 302-304 et trouver : if constInfo.MINIMAP_POSITIONINFO_ENABLE==1: En dessous, ajoutez le code suivant : self.positionInfo.Show() Merci! Joyeux temps des fêtes!
  8. Hello, Tout le monde le sait vous ne pouvez pas assembler le parchemins de bénédiction - soit un item avec une fonction "Drop" - ne peut pas être empiler. Ouvrez : uiinventory.py Cherchez : def __DropSrcItemToDestItemInInventory En dessous : if srcItemSlotPos == dstItemSlotPos: return Ajoutez : elif srcItemVID == player.GetItemIndex(dstItemSlotPos): self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos, 0) return Comme vous pouvez le voir ci dessous vous pouvez voir les le parchemin de bénédiction peut se pack maintenant sans problèmes: Si vous souhaitez le fond en jaune au lieu de rouge comme présenté ci dessous Toujours dans uiinventory.py Cherchez : def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos): Faite défilez jusqu'à : if item.IsRefineScroll(srcItemVNum): if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos): return True Et le remplacer par : if srcItemVNum == player.GetItemIndex(dstSlotPos): if player.GetItemCount(dstSlotPos) < 200: return True Ceci fonctionne pas seulement avec les parchemins de bénédiction et les changements de bonus. C'est un tout. (Ajout 6-7 & Changement, Orbe de bénédiction, ajout 1-5 & changement) Litchy, Rénové par Takuma.
  9. 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
  10. Skill Sage Grand Maître. 1) Qu'est ce que cela? 2) Les Prérequis. 3) Le téléchargement. 1) Qu'est ce que cela? Alors, les skill Sage Grand Maître sont des skills au-dessus de P ( Oui vous l'avez compris, vous pourrez up vos skills plus de P) Les skills s'upent de la même manière que pour up en P (de G1 à P ) Ils s'up de P1 à S Pour up vos skills vous aurez besoin de lire des Sage Pierre d'âme (Oh non pas encore des PA !!!!!!!!!!!!!!!!) Vidéos Une vidéo est toujours explicite que quelques mots sur une page blanche. 2) Les Prérequis. Des Files et un client Sources Client/Game/Db De l'archive en téléchargement et votre tête. Sachez encore une fois que ce partage n'est pas de moi et provient de Board Legend, ce système à été créé par Lennt. La traduction est cependant de moi. (Si quelqu'un pourrais traduire le skilldesc.txt je suis preneur.) 3) Le téléchargement. Cliquez ici FE Cordialement, History.
  11. Bonjour à tous! Voila une petite surprise! Vous connaissez tous Dofus Map Editor? Et Yggdrasil ? Maintenant je vous propose Dofus Map Editor version Yggdrasil Explication : en faite j'ai pris tout les image de Yggdrasil (le dernier) pour le mettre dans Dofus Map Editor car j'ai longtemps chercher Yggdrasil j'ai réussit a l'avoir finalement mes sa a prit du temps donc avec DME VERSION YGG Vous n'êtes pas obliger de parcourir google pour trouvée YGG cracké, bon bref voila le lien :rolleyes: =>100%<= --- Download
  12. Bonjour à tous! Je partage 14CMS que j'avais dans mes fichiers sur mes fichiers! Peu-etre certain des 14CMS on deja ete connu ou meme utilisé.. mais, je voulais quand meme vous les partager sur Funky-Emulation!! Site Site2 Source : Epvp Bonne journée, Praxy --- Download
  13. Cette quête va vous permettre d'envoyer des messages automatiques (de la même manière qu'un personnage GM utilise la commande /n) à tous vos joueurs toutes les 2 heures par exemple. Pour ajouter/éditer/supprimer des messages, un fichier sera automatiquement créé dans vos files dans le répertoire suivant: /usr/metin2/share/data Une phrase par ligne dans ce fichier. Vous n'aurez pas à reboot votre serveur ou recompiler vos quêtes à chaque changement. quest automatic_notices begin state start begin function get_notices() local check = io.open("data/notices_list", "a") check:close() local table_get_notices = {} local f = io.open("data/notices_list", "r") for line in f:lines() do table.insert(table_get_notices, line) end f:close() return table_get_notices end when letter with pc.is_gm() begin send_letter("Messages automatiques (management)") end when button or info with pc.is_gm() begin local combien_de_minutes = 30 -- Messages automatiques toutes les combien de minutes ? Actuellement 30. local text = { [0] = "Messages automatiques actuellement désactivés.", [1] = "Messages automatiques actuellement activés.", } say_title("Messages automatiques (management)[ENTER]") say(text[game.get_event_flag("notices_loop")]) say("Que voulez-vous faire ?[ENTER]") local choice = select("Activer les messages automatiques", "Les désactiver", locale.cancel) if choice == 3 then return end if choice == 2 then setskin(NOWINDOW) syschat("Les messages automatiques ont bien été désactivés.") game.set_event_flag("notices_loop", 0) clear_server_timer("notices_server_loop") return end if choice == 1 then setskin(NOWINDOW) syschat("Les messages automatiques ont bien été activés.") game.set_event_flag("notices_loop", 1) automatic_notices.get_notices() server_loop_timer("notices_server_loop", combien_de_minutes*60) return end end when notices_server_loop.server_timer with game.get_event_flag("notices_loop") !=0 begin local notices = automatic_notices.get_notices() notice_all(notices[number(1, table.getn(notices))]) end end end N'oubliez pas de modifier ceci par le nombre de minutes entre chaque message automatique: local combien_de_minutes = 30
  14. Salut tout le monde ! Je vous partage le client WoW 5.4.1 Mists Of Pandaria en FR. Vous avez le choix entre la version 32BITS et 64BITS. Client 32 bits : ICI Client 64 bits : ICI Si vous avez des questions, n'hésitez pas Source : zone-wow Bon jeu ! --- Download
  15. Bonjour Funky! Je vous partage aujourd'hui un petit CMS avec 3 couleurs changeable que j'ai fais en 10 minutes, il ne comporte qu'un système d'inscription et de classement. Pour la configuration de la base de données, c'est dans config/db.php, pas besoin de vous montrez comment configurer ça j'espère Téléchargement: Clique ici A+ --- Download
  16. Shivas est un émulateur Dofus 1.29 développé en Java avec Mina pour le réseau et Atomium pour la db. Voir les sources : [Hidden Content] Voir le changelog : [Hidden Content]/commits/master Features : (dernière màj 19.09.2012) se déplacer parler boost ses caractéristiques boost ses sorts gérer son inventaire, utiliser des consommables gérer sa liste d'amis/ennemis utiliser des commandes IG système de cadeau scripting groupes zaaps échanges entre joueurs Ce projet n'est plus maintenu, à contre-cœur, notamment à cause de mauvais choix dès le départ. Les travaux que j'ai fait ne me convienne plus et je me suis tourné vers d'autres techniques. J'ai conscience que le projet sera sûrement très lourd à maintenir mais je pense que ça en vaut la peine au moins pour apprendre. J'ai créé deux pages wiki pour savoir comment compiler le projet et comment créer un mod. Vous pouvez reprendre le projet sans ma permission tant que les sources sont partagées publiquement ou sinon veuillez juste m'en informer par MP, merci. --- Download
  17. Bonjour à vous tous. Encore une fois et dans le même but que le tutoriel d'avant hier, j'ai décidé de vous apprendre à corriger une erreur, qui peut arriver chez vous et qui arrive probablement chez vous à l'heure actuelle. @ASIKOO m'ayant demandé d'y jeter un oeil et encore une fois possédant ce bug, j'ai décidé de vous apprendre à le corriger ! :papy: Voici donc le spécimen de l'erreur de erreur que je vais corriger chez moi : Ce qu'on apprend : Le jeu n'a pas réussi à trouver les données d'accumulation dans le fichier "run.msa" du monstre "fire_tiger". La source de l'erreur : Il manque la ligne accumulation et/ou les données dans le fichier "run.msa" du monstre "fire_tiger". Pour corriger, c'est très simple, afin de le faire de manière propre, j'ai utilisé le Tool Metin2MsaMaker trouvable dans les sources et compilable depuis là. Il m'a sorti un fichier complet mais vous pouvez très bien faire sans, c'était juste pour voir si les tools d'Ymir allaient me donner la même erreur ^^ D'ailleurs le tool me sortait des valeurs neutres, à savoir des 0, avec des zéros, l'erreur reste la même, il suffit donc d'attribuer une valeur non nulle à ce dernier. J'ai donc rajouté la ligne "Accumulation", avec des valeurs. Cependant, il faut toucher à la valeur du milieu, autrement, même avec des valeurs ailleurs, il vous sortira la même erreur. Vous pouvez donc mettre "0.001" à la valeur du milieu comme je l'ai fait ! Je précise que je n'ai pas notifié de soucis particuliers en jeu, alors je pense que c'est safe. Pour comparer, voici le fichier avant, qui me provoquait l'erreur : ScriptType MotionData MotionFileName "D:\ymir work\npc\fire_tiger\run.GR2" MotionDuration 0.666666 Voici le fichier actuel, qui ne me sort aucune erreur ! ScriptType MotionData MotionFileName "D:\ymir work\npc\fire_tiger\run.GR2" MotionDuration 0.666666 Accumulation 0.00 0.001 0.00 Voici donc la ligne à rajouter à la fin de chaque fichier .msa vous sortant une erreur comme celle que nous avons examiné plus haut: Accumulation 0.00 0.001 0.00 Je laisse le dernier mot à ce cher ASIKOO ! :hehe: :hehe: C'est tout pour moi et bonne journée à vous !
  18. 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
  19. 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.
  20. 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
  21. Bonjour, Granny 2.9.12 Granny 2.11.8 Granny 2.8.41 Cordialement, History. --- Download
  22. 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
  23. 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
  24. 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
  25. 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.
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.