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

    467
  • Inscription

  • Dernière visite

  • Jours gagnés

    4
  • Points

    1,038 [ Donner ]

Réputation sur la communauté

87 Adoré

1 abonné

À propos de Madara

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

Profil

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

Visiteurs récents du profil

897 visualisations du profil
  1. Pour les personnes ayant achetée cette version, merci de me contacter en message privé sur discord afin que je puisse vous transmettre la v2 (gratuitement). [Contenu Masqué]
  2. Bonjour, Je viens vous partager mon savoir sur ce que j'ai découvert récemment sur l’encryption des packets. Certains risquent de me dire, mais cela a déjà été partagé par MartySama. En réalité, celui-ci n'est pas complet, il a oublié un facteur très important que je vous présenterai par la suite. Mais du coup, vous devez vous demander ce qu'il ce passe si on désactive l'encryption des packets, par la manière dont il l'a partagé? Et bien, on risque d'avoir une surcharge au niveau des buffers, ce qui risque d'entraîner des crashs game sans erreur ou encore des bugs assez étranges. J'ai pu apercevoir différents bugs étranges. Le plus fréquent, c'était le fait qu'on ne puisse plus exécuter une action qui nécessite un accord avec le game. Exemple, au bout de 15 minutes de jeu avec quelques joueurs connectés, certains ne pourront plus cliquer sur un item, ou d'autres ne pourront plus parler, etc ... Il y a eu beaucoup de débats sur ça, j'ai pris des avis à gauche et à droite et j'en ai tiré une problématique. I - Pourquoi ces bugs n'étaient pas présents avant l'encryption des packets ? Tout simplement parce que la structure a été éditée ! En effet, on peut apercevoir que dans le protocol.h du Game, la fonction buffer_adjust_size a été commentée. Également, dans le desc.cpp, ils ont complètement supprimé la condition dans la fonction: void DESC::Packet Mais pourquoi? Tout simplement car elle ne sert plus à rien, le nouveau système ne nécessite plus d'ajusteur de taille pour les buffers ( il me semble ) Ou alors, ils ont codé autre chose qui permet de régler automatiquement la taille des buffers mais j'ai pas encore regardé. II - Comment retirer le système d'encryption proprement? Dans le Common, ouvrez le fichier service.h et commentez: #define _IMPROVED_PACKET_ENCRYPTION_ Dans le Game maintenant, ouvrez le protocol.h et cherchez: //buffer_adjust_size(pbuf, length); Dé-commentez la fonction pour obtenir ceci: buffer_adjust_size(pbuf, length); Toujours dans le Game, ouvrez le fichier desc.cpp, et modifiez l'intégralité de la fonction: void DESC::Packet(const void * c_pvData, int iSize) Par ceci: void DESC::Packet(const void * c_pvData, int iSize) { assert(iSize > 0); if (m_iPhase == PHASE_CLOSE) // 끊는 상태면 보내지 않는다. return; if (m_stRelayName.length() != 0) { // Relay 패킷은 암호화하지 않는다. TPacketGGRelay p; p.bHeader = HEADER_GG_RELAY; strlcpy(p.szName, m_stRelayName.c_str(), sizeof(p.szName)); p.lSize = iSize; if (!packet_encode(m_lpOutputBuffer, &p, sizeof(p))) { m_iPhase = PHASE_CLOSE; return; } m_stRelayName.clear(); if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { m_iPhase = PHASE_CLOSE; return; } } else { if (m_lpBufferedOutputBuffer) { buffer_write(m_lpBufferedOutputBuffer, c_pvData, iSize); c_pvData = buffer_read_peek(m_lpBufferedOutputBuffer); iSize = buffer_size(m_lpBufferedOutputBuffer); } // TRAFFIC_PROFILE if (g_bTrafficProfileOn) TrafficProfiler::instance().Report(TrafficProfiler::IODIR_OUTPUT, *(BYTE *) c_pvData, iSize); // END_OF_TRAFFIC_PROFILER #ifdef _IMPROVED_PACKET_ENCRYPTION_ void* buf = buffer_write_peek(m_lpOutputBuffer); if (packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { if (cipher_.activated()) { cipher_.Encrypt(buf, iSize); } } else { m_iPhase = PHASE_CLOSE; } #else if (!m_bEncrypted) { if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { m_iPhase = PHASE_CLOSE; } } else { if (buffer_has_space(m_lpOutputBuffer) < iSize + 8) { buffer_adjust_size(m_lpOutputBuffer, iSize); if (buffer_has_space(m_lpOutputBuffer) < iSize + 8) { sys_err( "desc buffer mem_size overflow : ", " memsize(%u) ", " write_pos(%u)", " iSize(%d)", m_lpOutputBuffer->mem_size, m_lpOutputBuffer->write_point_pos, iSize); m_iPhase = PHASE_CLOSE; } } else { // 암호화에 필요한 충분한 버퍼 크기를 확보한다. /* buffer_adjust_size(m_lpOutputBuffer, iSize + 8); */ DWORD * pdwWritePoint = (DWORD *) buffer_write_peek(m_lpOutputBuffer); if (packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { int iSize2 = TEA_Encrypt(pdwWritePoint, pdwWritePoint, GetEncryptionKey(), iSize); if (iSize2 > iSize) buffer_write_proceed(m_lpOutputBuffer, iSize2 - iSize); } } } #endif // _IMPROVED_PACKET_ENCRYPTION_ SAFE_BUFFER_DELETE(m_lpBufferedOutputBuffer); } //sys_log(0, "%d bytes written (first byte %d)", iSize, *(BYTE *) c_pvData); if (m_iPhase != PHASE_CLOSE) fdwatch_add_fd(m_lpFdw, m_sock, this, FDW_WRITE, true); } Vous pouvez compiler votre game en étant serein. N'oubliez surtout pas de compiler le DB ! Dans le projet EterBase, ouvrez le fichier ServiceDefs.h et commentez: #define _IMPROVED_PACKET_ENCRYPTION_ Dans le projet Userinterface, ouvrez le fichier Locale.cpp et éditez: #define LSS_SECURITY_KEY "testtesttesttest" Par ceci: #define LSS_SECURITY_KEY "1234abcd5678efgh" III - Pourquoi désactiverais-je ce système? - Temps de connexion LARGEMENT diminué ( vue qu'on n'utilise plus Cipher ) - Temps de chargement diminué également - Meilleure fluidité (avis personnel) - Taille du game énormément diminuée ainsi que celle du lanceur Voici une petite vidéo: Cordialement Madara,
  3. Tout dépend ce que ton uiinventory charge dans la class InventoryWindows, fonction DefLoad De base c'est le locale
  4. Excellent tutoriel, il en faut plus de ce genre.
  5. InventoryWindows.py, à remplacer par ceci: { "name" : "Inventory_Tab_01", "type" : "radio_button", "x" : 10, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_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, "x" : 10 + 39, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_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 + 39 + 39, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_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 + 39 + 39 + 39, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_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", }, ), },
  6. Lien: Clique ici Le tutoriel se trouve dans le .rar
  7. 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
  8. Ta oublié d'ajouter ça dans ton lanceur ( source client )
  9. Vérifie que tu as bien suivis la partie de l'introloading, c'est elle qui initialise la fonction playerSettingModule.LoadGameData("WOLFMAN")
  10. 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.
  11. 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; }
  12. 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
  13. 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 !
×

Information importante

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