Search the Community

Showing results for tags 'tutoriel / partage'.



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
    • 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
  • PassionDev's Forum
  • M2 Project's M2P
  • M2 Project's Aide / Questions / Support
  • M2 Project's Tutoriels & Partages
  • M2 Project's Suggestions
  • M2 Project'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 762 results

  1. 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
  2. Niveau requis : Intermédiaire Temps estimé : Entre 25 et 30 minutes Bonjour j'ai vue ce partage sur d'autre forum mais pas ici, donc je vous en fais une petite traduction ici pour les moins bilingue d'entre nous Dans le tutoriel il y est utilisé la variable "int" car elle propose une limite de 2147483647 niveau pour cette utilisation ce qui semble bien plus que suffisant c'est pourquoi l'auteur du post recommande cette variable. Bref j'imagine que je n'ai pas vraiment de vous expliquer en quoi consiste ce tuto, voici un petit screen du résultat : Pré-requis: - Les sources de votre serveur - Les sources de votre client - Un accès ftp via FileZilla ou WinSCP - Un accès BDD via Navicat I. Partie /Srcs/Server/game/ II. Partie /Srcs/Server/common/ III. Partie /Srcs/Server/db/ IV. Parti /SrcsClient/UserInterface/ Pour finir dirigez vous vers Navicat, ouvrez votre bdd 'player' faites clique droit sur la table 'player', selectionnez "Design Table", déscendez a la ligne 'level', dans la colonne 'Type' modifiez en 'int' et dans la colonne 'Length' modifiez le chiffre et mettez '5' pour etre tranquille. Le fichier 'constants.cpp' : ICI Credit, Source : ~masodikbela Pour continuer: Vous n'avez plus qu'a compiler et modifier le niveau max de vos files : Modifier le level maximum
  3. 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
  4. 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
  5. Bonjour, Aujourd'hui, je vais vous apprendre à créer votre rétro habbo avec PlusEmu, phpmyadmin et XAMP au passage Pour cela, vous allez avoir besoin de : XAMPP, pour pouvoir gérer la partit web et la base de donnés Lien : [Hidden Content] Le CMS: ICI C'est le site WEB (le CMS) que l'on va utiliser pour le serveur Habbo. Il nous permettra d'accéder à l'hôtel ainsi que de gérer la maintenance du serveur (Membres, appartements, etc ...) Les fichiers Habbo (Emulateur + Base de données + SWF): [Hidden Content] Vous aurez aussi besoin de l'émulateur avec sa base de donnée ! Lien : ICI Une fois ceci, fait, nous pouvons commencer. Rendez vous dans le dossier web de XAMPP (htdocs) déplacez-y tous les fichiers contenue dans l'archive du site : Démarrez ensuite XAMPP, installer Apache et Mysql en appuyant, puis démarrez les (appuyez sur les boutons en rouge pour les installer et en bleu pour les démarrer), une fois fait, vous devriez avoir ceci : Il se peut que Apache utilise le même port que skype, pour ça changez le dans les paramètres de WAMP. Rendez maintenant sur phpmyadmin : [Hidden Content] Appuyez sur "nouvelle base de données" : Nommez là : funkyEmu , puis appuyez sur "créer" : Ensuite, faites "importer" : Faites "parcourir", puis sélectionner le habbo.sql se trouvant dans l'archive de l'émulateur : Si le fichier ne veut pas s'upload, c'est qu'il est trop gros pour phpmyadmin, allez dans xampp\php\php.ini et modifier cette ligne : Ensuite, uploadez votre habbo.sql, cela peut prendre un peu de temps. Une fois fait, vous devriez avoir quelques tables d'ajouté(et d'autres, mais bon tout ne tient pas dans un screen) : Allez ensuite dans votre dossier : htdocs\includes\settings.inc.php Verfiez que les informations sont bien remplis comme ça, ou changez le nom de la base de données (les // sont là pour vous aidez) si vous n'avez pas mis "FunkyEMU". Enregistrez, puis rendez-vous sur : [Hidden Content] Sélectionnez ensuite "Butterfly", puis faites "Valider l'installation" Une fois fait, cliquez sur "Supprimer fichier d'installation". Vous allez ensuite vous créez un compte sur votre site. Allez ensuite ici : [Hidden Content] Allez dans votre base de donnée, puis la table "users" : Changez ensuite le "1" de "rank" en "10" Rendez vous ensuite sur votre site, relancez la page, et un bouton est apparue : Cliquez dessus, puis allez dans "configuration" Vous aurez ceci : Configurez les comme ceci : Variables : [Hidden Content]game/gamedata/external_variables.txt Texts : [Hidden Content]game/gamedata/external_flash_texts.txt Furnidata : [Hidden Content]game/gamedata/furnidata.xml Productdata : [Hidden Content]game/gamedata/productdata.txt Banner : Ne pas y toucher Base : [Hidden Content]game/gordon/PRODUCTION-201601012205-226667486/ Habbo SWF : [Hidden Content]game/gordon/PRODUCTION-201601012205-226667486/Habbo.swf Ce qui donne : Ensuite, il va falloir faire un petit changement dans votre panneau de configuration, allez dans : Faites parametres suplémentaire, puis : Changez le symbole décimal par un "." Faites "Appliquer", et le tour est joué ! Ensuite, aller dans l'émulateur : Emulateur PlusEmu\bin\Debug\config.ini Vous metterez ceci : Code : ## MySQL Configuration db.hostname=127.0.0.1 db.port=3306 db.username=root db.password= db.name=FunkyEmu Changer le si vous n'avez pas mis "FunkyEmu" en nom de base de données. Enregistrez, puis lancer l'émulateur grâce à : Plus Emulator.exe qui se trouve dans le meme dossier que le config.ini Vous aurez normalement ceci : Vous pouvez donc vous connectez sur votre rétro habbo ! Pour être staff, il vous suffit de vous mettre au "rank" 8 de la même façons que vous vous êtes mis "rank" 10 toute à l'heure. je sais que le tutoriel à déjà été fait mais apparemment Navicat créer des erreurs, je ne sais pas je n'ai pas essayez mais au moins, voici de quoi rendre tout le monde heureux. Bon jeu ! Cordialement. --- Download
  6. Bonjour. Alors moi, comme j'aime avoir le choix, quand j'ai vu ça : /n = Sans le nom ou /n = Avec le nom GM mais tout le temps, je me suis dis, c'pas possible, il faut que j'ai le choix. Du coup j'ai fais ça vite fais : Allez dans votre uichat.py (root) : Ajoutez : import player Cherchez : def __SendTalkingChatPacket(self, text): Remplacez la fonction par (Remplacez les tabs) : def __SendTalkingChatPacket(self, text): characterName = player.GetName() if text[0] == '/' and text[1] == 'n' and text[2] == 'n' and text[3] == ' ': text = text[3:] self.__SendChatPacket("/n "+ text, chat.CHAT_TYPE_TALKING) self.__ResetChat() elif text[0] == '/' and text[1] == 'n' and text[2] == ' ': text = text[2:] self.__SendChatPacket("/n "+characterName + " :"+ text, chat.CHAT_TYPE_TALKING) self.__ResetChat() else: self.__SendChatPacket(text, chat.CHAT_TYPE_TALKING) self.__ResetChat() Ce qui donne : Packez. Maintenant si vous faites : /n il affiche le nom du GM et si vous faites /nn il fait un /n mais sans le nom du GM. Voilà. Cordialement, Takuma. Edit : code un peu plus propre (mais non tester) : def __SendTalkingChatPacket(self, text): characterName = player.GetName() if text.startswith("/nn"): self.__SendChatPacket("/n{}".format(text[3:]), chat.CHAT_TYPE_TALKING) elif text.startswith("/n"): self.__SendChatPacket("/n {}:{}".format(characterName, text[2:]), chat.CHAT_TYPE_TALKING) else: self.__SendChatPacket(text, chat.CHAT_TYPE_TALKING) self.__ResetChat()
  7. Bonjour ! Aujourd'hui on va apprendre à mettre le plugin ClearLag sur son serveur et comment s'en servir ok ? Bah c'est partit alors Téléchargement : ici 1.CLearLag ça sert à quoi ? ClearLag est un plugin minecraft qui sert à réduire les lags sur votre serveur en supprimant tout les objets loots (au sol). Toutes les minutes avant de le faire, il va prévenir les joueurs, même chose pour 30 seconde et 10 secondes. 2.Mettre le plugin au nom de son serveur : Je vous avoue que on va pas du tout se compliqué la tache. Pour preuve ? Ouvrez votre .jar avec WinRar. Vous allez donc extraire le fichier : config.yml Ouvrez le, et rechercher : [ClearLag] Vous obtiendrez normalement 4 résultats : Vous n'avez donc que à remplacer le ClearLag par votre nom de serveur, ou bien enlever la ligne si vous ne voulez pas envoyer de message, mais bon après les loots peuvent se supprimer quand les joueurs s'échange des items... Vous pouvez aussi traduire toute la phrase. Vous sauvegardez, et vous replacez ce fichier bien gentiment dans sa petite archive, et le tour est joué 3.Installation : Pour l'installation, rien de plus simple, déplacer le directement dans votre dossier plugins, pas d'autre manipulation à faire ! C'est quand même cool hein ? J’espère que ça pourra vous aider. Cordialement.
  8. Bonjour, aujourd'hui je vous partage le logiciel Flash Decompiller Trillix 5.3.1370. Ce programme sert à ouvrir les fichiers en .swf Vous pouvez vous en servir pour changer l'image du chargement de votre rétro par exemple ! Liens mega : ici Scan : ici Tutoriel : Il est déjà intégré dans l'archive, mais je l'explique quand même ici avec quelques screens ! Vous allez installer le programme qui se trouve dans Setup en prenant soins de décocher la case pour le lancer à la fin ! Je vous détaille l'installation même si je pense que vous savez faire... Sélectionnez votre langue puis, puis faite "OK" Faites suivants : Faites ensuite l'installation standard, c'est très important ! Après, faite attention à ne pas cocher cette case : SURTOUT PAS Allez ensuite dans sur votre bureau : Faites CLIQUES DROIT sur "Flash Decompiler Trillix.exe" (un menu déroulant s'affichera), et cliquez sur "Ouvrir l'emplacement du fichier". maintenant, vous avez les deux dossier "Program Files (x86)\Eltima Software\Flash Decompiler Trillix" & "Flash Decompiler Trillix 5.3.1370 cracked" Dans le dossier "Flash Decompiler Trillix 5.3.1370 cracked", glissez le programme "FlashDecompiler.exe" dans le dossier "Program Files (x86)\Eltima Software\Flash Decompiler Trillix" Et voilà c'est cracker. Bon jeu à vous Cordialement. --- Download
  9. 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!
  10. 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.
  11. 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
  12. Salut Funky ! Je vous partage aujourd'hui mon émulateur basé sur PlusEmu avec certaine faille de fixé. Il n'est malheureusement pas Open-Source car il n'est pas encore totalement terminé. Les changements: -Faille SSO corrigé -Modification du :about ([Hidden Content]) -Modification du HC Club ([Hidden Content]) -Modification du :ha (pseudo sous et ([Hidden Content])) -Traduction 98% de l'émulateur ([Hidden Content]) Scan: [Hidden Content] (0/53) Téléchargement: [Hidden Content] --- Download
  13. 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
  14. 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.
  15. 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
  16. Salut à tous , je vais vous expliquer comment mettre 4 pages d'inventaire. Tout d'abord, allez ici : Server/common/ puis ouvrez length.h Ensuite cherchez : INVENTORY_MAX_NUM = 90, et remplacez par : INVENTORY_MAX_NUM = 180, Ensuite, dans le répertoire : game/src ouvrez char_item.cpp et cherchez : BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2); et remplacez cette ligne par : BYTE bPage = bCell / (INVENTORY_MAX_NUM / 4); Cherchez ensuite(toujours dans le char_item.cpp) : if (p / (INVENTORY_MAX_NUM / 2) != bPage) puis remplacez par : if (p / (INVENTORY_MAX_NUM / 4) != bPage) Ensuite ouvrez exchange.cpp et cherchez : static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 2); // inven page 1 puis complétez comme ici : static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 4); // inven page 1 static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 4); // inven page 2 static CGrid s_grid3(5, INVENTORY_MAX_NUM/5 / 4); // inven page 3 static CGrid s_grid4(5, INVENTORY_MAX_NUM/5 / 4); // inven page 4 s_grid1.Clear(); s_grid2.Clear(); s_grid3.Clear(); s_grid4.Clear(); Ensuite, rajoutez en début de fichier ces lignes (en dessous des #include) : /* 4 INVENTORY DEFINES */ #define INVEN_PAGES 4 #define INVEN_PAGE_SIZE (INVENTORY_MAX_NUM / INVEN_PAGES) Ensuite dans la fonction " bool CExchange::CheckSpace() " , remplacez les lignes ci-dessous : for (i = 0; i < INVEN_PAGE_SIZE; ++i) { if (!(item = victim->GetInventoryItem(i))) continue; s_grid1.Put(i, 1, item->GetSize()); } for (i = INVEN_PAGE_SIZE; i < INVEN_PAGE_SIZE*2; ++i) { if (!(item = victim->GetInventoryItem(i))) continue; s_grid2.Put(i - INVEN_PAGE_SIZE, 1, item->GetSize()); } for (i = INVEN_PAGE_SIZE*2; i < INVEN_PAGE_SIZE*3; ++i) { if (!(item = victim->GetInventoryItem(i))) continue; s_grid3.Put(i - INVEN_PAGE_SIZE*2, 1, item->GetSize()); } for (i = INVEN_PAGE_SIZE*3; i < INVENTORY_MAX_NUM; ++i) { if (!(item = victim->GetInventoryItem(i))) continue; s_grid4.Put(i - INVEN_PAGE_SIZE*3, 1, item->GetSize()); } Ensuite, chercher : int iPos = s_grid1.FindBlank(1, item->GetSize()); vous devriez y voir ca : int iPos = s_grid1.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid1.Put(iPos, 1, item->GetSize()); } else { iPos = s_grid2.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid2.Put(iPos, 1, item->GetSize()); } else { return false; } } modifier par int iPos = s_grid1.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid1.Put(iPos, 1, item->GetSize()); } else { iPos = s_grid2.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid2.Put(iPos, 1, item->GetSize()); } else { iPos = s_grid3.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid3.Put(iPos, 1, item->GetSize()); } else { iPos = s_grid4.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid4.Put(iPos, 1, item->GetSize()); } else { return false; } } } } PARTIE SERVEUR TERMINÉE Passons maintenant Partie client. Pour commencer , allez ici : Client/Userinterface et ouvrez GameType.h et cherchez : const DWORD c_Inventory_Page_Count = 2; et remplacez par : const DWORD c_Inventory_Page_Count = 4; Ouvrez ensuite inventorywindow.py et cherchez : EQUIPMENT_START_INDEX = 90 que vous remplacez par : EQUIPMENT_START_INDEX = 180 Ensuite, (eh oui, c'est toujours pas terminé !) ouvrez uiinventory.py et cherchez : self.inventoryTab.append(self.GetChild("Inventory_Tab_02")) que vous ajoutez en dessous : self.inventoryTab.append(self.GetChild("Inventory_Tab_03")) self.inventoryTab.append(self.GetChild("Inventory_Tab_04")) ensuite cherchez : self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg)) et ajoutez en dessous : self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg)) self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg)) cherchez ensuite : self.inventoryTab[0].Down() rajoutez en dessous : self.inventoryPageIndex = 0 Ensuite cherchez la fonction SetInventoryPage et remplacez par ça : def SetInventoryPage(self, page): self.inventoryTab[self.inventoryPageIndex].SetUp() self.inventoryPageIndex = page self.inventoryTab[self.inventoryPageIndex].Down() self.RefreshBagSlotWindow() PARTIE CLIENT TERMINÉE Vous pouvez tout recompiler et la partie source est terminée. Je vous partage mon inventorywindow.py qui se trouve dans locale_fr/ui : import uiScriptLocale import item EQUIPMENT_START_INDEX = 180 window = { "name" : "InventoryWindow", ## 600 - (width + i?¢´e¡Í¢¬i¨£¨öi©«¨ùe¢®©« e¢Ò¢æi?¡Æ e?i?¡Æe¢¬¡Æ 24 px) "x" : SCREEN_WIDTH - 176, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 176, "height" : 585, "children" : ( ## Inventory, Equipment Slots { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 176, "height" : 585, "children" : ( ## Title { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 8, "y" : 7, "width" : 161, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x":77, "y":3, "text":uiScriptLocale.INVENTORY_TITLE, "text_horizontal_align":"center" }, ), }, ## Equipment Slot { "name" : "Equipment_Base", "type" : "image", "x" : 10, "y" : 33, "image" : "d:/ymir work/ui/equipment_bg_without_ring.tga", "children" : ( { "name" : "EquipmentSlot", "type" : "slot", "x" : 3, "y" : 3, "width" : 150, "height" : 182, "slot" : ( {"index":EQUIPMENT_START_INDEX+0, "x":39, "y":37, "width":32, "height":64}, {"index":EQUIPMENT_START_INDEX+1, "x":39, "y":2, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+2, "x":39, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+3, "x":75, "y":67, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+4, "x":3, "y":3, "width":32, "height":96}, {"index":EQUIPMENT_START_INDEX+5, "x":114, "y":67, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+6, "x":114, "y":35, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+7, "x":2, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+8, "x":75, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+9, "x":114, "y":2, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+10, "x":75, "y":35, "width":32, "height":32}, ## i?? e¡Æ?i¡×¢æ1 ##{"index":item.EQUIPMENT_RING1, "x":2, "y":106, "width":32, "height":32}, ## i?? e¡Æ?i¡×¢æ2 ##{"index":item.EQUIPMENT_RING2, "x":75, "y":106, "width":32, "height":32}, ## i?? e©÷¡§i?¢¬ {"index":item.EQUIPMENT_BELT, "x":39, "y":106, "width":32, "height":32}, ), }, ## Dragon Soul Button { "name" : "DSSButton", "type" : "button", "x" : 114, "y" : 107, "tooltip_text" : uiScriptLocale.TASKBAR_DRAGON_SOUL, "default_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_01.tga", "over_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_02.tga", "down_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_03.tga", }, ## MallButton { "name" : "MallButton", "type" : "button", "x" : 118, "y" : 148, "tooltip_text" : uiScriptLocale.MALL_TITLE, "default_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_01.tga", "over_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_02.tga", "down_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_03.tga", }, ## CostumeButton { "name" : "CostumeButton", "type" : "button", "x" : 78, "y" : 5, "tooltip_text" : uiScriptLocale.COSTUME_TITLE, "default_image" : "d:/ymir work/ui/game/taskbar/costume_Button_01.tga", "over_image" : "d:/ymir work/ui/game/taskbar/costume_Button_02.tga", "down_image" : "d:/ymir work/ui/game/taskbar/costume_Button_03.tga", }, { "name" : "Equipment_Tab_01", "type" : "radio_button", "x" : 86, "y" : 161, "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub", "children" : ( { "name" : "Equipment_Tab_01_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "I", }, ), }, { "name" : "Equipment_Tab_02", "type" : "radio_button", "x" : 86 + 32, "y" : 161, "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub", "children" : ( { "name" : "Equipment_Tab_02_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "II", }, ), }, ), }, { "name" : "Inventory_Tab_01", "type" : "radio_button", "x" : 10, "y" : 33 + 189, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1, "children" : ( { "name" : "Inventory_Tab_01_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "I", }, ), }, { "name" : "Inventory_Tab_02", "type" : "radio_button", "x" : 10 + 78, "y" : 33 + 189, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2, "children" : ( { "name" : "Inventory_Tab_02_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "II", }, ), }, { "name" : "Inventory_Tab_03", "type" : "radio_button", "x" : 10, "y" : 33 + 210, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_3, "children" : ( { "name" : "Inventory_Tab_03_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "III", }, ), }, { "name" : "Inventory_Tab_04", "type" : "radio_button", "x" : 10 + 78, "y" : 33 + 210, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_4, "children" : ( { "name" : "Inventory_Tab_04_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "IV", }, ), }, ## Item Slot { "name" : "ItemSlot", "type" : "grid_table", "x" : 8, "y" : 264, "start_index" : 0, "x_count" : 5, "y_count" : 9, "x_step" : 32, "y_step" : 32, "image" : "d:/ymir work/ui/public/Slot_Base.sub" }, ## Print { "name":"Money_Slot", "type":"button", "x":8, "y":28, "horizontal_align":"center", "vertical_align":"bottom", "default_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "over_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "down_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "children" : ( { "name":"Money_Icon", "type":"image", "x":-18, "y":2, "image":"d:/ymir work/ui/game/windows/money_icon.sub", }, { "name" : "Money", "type" : "text", "x" : 3, "y" : 3, "horizontal_align" : "right", "text_horizontal_align" : "right", "text" : "123456789", }, ), }, ), }, ), } Pour clore le tutoriel , allez dans locale_interface.txt et cherchez : INVENTORY_PAGE_BUTTON_TOOLTIP_2 2e inventaire et ajoutez en dessous : INVENTORY_PAGE_BUTTON_TOOLTIP_3 3e inventaire INVENTORY_PAGE_BUTTON_TOOLTIP_4 4e inventaire Vous pouvez tout recompiler, repacker et regarder le résultat. Voila, tutoriel terminé, bonne chance ! Source : M2Dev, Corrigé par Kameyu, et merci à History, Galet et Calypso pour leur participation au débug.
  17. Bonjour, Travaillant actuellement sur un Bot Dofus et sur un logiciel de gestion d'items et dialogues. J'ai décidé de recréer de zero une classe pour chargé et lire les .d2i rapidement en en ne comsommant pas beaucoup de mémoire. Je me suis dis que peut être des nouveaux venu avait la flemme de comprendre et d'écrir le reader. Je ferais aussi une version pour les d2o après. Description C'est une Class Library (.dll) en VB.NET Il y a la possibilité d'utiliser l'option FastLoad qui permet d'economiser plus de ram. FastLoad: SlowLoad: il y a aussi la possibilité de choisir d'afficher le texte du d2i avec son mode diacritique ou non. Ainsi que d'afficher les textes des messages ui (ui.chat.check0). Version 1.1.0.0 (actuelle) : - Ajout de la fonction GetUi - Revue complète du SlowLoad et FastLoad 1.2.0.0 (prochaine) : - Ajout d'un système de cache pour le FastLoad - Ajouter le SlowLoad et FastLoad aux UI - Ajouter les diacritique au GetUi Fonctionnement Class FastReader: Chemin: le chemin du d2i FastLoad: Activer ou désactiver le FastLoad Fonction GetText: ID: l'ID du texte associé Diacritique: Afficher la version diacritique du texte. Fonction GetUi: MySearch: le message ui dont il faut trouver le texte. Exemple VB.NET Dim myReader As New FastReader(pather & "\i18n_fr.d2i", True) Console.WriteLine(myReader.GetText(1, False)) Console.WriteLine(myReader.GetUi("ui.chat.check6")) C# FastReader myReader = new FastReader(pather + "\\i18n_fr.d2i", true); Console.WriteLine(myReader.GetText(1, false)); Console.WriteLine(myReader.GetUi("ui.chat.check6")); Screens Slow Load: Fast Load: Téléchargements Virus Total: [Hidden Content] Download: [Hidden Content] Cordialement, The Falcon --- Download
  18. Bonjour à tous ! Un petit message d'introduction et on commence ! Tout d'abord merci à @Nicky31 pour son tutoriel qui représente une très grande partie de ce poste ! Je me permets de le reprendre pour corriger/apporter des éléments qui bloquaient pas mal de monde. Durée approximative : 10 à 30 en fonction de votre qualification. L'avantage d'Ancestra Remake 54 est le multi-serveurs (Il peut gérer plusieurs serveurs). Commençons ! 1 - Pré-Requis Disposer d'Ancestra Remake 54 Disposer d'une IP de connexion (Hamachi, No-Ip, dédié ...), à vous de voir ce que vous préférez. Hamachi : Simule un réseau local. No-Ip : Redirige sur votre IP accessible ici quand votre opérateur ne vous permet pas de la garder fixe. Dédié : Sur un autre PC constamment allumé fait maison ou loué en ligne. Hébergeur conseillé : Kimsufi / soyoustart. Disposer de WampServer (gratuit) et de Navicat (crack ou payé) sauf si vous savez vous débrouiller avec PhpMyAdmin Disposer de Dofus 1.29 (Certaines personnes ont des problèmes lors du lancement du client Dofus lorsqu'ils n'installent pas Dofus 1.29 dans Program Files (x86) ). 2 - Installer les base de données En premier lieu, l'émulateur a besoin, pour fonctionner, 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 (non obligatoire mais bon). 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 connexion) [*]Click droit sur localhost (votre connexion), 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 connexion, double clickez sur vos deux bases de données afin de les "ouvrir" (cela s'affichera en vert) [*]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 ... PS : Ne vous inquiétez pas "Patch rev5" affiche un message d'erreur dans les logs mais ce n'est pas grave. 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(bis) - 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 connexion 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 connexion), 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 connexion (celui sur lequel le client se connecte) L'ip de chaque serveur & leur port de connexion (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 connexion 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 connexion à la db. Si vous ne l'avez pas changé depuis l'installation, c'est toujours root ServerPassword ; le mot de passe de la connexion à 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 connexion à 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. Dans le cas ou vous avez fait le tutoriel à la lettre ; vous êtes censé mettre : REALM_DB_HOST = 127.0.0.1 REALM_DB_USER = root REALM_DB_PASSWORD = REALM_DB_NAME = ancestra_realm Warning Si vous n'avez pas mis de mot de passe (password) ; n'oubliez pas de laisser un espace après le "=" sinon le serveur ne se lancera pas. 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 (5555 dans ce tutoriel) 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 à @Défense 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. Dans le cas ou vous avez fait le tutoriel à la lettre ; vous êtes censé mettre : #Configuration de la base de donnée du serveur de connexion REALM_DB_HOST = 127.0.0.1 REALM_DB_USER = root REALM_DB_PASS = REALM_DB_NAME = ancestra_realm # Configuration de la base de donnée DB_HOST = 127.0.0.1 DB_USER = root DB_PASS = DB_NAME = ancestra_game 4 - Configuration des .bat pour démarrer le realm et le game Ouvrez avec un éditeur de .txt les fichiers "startRealm.bat" du dossier "realm" et "game". Vous devez à présent renseigner la localisation de votre "java.exe". Dans mon cas : @echo off title Ancestra Remake rev 54 :loop "C:\Program Files\Java\jre1.8.0_191\bin\java.exe" -jar -Xmx1024m -Xms1024m Ancestra.jar goto loop PAUSE Petite astuce pour avoir votre chemin rapidement : - Cherchez votre java.exe qui devrait se trouver dans "Programmes". - Créez un raccourci sur le bureau - Clique droit sur le raccourci puis "propriété" - Copier le contenu de "Cible :" La partie "-Xmx1024m -Xms1024m" correspond à la ram que vous allouez à votre serveur. Ici 1024m donc 1G de ram. 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. 5 - 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"> Exemple : <connserver ip="127.0.0.1" name="Serveur tuto" port="444"/> Si vous avez bien suivi ce tutoriel, vous devriez normalement mettre 444 pour le port du realm. Le nom du serveur ne dépend de rien de ce qu'on à fait avant. A présent que tout est en place, il ne reste qu'à lancer l'émulateur : En premier le Realm en lançant AR54/Realm/startRealm.bat puis le Game en lançant AR54/Game/startRealm.bat. (Vous pouvez renommer celui la en startGame.bat) Et voilà, distribuez la config.xml à vos joueurs, et votre serveur est en place ! Si vous avez des difficultés malgré le tutoriel je vous laisse les 3 configs que nous avons vu réglé pour faire tourner votre serveur en réseau local. Je conseille tout de même d'essayer un minimum pour ne pas être décourager pour la suite ! Game_Config.txt Realm_Config.txt config.xml Je me ferai une joie de répondre à vos questions et d'avoir des suggestions pour améliorer le contenu. Encore une fois, le tutoriel n'est pas de moi, j'ai seulement corrigé quelques parties causants des problèmes à beaucoup et apporter des précisions en accord avec @Calypso. Bonne chance à tous ! --- Download
  19. Bonjour, Aujourd'hui je vous propose les files 2016 de la Team-FE, aussi, repris par Saw, que j'ai modifié de mon côté. Changelog V3.0 (Team-FE) : -Système d'étole (Avec les 4 types d'étoles) -Système de costume d'armes -Système de costume de monture -Système de liaison d'âme -Système des 7è & 8è compétences -Système du pet officiel (Meley, petit singe, Bébé némère, Bébé razador, petite araignée) -Pierres anti-magie disponibles jusque +4 -Interface de création et de sélection de personnages officielle -4 inventaires disponibles -Ajout de nombreux mobs et items (Utilisation des item_proto et mob_proto officiels avec quelques modifications) -Level 255 débloqué mais fixé à 115 dans les CONFIG -Système des targets de couleur -Ajout de nombreux costumes et coiffures -Possibilité d'acheter des items à 0 yangs -Ajout de l'effet officiel quand on drop un item. -Ajout des armures 115. -Certaines interfaces ont été traduites. -FIX du lame enchanté -Mise en place de sécurité afin d'éviter certaines injections SQL -Les games et DB sont optimisés et ont la possibilité d'être stripper pour obtenir des poids de 5.000 Ko et 7.180Ko Liste des modifications apportées sur les files (Saw) : Serveur : drop des yang's sur les moobs réglé Réglage des fichiers CONFIG Amélioration du start.sh Ajout des cshybridcrypt dans packages Correction des data find count etc.... (0 syserr à l'ouverture) Débug de la give_basic_weapon + rangement du locale_list dans l'ordre A-Z Installation MySQL_query Client : Suppression de fichiers inutiles Optimisation des lib's (beaucoup moins lourdes) On obtient un client de 1go5 au lieu de 2go6 Débug des effets d'étoles Possibilité d'appuyer sur "ENTRER" pour choisir son personnage Fix de la texture du Theowahdan Ajout de la texture du Azräel qui était invisible Ajout de la liste des GM dans la liste d'amis Fix de la texture du Seon-Pyeong Réorganisation des Inventaires Débug effets/sons des 6èmes skill's Source serveur : achats d'item à 0 yang les monstres ne contenant pas de race le sysser DB de la monarch election l'erreur de la table des pet's lors de l'ouverture du serveur la suppression des personnages. Réglage de quelques warning de compilations. (Makefile dans l'ordre A-Z) Réglage du chat global et activations sur tous les channels. Réglage du shutdown: tics did not updated (checkpoint). Fix injection sql Fix ban depuis le messenger Fix ouverture db (merci à @Darknessmt2) Fix création de guilde/injection guilde Fix d'accumulation de bonus Fix core dungeon Activation fonction "pc.change_name" fix motion pet (sysser) fix header 100 (syserr) activation 6/7 fix accumulation des bonus des pets via l'échange. Fix du Bug Aura. Fix event kill qui est déclenché deux fois (merci à @A n t 0 k) Fix d'un problème qui empêcher de changer d'item lorsque l'inventaire est plains Fix du BeltInventory Fix bug PV négative lors d'un tp/connexion Source client : Amélioration de la structure des fichiers (plus besoin de spécifié les includes/libs dans les paramètres/beaucoup plus compréhensible) Accélération du défilement des quêtes (0 secondes) Modification des "[Niv. %d" en "Lv %d" Suppression italique sur MP avec un staffien. Passage en Python 2.7 Et maintenant, ce que j'apporte de mon côté aux files : Files : Armures / Armes Kyanites et Zodiaque Biologiste universelle Multi-sélection de shop (à remplir) Bonus 6 et 7 dans l'item-proto Client : Correctif du temps restant dans les magasins Effet Berserk Prix à 0 yangs = Gratuit 999.999.999 yangs échangeables. Lisibilité du nombre de yang en échange (Séparation par ".") Ne plus avoir à consulter 2 fois le même magasin (Blanc = non ouvert / Vert = Ouvert) Détruire un Item (Inventaire) Armures / Armes Kyanites et Zodiaque Afficher le niveau des équipements dans l'inventaire (+0 à +9) Mode graphique HD Source client : Informations sur les entités Anti MobPuller // Waithack Changer la couleur des drops selon le propriétaire (rouge quand l'item ne nous revient pas) Remettre le niveau en temps réel. Détruire un Item (Inventaire) Afficher le niveau des équipements dans l'inventaire (+0 à +9) Mode graphique HD Stop collision Source serveur : Chance de lier les pierres sur les armes ou armures de 30% Chance d'insérer un diamant de 50% bonus 6-7 sur les costumes désactiver Enlevez les potions à chaque up level Cape de bravoure (100% de réussite) Les compétences passent à M1 directement dès 17 points Informations sur les entités Empêcher le buff entre joueur/staffien Remettre le niveau en temps réel Détruire un Item (Inventaire) Protection contre le kick et le Sync Hack Log MP surveillance (MySQL) Log d'échange surveillance (MYSQL) Drop de groupe en instance Bloquer n'importe quel objet, sur n'importe quelle Map sans reboot ! Anti Wall Hack Montrer un item dans le chat sans loupe magique Crash lorsqu'un objet est acheté en même temps en magasin J'espère que ce sera utile pour certains, je vous mets de suite les liens de téléchargement. Quelques images Client : Cliquez ici pour télécharger Files : Cliquez ici pour télécharger MySQL : Cliquez ici pour télécharger Source serveur : Cliquez ici pour télécharger Source client : Cliquez ici pour télécharger VDI (Utilisateur : root / Mot de passe : admin) : Cliquez ici pour télécharger Mise à jour le 04.08.2018 à 13h Cordialement, Saejin --- Download
  20. Après avoir rédigé des tutos pour installer un serveur privé sous Windows, je vais vous montrer comment faire pour créer un serveur privé sous Linux et plus précisément sous Ubuntu pour ceux qui connaissent, si vous avez Debian ou autre je pense que vous serez capables de faire l'équivalent. Installation lamp Alors on commence, nous allons d'abord installer lamp qui équivaut à wamp : sudo apt-get install lamp-server^ //Ne pas oublier le ^ très important Configuration Apache 2 Ensuite, nous allons configurer apache 2 pour commencer donc lisez correctement ce document et appliquez-le à la lettre. Configuration Mysql Après vous allez configurer mysql en vous aidant de ce document. Phpmyadmin Après ça nous allons mettre phpmyadmin car Navicat n'existe pas sous Linux donc lisez ça. Une fois cela fait je vous invite à aller sur [Hidden Content]. Si tout marche bien vous devez voir "It works" si ma mémoire est bonne. No-ip Nous allons mettre No-ip donc créez un compte sur le site No-ip.com et lisez ce document. Essayer d'aller sur votre no-ip maintenant et normalement s'il n'y a pas de problème vous devez voir votre configuration routeur, donc nous allons modifier ça. Fixer votre ip sous Linux et faites : sudo gedit etc/hosts.conf Et après tout à la fin ajoutez : Votre_ip_fixer Votre_No_Ip Exemple : 192.168.0.54 test.no-ip.org Enregistrez et retentez d'aller sur votre no-ip dans la barre d'adresse et vous devez de nouveau retomber sur "It works" ! Modification de la BDD Après avoir fait tout ça nous allons aller sur [Hidden Content]/phpmyadmin et exécuter les fichiers .sql pour l'ému choisi. Java Une fois fait je vous invite à installer java en faisant : sudo apt-get install sun-java6-jre Ensuite suivez ce tuto. Lancement du fichier .jar Pour finir, allez dans le dossier du fichier .jar cd ~/serveurdofus //Par exemple Et lancez l'ému en faisant : java -jar fichier.jar //Bien sûr remplacer fichier par le nom du fichier de l'ému ... Ps : Pour installer un CMS et pouvoir le voir sous http:/localhost/CMS mettez le dossier dans var/www. Modifications des fichiers de config On modifie le fichier config comme sur windows Donc une petite image pour vous aider : Et puis on modifie le fichier config.xml de dofus comme ceci : PS : N'oubliez pas d'ouvrir vos ports (5555, port choisit dans config, 3306, 443) Enfin !!! Vous avez fini votre installation du serveur sous Linux, bon jeu !
  21. Bonsoir apres que j'ai trouvé le kit graphite des cms de woople online et celuide ocean serveur ou dream obcession sur ce site, bref je viens de commencer mon nouveau cms et mon tout premier. Changelog : Téléchargement : ICI Remerciement : Fatal Pour le Design et quelques codes... TeamApero pour quelques images... Reben pour quelques sources... Désolé je sais pas coder le php donc je me suis basé différent cms et voila ce que ça a donné ce cms ou tous le monde voulait le voler ou plutôt arnaqué et maintenant gratuit... --- Download
  22. 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
  23. 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
  24. Salut Funky-Emu. Aujourd'hui je vais vous apprendre à installer HabboPHP et l'utiliser Pour suivre ce tutoriel, il vous faudra soit Phoneix soit Butterfly Il faudra totalement supprimer votre ancien CMS mais pas les SWF ! Téléchargement : ICI Scan virus : ICI On va maintenant l'installer, vous allez déplacer tout les fichiers de l'archive dans votre dossier web (ftp pour hebergeur // htdocs pour XAMP /// www pour WAMP) Un fois fait rendez vous sur : [Hidden Content] ou l'adresse de votre hébergement web. Faites "C'est partit" Allez ensuite dans votre base de donné, par exemple avec phpmydamin ça donne : -Allez dans votre base de données -Faites "importer" -sélectionner votre fichier .sql se trouvant dans pheonix : Faire ensuite "Exécuter" L'importation va durer un petit moment, c'est possible. Retournez sur votre localhost puis : Configurez comme il se doit ceci, puis, attendez phpmyadmin est finis toutes ses requêtes, puis faites : "Envoyer" puis "vérifier" Remplissez comme vous le voulez puis faites : "Envoyer" Ensuite, aller dans votre fichier web, puis supprimer le dossier "install" une fois ceci, fait allez sur [Hidden Content] Connectez-vous, et allez dans la Housepeeking (administration) : Allez dans l'onglet serveur et si vous avez suivis le tutoriel de Calypso vous devez entrer ça : (Si non, corrigez ce qu'il faut !) Adresse Emulateur : 127.0.0.1 Port Emulateur : 3000 Texts : [Hidden Content]game/gamedata/external_flash_texts.txt Variables : [Hidden Content]game/gamedata/external_variables.txt Habbo SWF : [Hidden Content]game/gordon/PRODUCTION-201602082203-712976078/Habbo.swf Ce qui devrait vous donnez ça : Une fois ceci fait, vous voilà Administrateur, cms configurer, je crois que c'est bon non ? Petit bonus, pour changer ça : Allez dans : admin\includes\footer.php admin\form\includes Voilà, après ce petit bonus, je vous laisse Bon jeu ! Cordialement. --- Download
  25. 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