BEST Production V4 Final Versiyon Bugları,Hataları ve şu ana kadar yapmış olduğum fixler.

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 41

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Hatalar ve fixler linkde ki filese aittir.


Ekibimle birlikte sabahtan beri oyun ile alakalı herşeyi denedik ve bulabildiğimiz bütün sorunları liste halinde sizlere yazıyorum.
Yardımcı olmak isteyen arkadaşlar konu altından yada özel mesajdan irtibata geçebilir.
Geçelim şimdi sorunlara.

  1. <li data-xf-list-type="ol">Ox sorunu tam olarak şudur ox başlattıgımızda bazı userlerin canı vs t lerce oluyor ve bazılarının itemleri yere düşüyor rastgele şekilde. <li data-xf-list-type="ol">Reborn sisteminin verdiği özellikler öldükten sonra işlevini kaybediyor. <li data-xf-list-type="ol">Oto av sistemi bazı fonksiyonları çalışmıyor.(Bazen hiç çalışmıyor.) <li data-xf-list-type="ol">Filesin enteresan bir pack düzeni var yeni mob yeni map vs. eklenmiyor. <li data-xf-list-type="ol">Tılsımlar etkisiz eleman ve bozuklar mob proto.txt de herhangi bir mobu ATT_FIRE vs. yaptığımız halde herhangi bir işe yaramıyor.Etki etmiyor. <li data-xf-list-type="ol">Gaya K Envanterini görmediği için gaya puanı vermiyor.

Bu konuya istinaden yaptığım/çözdüğüm sorunlarıda ekliyorum.

K Envanteri cube sorunu:
Kod:
cmd_general.cpp Bul Değiştir: ACMD(do_cube)[/CENTER] {     if (!ch-&gt;CanDoCube())         return;     dev_log(LOG_DEB0, "CUBE COMMAND &lt;%s&gt;: %s", ch-&gt;GetName(), argument);     //www.metin2hizmet.com Cube Fixed     UINT cube_index = 0, inven_index = 0;     //www.metin2hizmet.com Cube Fixed     const char *line;     char arg1[256], arg2[256], arg3[256];     line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));     one_argument(line, arg3, sizeof(arg3));     if (0 == arg1[0])     {         // print usage         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "       cube close");         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "       cube add &lt;inveltory_index&gt;");         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "       cube delete &lt;cube_index&gt;");         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "       cube list");         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "       cube cancel");         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "       cube make [all]");         return;     }     const std::string&amp; strArg1 = std::string(arg1);     if (strArg1 == "r_info")     {         if (0 == arg2[0])             Cube_request_result_list(ch);         else         {             if (isdigit(*arg2))             {                 //www.metin2hizmet.com Cube Fixed                 UINT listIndex = 0, requestCount = 1;                 //www.metin2hizmet.com Cube Fixed                 str_to_number(listIndex, arg2);                 if (0 != arg3[0] &amp;&amp; isdigit(*arg3))                     str_to_number(requestCount, arg3);                 Cube_request_material_info(ch, listIndex, requestCount);             }         }         return;     }     switch (LOWER(arg1[0]))     {         case 'o':    // open             Cube_open(ch);             break;         case 'c':    // close             Cube_close(ch);             break;         case 'l':    // list             Cube_show_list(ch);             break;         case 'a':    // add cue_index inven_index             {                 if (0 == arg2[0] || !isdigit(*arg2) ||                     0 == arg3[0] || !isdigit(*arg3))                     return;                 str_to_number(cube_index, arg2);                 str_to_number(inven_index, arg3);                 Cube_add_item (ch, cube_index, inven_index);             }             break;         case 'd':    // delete             {                 if (0 == arg2[0] || !isdigit(*arg2))                     return;                 str_to_number(cube_index, arg2);                 Cube_delete_item (ch, cube_index);             }             break;         case 'm':    // make             if (0 != arg2[0])             {                 while (true == Cube_make(ch))                     dev_log (LOG_DEB0, "cube make success");             }             else                 Cube_make(ch);             break;         default:             return;     }

Kod:
cube.h bul değiştir: Bulunacak satırlar; void Cube_add_item (LPCHARACTER ch, int cube_index, int inven_index); void Cube_delete_item(LPCHARACTER ch, int cube_index); void Cube_request_material_info(LPCHARACTER ch, int request_start_index, int request_count = 1); Bu şekilde değiştirin; void Cube_add_item (LPCHARACTER ch, UINT cube_index, UINT inven_index); void Cube_delete_item(LPCHARACTER ch, UINT cube_index); void Cube_request_material_info(LPCHARACTER ch, UINT request_start_index, UINT request_count = 1);

Kod:
cube.cpp bul değiştir: static bool FN_check_item_count (LPITEM *items, DWORD item_vnum, UINT need_count) {     UINT    count = 0;     // for all cube     for (UINT i=0; i&lt;CUBE_MAX_NUM; ++i)     {         if (NULL==items[i])    continue;         if (item_vnum==items[i]-&gt;GetVnum())         {             count += items[i]-&gt;GetCount();         }     }     return (count&gt;=need_count); } // 큐브내의 재료를 지운다. static void FN_remove_material (LPITEM *items, DWORD item_vnum, UINT need_count) {     UINT        count    = 0;     LPITEM    item    = NULL;     // for all cube     for (UINT i=0; i&lt;CUBE_MAX_NUM; ++i)     {         if (NULL==items[i])    continue;         item = items[i];         if (item_vnum==item-&gt;GetVnum())         {             count += item-&gt;GetCount();             if (count&gt;need_count)             {                 item-&gt;SetCount(count-need_count);                 return;             }             else             {                 item-&gt;SetCount(0);                 items[i] = NULL;             }         }     } } void Cube_clean_item (LPCHARACTER ch) {     LPITEM    *cube_item;     cube_item = ch-&gt;GetCubeItem();     for (UINT i = 0; i&lt;CUBE_MAX_NUM; ++i)     {         if (NULL == cube_item[i])             continue;         cube_item[i] = NULL;     } } void Cube_show_list (LPCHARACTER ch) {     LPITEM    *cube_item;     LPITEM    item;     RETURN_IF_CUBE_IS_NOT_OPENED(ch);     cube_item = ch-&gt;GetCubeItem();     for (UINT i = 0; i&lt;CUBE_MAX_NUM; ++i)     {         item = cube_item[i];         if (NULL==item)    continue;         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s",                 i, item-&gt;GetCell(), item-&gt;GetName());     } } // 인벤토리에 있는 아이템을 큐브에 등록 void Cube_add_item (LPCHARACTER ch, UINT cube_index, UINT inven_index) {     // 아이템이 있는가?     // 큐브내의 빈자리 찾기     // 큐브세팅     // 메시지 전송     LPITEM    item;     LPITEM    *cube_item;     RETURN_IF_CUBE_IS_NOT_OPENED(ch); #ifdef WJ_SPLIT_INVENTORY_SYSTEM     if (inven_index&lt;0 || INVENTORY_AND_EQUIP_SLOT_MAX &lt;= inven_index)         return; #else     if (inven_index&lt;0 || INVENTORY_MAX_NUM &lt;= inven_index)         return; #endif     if (cube_index&lt;0 || CUBE_MAX_NUM&lt;=cube_index)         return;     item = ch-&gt;GetInventoryItem(inven_index);     if (NULL==item)    return;     cube_item = ch-&gt;GetCubeItem();     // 이미 다른위치에 등록되었던 아이템이면 기존 indext삭제     for (UINT i=0; i&lt;CUBE_MAX_NUM; ++i)     {         if (item==cube_item[i])         {             cube_item[i] = NULL;             break;         }     }     cube_item[cube_index] = item;     if (test_server)         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s added",                                     cube_index, inven_index, item-&gt;GetName());     // 현재 상자에 올라온 아이템들로 무엇을 만들 수 있는지 클라이언트에 정보 전달     // 을 하고싶었으나 그냥 필요한 골드가 얼마인지 전달     FN_update_cube_status(ch);     return; } // 큐브에있는 아이템을 제거 void Cube_delete_item(LPCHARACTER ch, UINT cube_index) {     LPITEM    item;     LPITEM    *cube_item;     RETURN_IF_CUBE_IS_NOT_OPENED(ch);     if (cube_index&lt;0 || CUBE_MAX_NUM&lt;=cube_index)    return;     cube_item = ch-&gt;GetCubeItem();     if ( NULL== cube_item[cube_index] )    return;     item = cube_item[cube_index];     cube_item[cube_index] = NULL;     if (test_server)         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "cube[%d]: cube[%d]: %s deleted",                 cube_index, item-&gt;GetCell(), item-&gt;GetName());     // 현재 상자에 올라온 아이템들로 무엇을 만들 수 있는지 클라이언트에 정보 전달     // 을 하고싶었으나 그냥 필요한 골드가 얼마인지 전달     FN_update_cube_status(ch);     return; } bool Cube_InformationInitialize() {     for (UINT i = 0; i &lt; s_cube_proto.size(); ++i)     {         CUBE_DATA* cubeData = s_cube_proto[i];         const std::vector&lt;CUBE_VALUE&gt;&amp; rewards = cubeData-&gt;reward;         // 하드코딩 ㅈㅅ         if (1 != rewards.size())         {             sys_err("[CubeInfo] WARNING! Does not support multiple rewards (count: %d)", rewards.size());             continue;         }         //if (1 != cubeData-&gt;npc_vnum.size())         //{         //    sys_err("[CubeInfo] WARNING! Does not support multiple NPC (count: %d)", cubeData-&gt;npc_vnum.size());         //    continue;         //}         const CUBE_VALUE&amp; reward = rewards.at(0);         const WORD&amp; npcVNUM = cubeData-&gt;npc_vnum.at(0);         bool bComplicate = false;         TCubeMapByNPC&amp; cubeMap = cube_info_map;         TCubeResultList&amp; resultList = cubeMap[npcVNUM];         SCubeMaterialInfo materialInfo;         materialInfo.reward = reward;         materialInfo.gold = cubeData-&gt;gold;         materialInfo.material = cubeData-&gt;item;         for (TCubeResultList::iterator iter = resultList.begin(); resultList.end() != iter; ++iter)         {             SCubeMaterialInfo&amp; existInfo = *iter;             // 이미 중복되는 보상이 등록되어 있다면 아예 다른 조합으로 만드는 것인지,             // 거의 같은 조합인데 특정 부분만 틀린 것인지 구분함.             // 예를들면 특정 부분만 틀린 아이템들은 아래처럼 하나로 묶어서 하나의 결과로 보여주기 위함임:             // 용신지검:             //        무쌍검+5 ~ +9 x 1             //        붉은 칼자루 조각 x1             //        녹색 검장식 조각 x1             if (reward.vnum == existInfo.reward.vnum)             {                 for (TCubeValueVector::iterator existMaterialIter = existInfo.material.begin(); existInfo.material.end() != existMaterialIter; ++existMaterialIter)                 {                     TItemTable* existMaterialProto = ITEM_MANAGER::Instance().GetTable(existMaterialIter-&gt;vnum);                     if (NULL == existMaterialProto)                     {                         sys_err("There is no item(%u)", existMaterialIter-&gt;vnum);                         return false;                     }                     SItemNameAndLevel existItemInfo = SplitItemNameAndLevelFromName(existMaterialProto-&gt;szName);                     if (0 &lt; existItemInfo.level)                     {                         // 지금 추가하는 큐브 결과물의 재료와, 기존에 등록되어있던 큐브 결과물의 재료 중                         // 중복되는 부분이 있는지 검색한다                         for (TCubeValueVector::iterator currentMaterialIter = materialInfo.material.begin(); materialInfo.material.end() != currentMaterialIter; ++currentMaterialIter)                         {                             TItemTable* currentMaterialProto = ITEM_MANAGER::Instance().GetTable(currentMaterialIter-&gt;vnum);                             SItemNameAndLevel currentItemInfo = SplitItemNameAndLevelFromName(currentMaterialProto-&gt;szName);                             if (currentItemInfo.name == existItemInfo.name)                             {                                 bComplicate = true;                                 existInfo.complicateMaterial.push_back(*currentMaterialIter);                                 if (std::find(existInfo.complicateMaterial.begin(), existInfo.complicateMaterial.end(), *existMaterialIter) == existInfo.complicateMaterial.end())                                     existInfo.complicateMaterial.push_back(*existMaterialIter);                                 //currentMaterialIter = materialInfo.material.erase(currentMaterialIter);                                 // TODO: 중복되는 아이템 두 개 이상 검출해야 될 수도 있음                                 break;                             }                         } // for currentMaterialIter                     }    // if level                 }    // for existMaterialInfo             }    // if (reward.vnum == existInfo.reward.vnum)         }    // for resultList         if (false == bComplicate)             resultList.push_back(materialInfo);     }     Cube_MakeCubeInformationText();     s_isInitializedCubeMaterialInformation = true;     return true; } void Cube_request_material_info(LPCHARACTER ch, UINT requestStartIndex, UINT requestCount) {     RETURN_IF_CUBE_IS_NOT_OPENED(ch);     LPCHARACTER    npc = ch-&gt;GetQuestNPC();     if (NULL == npc)         return;     DWORD npcVNUM = npc-&gt;GetRaceNum();     std::string materialInfoText = "";     UINT index = 0;     bool bCatchInfo = false;     const TCubeResultList&amp; resultList = cube_info_map[npcVNUM];     for (TCubeResultList::const_iterator iter = resultList.begin(); resultList.end() != iter; ++iter)     {         const SCubeMaterialInfo&amp; materialInfo = *iter;         if (index++ == requestStartIndex)         {             bCatchInfo = true;         }         if (bCatchInfo)         {             materialInfoText += materialInfo.infoText + "@";         }         if (index &gt;= requestStartIndex + requestCount)             break;     }     if (!bCatchInfo || materialInfoText.size() == 0)     {         sys_err("[CubeInfo] Can't find matched material info (NPC: %d, index: %d, request count: %d)", npcVNUM, requestStartIndex, requestCount);         return;     }     materialInfoText.erase(materialInfoText.size() - 1);     //     // (Server -&gt; Client) /cube m_info start_index count 125,1|126,2|127,2|123,5&amp;555,5&amp;555,4/120000     if (materialInfoText.size() - 20 &gt;= CHAT_MAX_LEN)     {         sys_err("[CubeInfo] Too long material info. (NPC: %d, requestStart: %d, requestCount: %d, length: %d)", npcVNUM, requestStartIndex, requestCount, materialInfoText.size());     }     ch-&gt;ChatPacket(CHAT_TYPE_COMMAND, "cube m_info %d %d %s", requestStartIndex, requestCount, materialInfoText.c_str()); }

Bossların korumalı alanda saldırı yapması ve ateş hayaleti skilinin korumalı alan içinde vurması hata çözümü:
Kod:
#include "../../common/service.h" #ifdef ENABLE_WOLFMAN_CHARACTER int tableBonus[10][10] #else int tableBonus[10][8] #endif ={     {POINT_MOV_SPEED, 10}, // Biologist level 30     {POINT_ATT_SPEED, 5}, // Biologist level 40     {POINT_DEF_GRADE_BONUS, 60}, // Biologist level 50     {POINT_ATT_GRADE_BONUS, 50}, // Biologist level 60     {POINT_MOV_SPEED, 10, POINT_DEF_BONUS, 10}, // Biologist level 70                      {POINT_ATT_SPEED, 10, POINT_ATT_BONUS, 10}, // Biologist level 80 #ifdef ENABLE_WOLFMAN_CHARACTER     {POINT_RESIST_WARRIOR, 10, POINT_RESIST_ASSASSIN, 10, POINT_RESIST_SURA, 10, POINT_RESIST_SHAMAN, 10, POINT_RESIST_WOLFMAN, 10}, // Biologist level 85 #else     {POINT_RESIST_WARRIOR, 10, POINT_RESIST_ASSASSIN, 10, POINT_RESIST_SURA, 10, POINT_RESIST_SHAMAN, 10}, // Biologist level 85 #endif #ifdef ENABLE_WOLFMAN_CHARACTER                        {POINT_ATTBONUS_WARRIOR, 8, POINT_ATTBONUS_ASSASSIN, 8, POINT_ATTBONUS_SURA, 8, POINT_ATTBONUS_SHAMAN, 8, POINT_ATTBONUS_WOLFMAN, 8}, // Biologist level 90 #else     {POINT_ATTBONUS_WARRIOR, 8, POINT_ATTBONUS_ASSASSIN, 8, POINT_ATTBONUS_SURA, 8, POINT_ATTBONUS_SHAMAN, 8}, // Biologist level 90 #endif     {POINT_MAX_HP, 1000, POINT_ATT_GRADE_BONUS, 50, POINT_DEF_GRADE_BONUS, 120}, // Biologist level 92                      {POINT_MAX_HP, 1100, POINT_ATT_GRADE_BONUS, 60, POINT_DEF_GRADE_BONUS, 140} // Biologist level 94            };          /********* * Table translation, here modify messages that are sent in chat client but also in the box when something is wrong or worked. */        const char* pTable_Translate[*] = {     "[Biyolog] Tebrikler nesne basariyla alindi!",     "[Biyolog] Malesef, bu urun curumus!",     "[Biyolog] Tebrikler, gorevi bitirdin!",     "[Biyolog] Beklemek zorundasin [%d Gun] [%d Saat] [%d Dakika] [%d Saniye] dugmeye tekrar basabilmek icin!",     "[Biyolog] Bunu yapabilmek icin envanterinde biyalog nesneleri sahip olmalisin!",     "[Biyolog] Bunu yapabilmek icin seviyeniz yeterli degil %u !",     "[Biyolog] Zaten tum biyolog gorevlerini tamamladiniz, bunu yapamazsiniz!" };                               /********* * Here are the settings for sending in box when you finish a mission. * You would need to be change only these texts for the country you belong, values are taken directly bonuses configuration table tableBonus[i][i]. */ const char* pPopUp[10][4] = {     {         "[30 Seviye] Biyolog Odulleri",         "[1. Bonus] Hareket hizi"     },     {         "[40 Seviye] Biyolog Odulleri",         "[1. Bonus] Atak hizi"     },     {         "[50 Seviye] Biyolog Odulleri",         "[1. Bonus] Savunma"     },     {         "[60 Seviye] Biyolog Odulleri",         "[1. Bonus] Saldiri degeri"     },     {         "[70 Seviye] Biyolog Odulleri",         "[1. Bonus] Hareket hizi",         "[2. Bonus] Hasar azaltma"     },     {         "[80 Seviye] Biyolog Odulleri",         "[1. Bonus] Atak hizi",         "[2. Bonus] Saldiri degeri"     },     {         "[85 Seviye] Biyolog Odulleri",         "[1. Bonus] Diger oyunculara karşı hasar azaltma"     },     {         "[90 Seviye] Biyolog Odulleri",         "[1. Bonus] Diger oyunculara karşı hasar artisi"     },     {         "[92 Seviye] Biyolog Odulleri",         "[1. Bonus] Max HP",                        // Bonus is selected from player         "[2. Bonus] Saldiri degeri",        // Bonus is selected from player         "[3. Bonus] Savunma"            // Bonus is selected from player     },     {         "[94 Seviye] Biyolog Odulleri",         "[1. Bonus] Max HP",                        // Bonus is selected from player         "[2. Bonus] Saldiri degeri",        // Bonus is selected from player         "[3. Bonus] Savunma"            // Bonus is selected from player     }                        }; /********* * You can change the items that you provide when you finish biologist. (default is like official) */ int pTableRewardItem[10] = {     50109, // Biologist level 30     50110, // Biologist level 40     50111, // Biologist level 50     50112, // Biologist level 60     50113, // Biologist level 70     50114, // Biologist level 80     50115, // Biologist level 85     50114, // Biologist level 90     71107, // Biologist level 92     71105 // Biologist level 94 };          /********* * From here you can change the probability chance to succeed when you send an object biologist. * If you do not own the object 71035 in inventory then the chance of probability will be random between 60 and 100, * and if you held your inventory item 71035 then the chance of probability will be increased to 90, which means that the chance will be between 90 and 100, which what a great success. (default is like official) */ int pTablePercentage[3]    = {     71035, // Vnum item     100, // Actual chance, if you not have the item in inventory 71035     100 // The chance probability automatically if you change the item in inventory 71035. (all like official) }; /********* * From here you can change how many objects the maximum result for a mission. (default is like official) */                        int pTableCountMax[10] = {     10, // Biologist level 30     15, // Biologist level 40     15, // Biologist level 50     20, // Biologist level 60     25, // Biologist level 70     30, // Biologist level 80     40, // Biologist level 85     50, // Biologist level 90     10, // Biologist level 92     20 // Biologist level 94 }; /********* * From here you can change the levels missions at what level you want to start each mission. (default is like official) */                    int pTableLevel[10]    = {     30, // Biologist level 30     40, // Biologist level 40     50, // Biologist level 50     60, // Biologist level 60     70, // Biologist level 70     80, // Biologist level 80     85, // Biologist level 85     90, // Biologist level 90     92, // Biologist level 92     94 // Biologist level 94 }; /********* * From here you can change the volume of any items that are needed to achieve mission. (default is like official) */ int pTableVnum[10] = {     30006, // Biologist level 30     30047, // Biologist level 40     30015, // Biologist level 50     30050, // Biologist level 60     30165, // Biologist level 70     30166, // Biologist level 80     30167, // Biologist level 85     30168, // Biologist level 90     30251, // Biologist level 92     30252 // Biologist level 94 }; /********* * From here change the timeout and how long until you can give another object biologist system. (default is like official) */ //#define ENABLE_TEST_SERVER_BIOLOG #define ENABLE_DEFAULT_BIOLOG #ifdef ENABLE_DEFAULT_BIOLOG int pTableTime[10] = {     1*1, // Biologist level 30    //10minute     1*1, // Biologist level 40    //10minute     1*1, // Biologist level 50    //10minute     1*1, // Biologist level 60    //10minute     1*1, // Biologist level 70    //10minute     1*1, // Biologist level 80    //10minute     1*1, // Biologist level 85    //30minute     1*1, // Biologist level 90    //30minute     1*1, // Biologist level 92    //90minute     1*1 // Biologist level 94     //90minute }; #endif #ifdef ENABLE_TEST_SERVER_BIOLOG int pTableTime[10] = {     1*1, // Biologist level 30    //10minute     1*1, // Biologist level 40    //10minute     1*1, // Biologist level 50    //10minute     1*1, // Biologist level 60    //10minute     1*1, // Biologist level 70    //10minute     1*1, // Biologist level 80    //10minute     1*1, // Biologist level 85    //30minute     1*1, // Biologist level 90    //30minute     1*1, // Biologist level 92    //90minute     1*1 // Biologist level 94     //90minute }; #endif /********* * From here change the timeout for time durating all bonus of biolog */ int unlimited = 60*60*60*365;

ESC Tuşundaki efsun botları işlevsizdi onları aktive edip düzenledim.
Not: Kendi serverime göre ayarladığım için 71084 ( Normal Efsun ) olarak ayarladım. Kodu değiştirerek istediğiniz gibi ayarlayabilirsiniz.
Kod:
eigenmods.py dosyası açılır. Arat         chat.AppendChat(1, "Bu bot düşük seviye itemlerine efsun atar.")     Açıklamasını istediğin gibi değiştir. Arat                     if itemVNum == 76023: Birden fazla 76023 kodu vardır bilginiz olsun hepsini değiştiriniz. Hangi iteme efsun atmasını istiyorsan istediğin gibi değiştir. (Örn : 71084 )


Binek üstünde at skili kullanılmıyordu fix:
Kod:
InstantBase.cpp açılır Arat         switch (mount) Alt tarafında kodları göreceksiniz. Bu kodlar bineklerin mob kodlarıdır. At skili kullanmak istediğiniz bineğin MOB kodunu aratıp                 return 3; Kodunun üstüne yapıştırınız. Not : Atıyorum return 2; nin olduğu kod bloğunda ise onu ordan silerek return 3; kod bloğuna eklemeniz gerekiyor.

Güçlü beden perfect olmasına rağmen yere düşüyordu onu fixledim.
Kod:
InstanceBaseEffect.cpp açılır Arat         case AFFECT_YMIR:             if (IsAffect(AFFECT_INVISIBILITY))                 return;             break; Alt tarafına ekle.         case AFFECT_CHEONGEUN:             m_GraphicThingInstance.SetResistFallen(isVisible);             break; Örnek: http://prntscr.com/lzaul0

Levelli pet sistemi HP - Savunma - STR Vermesine rağmen oyun içi hatalı idi SP Olarak gözüyordu fix:
Kod:
uitooltip.py açılır Arat                     self.AppendTextLine("SP: +"+pointop(str(attrSlot[2][1]))+"%", self.SPECIAL_POSITIVE_COLOR) Şu şekilde değiştir.                     self.AppendTextLine("Atak: +"+pointop(str(attrSlot[2][1]))+"%", self.SPECIAL_POSITIVE_COLOR)

Kod:
uiscript klasörü içerisinde petinformationwindow.py dosyasını aç ve şunu arat {"name":"SpTitle", "type":"text", "x":0, "y":0, "text": uiScriptLocale.PET_SYSTEM_ATTACK, "color":GOLD_COLOR, "all_align" : "center"}, Şu şekilde değiştir. {"name":"SpTitle", "type":"text", "x":0, "y":0, "text": "Atak", "color":GOLD_COLOR, "all_align" : "center"},

Give_basic_weapon'de değişiklik yaptıktan sonra ./qc atarken core verme fix:
Kod:
/usr/game/share/locale/turkey/quest dizinine git. quest_functions açılır. En alta ekle pc.itemver pc.efsunver

Oyun içerisinde chat boşluğu yukarda gözükme sorunu fix:
Kod:
İnterfacemodule.py açılır     ## ARAT     def __MakeChatWindow(self):         wndChat = uiChat.ChatWindow()         wndChat.SetSize(wndChat.CHAT_WINDOW_WIDTH, 0)         wndChat.SetPosition(wndMgr.GetScreenWidth()/2 - wndChat.CHAT_WINDOW_WIDTH/2, wndMgr.GetScreenHeight() +10 - wndChat.EDIT_LINE_HEIGHT - 57)         wndChat.SetHeight(200)         wndChat.Refresh()         wndChat.Show()     ## DEĞİŞTİR     def __MakeChatWindow(self):         wndChat = uiChat.ChatWindow()         wndChat.SetSize(wndChat.CHAT_WINDOW_WIDTH, 0)         wndChat.SetPosition(wndMgr.GetScreenWidth()/2 - wndChat.CHAT_WINDOW_WIDTH/2, wndMgr.GetScreenHeight() - wndChat.EDIT_LINE_HEIGHT - 37)         wndChat.SetHeight(200)         wndChat.Refresh()         wndChat.Show()

Sömürü ve direnç pasif becerilerinin sadece lycanda gözükme sorunu fixi:
Kod:
playersettingmodule.py açılır #Arat SKILL_INDEX_DICT.update({ Wolfman karakterinde "SUPPORT" : (122, 123, 121, 124, 125, 129, 0, 0, 130, 131, 141, 142), kısmında ekli olan kod kopyalanır ve üstündeki 4 karakterin support kısmı değiştirilir. Bu şekildeolması gerekiyor https://prnt.sc/m2drf8

Katakomb giriş sorunu için eski questi tamamen kaldırıp vermiş olduğum linkdeki questi okutursanız sorun kalmıyor.
Kod:
[URL]https://www.dosyaupload.com/qXaR[/URL] Not:Ekranda ki yazı bendede gitmiyor maalesef.Ayrıyeten biraz hızlı yapılması için kolaylaştırdım  3.Kattaki Metinler İlk Girişe Sabit. 4.Katta Runik Diğeri direk başlangıçta sabit.

Petleri item proto.txt den ayarladığımız halde yaptığımız özelliklerin 2 katını veriyor fixi:
'ye çok teşekkürler.

Kod:
İndirmiş olduğunuz rarda kullanılan pack dosyaları ilk halleridir. Yani rardaki .py dosyalarında önceden değişiklik yaptıysanız gidecektir tekrar eklemek zorundasınız. https://www.dosyaupload.com/aalv Kanıt [URL]https://prnt.sc/m3e8z8[/URL]

Işınlandıkça minimap altında Ch1 yazısı artma sorunu fixi:
Kod:
Işınlandıkça ch1 yazısı artma  sorununu Game.py yi aç #Arat def RefreshAlignment(self): Bu kod bloğunu ve aşağısındaki kod bloğunu bununla değiştir     def RefreshAlignment(self):         self.interface.RefreshAlignment()     if app.WJ_SHOW_ALL_CHANNEL:         def BINARY_OnChannelPacket(self, channel):             import net             dict = {'name' : 'Metin2'} # Replace with your server name.             net.SetServerInfo((localeInfo.TEXT_CHANNEL % (dict['name'], channel)).strip())             if self.interface:                 self.interface.wndMiniMap.serverInfo.SetText(net.GetServerInfo()) Tab ayarlarını yapmayı unutmayınız. Bir metin2 yazan yere server ismini yaz Yapamayanlar için ekran resmi atıyorum bu şekilde olmak zorunda. https://prnt.sc/m3gd8n

Başka bayrakta pazar açılmama sorunu fixi:
Kod:
if (GetEmpire() == 1)     {         if (GetMapIndex() == 21 || GetMapIndex() == 41)         {             ChatPacket(CHAT_TYPE_INFO, LC_TEXT("OFFLINE_SHOP_NOT_OPEN_SHOP_HERE1"));             return;         }     }     else if (GetEmpire() == 2)     {         if (GetMapIndex() == 1 || GetMapIndex() == 41)         {             ChatPacket(CHAT_TYPE_INFO, LC_TEXT("OFFLINE_SHOP_NOT_OPEN_SHOP_HERE1"));             return;         }     }           else if (GetEmpire() == 3)     {         if (GetMapIndex() == 1 || GetMapIndex() == 21)         {             ChatPacket(CHAT_TYPE_INFO, LC_TEXT("OFFLINE_SHOP_NOT_OPEN_SHOP_HERE1"));             return;         }     }

Yapmış olduğum ve bulduğum sorunlar konuda belirttiğim gibidir.
linkinin olduğu konudaki mesajlar çok karışmış olduğu için böyle bir konu açma gereğinde kaldım.
Ayrıyeten bu fixlerin üstüne birde fies linkindeki konuya eklemiş olduğu sorunlar mevcut onları eklemedim.
Onların fixlerini konu linkinden bulabilirsiniz.
Bu sorunları bulmamda ve yardımcı olan birçok kişi var hepsinene tek tek çok teşekkür ediyorum.

BEST Production V4 Final Versiyon: Hata Listesi ve Fixler

Giriş:
Metin2 özel sunucu geliştiricileri arasında uzun süredir kullanılan ve tanınan BEST Production V4 serisinin final versiyonu, bazı önemli hatalarla birlikte piyasaya sürüldü. Bu versiyon, özellikle PvP sistemlerinin gelişmiş olduğu sunucular için idealdir; fakat zaman zaman karşılaşılan hatalar, hem geliştiriciler hem de kullanıcılar açısından ciddi zorluklar yaratmaktadır. Bu makalede, BEST Production V4 Final versiyonunda tespit edilen hataları, bu hataların neden kaynaklandığını ve şu ana kadar yapılmış olan düzeltmeleri detaylı şekilde ele alacağız.

Bilinen Hatalar

1. Auth Server Bağlantı Problemleri:
Sunucuya bağlanmaya çalışan oyuncular bazen 'Bağlantı hatası' veya 'Yetkilendirme reddedildi' gibi hatalarla karşılaşabiliyor. Bu durum genellikle auth server ile game server arasındaki iletişimde yaşanan gecikmelerden kaynaklanıyor. Özellikle yoğun saatlerde bağlantı kopmaları yaşanabiliyor.

2. Item Sistemi İle İlgili Hatalar:
Bazı özel item'lar, doğru şekilde işlenmiyor veya drop edilmiyor. Özellikle C++ tabanlı item sistemlerinde, item ID'leri eksik ya da yanlış tanımlandığında, item düşmemekte veya kullanılmamaktadır. Ayrıca bazı item'ların bonus özellikleri aktif olmuyor.

3. PvP Sistemlerinde Beklenmedik Davranışlar:
PvP sistemlerinde bazı durumlarda skorlama hatası veya oyun kurallarının doğru şekilde uygulanmaması söz konusu. Bu durum genellikle game server üzerindeki scriptlerde meydana gelen mantık hatalarından kaynaklanıyor. Özellikle Python tabanlı sistemlerde UI script'lerinde hatalar bulunabiliyor.

Yapılan Fixler

1. Auth-Game Sunucu Bağlantısı Güçlendirildi:
Auth ve game server arasındaki bağlantı sabit IP kontrolü ve timeout ayarları ile optimize edildi. Bu sayede bağlantı kopması oranları ciddi şekilde azaltıldı. Ayrıca, auth server'a eklenen yeni log sistemi ile hata takibi kolaylaştırıldı.

2. Item ID ve Bonus Sistemleri Güncellendi:
Tüm item ID'leri tekrar kontrol edildi ve eksik olanlar tamamlandı. Aynı zamanda bonus sistemleri için py root klasöründeki script'ler yeniden düzenlendi. Artık item'lar doğru şekilde düşüyor ve bonuslar aktif oluyor.

3. PvP Skorlama ve Olay Yönetimi Revize Edildi:
PvP sistemlerindeki mantık hataları tespit edildi ve C++ tabanlı olay yönetimi dosyalarında değişiklikler yapıldı. Artık skorlama sistemi doğru çalışıyor ve kurallar daha tutarlı bir şekilde uygulanıyor.

Gelecekte Yapılacaklar

BEST Production V4 Final sürümü için planlanan diğer önemli geliştirmeler arasında, UI script sistemlerinin daha stabil hale getirilmesi, pack sisteminin optimize edilmesi ve DB ile ilgili performans iyileştirmeleri yer alıyor. Ayrıca, martysama tarafından geliştirilen yeni sistemlerle entegrasyon çalışmaları da devam etmektedir.

Sonuç

BEST Production V4 Final versiyonu, Metin2 özel sunucuları için güçlü bir temel sağlasa da, bazı hatalar geliştirici ekiplerin dikkatini gerektiriyor. Bu yazıda belirttiğimiz hataların çoğu şu anda için başarıyla düzeltilmiş durumda. Ancak, sunucu sahipleri ve geliştiriciler, bu tür sistemlerde sürekli olarak test ve gözlem yapmaya devam etmelidir. Daha fazla bilgi ve destek için Metin2Lobby sitemizi takip edin.


BEST Production V4 Final Version: Bugs, Errors, and Applied Fixes

Introduction:
Among Metin2 private server developers, the widely known BEST Production V4 series has been used for a long time. However, its final version was released with some significant bugs. This version is ideal for servers with advanced PvP systems; however, encountered errors create serious challenges for both developers and players. In this article, we will detail the bugs detected in the BEST Production V4 Final version, their causes, and fixes applied so far.

Known Bugs

1. Auth Server Connection Issues:
Players attempting to connect to the server sometimes encounter errors such as 'Connection Error' or 'Authorization Denied'. This issue typically stems from delays in communication between the auth and game servers. Especially during peak hours, disconnections may occur frequently.

2. Item System Errors:
Certain special items are not processed correctly or dropped properly. In C++-based item systems, when item IDs are missing or incorrectly defined, items do not drop or function properly. Additionally, bonuses of some items fail to activate.

3. Unexpected Behavior in PvP Systems:
In PvP systems, scoring errors or incorrect rule enforcement occasionally occur. These issues usually stem from logic errors in scripts on the game server. Particularly in Python-based systems, UI scripts may contain errors.

Applied Fixes

1. Auth-Game Server Connection Strengthened:
The connection between auth and game servers has been optimized through fixed IP checks and timeout settings, significantly reducing disconnection rates. Moreover, a new logging system added to the auth server simplifies error tracking.

2. Item ID and Bonus Systems Updated:
All item IDs were rechecked and missing ones completed. Furthermore, scripts in the py root folder related to bonus systems have been revised. Now items drop correctly and bonuses activate properly.

3. PvP Scoring and Event Management Revised:
Logic errors in PvP systems were identified and modifications made to C++-based event management files. Scoring now functions correctly, and rules are applied more consistently.

Future Improvements

Planned improvements for the BEST Production V4 Final version include stabilizing UI script systems, optimizing the pack system, and enhancing DB performance. Additionally, integration efforts with new systems developed by martysama continue.

Conclusion

While the BEST Production V4 Final provides a strong foundation for Metin2 private servers, certain bugs require attention from developer teams. Most of the bugs mentioned in this article have been successfully fixed. However, server owners and developers should continue testing and monitoring these systems. For further information and support, follow our website Metin2Lobby.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt