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

Kuroro

Membre
  • Compteur de contenus

    442
  • Inscription

  • Dernière visite

  • Jours gagnés

    10

Tout ce qui a été posté par Kuroro

  1. Salut, Merci pour ta réponse. Je t'invite à télécharger le client de wom2, de te faire un compte et d'entrer en jeu. Compte même pas 2 secondes pour le login, la selection et le chargement. Je pense qu'avoir un jeu optimisé est indispensable pour avoir une base stable & rapide. Tout les gros dev, à ma connaissance ont retiré ce système des sources mais ça ne veut dire pas qu'ils ont raison. C'est d'ailleurs pour cette raison que j'ai effectué des test sur du long terme et que j'en ai tiré cette conclusion. Concernant ta remarque par rapport à la sécurités des donne du client, on est en 2018, les gens n'exploitent plus ce genre de faille depuis un bon bout de temps. Je pense que tout les gros serveur auraient sautés sinon. Merci pour ta réponse développé
  2. Centre de Téléchargement Télécharger ( Interne ) Salut à tous, Je viens vous partager les résultats de mes test après quelques mois. Moins de déconnexion inexpliqué lié au game. Plus aucune erreur lié au séquence dans les syserrs Sources serveur & client allégés Comme vous pouvez le constater, la suppression de ce système est entièrement bénéfique puisque c'est un système incomplet provoquant des déconnexion en jeu sans aucune raison. Le système générait également cette erreur côté serveur: Par contre, si vous avez désactiver l'encryption des packets sur vos sources, ça nécessitera beaucoup d'autres modifications assez importantes. Si vous voulez faire une série de test vous avez la possibilité d'agir de 3 façons différentes : #ifndef SEQUENCE_SYSTEM_DISABLED avant chaque code lié aux séquences. Vous commentez le code Vous supprimez le code pour alléger votre sources (j'ai opté pour celle-ci) Commençons, Ouvrez input.cpp et cherchez : if (bHeader == HEADER_CG_PONG) sys_log(0, "PONG! %u %u", m_pPacketInfo->IsSequence(bHeader), *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE))); Ici, le syslog lié au Header de la clé pong fait appel à la fonction IsSequence, on va modifier ça par : if (bHeader == HEADER_CG_PONG) sys_log(0, "PONG! %u", *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE))); Juste en bas vous avez : if (m_pPacketInfo->IsSequence(bHeader)) { BYTE bSeq = lpDesc->GetSequence(); BYTE bSeqReceived = *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE)); if (bSeq != bSeqReceived) { sys_err("SEQUENCE %x mismatch 0x%x != 0x%x header %u", get_pointer(lpDesc), bSeq, bSeqReceived, bHeader); LPCHARACTER ch = lpDesc->GetCharacter(); char buf[1024]; int offset, len; offset = snprintf(buf, sizeof(buf), "SEQUENCE_LOG [%s]-------------\n", ch ? ch->GetName() : "UNKNOWN"); if (offset < 0 || offset >= (int) sizeof(buf)) offset = sizeof(buf) - 1; for (size_t i = 0; i < lpDesc->m_seq_vector.size(); ++i) { len = snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", lpDesc->m_seq_vector[i].hdr, lpDesc->m_seq_vector[i].seq); if (len < 0 || len >= (int) sizeof(buf) - offset) offset += (sizeof(buf) - offset) - 1; else offset += len; } snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", bHeader, bSeq); sys_err("%s", buf); lpDesc->SetPhase(PHASE_CLOSE); return true; } else { lpDesc->push_seq(bHeader, bSeq); lpDesc->SetNextSequence(); //sys_err("SEQUENCE %x match %u next %u header %u", lpDesc, bSeq, lpDesc->GetSequence(), bHeader); } } Ajoutez le ifdef, commentez ou supprimez l'intégralité du code. Cherchez : CInputHandshake::CInputHandshake() { CPacketInfoCG * pkPacketInfo = M2_NEW CPacketInfoCG; pkPacketInfo->SetSequence(HEADER_CG_PONG, false); m_pMainPacketInfo = m_pPacketInfo; BindPacketInfo(pkPacketInfo); } On va supprimer l’envoi de la séquence de la clé pong ici comme ceci : CInputHandshake::CInputHandshake() { CPacketInfoCG * pkPacketInfo = M2_NEW CPacketInfoCG; // pkPacketInfo->SetSequence(HEADER_CG_PONG, false); m_pMainPacketInfo = m_pPacketInfo; BindPacketInfo(pkPacketInfo); } C'est tout pour l'input.cpp, ouvrons le fichier desc.cpp : #include "sequence.h" Ajoutez un commentaire à l'include. Ensuite cherchez et commentez le code : m_iCurrentSequence Cherchez et commentez le code: m_seq_vector.clear(); Cherchez à nouveau & commentez le code : m_seq_vector.clear(); Cherchez : BYTE DESC::GetSequence() { return gc_abSequence[m_iCurrentSequence]; } void DESC::SetNextSequence() { if (++m_iCurrentSequence == SEQUENCE_MAX_NUM) m_iCurrentSequence = 0; } Commentez l'intégralité. Pour finir, cherchez : void DESC::push_seq(BYTE hdr, BYTE seq) { if (m_seq_vector.size()>=20) { m_seq_vector.erase(m_seq_vector.begin()); } seq_t info = { hdr, seq }; m_seq_vector.push_back(info); } Commentez également l'intégralité de la fonction. Ouvrons le desc.h pour les déclarations. Cherchez : // sequence 버그 찾기용 데이타 struct seq_t { BYTE hdr; BYTE seq; }; typedef std::vector<seq_t> seq_vector_t; // sequence 버그 찾기용 데이타 Commentez le tout. Cherchez : BYTE GetSequence(); void SetNextSequence(); Commentez les 2 fonctions. Cherchez : int m_iCurrentSequence; Commentez la fonction. Cherchez : public: seq_vector_t m_seq_vector; void push_seq (BYTE hdr, BYTE seq); Commentez tout. Ouvrons le packet_info.cpp et cherchons : void CPacketInfo::Set(int header, int iSize, const char * c_pszName, bool bSeq) { if (m_pPacketMap.find(header) != m_pPacketMap.end()) return; TPacketElement * element = M2_NEW TPacketElement; element->iSize = iSize; element->stName.assign(c_pszName); element->iCalled = 0; element->dwLoad = 0; element->bSequencePacket = bSeq; if (element->bSequencePacket) element->iSize += sizeof(BYTE); m_pPacketMap.insert(std::map<int, TPacketElement *>::value_type(header, element)); } Modifiez par: void CPacketInfo::Set(int header, int iSize, const char * c_pszName) { if (m_pPacketMap.find(header) != m_pPacketMap.end()) return; TPacketElement * element = M2_NEW TPacketElement; element->iSize = iSize; element->stName.assign(c_pszName); element->iCalled = 0; element->dwLoad = 0; /* element->bSequencePacket = bSeq; if (element->bSequencePacket) element->iSize += sizeof(BYTE); */ m_pPacketMap.insert(std::map<int, TPacketElement *>::value_type(header, element)); } Cherchez : bool CPacketInfo::IsSequence(int header) { TPacketElement * pkElement = GetElement(header); return pkElement ? pkElement->bSequencePacket : false; } void CPacketInfo::SetSequence(int header, bool bSeq) { TPacketElement * pkElem = GetElement(header); if (pkElem) { if (bSeq) { if (!pkElem->bSequencePacket) pkElem->iSize++; } else { if (pkElem->bSequencePacket) pkElem->iSize--; } pkElem->bSequencePacket = bSeq; } } Commentez la totalité. Maintenant, on va modifier tout les packets de la fonction CPacketInfoCG::CPacketInfoCG(). L’envoi de séquence n'étant plus nécessaire, remplacez ceci : Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload", false); Par : Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload"); Faites ceci pour tous les header avec un true ou un false. Vous devriez avoir quelque comme comme ça: Ouvrons le packet_info.h et cherchons : typedef struct SPacketElement { int iSize; std::string stName; int iCalled; DWORD dwLoad; bool bSequencePacket; } TPacketElement; Modifiez par: typedef struct SPacketElement { int iSize; std::string stName; int iCalled; DWORD dwLoad; //bool bSequencePacket; } TPacketElement; Cherchez : void Set(int header, int size, const char * c_pszName, bool bSeq=false); Modifiez par : void Set(int header, int size, const char * c_pszName); Cherchez et commentez le code : bool IsSequence(int header); void SetSequence(int header, bool bSeq); Pour conclure le tutoriel, ouvrons input_udp.cpp et cherchons : Set(1, sizeof(ServerStateChecker_RequestPacket), "ServerStateRequest", false); Modifiez par : Set(1, sizeof(ServerStateChecker_RequestPacket), "ServerStateRequest"); Enfin, supprimez les 2 fichiers séquence de vos sources et n'oubliez pas de les retirer du makefile. Pour la partie client je ne vais pas faire de tutoriel étant donné que ce fichier n'est jamais modifié donc vous pouvez prendre le miens (j'en ai refait un pour vous vu que j'ai désactivé l’encryption des packets de mon côté). Lien de téléchargement : Cliquez-ici ! Source : Madara, merci de citer la source si vous souhaitez partager ce tutoriel ailleurs.
  3. Kuroro

    Item_Scale

    Centre de Téléchargement Télécharger ( Interne ) Salut à tous, Aujourd'hui je viens vous partager mon item_scale que j'ai retravaillé de A à Z niveau positions et tailles. Les grosses étoles qui n'étaient pas adaptées aux personnages ne me convenait pas, c'est pour cette raison que j'ai décidé de les refaire une à une. Rendu : [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] Cordialement
  4. D'après ton code, si t'ouvre l'interface de création, ton pet disparaîtra encore. Je te propose un petit correctif supplémentaire. Remplace: if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || (IsSummoned() && m_pkOwner->IsCubeOpen() || m_dwduration <= 0) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() ) Par: if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead() || m_dwduration <= 0) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() )
  5. Euuuuuuuuh si ... Tu peux mettre les valeurs que tu veux, tant que tu les convertis en hexa sur ton packer.
  6. Kuroro

    Problème langage du jeu

    Problème d'encodage avec ton locale_string, si tu l'ouvre avec notpadd sans changer l'enco, ça provoque ceci.
  7. Kuroro

    Bug de graphisme ?

    import uiScriptLocale import item import player import app COSTUME_START_INDEX = item.COSTUME_SLOT_START window = { "name" : "CostumeWindow", "x" : SCREEN_WIDTH - 175 - 140, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 140, "height" : 227, "children" : ( { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 140, "height" : 227, "children" : ( ## Title { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 6, "y" : 6, "width" : 130, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x":60, "y":3, "text":uiScriptLocale.COSTUME_WINDOW_TITLE, "text_horizontal_align":"center" }, ), }, ## Equipment Slot { "name" : "Costume_Base", "type" : "image", "x" : 13, "y" : 38, "image" : uiScriptLocale.LOCALE_UISCRIPT_PATH + "costume/new_costume_bg.jpg", "children" : ( { "name" : "CostumeSlot", "type" : "slot", "x" : 3, "y" : 3, "width" : 127, "height" : 145, "slot" : ( {"index":COSTUME_START_INDEX+0, "x":61, "y":45, "width":32, "height":64}, {"index":COSTUME_START_INDEX+1, "x":61, "y": 8, "width":32, "height":32}, {"index":COSTUME_START_INDEX+2, "x":13, "y":13, "width":32, "height":96},#arme ##{"index":COSTUME_START_INDEX+3, "x":61, "y":125, "width":32, "height":32},#Etole {"index":COSTUME_START_INDEX+3, "x":13, "y":125, "width":32, "height":32},#Monture ), }, ), }, ), }, ), } Adapte les start_index selon ton GameType.h Concernant le problème de graphisme, oui
  8. Kuroro

    Bug de graphisme ?

    Pour la case de l'inventaire costume, tu dois up la hauteur de la gui et sélectionner la nouvelle image de la page costume qui inclue le slot des étoles et des montures. Pour le bug graphisme, vérifie ton projet EterGrnLib ou EterLib. C'est peux être lié à une fonction du scale ...
  9. Kuroro

    Bloquer PvP dans une map

    Pourquoi un système? Une simple condition avec l'index de map et c'est réglé
  10. Kuroro

    Compilation

    Euh ... Non Gmake clean = tu vides le dossier OBJDIR Gmake dep = tu actualises après avoir installé tes sources ou après avoir modif ton makefile Gmake default = Identique à -j tout dépend du processus que tu souhaites Et il peut très bien utiliser le game stripé y a aucune différence, les symboles sont juste supprimé ce qui empêche juste l'ouverture du module complémentaire GDB ... Pour en revenir au problème, recompile un db si tu touches au common.
  11. Kuroro

    Problème files 2016

    Bonjour, Poste le contenu de ton syserr db
  12. Le msenv de la nuit est généré à partir du fichier en lui même. C'est à dire qu'il n'est pas relié à des images, c'est que du code. En revanche, si tu ouvres un fichier de jour comme la map thunders, tu peux apercevoir des chemins de texture.
  13. L'environnement est modifiable via des fichiers .msenv relié à des images que tu peux trouver un peu partout sur le net en tapant par exemple "Skybox metin2 release". Les fichier .msenv sont situé de base dans le pack etc -> environnement
  14. Kuroro

    Costumes illimités

    Essaye de t'abstenir de dire des choses erronée. Sous file 2016 par la team FE, le système de proto par la lecture du DB fonctionne sous TXT. Tu remplaces le REAL_TIME ou le REAL_FIRST_TIME_USE par LIMIT_NONE suivis d'une valeur NULL
  15. Traduction: Pas de tabulation ligne 154
  16. Pour le mob_information? Sisi, y a une partie source client à effectuer aussi longue que la partie serveur
  17. Tu déclares une fonction qui n'est pas présente dans ton lanceur, en conséquence, tu as peux être oublié de le déclarer dans le locale_inc ou autre fichier source client.
  18. Kuroro

    Les costumes

    C'est costume ont été crée par moi & monaria, tu les trouveras nul pars sauf si tu les achètes.
  19. Ta mal compilé alors ou ta pas placé le new game dans tes file.
  20. Salut, C'est pas une quête, c'est définis dans le game. Plus précisément dans ton char.cpp: static bool __party_can_join_by_level(LPCHARACTER leader, LPCHARACTER quest) { int level_limit = 30; if (LC_IsCanada()) level_limit = 15; else if (LC_IsBrazil() == true) { level_limit = 10; } else level_limit = 30; return (abs(leader->GetLevel() - quest->GetLevel()) <= level_limit); } Remplace par ce que tu souhaites
  21. Euh ça, ça viens du refine_vnum qui est pas définis dans ton item_proto client. Tu utilises un dump_proto ou tu modifies ça à la main?
  22. Kuroro

    Voir PV

    En C++, sur ce système, ça récupère uniquement les informations du personnage. Du style "est ce que c'est un PNJ ou un joueur". Il y a aussi la détection du nombre de pv de la cible qui est détecté mais c'est géré en python pour le calcule. Conclusion, tu t'es fails côté uitarget.py de mon point d'vue
  23. Kuroro

    Skill boss

    Salut, L'animation est partie client oui, c'est des gr2 avec des effects dans le dossier des mobs en question. Les dégâts des skill se définissent dans les colonnes de ton mob_proto du style skill_level1" "skill_vnum1" "etc .... Et pour la chance de faire un skill ou un coup classique, me semble que c'est définis en C++ ( à vérifier )
  24. uiinventory, dans la fonction: def __DropSrcItemToDestItemInInventory Tu as: if srcItemSlotPos == dstItemSlotPos: return Ajoute en dessous: elif srcItemVID == player.GetItemIndex(dstItemSlotPos): self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos, 0) return Cherche: def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos): En dessous tu as: if item.IsRefineScroll(srcItemVNum): if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos): return True Que tu remplaces par: if srcItemVNum == player.GetItemIndex(dstSlotPos): if player.GetItemCount(dstSlotPos) < 200: return True Ce qui donne en image:

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.