Vous devez être connecté et donner une réaction ( Like ) au sujet pour débloquer les liens de téléchargements...

Search the Community

Showing results for tags 'a corriger'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Register & Login
    • Register
    • Login
  • Espace Communautaire
    • Funky Emulation
    • Présentations
    • Discussions Générales
    • Bureau de la Communauté
    • Espace Gaming
    • Espace Premium
  • Emulation & Co
    • Rewrite a Release / Tutorial
    • Suggest a Release / Tutorial
    • The Ideas Box
  • Emulation de jeux
    • RaiderZ
    • Aura Kingdom
    • Metin2
    • Dofus
    • World of Warcraft
    • Minecraft
    • Aion
    • Habbo
    • Voir plus...
  • Espace Divers
  • Internationnal Forum
  • PassionDev's Forum
  • M2Project - Metin2's M2SF
  • M2Project - Metin2's Aide / Questions / Support
  • M2Project - Metin2's Tutoriels & Partages
  • M2Project - Metin2's Suggestions
  • M2Project - Metin2's Report de Bugs

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Nationality


Sexe


Discord


Skype


Biographie


Site


Nombre

 
or  

Found 608 results

  1. 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 ! LIEN FE Screen du système: Voilà c'est fini ! Source du totoriel : .Avenue™ de Metin2Dev Traduction: moi Cordialement, #Saw.
  2. Bonjour, Je viens vous partager un CMS développer en Laravel 5.1 par Synthx sous un design réaliser par Nicow. Fonctionnalité : Pages classiques (CGU, Règlement, Staff, News, etc...) Gestion de compte Ladder Mises à jours Achat de points (Starpass) Mode VIP (désactivable) Loterie Vote par IP Confirmation du vote avec vérification de la valeur OUT Boutique avec stock Téléchargement : GitHub --- Download
  3. Bonjour, Granny 2.9.12 Granny 2.11.8 Granny 2.8.41 Cordialement, History. --- Download
  4. Yep, Vous connaissez sans doutes les fameuses file 2013, avec les tools qui permettent de générer le côté client grâce au côté serveur. Mais malheureusement, certains n'arrivent plus à dump ces protos car ils sont beaucoup trop récents ... Bah ici, c'est la même chose ! Il suffit de mettre l'exe dans un dossier avec l'item proto et l'item name txt (ou mob), de les faire glisser sur le exe le tour est joué ! De plus, il prend en compte les nouveaux mob proto donc les nouvelles colonnes ! Téléchargement: [Hidden Content] --- Download
  5. Verrouillage/Déverrouillage d'inventaire système de l'officiel. 1) Qu'est ce que c'est ? 2) Les Prérequis 3) Les téléchargements 1) Qu'est ce que c'est ? Le Système de Verrouillage/Déverrouillage d'inventaire est un verrou poser sur certains espaces de vos inventaire ( jusqu'à 4 inventaires ) Pour les déverrouiller il vous faut un item appeler Clé d'inventaire . Vidéos Screens Des images et vidéos valent mieux qu'un tas de mots sur une page blanche. 2) Les Prérequis Avoir des files et un client Disposez des 4 inventaires ( L'inventaires 3 et 4 doit être vide autrement cela vous empêchera de connecter le personnages en question.) Sources Client / Game / DB Les fichiers à télécharger et votre tête! 3) Les téléchargements Comme à mon habitude le tutoriel ce trouve à l'intérieur du .rar. Changelog : Sachez encore une fois que ce partage n'est pas de moi mais qu'il provient de TurkMmo. La traduction/réorganisation du tutoriel est cependant de moi. Lien mis à jour avec la correction : Cliquez ici FEV1 FEV2 GitHubV2 Cordialement, History.
  6. Salut à tous ! Je vous partage aujourd'hui une exclusivité de emulation-bay crée par Agronaque alias Rayz. Un petit bijoux attirant vos joueurs à voter ! Description : La quête Vote4BeTheBest.quest vous servira à faire voter vos joueurs pour votre serveur. En guise de récompense, ils gagneront un bonus simple dans une branche particulière (maxhp, def, attaque, magie) Version 1.0 Version 1.1 Vous vous loguez et vous recevez une lettre directement nommée "Votez et gagnez un bonus". Il vous suffit de cliquer dessus afin de voter dans le vote1, 2 ou 3 et ainsi gagner un petit bonus pour améliorer votre personnage. Si vous êtes GM, vous aurez droit au panel de configuration des adresses topsite et à une page internet Google simple. Vidéo :
  7. Bonjour, J'ai remarqué que beaucoup n'arrivaient plus à avoir la version v1.3 du repacker de Moustikk du à un problème de mises à jour... Bien à vous, --- Download
  8. Salut à tous, voici une petite API pour les votes sur RPG paradize. En gros elle fait : Récupère le captcha de la page de vote. Envoi le formulaire de vote. Regarde si le vote a été accepté et retourne true ou false. Donc au final plus besoin de faire une redirection vers RPG Paradize, et seul les bon votes seront comptés, et tout ça, très simplement ! RpgApi.php : ICI Exemple : ICI L'utilisation d'un tel système est relativement lourd, il est donc préférable de ne pas trop charger la page de vote. --- Download
  9. Bonjour Funky! Je vous partage aujourd'hui un petit CMS avec 3 couleurs changeable que j'ai fais en 10 minutes, il ne comporte qu'un système d'inscription et de classement. Pour la configuration de la base de données, c'est dans config/db.php, pas besoin de vous montrez comment configurer ça j'espère Téléchargement: Clique ici A+ --- Download
  10. Bonjour à tous, je vous partage donc un partage d'epvps pour ne plus avoir besoin de txt et reprendre donc l'ancien systeme via mysql. Pour ce faire on se rend donc dans ClientManagerBoot.cpp qui se trouve donc dans mainline/srcs/server/db/src. Ensuite il vous faudra remplacer bool CClientManager::InitializeItemTable() { //================== ÇÔ¼ö ¼³¸à ==================// //1. ¿ä¾à : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ÆÄÀÃÀ» ÀðÃ, // (TItemTable), ¿ÀºêçƮ¸¦ »ý¼ºÇÑ´Ù. //2. ¼ø¼ // 1) 'item_names.txt' ÆÄÀÃÀ» ÀÃ¾î¼ (a)[localMap](vnum:name) ¸ÊÀ» ¸¸µç´Ù. // 2) 'item_proto_text.txt'ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (b)[test_map_itemTableByVnum](vnum:TItemTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. // 3) 'item_proto.txt' ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (!)[item_table], À» ¸¸µç´Ù. // <Âü°Ã> // °¢ row µé Ãß, // (b)[test_map_itemTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_itemTableByVnum]ÀÇ °ÃÀ» »ç¿ëÇÑ´Ù. // 4) (b)[test_map_itemTableByVnum]ÀÇ rowÃß, (!)[item_table]¿¡ ¾ø´Â °ÃÀ» Ãß°¡ÇÑ´Ù. //3. Å×½ºÆ® // 1)'item_proto.txt' 亸°¡ item_table¿¡ Àß µé¾î°¬´ÂÃö. -> ¿Ã·á // 2)'item_names.txt' 亸°¡ item_table¿¡ Àß µé¾î°¬´ÂÃö. // 3)'item_proto_test.txt' ¿¡¼ [°ãÄ¡´Â] 亸°¡ item_table ¿¡ Àß µé¾î°¬´ÂÃö. // 4)'item_proto_test.txt' ¿¡¼ [»õ·Î¿î] 亸°¡ item_table ¿¡ Àß µé¾î°¬´ÂÃö. // 5) (ÃÖþ) °ÔÀÓ Ŭ¶óÀ̾ðÆ®¿¡¼ æ´ë·Î ÀÛµ¿ ÇôÂÃö. //_______________________________________________// //=================================================================================// // 1) 'item_names.txt' ÆÄÀÃÀ» ÀÃ¾î¼ (a)[localMap](vnum:name) ¸ÊÀ» ¸¸µç´Ù. //=================================================================================// bool isNameFile = true; map localMap; cCsvTable nameData; if(!nameData.Load("item_names.txt",'\t')) { fprintf(stderr, "item_names.txt was loaded successfully.\n"); isNameFile = false; } else { nameData.Next(); while(nameData.Next()) { localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1); } } //_________________________________________________________________// //=================================================================// // 2) 'item_proto_text.txt'ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (b)[test_map_itemTableByVnum](vnum:TItemTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. //=================================================================// map test_map_itemTableByVnum; //1. ÆÄÀà Àþî¿À±â. cCsvTable test_data; if(!test_data.Load("item_proto_test.txt",'\t')) { fprintf(stderr, "item_proto_test.txt was loaded successfully.\n"); //return false; } else { test_data.Next(); //¼³¸à ·Î¿ì ³Ñ¾î°¡±â. //2. Å×½ºÆ® ¾ÆÀÌÅÛ Å×ÀÌºà »ý¼º. TItemTable * test_item_table = NULL; int test_itemTableSize = test_data.m_File.GetRowCount()-1; test_item_table = new TItemTable[test_itemTableSize]; memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize); //3. Å×½ºÆ® ¾ÆÀÌÅÛ Å×À̺ÿ¡ °ªÀ» ³Ö°Ã, ¸Ê¿¡±îÃö ³Ö±â. while(test_data.Next()) { if (!Set_Proto_Item_Table(test_item_table, test_data, localMap)) { fprintf(stderr, "¾ÆÀÌÅÛ Ç÷ÎÅä Å×ÀÌºà ¼ÂÆà ½ÇÆÃ.\n"); } test_map_itemTableByVnum.insert(std::map::value_type(test_item_table->dwVnum, test_item_table)); test_item_table++; } } //______________________________________________________________________// //========================================================================// // 3) 'item_proto.txt' ÆÄÀðú (a)[localMap] ¸ÊÀ¸·Î // (!)[item_table], À» ¸¸µç´Ù. // <Âü°Ã> // °¢ row µé Ãß, // (b)[test_map_itemTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_itemTableByVnum]ÀÇ °ÃÀ» »ç¿ëÇÑ´Ù. //========================================================================// //vnumµéÀ» ÀúÀåÇÒ ¼Â. »õ·Î¿î Å×½ºÆ® ¾ÆÀÌÅÛÀ» ÆǺ°ÇÒ¶§ »ç¿ëµÈ´Ù. set vnumSet; //ÆÄÀà Àþî¿À±â. cCsvTable data; if(!data.Load("item_proto.txt",'\t')) { fprintf(stderr, "item_proto.txt was loaded successfully.\n"); return false; } data.Next(); //¸Ç ÀÃ٠æ¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸ÃÇô ºÎºÃ) if (!m_vec_itemTable.empty()) { sys_log(0, "RELOAD: item_proto"); m_vec_itemTable.clear(); m_map_itemTableByVnum.clear(); } //===== ¾ÆÀÌÅÛ Å×ÀÌºà »ý¼º =====// //»õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆľÇÇÑ´Ù. int addNumber = 0; while(data.Next()) { int vnum = atoi(data.AsStringByIndex(0)); std::map::iterator it_map_itemTable; it_map_itemTable = test_map_itemTableByVnum.find(vnum); if(it_map_itemTable != test_map_itemTableByVnum.end()) { addNumber++; } } //data¸¦ ´Ù½Ã ùÃÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àþî¿Â´Ù; data.Destroy(); if(!data.Load("item_proto.txt",'\t')) { fprintf(stderr, "item_proto.txt was loaded successfully.\n"); return false; } data.Next(); //¸Ç ÀÃ٠æ¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸ÃÇô ºÎºÃ) m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber); memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size()); int testValue = m_vec_itemTable.size(); TItemTable * item_table = &m_vec_itemTable[0]; while (data.Next()) { int col = 0; std::map::iterator it_map_itemTable; it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col))); if(it_map_itemTable == test_map_itemTableByVnum.end()) { //°¢ Ä®·³ µ¥ÀÌÅà ÀúÀå if (!Set_Proto_Item_Table(item_table, data, localMap)) { fprintf(stderr, "¾ÆÀÌÅÛ Ç÷ÎÅä Å×ÀÌºà ¼ÂÆà ½ÇÆÃ.\n"); } } else { //$$$$$$$$$$$$$$$$$$$$$$$ Å×½ºÆ® ¾ÆÀÌÅÛ Ã¤º¸°¡ ÀÖ´Ù! TItemTable *tempTable = it_map_itemTable->second; item_table->dwVnum = tempTable->dwVnum; strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName)); strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName)); item_table->bType = tempTable->bType; item_table->bSubType = tempTable->bSubType; item_table->bSize = tempTable->bSize; item_table->dwAntiFlags = tempTable->dwAntiFlags; item_table->dwFlags = tempTable->dwFlags; item_table->dwWearFlags = tempTable->dwWearFlags; item_table->dwImmuneFlag = tempTable->dwImmuneFlag; item_table->dwGold = tempTable->dwGold; item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice; item_table->dwRefinedVnum =tempTable->dwRefinedVnum; item_table->wRefineSet =tempTable->wRefineSet; item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct; item_table->cLimitRealTimeFirstUseIndex = -1; item_table->cLimitTimerBasedOnWearIndex = -1; int i; for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { item_table->aLimits.bType = tempTable->aLimits.bType; item_table->aLimits.lValue = tempTable->aLimits.lValue; if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType) item_table->cLimitRealTimeFirstUseIndex = (char)i; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType) item_table->cLimitTimerBasedOnWearIndex = (char)i; } for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { item_table->aApplies.bType = tempTable->aApplies.bType; item_table->aApplies.lValue = tempTable->aApplies.lValue; } for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i) item_table->alValues = tempTable->alValues; item_table->bGainSocketPct = tempTable->bGainSocketPct; item_table->sAddonType = tempTable->sAddonType; item_table->bWeight = tempTable->bWeight; } vnumSet.insert(item_table->dwVnum); m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); ++item_table; } //_______________________________________________________________________// //========================================================================// // 4) (b)[test_map_itemTableByVnum]ÀÇ rowÃß, (!)[item_table]¿¡ ¾ø´Â °ÃÀ» Ãß°¡ÇÑ´Ù. //========================================================================// test_data.Destroy(); if(!test_data.Load("item_proto_test.txt",'\t')) { fprintf(stderr, "item_proto_test.txt was loaded successfully.\n"); //return false; } else { test_data.Next(); //¼³¸à ·Î¿ì ³Ñ¾î°¡±â. while (test_data.Next()) //Å×½ºÆ® µ¥ÀÌÅà °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÃÀ» Ãß°¡ÇÑ´Ù. { //Ãߺ¹µÇ´Â ºÎºÃÀ̸é ³Ñ¾î°£´Ù. set::iterator itVnum; itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0))); if (itVnum != vnumSet.end()) { continue; } if (!Set_Proto_Item_Table(item_table, test_data, localMap)) { fprintf(stderr, "¾ÆÀÌÅÛ Ç÷ÎÅä Å×ÀÌºà ¼ÂÆà ½ÇÆÃ.\n"); } m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); item_table++; } } // QUEST_ITEM_PROTO_DISABLE // InitializeQuestItemTable(); // END_OF_QUEST_ITEM_PROTO_DISABLE m_map_itemTableByVnum.clear(); itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); while (it != m_vec_itemTable.end()) { TItemTable * item_table = &(*(it++)); sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u", item_table->dwVnum, item_table->szName, item_table->szLocaleName, item_table->alValues[0], item_table->alValues[1], item_table->alValues[2], item_table->alValues[3], item_table->alValues[4], item_table->alValues[5], item_table->dwWearFlags, item_table->dwAntiFlags, item_table->dwImmuneFlag, item_table->dwRefinedVnum, item_table->wRefineSet, item_table->bAlterToMagicItemPct); m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); } sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum()); return true; } par bool CClientManager::InitializeItemTable() { char query[2048]; fprintf(stderr,"Loading item_proto from MySQL"); snprintf(query, sizeof(query), "SELECT vnum,name,%s,type,subtype,weight,size,antiflag,flag,wearflag,immuneflag+0,gold,shop_buy_price,refined_vnum," "refine_set,magic_pct,limittype0,limitvalue0,limittype1,limitvalue1,applytype0,applyvalue0," "applytype1,applyvalue1,applytype2,applyvalue2,value0,value1,value2,value3,value4,value5,socket_pct,addon_type FROM item_proto%s ORDER BY vnum", g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) return false; int addNumber = pRes->uiNumRows; if (!m_vec_itemTable.empty()) { sys_log(0, "RELOAD: item_proto"); m_vec_itemTable.clear(); m_map_itemTableByVnum.clear(); } m_vec_itemTable.resize(addNumber-1); memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size()); TItemTable * item_table = &m_vec_itemTable[0]; MYSQL_ROW data; //return true; set vnumSet; while ((data = mysql_fetch_row(pRes->pSQLResult))) { str_to_number(item_table->dwVnum, data[0]); strlcpy(item_table->szName,data[1] , sizeof(item_table->szName)); strlcpy(item_table->szLocaleName, data[2], sizeof(item_table->szLocaleName)); str_to_number(item_table->bType, data[3]); str_to_number(item_table->bSubType, data[4]); str_to_number(item_table->bWeight, data[5]); str_to_number(item_table->bSize, data[6]); str_to_number(item_table->dwAntiFlags, data[7]); str_to_number(item_table->dwFlags, data[8]); str_to_number(item_table->dwWearFlags, data[9]); str_to_number(item_table->dwImmuneFlag, data[10]); str_to_number(item_table->dwGold, data[11]); str_to_number(item_table->dwShopBuyPrice, data[12]); str_to_number(item_table->dwRefinedVnum, data[13]); str_to_number(item_table->wRefineSet, data[14]); str_to_number(item_table->bAlterToMagicItemPct, data[15]); item_table->cLimitRealTimeFirstUseIndex = -1; item_table->cLimitTimerBasedOnWearIndex = -1; str_to_number(item_table->aLimits[0].bType, data[16]); str_to_number(item_table->aLimits[0].lValue, data[17]); if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[0].bType) item_table->cLimitRealTimeFirstUseIndex = (char)0; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[0].bType) item_table->cLimitTimerBasedOnWearIndex = (char)0; str_to_number(item_table->aLimits[1].bType, data[18]); str_to_number(item_table->aLimits[1].lValue, data[19]); if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[1].bType) item_table->cLimitRealTimeFirstUseIndex = (char)1; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[1].bType) item_table->cLimitTimerBasedOnWearIndex = (char)1; str_to_number(item_table->aApplies[0].bType, data[20]); str_to_number(item_table->aApplies[0].lValue, data[21]); str_to_number(item_table->aApplies[1].bType, data[22]); str_to_number(item_table->aApplies[1].lValue, data[23]); str_to_number(item_table->aApplies[2].bType, data[24]); str_to_number(item_table->aApplies[2].lValue, data[25]); str_to_number(item_table->alValues[0], data[26]); str_to_number(item_table->alValues[1], data[27]); str_to_number(item_table->alValues[2], data[28]); str_to_number(item_table->alValues[3], data[29]); str_to_number(item_table->alValues[4], data[30]); str_to_number(item_table->alValues[5], data[31]); str_to_number(item_table->bGainSocketPct, data[32]); str_to_number(item_table->sAddonType, data[33]); vnumSet.insert(item_table->dwVnum); m_map_itemTableByVnum.insert(std::map::value_type(item_table->dwVnum, item_table)); sys_log(0, "ITEM: #%-5lu %-24s %-24s VAL: %d %ld %d %d %d %d WEAR %d ANTI %d IMMUNE %d REFINE %lu REFINE_SET %u MAGIC_PCT %u", item_table->dwVnum, item_table->szName, item_table->szLocaleName, item_table->alValues[0], item_table->alValues[1], item_table->alValues[2], item_table->alValues[3], item_table->alValues[4], item_table->alValues[5], item_table->dwWearFlags, item_table->dwAntiFlags, item_table->dwImmuneFlag, item_table->dwRefinedVnum, item_table->wRefineSet, item_table->bAlterToMagicItemPct); item_table++; } fprintf(stderr," Complete! %d Items loaded.\r\n",addNumber); return true; } et bool CClientManager::InitializeMobTable() { //================== ÇÔ¼ö ¼³¸í ==================// //1. ¿ä¾à : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ÆÄÀÏÀ» Àаí, // (!)[mob_table] Å×ÀÌºí ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù. (ŸÀÔ : TMobTable) //2. ¼ø¼­ // 1) 'mob_names.txt' ÆÄÀÏÀ» Àо (a)[localMap](vnum:name) ¸ÊÀ» ¸¸µç´Ù. // 2) 'mob_proto_test.txt'ÆÄÀÏ°ú (a)[localMap] ¸ÊÀ¸·Î // (b)[test_map_mobTableByVnum](vnum:TMobTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. // 3) 'mob_proto.txt' ÆÄÀÏ°ú (a)[localMap] ¸ÊÀ¸·Î // (!)[mob_table] Å×À̺íÀ» ¸¸µç´Ù. // <Âü°í> // °¢ row µé Áß, // (b)[test_map_mobTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_mobTableByVnum]ÀÇ °ÍÀ» »ç¿ëÇÑ´Ù. // 4) (b)[test_map_mobTableByVnum]ÀÇ rowÁß, (!)[mob_table]¿¡ ¾ø´Â °ÍÀ» Ãß°¡ÇÑ´Ù. //3. Å×½ºÆ® // 1)'mob_proto.txt' Á¤º¸°¡ mob_table¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á // 2)'mob_names.txt' Á¤º¸°¡ mob_table¿¡ Àß µé¾î°¬´ÂÁö. // 3)'mob_proto_test.txt' ¿¡¼­ [°ãÄ¡´Â] Á¤º¸°¡ mob_table ¿¡ Àß µé¾î°¬´ÂÁö. // 4)'mob_proto_test.txt' ¿¡¼­ [»õ·Î¿î] Á¤º¸°¡ mob_table ¿¡ Àß µé¾î°¬´ÂÁö. // 5) (ÃÖÁ¾) °ÔÀÓ Å¬¶óÀ̾ðÆ®¿¡¼­ Á¦´ë·Î ÀÛµ¿ ÇÏ´ÂÁö. //_______________________________________________// //===============================================// // 1) 'mob_names.txt' ÆÄÀÏÀ» Àо (a)[localMap] ¸ÊÀ» ¸¸µç´Ù. //<(a)localMap ¸Ê »ý¼º> map localMap; bool isNameFile = true; //<ÆÄÀÏ Àбâ> cCsvTable nameData; if(!nameData.Load("mob_names.txt",'\t')) { fprintf(stderr, "mob_names.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); isNameFile = false; } else { nameData.Next(); //¼³¸írow »ý·«. while(nameData.Next()) { localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1); } } //________________________________________________// //===============================================// // 2) 'mob_proto_test.txt'ÆÄÀÏ°ú (a)localMap ¸ÊÀ¸·Î // (b)[test_map_mobTableByVnum](vnum:TMobTable) ¸ÊÀ» »ý¼ºÇÑ´Ù. //0. set vnumSet; //Å×½ºÆ®¿ë ÆÄÀÏ µ¥ÀÌÅÍÁß, ½Å±Ô¿©ºÎ È®Àο¡ »ç¿ë. //1. ÆÄÀÏ Àоî¿À±â bool isTestFile = true; cCsvTable test_data; if(!test_data.Load("mob_proto_test.txt",'\t')) { fprintf(stderr, "Å×½ºÆ® ÆÄÀÏÀÌ ¾ø½À´Ï´Ù. ±×´ë·Î ÁøÇàÇÕ´Ï´Ù.\n"); isTestFile = false; } //2. (c)[test_map_mobTableByVnum](vnum:TMobTable) ¸Ê »ý¼º. map test_map_mobTableByVnum; if (isTestFile) { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. //¤¡. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí »ý¼º. TMobTable * test_mob_table = NULL; int test_MobTableSize = test_data.m_File.GetRowCount()-1; test_mob_table = new TMobTable[test_MobTableSize]; memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize); //¤¤. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí¿¡ °ªÀ» ³Ö°í, ¸Ê¿¡±îÁö ³Ö±â. while(test_data.Next()) { if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n"); } test_map_mobTableByVnum.insert(std::map::value_type(test_mob_table->dwVnum, test_mob_table)); ++test_mob_table; } } // 3) 'mob_proto.txt' ÆÄÀÏ°ú (a)[localMap] ¸ÊÀ¸·Î // (!)[mob_table] Å×À̺íÀ» ¸¸µç´Ù. // <Âü°í> // °¢ row µé Áß, // (b)[test_map_mobTableByVnum],(!)[mob_table] ¸ðµÎ¿¡ ÀÖ´Â row´Â // (b)[test_map_mobTableByVnum]ÀÇ °ÍÀ» »ç¿ëÇÑ´Ù. //1. ÆÄÀÏ Àбâ. cCsvTable data; if(!data.Load("mob_proto.txt",'\t')) { fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¼³¸í row ³Ñ¾î°¡±â //2. (!)[mob_table] »ý¼ºÇϱâ //2.1 »õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆÄ¾Ç int addNumber = 0; while(data.Next()) { int vnum = atoi(data.AsStringByIndex(0)); std::map::iterator it_map_mobTable; it_map_mobTable = test_map_mobTableByVnum.find(vnum); if(it_map_mobTable != test_map_mobTableByVnum.end()) { addNumber++; } } //data¸¦ ´Ù½Ã ùÁÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àоî¿Â´Ù; data.Destroy(); if(!data.Load("mob_proto.txt",'\t')) { fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ) //2.2 Å©±â¿¡ ¸Â°Ô mob_table »ý¼º if (!m_vec_mobTable.empty()) { sys_log(0, "RELOAD: mob_proto"); m_vec_mobTable.clear(); } m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber); memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size()); TMobTable * mob_table = &m_vec_mobTable[0]; //2.3 µ¥ÀÌÅÍ Ã¤¿ì±â while (data.Next()) { int col = 0; //(b)[test_map_mobTableByVnum]¿¡ °°Àº row°¡ ÀÖ´ÂÁö Á¶»ç. bool isSameRow = true; std::map::iterator it_map_mobTable; it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col))); if(it_map_mobTable == test_map_mobTableByVnum.end()) { isSameRow = false; } //°°Àº row °¡ ÀÖÀ¸¸é (b)¿¡¼­ Àоî¿Â´Ù. if(isSameRow) { TMobTable *tempTable = it_map_mobTable->second; mob_table->dwVnum = tempTable->dwVnum; strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName)); strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName)); mob_table->bRank = tempTable->bRank; mob_table->bType = tempTable->bType; mob_table->bBattleType = tempTable->bBattleType; mob_table->bLevel = tempTable->bLevel; mob_table->bSize = tempTable->bSize; mob_table->dwAIFlag = tempTable->dwAIFlag; mob_table->dwRaceFlag = tempTable->dwRaceFlag; mob_table->dwImmuneFlag = tempTable->dwImmuneFlag; mob_table->bEmpire = tempTable->bEmpire; strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName)); mob_table->bOnClickType = tempTable->bOnClickType; mob_table->bStr = tempTable->bStr; mob_table->bDex = tempTable->bDex; mob_table->bCon = tempTable->bCon; mob_table->bInt = tempTable->bInt; mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0]; mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1]; mob_table->dwMaxHP = tempTable->dwMaxHP; mob_table->bRegenCycle = tempTable->bRegenCycle; mob_table->bRegenPercent = tempTable->bRegenPercent; mob_table->dwGoldMin = tempTable->dwGoldMin; mob_table->dwGoldMax = tempTable->dwGoldMax; mob_table->dwExp = tempTable->dwExp; mob_table->wDef = tempTable->wDef; mob_table->sAttackSpeed = tempTable->sAttackSpeed; mob_table->sMovingSpeed = tempTable->sMovingSpeed; mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct; mob_table->wAggressiveSight = tempTable->wAggressiveSight; mob_table->wAttackRange = tempTable->wAttackRange; mob_table->dwDropItemVnum = tempTable->dwDropItemVnum; mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum; for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) mob_table->cEnchants[i] = tempTable->cEnchants[i]; for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i) mob_table->cResists[i] = tempTable->cResists[i]; mob_table->fDamMultiply = tempTable->fDamMultiply; mob_table->dwSummonVnum = tempTable->dwSummonVnum; mob_table->dwDrainSP = tempTable->dwDrainSP; mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum; mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel; mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum; mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel; mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum; mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel; mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum; mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel; mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum; mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel; mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum; mob_table->bBerserkPoint = tempTable->bBerserkPoint; mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint; mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint; mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint; mob_table->bRevivePoint = tempTable->bRevivePoint; } else { if (!Set_Proto_Mob_Table(mob_table, data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n"); } } //¼Â¿¡ vnum Ãß°¡ vnumSet.insert(mob_table->dwVnum); sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } //_____________________________________________________// // 4) (b)[test_map_mobTableByVnum]ÀÇ rowÁß, (!)[mob_table]¿¡ ¾ø´Â °ÍÀ» Ãß°¡ÇÑ´Ù. //ÆÄÀÏ ´Ù½Ã Àоî¿À±â. test_data.Destroy(); isTestFile = true; test_data; if(!test_data.Load("mob_proto_test.txt",'\t')) { fprintf(stderr, "Å×½ºÆ® ÆÄÀÏÀÌ ¾ø½À´Ï´Ù. ±×´ë·Î ÁøÇàÇÕ´Ï´Ù.\n"); isTestFile = false; } if(isTestFile) { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. while (test_data.Next()) //Å×½ºÆ® µ¥ÀÌÅÍ °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÍÀ» Ãß°¡ÇÑ´Ù. { //Áߺ¹µÇ´Â ºÎºÐÀÌ¸é ³Ñ¾î°£´Ù. set::iterator itVnum; itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0))); if (itVnum != vnumSet.end()) { continue; } if (!Set_Proto_Mob_Table(mob_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n"); } sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } } sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum()); return true; } par bool CClientManager::InitializeMobTable() { char query[2048]; fprintf(stderr,"Loading mob_proto from MySQL "); snprintf(query, sizeof(query), "SELECT vnum,name,%s,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag," "empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min," "gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item," "resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate," "resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect," "resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0," "skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2," "skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s" ,g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) return false; if (!m_vec_mobTable.empty()) { sys_log(0, "RELOAD: mob_proto"); m_vec_mobTable.clear(); } int size = pRes->uiNumRows; m_vec_mobTable.resize(size); memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size()); TMobTable * mob_table = &m_vec_mobTable[0]; MYSQL_ROW data; //return true; set vnumSet; while ((data = mysql_fetch_row(pRes->pSQLResult))) { /* "SELECT vnum,name,locale_name,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag," "empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min," "gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item," "resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate," "resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect," "resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0," "skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2," "skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s */ int col = 0; str_to_number(mob_table->dwVnum, data[col++]); if(mob_table->dwVnum ==0) continue; strlcpy(mob_table->szName,data[col++] , sizeof(mob_table->szName)); strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName)); str_to_number(mob_table->bRank,data[col++]); str_to_number(mob_table->bType,data[col++]); str_to_number(mob_table->bBattleType,data[col++]); str_to_number(mob_table->bLevel,data[col++]); str_to_number(mob_table->bSize,data[col++]); //AI_FLAG mob_table->dwAIFlag = get_Mob_AIFlag_Value(data[col++]); //mount_capacity; col++; //RACE_FLAG mob_table->dwRaceFlag = get_Mob_RaceFlag_Value(data[col++]); //IMMUNE_FLAG mob_table->dwImmuneFlag = get_Mob_ImmuneFlag_Value(data[col++]); mob_table->bEmpire = atoi(data[col++]); strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder)); mob_table->bOnClickType = atoi(data[col++]); mob_table->bStr = atoi(data[col++]); mob_table->bDex = atoi(data[col++]); mob_table->bCon = atoi(data[col++]); mob_table->bInt = atoi(data[col++]); mob_table->dwDamageRange[0] = atoi(data[col++]); mob_table->dwDamageRange[1] = atoi(data[col++]); mob_table->dwMaxHP = atoi(data[col++]); mob_table->bRegenCycle = atoi(data[col++]); mob_table->bRegenPercent = atoi(data[col++]); mob_table->dwGoldMin = atoi(data[col++]); mob_table->dwGoldMax = atoi(data[col++]); mob_table->dwExp = atoi(data[col++]); mob_table->wDef = atoi(data[col++]); mob_table->sAttackSpeed = atoi(data[col++]); mob_table->sMovingSpeed = atoi(data[col++]); mob_table->bAggresiveHPPct = atoi(data[col++]); mob_table->wAggressiveSight = atoi(data[col++]); mob_table->wAttackRange = atoi(data[col++]); str_to_number(mob_table->dwDropItemVnum, data[col++]); //32 str_to_number(mob_table->dwResurrectionVnum, data[col++]); for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) str_to_number(mob_table->cEnchants[i], data[col++]); for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i) str_to_number(mob_table->cResists[i], data[col++]); str_to_number(mob_table->fDamMultiply, data[col++]); str_to_number(mob_table->dwSummonVnum, data[col++]); str_to_number(mob_table->dwDrainSP, data[col++]); //Mob_Color ++col; str_to_number(mob_table->dwPolymorphItemVnum, data[col++]); str_to_number(mob_table->Skills[0].bLevel, data[col++]); str_to_number(mob_table->Skills[0].dwVnum, data[col++]); str_to_number(mob_table->Skills[1].bLevel, data[col++]); str_to_number(mob_table->Skills[1].dwVnum, data[col++]); str_to_number(mob_table->Skills[2].bLevel, data[col++]); str_to_number(mob_table->Skills[2].dwVnum, data[col++]); str_to_number(mob_table->Skills[3].bLevel, data[col++]); str_to_number(mob_table->Skills[3].dwVnum, data[col++]); str_to_number(mob_table->Skills[4].bLevel, data[col++]); str_to_number(mob_table->Skills[4].dwVnum, data[col++]); str_to_number(mob_table->bBerserkPoint, data[col++]); str_to_number(mob_table->bStoneSkinPoint, data[col++]); str_to_number(mob_table->bGodSpeedPoint, data[col++]); str_to_number(mob_table->bDeathBlowPoint, data[col++]); str_to_number(mob_table->bRevivePoint, data[col++]); //ĽÂżˇ vnum Ăß°ˇ vnumSet.insert(mob_table->dwVnum); //fprintf(stderr, "MOB #%d %s %s level: %u rank: %u empire: %d\n", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } fprintf(stderr," Complete! %d/%d Mobs loaded.\r\n",size,vnumSet.size()); sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum()); return true; } Attention dans bool CClientManager::InitializeTables() vous devrez supprimez donc MirrorMobTableIntoDB() and MirrorItemTableIntoDB() Source : EPvP
  11. Bonjour, Vous allez ici apprendre à installer un système de news complet pour MT2-CMS. 1. Les fonctionnalités 2. Installation Vous pouvez copier/coller ce tutoriel mais vous avez l'obligation de citer l'auteur de manière visible.
  12. Bonjour ! Voyant que beaucoup d'entre vous (ou presque ) cherche à avoir les anciennes ailes de l'officiel pour leur serveur (celle ci dessous), je les partages. Je parle bien entendu des ailes où les ailes bontarien ont leur auréole ! C'est vrai que l'auréole des anges ça fais déjà plus ange . Téléchargement : Aile Démon Ange Version 1.18 Cordialement, --- Download
  13. Bonjour, Aujourd'hui je vous partage une nouvelle fois quelque chose d'un peu exclusif et très sympa, c'est les classes de Dofus en graphisme 2.13 en mode créature quand une map et surcharger de personnes les classes ce transforme c'est donc ceci que je vous partage. Je précise que c'est moi qui les et fait, que j'autorise le partage sur tout forum cité juste mon pseudo par respect s'il vous plait. Voici quelques informations sur les swf Quand t'il reste Static = Fait Quand t'il marche = Fait Quand t'il cour = Fait Quand t'il ce font toucher = Fait Quand t'il meure = Fait Stopage des animations = Fait Rezise des 12 classes 2.13 pour 1.29 = Fait Sons des swf = Non Swf en 25 Fps et non en dessous. Et enfin le lien de téléchargement Télécharger le pack Sur ce je vous souhaite une très bonne journée, si vous avez des questions je suis là et n'hésitez pas à me laisser un petit message sur le sujet sa me ferais plaisir (plus qu'un j'aime), a bientôt pour de nouveau partages. Nairolf - Dofus64 --- Download
  14. Bonjour Je vous fais un cours tutoriel sur l'extraction des SWF de Dofus l'officiel, ce tutoriel va surtout servir à compléter le tutoriel que je vais réaliser prochainement qui s'intitulera "Tutoriel SWF, Adapter les SWF de Dofus l'officiel pour 1.29" et donc avant de réaliser un tel tutoriel il faut bien que je vous apprenne comment extraire les fichiers D2P de Dofus l'officiel pour les adapter ensuite sur 1.29 donc pour votre serveur ! Je précise que le tutoriel est entièrement de moi. À l'heure où j'écris ces lignes je le commence tout juste, j'autorise le partage partout je suis POUR essayer de faire avancer la communauté et ne rien garder dans mon coin surtout que je quitte l'émulation Dofus ce sont en quelque sorte mes derniers cadeaux ! On va commencer ce mini-tutoriel ! Étape 1 : Télécharger le décompilateur D2P Ici, puis une fois téléchargé je vous invite à extraire le contenue du décompilateur sur votre bureau avec Winrar pour s'y retrouver plus facilement. C'est quoi un décompilateur ? un décompilateur sert à convertir un format dans un autre, par exemple avec les SWF de Dofus l'officiel a comme format de base D2P comme je vous le disais juste avant, grâce au décompilateur on va convertir les fichiers D2P en format SWL et ensuite en SWF ! Ah mais c'est quoi un format , un format et une extension de fichier, par exemple regardez une image et regardez la fin, en général c'est mon_image.png le .png est le format, il y a bien sûr énormément d'extensions mais c'est pas le but de ce tutoriel de vous les apprendre ! Et pourquoi aussi on convertit le fichier D2P en SWL puis en SWF ? Il y a trop de questions à se poser mais c'est sûrement la meilleur solution. Étape 2 : Rendez-vous dans votre dossier Dofus 2 (dofus l'officiel), et si vous ne l'avez pas, installez le Dofus officiel. Étape 3 : Une fois dans le dossier de Dofus 2 rendez-vous à ce chemin on va prendre pour exemple un D2P bien précis : C:\Program Files (x86)\Dofus2\app\content\gfx\sprites\bones0.d2p Étape 4 : Copiez/collez bones0.d2p sur votre bureau. Étape 5 : Rendez-vous sur votre décompilateur et ouvrez : TenkUnpacker.exe Étape 6 : Cliquez sur Parcourir et trouvez le fichier bones0.d2p qui est normalement sur votre bureau si vous m'avez écouté, cliquez sur Ouvrir et pour finir Extraire ! Maintenant si vous regardez dans votre dossier du décompilateur un dossier appelé "data" s'est créé. C'est très intéressant car il contient tous les fichiers extraits du fichier D2P en format SWL vous suivez toujours ? Étape 7 : Donc on a ce fameux dossier avec pleins de fichiers au format SWL, on ne les touche surtout pas, et maintenant ont va simplement ouvrir le logiciel TenkSwl.exe qui va enfin convertir tout seul les fichiers SWL en SWF ! Étape 8 : Il n'y a pas d'étape 8 si vous avez suivi le tutoriel, maintenant il vous reste plus qu'à vous rendre dans le dossier de votre décompilateur et de regarder le deuxième dossier qui s'est créé ! Appelé "data2" et tous les fichiers SWF se trouvent tout simplement dedans. Le tutoriel est terminé, vous avez extrait les fichiers de Dofus l'officiel en format D2P en SWF ! Une question ? Je suis la. Un merci je vous en remercie, un message sur le sujet et encore mieux. [Tutoriel SWF] Adapter les fichiers SWF de Dofus l'officiel pour Dofus 1.29 : À venir
  15. Bonjour, Avant toute chose, je précise que ce partage m'a été demandé par Zano directement (on me pourra pas me dire "wesh dou ta l'droit d'partage comme ça?") Voici le partage officiel de Zano, via GitHub, d'Astria Map Editor V2, avec les sources et aussi une version compilée, en mode totalement offline (pas besoin de wamp). Voici directement le copié/collé de son partage sur un autre forum (aucun Hide en place car ceci n'est pas de moi mais de Zano, merci quand même de poster un remerciement à son égard) Je pense qu'il serait judicieux, pour ceux ayant les compétences, de travailler directement sur GitHub afin de continuer son travail. Encore merci à lui pour ce cadeau --- Download
  16. Salut à tous, Dans ce tutoriel je vais vous apprendre à installer un serveur DNS (domain name system) pour lier votre nom de domaine à votre machine, ainsi qu'un serveur de mail des plus simple utilisant la fonction no-reply I Ce que nous allons apprendre : Je vais vous apprendre à installer et configurer un serveur DNS avec BIND9, pour faire pointer votre nom de domaine vers votre machine, pour exemple nous utiliserons un serveur dédié kimsufi et un nom de domaine enregistré chez ovh. Je vais vous apprendre à installer un serveur de mail avec postfix utilisant la fonction no-reply. La méthode la plus simple pour activer les compte de vos forumeur par e-mail, ou la récupération de mot de passe, si vous n'avez pas serveur mail, ou la fonction phpmail d'activé. Certes ce ne sont pas des méthodes ultra-conventionelle, mais quand vous n'avez l'utilité d'un webmail "pro" c'est la méthode la plus simple à mettre en oeuvre. Si vous êtes intéressé par le mailling de masse, le système de news letter, Vous avez deux solution soit passé par un hoster type Google Apps ou Zohoo voir plus bas ou créer le votre. (je ferai surement un tuto pour vous apprendre à créer votre propre serveur de mail) Utilisation d'un hoster : (google apps très bien, mais depuis peu payant 11€/mois, simple d'installation et d'utilisation, et de plus vos mails on une délivrabilité à 99.9%) Etre votre propre hoster : (Utiliser postfix, dovcot, spamassin, et un webmail du type roundcube ou rainloop) méthode très longue à mettre en oeuvre, le plus dur n'est pas d'installer les différents logiciel, mais c'est de parametrer à la perfection, il faut pas mal de certificat : opendkim, spf, openssl etc.. Sinon vos email ne verrons jamais la lueur d'une boîte mail. Donc ma méthode c'est no prise de tête et ça fonctionnera ! Vos membres pourront activer leur compte, vous pourrez les tenir informer par email de masse depuis votre forum, et il pourront utiliser le système de récupération. II Ce que nous allons faire : [1] Installation de bind. [2] Configuration de bind. [3] Installation de postfix. [4] Utilisation de no-reply. INFO : J'ai ajoutés des couleurs et des chiffres dans la checklist, pour vous repérer plus facilement III A vos console ssh et TOP DEPART ! [1] Rendez vous à la racine de votre système cd .. Comme d'habitude avant d'installer un nouveau paquets on met à jours le binz : apt-get dist-upgrade && apt-get update Installation de bind : apt-get install bind9 [2] Nous allons déclarer nos zones / zones de reversing, donc vous tapez : nano /etc/bind/named.conf.local Vous copiez ceci dans le fichier que vous venez d'ouvrir en édition, cela permet à notre domaine de pointer vers notre ip: zone "mon-ndd.com" { type master; file "/etc/bind/zones/db.mon-ndd.com"; }; A la suite vous copiez cela, qui vous permet de pointer votre ip vers votre domaine (reverse capito ?) : Attention tu dois mettre l'adresse ip de ta machine à l'envers soit par ex : 127.0.0.1 deviens : zone "1.0.0.127.in-addr.arpa" { type master; file "/etc/bind/zones/1.0.0.127.in-addr.arpa"; }; Ensuite nous enregistrons soit CTRL + X puis Y ensuite ENTRER Nous quittons la console pour ce connecter au manager kimsufi & ovh So, il nous faut un minimum d'information avant de continuer, donc je vous invites à vous connecter sur votre espace kimsufi manager et cliquez sur DNS : Ensuite vous cliquez sur AJOUTER DNS SECONDAIRE vous indiquez votre nom de domaine, vous sélectionnez l'ip de votre machine, vous confirmez. Nous avons besoin de 3 informations : Votre ownercheck : 8f7ae648 (code aléatoire qui prouve par A + B que vous êtes bien le proprio du ndd. Votre FQDN / serveur primaire : ns3XXX.ip-XXX.eu. Le serveur secondaire : ns.kimsufi.com. Relevez l'adresse en haut à gauche encadré du type ns3XXX.ip-XXX.eu c'est votre FQDN vous pouvez le modifier normalement mais là on s'égard jeune padawan Bon, désormais tu te connecte à ton espace manager OVH puis tu cliques sur ton nom de domaine à gauche, tu cliques sur ajouter une entrée et tu fais comme sur la screen mais avec ton code et ton ndd bien sur ^^ En suite nous cliquerons sur GESTION DNS vous supprimez les enregistrement actuelle et ajoutez les votres soit Votre FQDN / serveur primaire : ns3XXX.ip-XXX.eu. Votre serveur secondaire : ns.kimsufi.com. Retour à notre console, nous avons toutes les infos. Créons déjà le répertoire des fichiers de zones :: mkdir /etc/bind/zones Rendez vous dans le dossier /etc/bind/zones cd /etc/bind/zones Ensuite nous créons notre premier fichier de zones. Remplacez mon-ndd.com par votre ndd HEIN ! nano /etc/bind/zones/db.mon-ndd.com Vous copiez ceci, et vous remplacez biensur l'ip 127.0.0.1 par celle de votre machine, le FQDN par le votre, et le ndd ainsi que le code ownercheck : $TTL 12H $ORIGIN mon-ndd.com. @ IN SOA ns3XXX.ip-XXX.eu. postmaster.mon-ndd.com. ( 2015100701 ; Serial 8H ; Refresh 30M ; Retry 4W ; Expire 8H ; Minimum TTL ) IN NS ns3XXX.ip-XXX.eu. IN NS ns.kimsufi.com. IN MX 10 mail.mon-ndd.com. mon-ndd.com. IN A 127.0.0.1 ns IN A 127.0.0.1 mail IN A 127.0.0.1 www IN CNAME mon-ndd.com. ftp IN CNAME mon-ndd.com. ownercheck.mon-ndd.com. IN TXT "8f7ae648" Ensuite nous enregistrons soit CTRL + X puis Y ensuite ENTRER Good maintenant le fichier de reverse (remplacez 1.0.0.127 par votre ip à l'envers HEIN ! nano /etc/bind/zones/1.0.0.127.in-addr.arpa Vous collez ceci et le modifiez comme expliquez plus haut (c'est clair non ) $TTL 12H @ IN SOA ns3XXX.ip-XXX.eu. postmaster.mon-ndd.com. ( 2015100701 ; Serial 8H ; Refresh 30M ; Retry 4W ; Expire 8H ; Minimum TTL ) IN NS ns3XXX.ip-XXX.eu. IN NS ns.kimsufi.com. IN PTR mon-ndd.com. Idem nous enregistrons soit CTRL + X puis Y ensuite ENTRER Le seul truc qui nous intéresse ici c'est ça : 2015100701 ; Serial (car toi perso tu veux juste que ton ndd pointe sur ta machine le reste osef hein ? Année mois jours modification voila dans quel ordre il faut le remplir à chaque modification que tu entreprends il faut que tu incrémente le sérial c'est à dire que si tu le modifie après l'avoir reload, tu remplace le 01 par un 02 etc... A présent nous allons check notre config : named-checkconf /etc/bind/named.conf No error ? Good ! Error ? Go to support ! Testons à présent nos fichiers de zone : named-checkzone mon-ndd.com db.mon-ndd.com Réponse quand ça fonctionne : zone mon-ndd.com/IN: loaded serial 2015100701 OK le reverse now : named-checkzone mon-ndd.com 1.0.0.127.in-addr.arpa Reponse quand ça fonctionne : zone mon-ndd.com/IN: loaded serial 2015100701 OK Super aucune erreur ? On reload bind pour prendre en compte nos fichiers de zone : etc/init.d/bind9 reload etc/init.d/bind9 restart Voila maintenant, nous testons si notre serveur DNS répond : nslookup mon-ndd.com. ns3XXX.ip-XXX.eu Idem en solution inverse : nslookup 127.0.0.1 ns3XXX.ip-XXX.eu Parfait, si tout ce passe bien pas d'erreur ça répond, sinon je vous invite à créer un thread dans la catégorie support. [3] Installation de postfix : (Agent MTA de transfert de courrier (Evite que des spammeurs utilise votre machine pour envoyer du courrier indésirable)[/color][/color][/color] apt-get install postfix Maintenant direction votre forum exemple ci joint un forum phpbb : Vous remplissez comme sur la screen et vous pouvez envoyer vos mail YOUPI !
  17. Bonjour à tous chère WebMaster/Scripteur ! Voici le Gamemode D'Universal Role Play !!! Informations Du Script : -Version : 2 -Base : LARP -Bot : 1 ( Voir filterscript sf_bot pour bot TRAM ) -Objets : Environs 750 Objets -Véhicule : 305 Véhicule -Site/Production : [Hidden Content] Listes Des Améliorations/Modfication : Correction > - Les Différents de BUG du GM Larp on la plupart était corrigé comme par exemple : Le problème de Location, Problème D'achat de maison(quand on acheté une maison on restez bloqué à l'intérieur ! - Des Jobs Inutile Enlevé (Comme le balayeur qui consister à faire semblant de travailler en roulant ^^) ... Modification > -Chat Modifier ( Plus VIF ) -Gang Modifié ( Plus réel ) -Système de véhicule remplacer par celui de Mr Freedo ... Nouveauté > -Nouvelle commande ajouté : /aidemenu (Listes des commandes générale en menu) || /moi+ ( Action du personnage en Text 3D Label) || /acc ( Simule un Accident ) || /ceinture ( Met une ceinture de sécurité ) || /vmenu ( Vous affiche les commande de gestion de véhicule ) ... Les autres seront à découvrir par vous même -Système Anti-Pub : Une radio doit êtres obligatoirement acheté dans un 24/7 pour pouvoir utiliser les PM, Le OOC, le /b et le /sms, Les PM et /sms sont lisible par tout les admins connecté ! -Systeme de Click Button(BETA) : Quand vous monter dans un véhicule un mode de button click peut être activé les instructions sont marqué dns le cadre lors de la monter dans le véhicule ! (Quelque BUG ) -Système de Tunning fait maison par les nouveaux menu de sa-mp ( mettez vous devant la grille du garage de la gare est faite /tuning ) -Système de Braquage fait maison ... -Système de frontière : Vous devez payer lors du passage a frontière des mafias (Bayside) ! - Et le script à était complétement aménager ( Rangements ect ... ) ... à Découvrir par vous même Les défaut : - 2 boucle à corrigé ( La frontière et Les menu D'entré de bizz ) - Systeme de stats en mysql à retirer ! ( Plus d'info : [Hidden Content] ) Remerciements :- MrFreedo pour son système de véhicule - Xoss Pour le modèle de présentation ( Que j'ai quand même modifié ) - A tout le staff de Gta Online qui mon aidez dans l'apprentissage du pawn / allias C+++++++ ^^ Réalisation de vidéo RP et Fun de mon serveur : [Hidden Content] Téléchargement : [Hidden Content] > Mise à jour ! Version NO Mysql ... [Hidden Content] > Script PHP pour Web Stats (( Désolé je n'ai plus la version traduire sur mon pc ... )) Merci de laisser le copyright pour le respect du scripteur (même si c'est un peu débile de dire sa )
  18. Voici un skin pour les distributeurs de boissons. Link : [Hidden Content] Source: BlackPearl Respect , Makaveli
  19. Bonjour, a tous Mon premier tutoriel dans la section wow je trouve que la section word of warcraft ne bouge pas assez c'est pour cela que je vais la remettre a jour tout seul s'il le faut la section Word of warcraft, Je pense que beaucoup de monde sur funky-emulation a déjà entendu parlé de Word of warcraft. Information que veux dire Wow : Wow = Word of warcraft ( Pour ceux qu'il ne le save pas ) Ceux tutoriel et plutôt pour les personne qu'il on déjà Word of warcraft : Commençons : Je vais prendre pour exemple : [Hidden Content] Ensuite : World of Warcraft => Data => frFR => Voici le ficher a mettre : [Hidden Content] Remplacé l'ancien ficher bien sur World of Warcraft => Data => frFR => realmlist.wtf Sa vous donne sa : Bon après on se retrouve sur le serveur =)
  20. Bonjour a tous. Voila un tuto pour vous expliquer comment créer des map qui servent aux serveurs samp. Tout d'abord, il faut que vous téléchargiez MTA SA pour utiliser map éditor. Téléchargez ici: > GTASA.fr > Mirror: RapideShare (upload par moi) Après le téléchargement, dézipez-le, instrallez le et donnez le chemin d'acces a votre dossier GTA San Andreas. Lancez MTA SA, puis cliquez sur "map éditor". Vous aurez le meme chargement que dans gta san andreas en solo. Vous arriverez dans groove street, devant la maison de CJ. Les déplacements et touches: s: pour avancer w: pour reculer a: pour tourner a gauche d: pour tourner a droite shift + s: acelerer plus vite. souris: pour la vue. entré: sélectioner echap: retourner au menu précédent. Ensuite, faites "new race" et nommez votre map, puis faite entré. Vous arriverez sur le premier menu. Allez sur "add élément" puis "create object" et enfin sur "Browse". On arrive au menu des objets. Ils sont classés comme ceci: -Beach and sea: Tous les objets qui concernent la mer comme les étoiles de mer etc... -Building: Toutes les maisons, habitations, immeubles, buildings, casinos...... -Industrial: Tous les objets industriels... -Interiors objects: Tous les objets d'interieurs qui servent dans les maisons et autes .... -Land masse: Tous les objets, comme les égoux de ls et les dunes, montagnes et des plantes .... -Miscellaneous: Tous les objets de la rue, les icones, les escalier .... -Nature: Tous les pierres, blocs rocheux .... -Structures: Tous les objets des aéroports, des parkings, les ramps .... -Transportations: Toutes les routes et voies de train .... Pour ajouter un objet a votre map, sélectionnez-le et appuyez sur entrée. Votre objet sera au bout de votre curseur. Pour poser l'objet, vous avez juste a cliquer. Pour déplacer un objets: 1) Vous pouvez faire un clique droit pour le déplacer avec votre souris (n'est pas très precis) 2) Faites un seul clique gauche et déplacez-le avec les touches: Utilisez les touches directionelles pour déplacer votre objet. Attention: Votre objet se déplace en fonction du nord. pour mieux comprendre, il vous suffit de placer votre vue FACE AU NORD et d'utiliser les touches. Vous comprendrez mieux quand vous le ferez vous meme. Les touches "début" et "fin" (au dessus de "supprimer") servent à élever ou abaisser votre objet. Vous pouvez faire "shift" et "début" ou "fin" pour l'élever plus rapidement. Faites: "ctrl" et "début" ou "fin" pour incliner votre objet. "ctrl" et la touche "up" et "down" pour incliner auss l'objet sur un autre angle. "ctrl" et les touches droites ou gauches pour faire pivoter votre objet. Quand vous etes sur de l'emplacement, faites échap et sélectionez un objets a nouveau. Pour supprimer un objet, il vous suffit et cliquer dessus et d'appuyer sur "supprimer" Pour cloner l'objet, cliquez dessus et faites F9. Quand votre map est finie, faites echap pour revenir au menu principal et il vous demanderont de sauver, vous aurez juste a dire "yes". Maintenant que vous avez créé votre map, il faut la traduire pour la mettre dans votre GM. Allez sur ce site: >>> [Hidden Content] <<<. Selectionez votre map (parcourir) . NB: Elle se trouve (par défaut) dans: C:\Program Files\MTA San Andreas\mods\map_editor\maps Choisissez le mode de script, puis cliquez sur "Convert Map". Placez le script obtenue dans "OneGameModInit" et vous avez une jolie map pour votre GM. Ptit rappel: Trop d'objets sur un serveur, le fait planter donc surveillez combien vous en avez mit. De 0 a 140: aucun crash De 140 a 200: quelques crash Plus de 200: crash total du serv. Cordialement, LeChapelierFou
  21. Bonsoir, alors d'abord je vous donne la source du CMS : ibui**. (Autre forum/No PUB.) Voici déjà le lien de telechargement : ici. (Si lien mort, merci de me le préciser.) Ceci est la dernière version, je la testerai dans la vidéo, peut-être qu'il y a la boutique ou le forum. • Alors ce CMS est vraiment beau et très complet. Les fonctionnalités Vous pouvez : Gérer votre serveur depuis le panel admin sur le site. Créer une boutique en ligne adapter au design de votre site. Créer des articles/news et gérer des commentaires. Faire un forum. ect... L'avancement du projet Pour l'instant le projet est apparemment stopper , voici une checklist de ce que nous avons fait et de ce qui reste à faire : [OK] Installation facile [OK] Système de connexion sécurisée [OK] Panel [OK] Partie publique [OK] Site officiel [OK] Plugin par bukkit Les choses à faire (Si vous arrivez.) La team qui a fait ce CMS l'a abandonné, peut-être que quelqu'un ce sent de taille pour le finir? Il manque : - La boutique. - Le forum.
  22. Bonjour FE, Je vous partage ce logiciel qui vous permet d'appliquer vos dif sur vos game. Screen : Téléchargement : ici Scan Source : epvp
  23. Bonjour, Je vous présente le plugin Vote4Diamondz crée par md_5 et rhinez0r. Ce plugin permet de récompenser les votes de vos joueurs sur les sites de vote pour votre serveur ! ATTENTION ! Le joueur doit être CONNECTE au serveur pour recevoir la récompense. Les + : - Hebergé sur votre serveur pour votre serveur ! - Gratuit - Garder les logs des votes. - Permet de mettre les meilleurs voteurs. - IP protection. Pour pas qu'il n'y ai de triche. - Récompense totalement personnalisable. - Juste le .jar à mettre sur votre serveur, configurer le vote.html et le config.yml. - Complètement personnalisable. Téléchargement : [Hidden Content] Prenez Vote4Diamondz-v1 (datant du 4 Octobre), oui oui, c'est marqué pour craftbukkit 1.3.2 mais cela marche quand même en 1.5.2 ! Utilisez la première version car elle est totalement personnalisable. La deuxième version a été simplifié pour les débutants.. mais du coup... moins personnalisable. Mettez le Vote4Diamondz.jar dans le dossier plugins de votre serveur. Lancez votre serveur pour que le dossier Vote4Diamondz se crée. Une fois ce dossier crée, on voit apparaître 3 fichiers dedans : - config.yml (= Configuration du plugin) - vote.html (= Configuration de la page de vote) - votes.sqlite (= Enregistrement des votes) Passons au config.yml : Le voici avec explication : Voilà, l'image parle d'elle-même. Alors pour le fichier vote.html : Pour changer les site de vote. Il suffit de changer ce qui est marqué ici : Sur la premiére : En rouge, c'est l'image qui va s'afficher sur votre site de vote, c'est en quelque sorte la banniére où le joueur cliquera pour pouvoir voter sur le site. En vert, le lien pour voter. Là où vous voulez que le joueur soit redirigé quoi. Faites de même pour les autres (vous pouvez mettre autant de site que vous voulez) Voilà !!! Tout est bon ! Vous pouvez configurer les textes autour si vous le voulez. En bas de la page, vous voyez Top Voters ? Sa sera la liste des joueurs qui ont votés, avec leur nombre de vote affiché à côté. (grâce au votes.sqlite) Ainsi, vous pourrez récompenser le meilleur voteur du mois par exemple. Puis vous n'aurez qu'a vidé le votes.sqlite ! Voilà, vous savez désormais récompenser les votes de vos joueurs. Have fun =)
  24. Bonjour, Aujourd'hui je vais vous apprendre à ajouter un bouton au footer de la maintenance RetroPhp. Déjà, c'est quoi le footer ? C'est ça : Pour ajouter un bouton allez dans votre CMS puis ouvrez maintenance.php Cherchez : Partenaires/publicité Vous aurez ça : Partenaires/publicité Vous allez copier ce code et le rajouter à la suite directement soit, vous aurez ça : > </pre> <ul> Aide - Contact La Habbo attitude Partenaires/publicité Partenaires/publicité Ici, on va créer une page d'aide donc par exemple : On change le dernier par aide, et on va le redirigé sur help.php : > </pre> <ul> Aide - Contact La Habbo attitude Partenaires/publicité Aide Vous allez donc créer le fichier help.php Ouvrez le, et créer votre page par exemple : Erreur La page d'aide va arriver. Patience !
  25. Bonjour, New tuto: comment changer l'icône des skills en jeu ! Go !! 1. Ouvrez EterNexus Vous depackez ensuite le pack etc.eix 2.On va où il faut : Rendez-vous ici : etc\ymir work\ui Vous ouvrez ensuite : skillsura.dds ou skillshaman.dds ou skillwarrior.dds ou bien skillninja.dds Vous devriez avoir ça : On modifie.... hum comme ça : On repack ensuite le tout ! Et voilà le rendu IG : J’espère que ça vous aura plu ! Bon jeu ! Cordialement.