• Serverınızın epinlerini tamamen Turkmmo güvencesiyle satın. Kredi kartı, mobil ödeme, havale/eft ve uygun komisyon oranıyla. Hemen mağaza başvurunuzu yapın. Oyunalisveris.com





Sitemize reklam vermek için [email protected] adresine mail atabilirsiniz
For Advertising Contact [email protected]


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

5.00 yıldız(lar) 3 Oy

traglon11

Level 4
Telefon Numarası Onaylanmış Üye
TM Üye
Katılım
8 Kas 2009
Konular
31
Mesajlar
417
Reaksiyon Skoru
85
Başarım Puanı
112
Yaş
24
MmoLira
265
DevLira
33
En İyi Cevap Puanı
1
Ticaret - 0%
0   0   0
Hatalar ve fixler linkde ki filese aittir.
Files linki.

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. 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.
  2. Reborn sisteminin verdiği özellikler öldükten sonra işlevini kaybediyor.
  3. Oto av sistemi bazı fonksiyonları çalışmıyor.(Bazen hiç çalışmıyor.)
  4. Filesin enteresan bir pack düzeni var yeni mob yeni map vs. eklenmiyor.
  5. 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.
  6. 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->CanDoCube())
        return;

    dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->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->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube close");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube add <inveltory_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube delete <cube_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube list");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube cancel");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube make [all]");
        return;
    }

    const std::string& 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] && 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<CUBE_MAX_NUM; ++i)
    {
        if (NULL==items[i])    continue;

        if (item_vnum==items[i]->GetVnum())
        {
            count += items[i]->GetCount();
        }
    }

    return (count>=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<CUBE_MAX_NUM; ++i)
    {
        if (NULL==items[i])    continue;

        item = items[i];
        if (item_vnum==item->GetVnum())
        {
            count += item->GetCount();

            if (count>need_count)
            {
                item->SetCount(count-need_count);
                return;
            }
            else
            {
                item->SetCount(0);
                items[i] = NULL;
            }
        }
    }
}

void Cube_clean_item (LPCHARACTER ch)
{
    LPITEM    *cube_item;

    cube_item = ch->GetCubeItem();

    for (UINT i = 0; i<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->GetCubeItem();

    for (UINT i = 0; i<CUBE_MAX_NUM; ++i)
    {
        item = cube_item[i];
        if (NULL==item)    continue;

        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s",
                i, item->GetCell(), item->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<0 || INVENTORY_AND_EQUIP_SLOT_MAX <= inven_index)
        return;
#else
    if (inven_index<0 || INVENTORY_MAX_NUM <= inven_index)
        return;
#endif

    if (cube_index<0 || CUBE_MAX_NUM<=cube_index)
        return;

    item = ch->GetInventoryItem(inven_index);

    if (NULL==item)    return;

    cube_item = ch->GetCubeItem();

    // 이미 다른위치에 등록되었던 아이템이면 기존 indext삭제
    for (UINT i=0; i<CUBE_MAX_NUM; ++i)
    {
        if (item==cube_item[i])
        {
            cube_item[i] = NULL;
            break;
        }
    }

    cube_item[cube_index] = item;

    if (test_server)
        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s added",
                                    cube_index, inven_index, item->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<0 || CUBE_MAX_NUM<=cube_index)    return;

    cube_item = ch->GetCubeItem();

    if ( NULL== cube_item[cube_index] )    return;

    item = cube_item[cube_index];
    cube_item[cube_index] = NULL;

    if (test_server)
        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: cube[%d]: %s deleted",
                cube_index, item->GetCell(), item->GetName());

    // 현재 상자에 올라온 아이템들로 무엇을 만들 수 있는지 클라이언트에 정보 전달
    // 을 하고싶었으나 그냥 필요한 골드가 얼마인지 전달
    FN_update_cube_status(ch);

    return;
}

bool Cube_InformationInitialize()
{
    for (UINT i = 0; i < s_cube_proto.size(); ++i)
    {
        CUBE_DATA* cubeData = s_cube_proto[i];

        const std::vector<CUBE_VALUE>& rewards = cubeData->reward;

        // 하드코딩 ㅈㅅ
        if (1 != rewards.size())
        {
            sys_err("[CubeInfo] WARNING! Does not support multiple rewards (count: %d)", rewards.size());
            continue;
        }
        //if (1 != cubeData->npc_vnum.size())
        //{
        //    sys_err("[CubeInfo] WARNING! Does not support multiple NPC (count: %d)", cubeData->npc_vnum.size());
        //    continue;
        //}

        const CUBE_VALUE& reward = rewards.at(0);
        const WORD& npcVNUM = cubeData->npc_vnum.at(0);
        bool bComplicate = false;

        TCubeMapByNPC& cubeMap = cube_info_map;
        TCubeResultList& resultList = cubeMap[npcVNUM];
        SCubeMaterialInfo materialInfo;

        materialInfo.reward = reward;
        materialInfo.gold = cubeData->gold;
        materialInfo.material = cubeData->item;

        for (TCubeResultList::iterator iter = resultList.begin(); resultList.end() != iter; ++iter)
        {
            SCubeMaterialInfo& 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->vnum);
                    if (NULL == existMaterialProto)
                    {
                        sys_err("There is no item(%u)", existMaterialIter->vnum);
                        return false;
                    }
                    SItemNameAndLevel existItemInfo = SplitItemNameAndLevelFromName(existMaterialProto->szName);

                    if (0 < existItemInfo.level)
                    {
                        // 지금 추가하는 큐브 결과물의 재료와, 기존에 등록되어있던 큐브 결과물의 재료 중
                        // 중복되는 부분이 있는지 검색한다
                        for (TCubeValueVector::iterator currentMaterialIter = materialInfo.material.begin(); materialInfo.material.end() != currentMaterialIter; ++currentMaterialIter)
                        {
                            TItemTable* currentMaterialProto = ITEM_MANAGER::Instance().GetTable(currentMaterialIter->vnum);
                            SItemNameAndLevel currentItemInfo = SplitItemNameAndLevelFromName(currentMaterialProto->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->GetQuestNPC();
    if (NULL == npc)
        return;

    DWORD npcVNUM = npc->GetRaceNum();
    std::string materialInfoText = "";

    UINT index = 0;
    bool bCatchInfo = false;

    const TCubeResultList& resultList = cube_info_map[npcVNUM];
    for (TCubeResultList::const_iterator iter = resultList.begin(); resultList.end() != iter; ++iter)
    {
        const SCubeMaterialInfo& materialInfo = *iter;

        if (index++ == requestStartIndex)
        {
            bCatchInfo = true;
        }

        if (bCatchInfo)
        {
            materialInfoText += materialInfo.infoText + "@";
        }

        if (index >= 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 -> Client) /cube m_info start_index count 125,1|126,2|127,2|123,5&555,5&555,4/120000
    if (materialInfoText.size() - 20 >= CHAT_MAX_LEN)
    {
        sys_err("[CubeInfo] Too long material info. (NPC: %d, requestStart: %d, requestCount: %d, length: %d)", npcVNUM, requestStartIndex, requestCount, materialInfoText.size());
    }

    ch->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ü:

Biyolog görevinde ki süre ve verdiği saçma özellikleri değiştirme:
Not:Özellikleri official şekilde fakat %100 kabul etme oranı var ve 1 sn de 1kez verilecek şekilde ayarlı
Eğer değiştirmek isterseniz sürelerini ve oranlarını ayarlayacağınız yerler
Oran değiştirme : 100, // Actual chance, if you not have the item in inventory 71035 Bu kısmı aratıp ayarlabilirsiniz.
Süre değiştirme : 1*1, // Biologist level 30 //10minute Aratıp 1*1 yazan yerlerini değiştirerek ayarlayabilirsiniz.

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:
@Statu 'ye çok teşekkürler.

Giymeli pet sistemi ise hem giydiği için hemde peti çağırdığı için bonus veriyor. Petsystem.cpp den bonusu kapatırsan sadece peti giydiği için bonus verir.

Okey eventi ekli olmasına rağmen okey oyna butonu olmadığı için başlatılmıyordu fixi:
@Value3 Teşekkür ederim sorunu çözdüğü için.

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.
@BEST Production files 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 @BEST Production 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.
 
Son düzenleme:

sananebak

Wrong Side of Heaven
TM Üye
Katılım
16 Eki 2009
Konular
56
Mesajlar
1,397
Reaksiyon Skoru
233
Başarım Puanı
154
Yaş
29
MmoLira
273
DevLira
0
En İyi Cevap Puanı
0
Ticaret - 0%
0   0   0
Hatalar ve fixler linkde ki filese aittir.
Files linki.

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. 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.
  2. Okey eventi ekli olmasına rağmen okey oyna butonu olmadığı için başlatılmıyor.Kaldırıp 0 dan kurup denedim olmadı Akira event dosyasını sıfırdan kurup oyuniçi event simgesini sola kaydırıp denedim olmadı hiçbir türlü beceremedim.
  3. Petleri item proto.txt den ayarladığımız halde yaptığımız özelliklerin 2 katını veriyor.
  4. Reborn sisteminin verdiği özellikler öldükten sonra işlevini kaybediyor.
  5. Oto av sistemi bazı fonksiyonları çalışmıyor.(Bazen hiç çalışmıyor.)
  6. Yeni pasif beceriler (Sömürü ve direnç) Lycan dışı karakterlerde ekli değil.
  7. Filesin enteresan bir pack düzeni var yeni mob yeni map vs. eklenmiyor.
  8. 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.
  9. Gaya ile ilgili sorun var süs taşı ve +3 taş verdiğinizde gaya puanı vermiyor.
Bu konuya istinaden yaptığım/çözdüğüm sorunlarıda ekliyorum.
  1. K Envanteri cube sorunu
  2. Ateş hayaletinin korumalı alanda işlemesi ve mobların korumalı alanda saldırması
  3. Title sistemi ile alakalı bazı sorunlar vardı onlar.
  4. Biyolog görevlerinin verdiği oranlar yanlış idi onları düzeltip sürelerini kaldırdım(C++)
  5. ESC Tuşundaki efsun botları işlevsizdi onları aktive edip düzenledim.
  6. Binek üstünde at skili kullanılmıyordu onu fixledim.
  7. Güçlü beden perfect olmasına rağmen yere düşüyordu onu fixledim.
  8. Levelli pet sistemi HP - Savunma - STR Vermesine rağmen oyun içi hatalı idi SP Olarak gözüyordu onu düzelttim.
  9. 53001 kodlu pet ve (birtane daha vardı onu hatırlamıyorum) oyundan kaldırın aksi takdirde minimapde turuncu bir iz bırakıp pc yi kasıyor.
  10. Oyuna başlarken efsunlu itemleri giyerek başlıyordu ve Give_basic_weapon'de item_verr gibi bir komut kullanılmıştı ama quest_functions larda ekli değildi onu düzelttim.
K Envanteri cube sorunu:
Kod:
cmd_general.cpp Bul Değiştir:
ACMD(do_cube)[/CENTER]
{
    if (!ch->CanDoCube())
        return;

    dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->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->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube close");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube add <inveltory_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube delete <cube_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube list");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube cancel");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube make [all]");
        return;
    }

    const std::string& 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] && 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<CUBE_MAX_NUM; ++i)
    {
        if (NULL==items[i])    continue;

        if (item_vnum==items[i]->GetVnum())
        {
            count += items[i]->GetCount();
        }
    }

    return (count>=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<CUBE_MAX_NUM; ++i)
    {
        if (NULL==items[i])    continue;

        item = items[i];
        if (item_vnum==item->GetVnum())
        {
            count += item->GetCount();

            if (count>need_count)
            {
                item->SetCount(count-need_count);
                return;
            }
            else
            {
                item->SetCount(0);
                items[i] = NULL;
            }
        }
    }
}

void Cube_clean_item (LPCHARACTER ch)
{
    LPITEM    *cube_item;

    cube_item = ch->GetCubeItem();

    for (UINT i = 0; i<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->GetCubeItem();

    for (UINT i = 0; i<CUBE_MAX_NUM; ++i)
    {
        item = cube_item[i];
        if (NULL==item)    continue;

        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s",
                i, item->GetCell(), item->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<0 || INVENTORY_AND_EQUIP_SLOT_MAX <= inven_index)
        return;
#else
    if (inven_index<0 || INVENTORY_MAX_NUM <= inven_index)
        return;
#endif

    if (cube_index<0 || CUBE_MAX_NUM<=cube_index)
        return;

    item = ch->GetInventoryItem(inven_index);

    if (NULL==item)    return;

    cube_item = ch->GetCubeItem();

    // 이미 다른위치에 등록되었던 아이템이면 기존 indext삭제
    for (UINT i=0; i<CUBE_MAX_NUM; ++i)
    {
        if (item==cube_item[i])
        {
            cube_item[i] = NULL;
            break;
        }
    }

    cube_item[cube_index] = item;

    if (test_server)
        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s added",
                                    cube_index, inven_index, item->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<0 || CUBE_MAX_NUM<=cube_index)    return;

    cube_item = ch->GetCubeItem();

    if ( NULL== cube_item[cube_index] )    return;

    item = cube_item[cube_index];
    cube_item[cube_index] = NULL;

    if (test_server)
        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: cube[%d]: %s deleted",
                cube_index, item->GetCell(), item->GetName());

    // 현재 상자에 올라온 아이템들로 무엇을 만들 수 있는지 클라이언트에 정보 전달
    // 을 하고싶었으나 그냥 필요한 골드가 얼마인지 전달
    FN_update_cube_status(ch);

    return;
}

bool Cube_InformationInitialize()
{
    for (UINT i = 0; i < s_cube_proto.size(); ++i)
    {
        CUBE_DATA* cubeData = s_cube_proto[i];

        const std::vector<CUBE_VALUE>& rewards = cubeData->reward;

        // 하드코딩 ㅈㅅ
        if (1 != rewards.size())
        {
            sys_err("[CubeInfo] WARNING! Does not support multiple rewards (count: %d)", rewards.size());          
            continue;
        }
        //if (1 != cubeData->npc_vnum.size())
        //{
        //    sys_err("[CubeInfo] WARNING! Does not support multiple NPC (count: %d)", cubeData->npc_vnum.size());          
        //    continue;
        //}

        const CUBE_VALUE& reward = rewards.at(0);
        const WORD& npcVNUM = cubeData->npc_vnum.at(0);
        bool bComplicate = false;
       
        TCubeMapByNPC& cubeMap = cube_info_map;
        TCubeResultList& resultList = cubeMap[npcVNUM];
        SCubeMaterialInfo materialInfo;

        materialInfo.reward = reward;
        materialInfo.gold = cubeData->gold;
        materialInfo.material = cubeData->item;

        for (TCubeResultList::iterator iter = resultList.begin(); resultList.end() != iter; ++iter)
        {
            SCubeMaterialInfo& 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->vnum);
                    if (NULL == existMaterialProto)
                    {
                        sys_err("There is no item(%u)", existMaterialIter->vnum);
                        return false;
                    }
                    SItemNameAndLevel existItemInfo = SplitItemNameAndLevelFromName(existMaterialProto->szName);

                    if (0 < existItemInfo.level)
                    {
                        // 지금 추가하는 큐브 결과물의 재료와, 기존에 등록되어있던 큐브 결과물의 재료 중
                        // 중복되는 부분이 있는지 검색한다
                        for (TCubeValueVector::iterator currentMaterialIter = materialInfo.material.begin(); materialInfo.material.end() != currentMaterialIter; ++currentMaterialIter)
                        {
                            TItemTable* currentMaterialProto = ITEM_MANAGER::Instance().GetTable(currentMaterialIter->vnum);
                            SItemNameAndLevel currentItemInfo = SplitItemNameAndLevelFromName(currentMaterialProto->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->GetQuestNPC();
    if (NULL == npc)
        return;

    DWORD npcVNUM = npc->GetRaceNum();
    std::string materialInfoText = "";

    UINT index = 0;
    bool bCatchInfo = false;

    const TCubeResultList& resultList = cube_info_map[npcVNUM];
    for (TCubeResultList::const_iterator iter = resultList.begin(); resultList.end() != iter; ++iter)
    {
        const SCubeMaterialInfo& materialInfo = *iter;

        if (index++ == requestStartIndex)
        {
            bCatchInfo = true;
        }
       
        if (bCatchInfo)
        {
            materialInfoText += materialInfo.infoText + "@";
        }

        if (index >= 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 -> Client) /cube m_info start_index count 125,1|126,2|127,2|123,5&555,5&555,4/120000
    if (materialInfoText.size() - 20 >= CHAT_MAX_LEN)
    {
        sys_err("[CubeInfo] Too long material info. (NPC: %d, requestStart: %d, requestCount: %d, length: %d)", npcVNUM, requestStartIndex, requestCount, materialInfoText.size());
    }

    ch->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ü:

Biyolog görevinde ki süre ve verdiği saçma özellikleri değiştirme:
Not:Özellikleri official şekilde fakat %100 kabul etme oranı var ve 1 sn de 1kez verilecek şekilde ayarlı
Eğer değiştirmek isterseniz sürelerini ve oranlarını ayarlayacağınız yerler
Oran değiştirme : 100, // Actual chance, if you not have the item in inventory 71035 Bu kısmı aratıp ayarlabilirsiniz.
Süre değiştirme : 1*1, // Biologist level 30 //10minute Aratıp 1*1 yazan yerlerini değiştirerek ayarlayabilirsiniz.

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)

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

Yapmış olduğum ve bulduğum sorunlar konuda belirttiğim gibidir.
@BEST Production files 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 @BEST Production 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.
Paylaşım için teşekkürler.
 

siytun

Level 2
Üye
Katılım
31 Tem 2010
Konular
2
Mesajlar
90
Reaksiyon Skoru
9
Başarım Puanı
74
MmoLira
167
DevLira
0
En İyi Cevap Puanı
0
Ticaret - 0%
0   0   0
Hatalar ve fixler linkde ki filese aittir.
Files linki.

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. 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.
  2. Okey eventi ekli olmasına rağmen okey oyna butonu olmadığı için başlatılmıyor.Kaldırıp 0 dan kurup denedim olmadı Akira event dosyasını sıfırdan kurup oyuniçi event simgesini sola kaydırıp denedim olmadı hiçbir türlü beceremedim.
  3. Petleri item proto.txt den ayarladığımız halde yaptığımız özelliklerin 2 katını veriyor.
  4. Reborn sisteminin verdiği özellikler öldükten sonra işlevini kaybediyor.
  5. Oto av sistemi bazı fonksiyonları çalışmıyor.(Bazen hiç çalışmıyor.)
  6. Yeni pasif beceriler (Sömürü ve direnç) Lycan dışı karakterlerde ekli değil.
  7. Filesin enteresan bir pack düzeni var yeni mob yeni map vs. eklenmiyor.
  8. 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.
  9. Gaya ile ilgili sorun var süs taşı ve +3 taş verdiğinizde gaya puanı vermiyor.
Bu konuya istinaden yaptığım/çözdüğüm sorunlarıda ekliyorum.
  1. K Envanteri cube sorunu
  2. Ateş hayaletinin korumalı alanda işlemesi ve mobların korumalı alanda saldırması
  3. Title sistemi ile alakalı bazı sorunlar vardı onlar.
  4. Biyolog görevlerinin verdiği oranlar yanlış idi onları düzeltip sürelerini kaldırdım(C++)
  5. ESC Tuşundaki efsun botları işlevsizdi onları aktive edip düzenledim.
  6. Binek üstünde at skili kullanılmıyordu onu fixledim.
  7. Güçlü beden perfect olmasına rağmen yere düşüyordu onu fixledim.
  8. Levelli pet sistemi HP - Savunma - STR Vermesine rağmen oyun içi hatalı idi SP Olarak gözüyordu onu düzelttim.
  9. 53001 kodlu pet ve (birtane daha vardı onu hatırlamıyorum) oyundan kaldırın aksi takdirde minimapde turuncu bir iz bırakıp pc yi kasıyor.
  10. Oyuna başlarken efsunlu itemleri giyerek başlıyordu ve Give_basic_weapon'de item_verr gibi bir komut kullanılmıştı ama quest_functions larda ekli değildi onu düzelttim.
K Envanteri cube sorunu:
Kod:
cmd_general.cpp Bul Değiştir:
ACMD(do_cube)[/CENTER]
{
    if (!ch->CanDoCube())
        return;

    dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->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->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube close");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube add <inveltory_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube delete <cube_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube list");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube cancel");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube make [all]");
        return;
    }

    const std::string& 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] && 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<CUBE_MAX_NUM; ++i)
    {
        if (NULL==items[i])    continue;

        if (item_vnum==items[i]->GetVnum())
        {
            count += items[i]->GetCount();
        }
    }

    return (count>=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<CUBE_MAX_NUM; ++i)
    {
        if (NULL==items[i])    continue;

        item = items[i];
        if (item_vnum==item->GetVnum())
        {
            count += item->GetCount();

            if (count>need_count)
            {
                item->SetCount(count-need_count);
                return;
            }
            else
            {
                item->SetCount(0);
                items[i] = NULL;
            }
        }
    }
}

void Cube_clean_item (LPCHARACTER ch)
{
    LPITEM    *cube_item;

    cube_item = ch->GetCubeItem();

    for (UINT i = 0; i<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->GetCubeItem();

    for (UINT i = 0; i<CUBE_MAX_NUM; ++i)
    {
        item = cube_item[i];
        if (NULL==item)    continue;

        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s",
                i, item->GetCell(), item->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<0 || INVENTORY_AND_EQUIP_SLOT_MAX <= inven_index)
        return;
#else
    if (inven_index<0 || INVENTORY_MAX_NUM <= inven_index)
        return;
#endif

    if (cube_index<0 || CUBE_MAX_NUM<=cube_index)
        return;

    item = ch->GetInventoryItem(inven_index);

    if (NULL==item)    return;

    cube_item = ch->GetCubeItem();

    // 이미 다른위치에 등록되었던 아이템이면 기존 indext삭제
    for (UINT i=0; i<CUBE_MAX_NUM; ++i)
    {
        if (item==cube_item[i])
        {
            cube_item[i] = NULL;
            break;
        }
    }

    cube_item[cube_index] = item;

    if (test_server)
        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: inventory[%d]: %s added",
                                    cube_index, inven_index, item->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<0 || CUBE_MAX_NUM<=cube_index)    return;

    cube_item = ch->GetCubeItem();

    if ( NULL== cube_item[cube_index] )    return;

    item = cube_item[cube_index];
    cube_item[cube_index] = NULL;

    if (test_server)
        ch->ChatPacket(CHAT_TYPE_INFO, "cube[%d]: cube[%d]: %s deleted",
                cube_index, item->GetCell(), item->GetName());

    // 현재 상자에 올라온 아이템들로 무엇을 만들 수 있는지 클라이언트에 정보 전달
    // 을 하고싶었으나 그냥 필요한 골드가 얼마인지 전달
    FN_update_cube_status(ch);

    return;
}

bool Cube_InformationInitialize()
{
    for (UINT i = 0; i < s_cube_proto.size(); ++i)
    {
        CUBE_DATA* cubeData = s_cube_proto[i];

        const std::vector<CUBE_VALUE>& rewards = cubeData->reward;

        // 하드코딩 ㅈㅅ
        if (1 != rewards.size())
        {
            sys_err("[CubeInfo] WARNING! Does not support multiple rewards (count: %d)", rewards.size());          
            continue;
        }
        //if (1 != cubeData->npc_vnum.size())
        //{
        //    sys_err("[CubeInfo] WARNING! Does not support multiple NPC (count: %d)", cubeData->npc_vnum.size());          
        //    continue;
        //}

        const CUBE_VALUE& reward = rewards.at(0);
        const WORD& npcVNUM = cubeData->npc_vnum.at(0);
        bool bComplicate = false;
       
        TCubeMapByNPC& cubeMap = cube_info_map;
        TCubeResultList& resultList = cubeMap[npcVNUM];
        SCubeMaterialInfo materialInfo;

        materialInfo.reward = reward;
        materialInfo.gold = cubeData->gold;
        materialInfo.material = cubeData->item;

        for (TCubeResultList::iterator iter = resultList.begin(); resultList.end() != iter; ++iter)
        {
            SCubeMaterialInfo& 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->vnum);
                    if (NULL == existMaterialProto)
                    {
                        sys_err("There is no item(%u)", existMaterialIter->vnum);
                        return false;
                    }
                    SItemNameAndLevel existItemInfo = SplitItemNameAndLevelFromName(existMaterialProto->szName);

                    if (0 < existItemInfo.level)
                    {
                        // 지금 추가하는 큐브 결과물의 재료와, 기존에 등록되어있던 큐브 결과물의 재료 중
                        // 중복되는 부분이 있는지 검색한다
                        for (TCubeValueVector::iterator currentMaterialIter = materialInfo.material.begin(); materialInfo.material.end() != currentMaterialIter; ++currentMaterialIter)
                        {
                            TItemTable* currentMaterialProto = ITEM_MANAGER::Instance().GetTable(currentMaterialIter->vnum);
                            SItemNameAndLevel currentItemInfo = SplitItemNameAndLevelFromName(currentMaterialProto->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->GetQuestNPC();
    if (NULL == npc)
        return;

    DWORD npcVNUM = npc->GetRaceNum();
    std::string materialInfoText = "";

    UINT index = 0;
    bool bCatchInfo = false;

    const TCubeResultList& resultList = cube_info_map[npcVNUM];
    for (TCubeResultList::const_iterator iter = resultList.begin(); resultList.end() != iter; ++iter)
    {
        const SCubeMaterialInfo& materialInfo = *iter;

        if (index++ == requestStartIndex)
        {
            bCatchInfo = true;
        }
       
        if (bCatchInfo)
        {
            materialInfoText += materialInfo.infoText + "@";
        }

        if (index >= 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 -> Client) /cube m_info start_index count 125,1|126,2|127,2|123,5&555,5&555,4/120000
    if (materialInfoText.size() - 20 >= CHAT_MAX_LEN)
    {
        sys_err("[CubeInfo] Too long material info. (NPC: %d, requestStart: %d, requestCount: %d, length: %d)", npcVNUM, requestStartIndex, requestCount, materialInfoText.size());
    }

    ch->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ü:

Biyolog görevinde ki süre ve verdiği saçma özellikleri değiştirme:
Not:Özellikleri official şekilde fakat %100 kabul etme oranı var ve 1 sn de 1kez verilecek şekilde ayarlı
Eğer değiştirmek isterseniz sürelerini ve oranlarını ayarlayacağınız yerler
Oran değiştirme : 100, // Actual chance, if you not have the item in inventory 71035 Bu kısmı aratıp ayarlabilirsiniz.
Süre değiştirme : 1*1, // Biologist level 30 //10minute Aratıp 1*1 yazan yerlerini değiştirerek ayarlayabilirsiniz.

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)

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

Yapmış olduğum ve bulduğum sorunlar konuda belirttiğim gibidir.
@BEST Production files 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 @BEST Production 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.
Çok İyi düşünmüşsün eline emegine saglık konda herşey iç içe girmişti paylaşım için teşekkür ederim
 
Üst