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

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 04/19/24 dans toutes les zones

  1. Centre de Téléchargement Télécharger ( Interne ) Bonjour, voici le switchbot développé par Sanii, l'archive est complète, bon jeu. L'archive contient : - Les modification coté client - Les modifications coté base de donée - Mes modification coté source client et serveur
    1 point
  2. M2 Download Center Download Here ( Mega.nz, Future updates will also be here) Client & Serverfiles + VDI ( Internal / Backup ) L'objectif est de proposer des serverfiles de référence 40250, aucun nouveau système n'a été ajouté, uniquement des corrections de bugs. Langues disponibles : EN/DE/HU/FR/CZ/DK/ES/GR/IT/NL/PL/PT/RO/RU/TR Langue par défaut : Anglais SSH / VM : root/123456789 MySQL : root/123456789 IG : admin/123456789 Commandes & Alias start cd /usr/metin2/server && sh start.sh close cd /usr/metin2/server && sh close.sh clear cd /usr/metin2/server && sh clear.sh backup cd /usr/metin2/server && sh backup.sh questcompile cd /usr/metin2/server/share/locale/english/quest && python make.py dbclean cd /usr/metin2/src/db/src && gmake clean dbcompile cd /usr/metin2/src/db/src && gmake gameclean cd /usr/metin2/src/game/src && gmake clean gamecompile cd /usr/metin2/src/game/src && gmake Remerciement @Mali pour les sources mises à jours : client & server @Sanchez pour le client de base 2014 base client. @Veltor88 pour les traductions avec translate.lua @Fazer pour le pack locale_string By TMP4
    1 point
  3. Centre de Téléchargement Télécharger ( Interne ) Plop, je vous partage un système que j'ai trouvé avec l'aide de Franch <fileStore.core_Emoticons>/emoticons/wink.png Chaque grade comporte un grade IMPLEMENTOR = GA HIGH_WIZARD = SGM GOD = GM LOW_WIZARD = MOD Il faudra modifier la partie Source serveur ( tutoriel dans le fichier rar ) Il faudra modifier la partie source client ( tutoriel dans le fichier rar ) Il faudra modifier la partie root.eix Il faudra modifier la partie locale_fr.eix Toute les informations ce trouve dans le fichiers rar, Le partage vient du forum turkmmo l'auteur c'est Suky Voici les screens qui vont avec : Révélation Virus Total : ICI Download : ICI J’espère que sa pourra vous intéressé
    1 point
  4. Bonjour, Bonsoir Je partage la version de TMP4 que j'ai retapé un peu j'ai simplement ranger le client ( le dossier pack) puis ajouter quelque petit système comme les 4Pages d'inventaire, l'interface de caractéristique de l'officiel avec le tooltips qui va avec. J'ai ensuite désactivé l'encryptage des paquets puis corriger quelque sysser lié à la SEQUENCE. Le page de quête comme l'officiel. Je tiens à préciser que la suite de cette version sortira plus tard avec les systèmes proposés sur certain forum. Voilà ce n'est pas grand-chose mais on ma demandé de partager c'est files comme ça pour une base bonne pour tout le monde. Previews : Official character windows with tooltips [Hidden Content] MouseWheel [Hidden Content] 4 Pages inventory [Hidden Content] Changelog : Liens de téléchargement
    1 point
  5. Centre de Téléchargement Télécharger ( Interne ) 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
    1 point
  6. Centre de Téléchargement Télécharger ( Interne ) Bonjour, Bonsoir touts le mondes Je viens vous partager le travail de "Kuroro" si je partage c'est files ses pour vous faire plaisir ou bien vous aidez s'il vous faut des systèmes ou autres. Ces files contiennent beaucoup de bug comme les pets qu'il ne s'invoque pas ou bien le Refresh de la banque du Magasin hors ligne, il y a effectivement beaucoup d'autres bugs que je n'ai pas rencontré surement. J'ai FIX ce que je pouvais ainsi que Débug l'inventaire spécial avec les pets qui affichait "Défense contre la magie 34000" Voici les systèmes côté sources service.h : Voici les systèmes côté source client Locale_inc : Lien de téléchargement : Source Client Client Kuroko Serveur BDD Files Kuroko Source Files VDI Kuroko DumpProto Je précise que sur le VDI les Files/Source sont pré-installer et compilable sans aucun soucis. Les logs du VDI ID : root MDP : admin Les logs de Navicat : ID : root MDP : admin Pour continuer: Citer les tutoriels / partages à pour poursuivre la création. Ou un lien vers des partages / vers l'AQS.
    1 point
  7. Download Metin2 Download Nature MDE Set - Ridack 3D Weapons Mass Import Script
    1 point
  8. Download Metin2 Download Ce système restreint les actions du joueur dans les duels, comme les demandes d'amis, les échanges, etc... Plusieurs actions sont également bloquées sur les maps PVP. Fonctions bloquées lors d'un duel Bloque les demandes d'amis lors d'un duel. Bloque les demandes de groupe lors d'un duel. Bloque les demandes de guilde lors d'un duel. Bloque l'action pendant un duel. Bloque l'utilisation des émotions lors d'un duel. Bloque le changement d'équipement lors d'un duel. Fonctions qui sont bloquées lorsque vous êtes sur une map duel Un chaman, peut se buff lui même. Bloque les demandes de guilde sur la map duel. Bloque l'utilisation des orbes de polymohpie. Bloque l'utilisation des animaux de compagnie. Bloque l'utilisation des montures. Bloque le changement de mode PK. Fonctions activées sur une map duel Pas de collision avec des joueurs qui ne sont pas en duel (ne s'applique pas aux joueurs en duel) Les bonus négatifs (par exemple l'empoisonnement) sont supprimés à la fin du duel. La vie des joueurs au duel sera reconstituée à la fin du duel. Pas de sélection d'empire sur les maps duel. Corrections des duels Le duel se termine dès qu'un des joueurs se déconnecte. (S'applique uniquement à la map PVP (peut être modifié)) Yuma
    1 point
  9. Centre de Téléchargement Télécharger ( Interne ) HelloW, Voici un partage d'un très vieux client de Metin2... Le Client de l'année 2007 ! Il est en anglais. Cordialement, ASIKOO
    1 point

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.