Aller au contenu

Nouveau membre ?! Pense à te présenter pour accéder au contenu du forum !

New member ?! Introduce yourself to get access to the forum !

Madara

 Spécialiste en Herbe
  • Compteur de contenus

    461
  • Inscription

  • Dernière visite

  • Jours gagnés

    4
  • Points

    1,141 [ Donner ]

Madara a gagné pour la dernière fois le 14 septembre

Madara a eu le contenu le plus aimé !

Réputation sur la communauté

57 Aimé

À propos de Madara

  • Rang
    Sen-paï
  • Date de naissance 18/03/1999

Profil

  • Discord
    Madara#5210
  • Nationalité
    Français
  • Sexe
    Homme

Visiteurs récents du profil

672 visualisations du profil
  1. Lien: Clique ici Le tutoriel se trouve dans le .rar
  2. Merci pour les explications détaillé, au top
  3. Salut, Ce fix concerne l'affect invisibilité et Eunhyeong. Indispensable pour mon système de Hide. InstanceBase.cpp: BOOL CInstanceBase::IsInvisibility() { if (IsAffect(AFFECT_INVISIBILITY)) return true; return false; } Remplacer par: BOOL CInstanceBase::IsInvisibility() { if (IsAffect(AFFECT_INVISIBILITY) || IsAffect(AFFECT_EUNHYEONG)) return true; return false; } void CInstanceBase::Update() { En dessous vous avez: if (IsMountingHorse()) { m_kHorse.m_pkActor->HORSE_MotionProcess(false); } } Ajouter plus bas: if (IsAffect(AFFECT_INVISIBILITY) || IsAffect(AFFECT_EUNHYEONG)) m_GraphicThingInstance.HideAllAttachingEffect(); InstanceBaseEffect.cpp: void CInstanceBase::__SetAffect(UINT eAffect, bool isVisible) { En dessous vous avez: case AFFECT_INVISIBILITY: if (isVisible) { m_GraphicThingInstance.ClearAttachingEffect(); __EffectContainer_Destroy(); DetachTextTail(); } else { m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f); AttachTextTail(); RefreshTextTail(); } return; break; } Remplacer par: case AFFECT_INVISIBILITY: if (isVisible) { // m_GraphicThingInstance.ClearAttachingEffect(); // __EffectContainer_Destroy(); // DetachTextTail(); m_GraphicThingInstance.HideAllAttachingEffect(); } else { m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f); m_GraphicThingInstance.ShowAllAttachingEffect(); // AttachTextTail(); // RefreshTextTail(); } return; break; Une petite vidéo: Merci à Legend
  4. Ta oublié d'ajouter ça dans ton lanceur ( source client )
  5. Vérifie que tu as bien suivis la partie de l'introloading, c'est elle qui initialise la fonction playerSettingModule.LoadGameData("WOLFMAN")
  6. Tu PvP avec un joueur? Car sur les GM il y a une protection pvp ( sauf en mode libre ) Mais en théorie, si c'est le cas, tu ne devrais pas avoir de miss en cac.
  7. game/src: questlua_mysql.cpp, à remplacer. // mysql_query(string) - 'returns a lua mysql table' int _mysql_query(lua_State* L) { string query = lua_tostring(L,1); SQLMsg* run = DBManager::instance().DirectQuery(query.c_str()); MYSQL_RES* res = run->Get()->pSQLResult; //Error in the query if (!run) { sys_err("MySQL query failed!"); lua_pushnil(L); return 0; } if(!res) { lua_newtable(L); return 1; } lua_newtable(L); //Fetch field list unsigned long rowcount = 1; set<MYSQL_FIELD*> fieldList; while(MYSQL_FIELD *f = mysql_fetch_field(res)) { fieldList.insert(f); } MYSQL_ROW row; while (row = mysql_fetch_row(res)) { lua_newtable(L); int i = 0; set<MYSQL_FIELD*>::iterator iter; for(iter = fieldList.begin(); iter != fieldList.end(); ++iter) { MYSQL_FIELD *f = *iter; lua_pushstring(L, f->name); lua_pushstring(L, row[i]); lua_settable(L, -3); //stack: [arg] table table2 i++; } lua_pushnumber(L, rowcount); lua_insert(L, -2); //stack: [arg] table rowcount table2 lua_settable(L, -3); rowcount++; } M2_DELETE(run); return 1; }
  8. Yo, Autant rentrer dans le bain directement avec les 2014, les 2012, c'est une perte de temps Je te conseil également de configurer ça en local, c'est tjr moins compliqué que du no-ip et puis t'en même pas pour 30 secondes Les file 2014 fonctionnent en no-ip / locale et hamachi sauf si tu veux que quelqu'un te rejoigne, il sera renvoyé à la sélection des channel il me semble Good-luck pour la suite
  9. Salut à tous, J'ai eu plusieurs requête par rapport à mes systèmes dont celui qui permet de cacher n'importe quel gr2 à cause des lags. J'ai appris que celui-ci avait fuité, donc j'ai décidé de faire une nouvelle version. C'est la raison pour la qu'elle je viens vous partager celle-ci. Pour ceux qui me l'ont acheté directement, veuillez me contacter en MP, je vous ferai une v2. Elle inclura le hide des étoles & costumes. Quelques informations avant tout : AFFECT_INVISIBILITY est bugé de base (essayez de vous inv avec un logo GM, une fois réapparu vous ne le verrez plus) J'avais trouvé un fix par hasard sur metin2dev il y a quelques mois, je vous le partagerais dans les commentaires si je le retrouve. Ce système est dynamique et le code est léger. Il possède également des define côté C++ mais j'ai pas pensé à le faire côté python. Merci de ne pas vendre ce système. Le tutoriel se trouve dans le .rar Une petite vidéo concernant le fonctionnement : Lien de téléchargement : Cliquez-ici !
  10. Re, Ouaip, pour les cheats c'est une autre histoire, si tu fais rien pour, c'est sûr que ça laissera une ouverture. Après, y a pas que le temps de connexion & de chargement qui diminue, tu as moins de déconnexion en jeu pour rien et le jeu est un peu fluide ( remarque personnel ) Ré-écrire le système de séquence de metin n'est pas une mauvaise idée également à condition de bien faire le travail et de ne pas bâcler & négliger ça comme ymir l'a fait ... Merci pour ton avis
  11. 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é
  12. 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 : #define SEQUENCE_SYSTEM_ENABLED 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.
  13. Re-Scale des étoles lycan en cour de progression.
  14. 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. Voici quelques images du rendu: [Contenu Masqué] [Contenu Masqué] [Contenu Masqué] [Contenu Masqué] Lien de mon item_scale.txt: Cliquez ici !
×

Information importante

By using this site, you agree to our Conditions d’utilisation.