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 01/19/22 dans toutes les zones

  1. 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
  2. Vous aussi ? Vous cherchez à concevoir un serveur de notre MMORPG préféré ?! Vous allez enfin pouvoir réaliser votre rêve ! Ce guide est exclusivement compatible avec Metin2 Project. Vous êtes prêt ? A vos marques... Prêts... Partez ! Vous êtes débutant ? Je vous suggère de débuter par la création d'un serveur sur votre ordinateur avec : Créer un serveur privé Metin2 Project en local. Que choisir ? Sommaire Environnement FreeBSD ( Obligatoire ) Environnement Web ( Facultatif ) Visual Studio ( Facultatif ) Cette partie est essentielle, elle vous permet de préparer, configurer votre environnement Metin2 Project sur votre serveur FreeBSD. Toutes les étapes sont nécessaires au bon fonctionnement de Metin2 Project. Installer FreeBSD Utiliser PuTTY Télécharger Serveur Client Configurer Resolv SSH PKG Débogage Installer MySQL Python GMake MakeDepend DevIL GDB LLVM Devel Utiliser WinSCP Configurer MySQL Utiliser Navicat Importer Base de Données Configurer Compte Personnage GM Installer Serveur Compiler Serveur Utiliser EterNexus Configurer Client Démarrer Serveur A vos marques... Prêts... Partez ! Cette partie est facultative si vous souhaitez utiliser Metin2 Project en l'état. Si vous voulez installer forum ou un site pour votre serveur Metin2 Project, il est nécessaire de préparer votre environnement web sur votre serveur FreeBSD. Il est primordial d'avoir paramétré votre nom de domaine afin de lui attribuer un enregistrement de type A vers l'adresse IP de votre serveur FreeBSD ! Si vous n'avez pas de nom de domaine, vous perdez votre temps. Installer Apache PHP Cerbot Configurer Apache PHP Cerbot Hôtes Virtuels Certification HTTPS Utiliser World Wide Web Cette partie est facultative si vous souhaitez utiliser Metin2 Project en l'état sans effectuer des modifications sur les sources du jeu. Si vous devez modifier ou ajouter des fichiers sources à Metin2 Project, il est nécessaire de préparer votre environnement de compilation sur votre ordinateur. Installer Visual Studio Compiler Client Dump Proto Config Made With and Metin2 Project
    1 point
  3. Centre de Téléchargement Télécharger ( Interne ) Bonsoir ! Ce soir je vous partages le "Battlepass" de ZeNu (celui présent sur les svfiles Owsap/osf) mais entièrement débug et fonctionnel et améliorer légèrement. Quelques aperçus : Téléchargement : Ici
    1 point
  4. Centre de Téléchargement Télécharger ( Interne ) Bonjour, voici le systeme officiel de cube, si ca interesse quelqu'un : Lien :
    1 point
  5. Centre de Téléchargement Télécharger ( Interne ) Système vous permettant d'ouvrir une GUI de téléportation pour votre serveur. A toi de choisir la méthode d'appelle du système, bouton dans l'inventaire ou un bouton F(X) (Non fournit dans le tutoriel).
    1 point
  6. 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.
    1 point
  7. I built the system, it took a long time to insert the system does not work that does not open that loads and then stops and nothing opens [Hidden Content]
    1 point
  8. [Hidden Content] Moi ça marche en tout cas Edit : Sinon tu peux essayer priv_empire
    1 point
  9. Centre de Téléchargement Télécharger ( Interne ) Bonjour, Bonsoir Les Funkiest, je vous partage un système qui va vous permettre de stocker vos items Up, Pierre, Manuel dans différents inventaires. Pré-requis: - Sources Client - Sources Serveur - Client Tout se trouve dans le dossier, tout est expliquer la dedans. Download Aperçu : [Hidden Content] Sources : Turkmmo Pour continuer: Vous trouverez de nombreux partages et tutoriels sur Funky-Émulation dans la section Metin2. La FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
    1 point
  10. Centre de Téléchargement Télécharger ( Interne ) Bonsoir, Je vous partage les dégâts infligés en HD : Screen : [Hidden Content] Téléchargement : ICI Asesino.
    1 point
  11. Centre de Téléchargement Télécharger ( Interne ) Ayant repris a dev / jouer à Metin après quelques année d'arret de pause (en étant passé par d'autre MMO entre temps), je me suis dit qu'une barre de raccourci allant de 1 à 4 (et F1 à F4 pour la secondaire) ça faisait un peut léger. Je vous propose donc de doubler la taille de cette barre. Attention ! Cet affichage n'est pas vraiment optimiser pour les très petites résolutions Info. Ceci est uniquement une modification client et ne change pas le nombre total de slot, mais les affiche uniquement de manière différente (en réduisant le nombre de ligne de 4 à 2) Screenshot Téléchargements
    1 point
  12. F Download Center Télécharger ( Interne ) Bonjour, J'ai décidé de refaire ce tutoriel Aujourd'hui je vais vous expliquer comment ajouté l'option "détruire" lorsque vous voulez jeter un item. Ca va être assez long, mais facile si vous suivez bien le tutoriel. Commençons ______________________________________________________________________ PRÉREQUIS ______________________________________________________________________ 1.Des source Serveur 2.Des sources Client 3.Un client ______________________________________________________________________ 1.SOURCE SERVEUR ______________________________________________________________________ Ouvrez votre "packet.h" et recherchez: HEADER_CG_ITEM_DROP2 = 20, Ajoutez ceci juste en dessous: HEADER_CG_ITEM_DESTROY = 21, Recherchez maintenant: typedef struct command_item_drop2 { BYTE header; TItemPos Cell; DWORD gold; BYTE count; } TPacketCGItemDrop2; Ajoutez ceci juste en dessous: typedef struct command_item_destroy { BYTE header; TItemPos Cell; } TPacketCGItemDestroy; Ouvrez maintenant le fichier packet_info.cpp et recherchez: Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", true); Ajoutez ceci juste en dessous: Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", true); Ouvrez maintenant le fichier input_main.cpp et recherchez la fonction: void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) Ajoutez cette fonction juste après: void CInputMain::ItemDestroy(LPCHARACTER ch, const char * data) { struct command_item_destroy * pinfo = (struct command_item_destroy *) data; if (ch) ch->DestroyItem(pinfo->Cell); } Cherchez maintenant ceci: case HEADER_CG_ITEM_DROP2: if (!ch->IsObserverMode()) ItemDrop2(ch, c_pData); break; Et ajoutez: case HEADER_CG_ITEM_DESTROY: if (!ch->IsObserverMode()) ItemDestroy(ch, c_pData); break; Ouvrez maintenant le fichier char_item.cpp et recherchez la fonction: bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount) Ajoutez cette fonction juste au-dessus: bool CHARACTER::DestroyItem(TItemPos Cell) { LPITEM item = NULL; if (!CanHandleItem()) { if (NULL != DragonSoul_RefineWindow_GetOpener()) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°*È*âÀ» ¿¬ »óÅ¿¡¼*´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù.")); return false; } if (IsDead()) return false; if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell))) return false; if (item->IsExchanging()) return false; if (true == item->isLocked()) return false; if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true) return false; if (item->GetCount() <= 0) return false; SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255); ITEM_MANAGER::instance().RemoveItem(item); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("L'item %s est desormais detruit."), item->GetName()); return true; } Ouvrez maintenant le fichier char.h et recherchez: bool DropItem(TItemPos Cell, BYTE bCount=0); Ajoutez ceci juste au-dessus: bool DestroyItem(TItemPos Cell); Ouvrez maintenant le fichier input.h et recherchez: void ItemDrop2(LPCHARACTER ch, const char * data); Ajoutez ceci juste en dessous: void ItemDestroy(LPCHARACTER ch, const char * data); ______________________________________________________________________ 2. SOURCE CLIENT ______________________________________________________________________ Ouvrez le fichier packet.h et recherchez: HEADER_CG_ITEM_DROP2 = 20, Ajoutez ceci juste en dessous: HEADER_CG_ITEM_DESTROY = 21, Recherchez maintenant: typedef struct command_item_drop2 { BYTE header; TItemPos pos; DWORD gold; BYTE count; } TPacketCGItemDrop2; Ajoutez ceci juste en dessous: typedef struct command_item_destroy { BYTE header; TItemPos pos; }TPacketCGItemDestroy; Ouvrez maintenant le fichier PythonNetworkStreamPhaseGameItem.cpp et recherchez la fonction: bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count) Ajoutez cette fonction juste en dessous: bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos) { if (!__CanActMainInstance()) return true; TPacketCGItemDestroy itemDestroyPacket; itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY; itemDestroyPacket.pos = pos; if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket)) { Tracen("SendItemDestroyPacket Error"); return false; } return SendSequence(); } Ouvrez maintenant le fichier PythonNetworkStreamModule.cpp et recherchez la fonction: PyObject* netSendItemDropPacket(PyObject* poSelf, PyObject* poArgs) Ajoutez cette fonction juste en dessous: PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs) { TItemPos Cell; if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BuildException(); CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance(); rkNetStream.SendItemDestroyPacket(Cell); return Py_BuildNone(); } Recherchez maintenant: { "SendItemDropPacketNew", netSendItemDropPacketNew, METH_VARARGS }, Ajoutez ceci juste après: { "SendItemDestroyPacket", netSendItemDestroyPacket, METH_VARARGS }, Ouvrez maintenant le fichier PythonNetworkStream.h et recherchez la fonction: bool SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count); Ajoutez ceci juste après: bool SendItemDestroyPacket(TItemPos pos); ______________________________________________________________________ 3. PYTHON CLIENT ______________________________________________________________________ Ouvrez le fichier uicommon.py du pack root et recherchez la class: class QuestionDialog(ui.ScriptWindow): Juste après celle class, ajoutez la class suivante: class QuestionDialogItem(ui.ScriptWindow): def __init__(self): ui.ScriptWindow.__init__(self) self.__CreateDialog() def __del__(self): ui.ScriptWindow.__del__(self) def __CreateDialog(self): pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "uiscript/questiondialogitem.py") self.board = self.GetChild("board") self.textLine = self.GetChild("message") self.acceptButton = self.GetChild("accept") self.destroyButton = self.GetChild("destroy") self.cancelButton = self.GetChild("cancel") def Open(self): self.SetCenterPosition() self.SetTop() self.Show() def Close(self): self.Hide() def SetWidth(self, width): height = self.GetHeight() self.SetSize(width, height) self.board.SetSize(width, height) self.SetCenterPosition() self.UpdateRect() def SAFE_SetAcceptEvent(self, event): self.acceptButton.SAFE_SetEvent(event) def SAFE_SetCancelEvent(self, event): self.cancelButton.SAFE_SetEvent(event) def SetAcceptEvent(self, event): self.acceptButton.SetEvent(event) def SetDestroyEvent(self, event): self.destroyButton.SetEvent(event) def SetCancelEvent(self, event): self.cancelButton.SetEvent(event) def SetText(self, text): self.textLine.SetText(text) def SetAcceptText(self, text): self.acceptButton.SetText(text) def SetCancelText(self, text): self.cancelButton.SetText(text) def OnPressEscapeKey(self): self.Close() return True Ouvrez maintenant le fichier game.py et cherchez la def suivante: def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): Recherchez ce bout de code dans la fonction (2x): itemDropQuestionDialog = uiCommon.QuestionDialog() Remplacez par: itemDropQuestionDialog = uiCommon.QuestionDialogItem() Toujours dans la même fonction, recherchez: itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) Ajoutez ceci juste après: itemDropQuestionDialog.SetDestroyEvent(lambda arg=True: self.RequestDestroyItem(arg)) Recherchez maintenant la fonction: def RequestDropItem(self, answer): Ajoutez cette fonction juste après: def RequestDestroyItem(self, answer): if not self.itemDropQuestionDialog: return if answer: dropType = self.itemDropQuestionDialog.dropType dropNumber = self.itemDropQuestionDialog.dropNumber if player.SLOT_TYPE_INVENTORY == dropType: if dropNumber == player.ITEM_MONEY: return else: self.__SendDestroyItemPacket(dropNumber) self.itemDropQuestionDialog.Close() self.itemDropQuestionDialog = None constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) Recherchez ensuite la fonction: def __SendDropItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY): Et ajoutez celle-ci juste après: def __SendDestroyItemPacket(self, itemVNum, itemInvenType = player.INVENTORY): if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return net.SendItemDestroyPacket(itemVNum) Ouvrez maintenant le fichier locale_interface.txt et ajoutez ceci: DESTROY Destroy Placez le fichier questiondialogitem.py dans votre pack uiscript ! Screen du système: [Hidden Content] Voilà c'est fini ! Source du totoriel : .Avenue™ de Metin2Dev Traduction: moi Cordialement, #Saw.
    1 point
  13. Centre de Téléchargement Télécharger ( Interne )
    0 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.