Çözüldü Efsunlu İtem ile Başlama

  • Konuyu açan Konuyu açan cosion
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 5
  • Gösterim Gösterim 989
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

cosion

Üye
Üye
Mesaj
128
Çözümler
12
Beğeni
23
Puan
469
Ticaret Puanı
0
Merhaba arkadaşlar, bir sorum olacaktı. Ben karakterimin itemlerini efsunlu ve üstüne giyili bir şekilde başlamasını istiyorum. input_db.cpp dosyasında gerekli düzenlemeyi yaptım, (forumdaki geliştirici serisindeki altyapı filesi kullanıyorum bu arada), efsun kodlarınıda girdim, build ederken hiç bir hata almıyorum, oyundada zaten efsunlar görünüyor ama envantere geliyorlar giyilmemiş halde. input_db.cpp dosyasındaki gerekli fonksiyonda bu şekilde düzenledim. Hatayı nerde yaptım acaba ? Teşekkürler şimdiden.
C++:
Genişlet Daralt Kopyala
void CInputDB::PlayerCreateSuccess(LPDESC d, const char * data)
{
    /* old code
    if (!d)
        return;

    TPacketDGCreateSuccess * pPacketDB = (TPacketDGCreateSuccess *) data;

    if (pPacketDB->bAccountCharacterIndex >= PLAYER_PER_ACCOUNT)
    {
        d->Packet(encode_byte(HEADER_GC_CHARACTER_CREATE_FAILURE), 1);
        return;
    }

    long lIndex = 0;

    if (!CMapLocation::instance().Get(pPacketDB->player.x,
                pPacketDB->player.y,
                lIndex,
                pPacketDB->player.lAddr,
                pPacketDB->player.wPort))
    {
        sys_err("InputDB::PlayerCreateSuccess: cannot find server for mapindex %d %d x %d (name %s)",
                lIndex,
                pPacketDB->player.x,
                pPacketDB->player.y,
                pPacketDB->player.szName);
    }

    TAccountTable & r_Tab = d->GetAccountTable();
    r_Tab.players[pPacketDB->bAccountCharacterIndex] = pPacketDB->player;

    TPacketGCPlayerCreateSuccess pack;

    pack.header = HEADER_GC_CHARACTER_CREATE_SUCCESS;
    pack.bAccountCharacterIndex = pPacketDB->bAccountCharacterIndex;
    pack.player = pPacketDB->player;

    d->Packet(&pack, sizeof(TPacketGCPlayerCreateSuccess));

    // ±âº» ¹«±â¿Í ±ÍȯºÎ¸¦ Áö±Ş
    TPlayerItem t;
    memset(&t, 0, sizeof(t));

    if (china_event_server)
    {
        t.window    = INVENTORY;
        t.count    = 1;
        t.owner    = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;

        //¹«»ç: ÀÚÀΰ©+3,öÆíÅõ±¸+3,±İÆí½Å¹ß+3,³²¸¸µµ+3,¹é±İ¸ñ°ÉÀÌ+3, Èæ´Ü±Í°ÉÀÌ+3, ¼Ò»êºÎ+3, ¿À°¢ÆĞ+3, Èæ´ÜÆÈÂî+3
        //ÀÚ°´£º¿µ¸°+3,¿¬È¯µÎ°Ç+3,±İÆí½Å¹ß+3,¸¶¾Èµµ+3,ȾȱÃ+3,¿Á¸ñ°ÉÀÌ+3, ¿Á±Í°ÉÀÌ+3, ¿À°¢ÆĞ+3, Èæ´ÜÆÈÂî+3
        //¼ö¶ó£ºÀ½¾ç°©+3,¾ÖÈñÅõ±¸+3,±İÆí½Å¹ß+3,³²¸¸µµ+3,ÁøÁÖ¸ñ°ÉÀÌ+3, ¹é±İ±Í°ÉÀÌ+3, ¿À°¢ÆĞ+3, Èæ´ÜÆÈÂî+3
        //¹«´ç£º¼ÃµÀÇ+3,ÅÂÀ»¸ğ+3,±İÆí½Å¹ß+3,ÀÚ¸°¼±+3,¸ÅÈ·É+3,ÁøÁÖ¸ñ°ÉÀÌ+3, ¹é±İ±Í°ÉÀÌ+3, ¿À°¢ÆĞ+3, Èæ´ÜÆÈÂî+3

        struct SInitialItem
        {
            DWORD dwVnum;
            BYTE pos;
        };

        const int MAX_INITIAL_ITEM = 9;

        static SInitialItem initialItems[JOB_MAX_NUM][MAX_INITIAL_ITEM] =
        {
            { {11243,    2}, {12223,    3}, {15103,    4}, {   93,    1}, {16143,    8}, {17103,    9}, { 3083,    0}, {13193,    11}, {14103, 12}, },
            { {11443,    0}, {12363,    3}, {15103,    4}, { 1053,    2}, { 2083,    1}, {16083,    7}, {17083,    8}, {13193,    9}, {14103,    10}, },
            { {11643,    0}, {12503,    2}, {15103,    3}, {   93,    1}, {16123,    4}, {17143,    7}, {13193,    8}, {14103,    9}, {    0,    0}, },
            { {11843,    0}, {12643,    1}, {15103,    2}, { 7083,    3}, { 5053,    4}, {16123,    6}, {17143,    7}, {13193,    8}, {14103,    9}, },
        };

        int job = pPacketDB->player.byJob;
        for (int i=0; i < MAX_INITIAL_ITEM; i++)
        {
            if (initialItems[job][i].dwVnum == 0)
                continue;

            t.id    = ITEM_MANAGER::instance().GetNewID();
            t.pos    = initialItems[job][i].pos;
            t.vnum    = initialItems[job][i].dwVnum;

            db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));
            db_clientdesc->Packet(&t, sizeof(TPlayerItem));
        }
    }

    LogManager::instance().CharLog(pack.player.dwID, 0, 0, 0, "CREATE PLAYER", "", d->GetHostName());
    */
    if (!d)
        return;

    TPacketDGCreateSuccess* pPacketDB = (TPacketDGCreateSuccess*)data;

    if (pPacketDB->bAccountCharacterIndex >= PLAYER_PER_ACCOUNT)
    {
        d->Packet(encode_byte(HEADER_GC_CHARACTER_CREATE_FAILURE), 1);
        return;
    }

    long lIndex = 0;

    if (!CMapLocation::instance().Get(pPacketDB->player.x,
        pPacketDB->player.y,
        lIndex,
        pPacketDB->player.lAddr,
        pPacketDB->player.wPort))
    {
        sys_err("InputDB::PlayerCreateSuccess: cannot find server for mapindex %d %d x %d (name %s)",
            lIndex,
            pPacketDB->player.x,
            pPacketDB->player.y,
            pPacketDB->player.szName);
    }

    TAccountTable& r_Tab = d->GetAccountTable();
    r_Tab.players[pPacketDB->bAccountCharacterIndex] = pPacketDB->player;

    TPacketGCPlayerCreateSuccess pack;

    pack.header = HEADER_GC_CHARACTER_CREATE_SUCCESS;
    pack.bAccountCharacterIndex = pPacketDB->bAccountCharacterIndex;
    pack.player = pPacketDB->player;

    d->Packet(&pack, sizeof(TPacketGCPlayerCreateSuccess));

  
    TPlayerItem t;
    memset(&t, 0, sizeof(t));

    //baslangic item verme
    t.owner = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;

    struct SInitialItem
    {
        BYTE    window;
        BYTE    pos;
        DWORD    count;

        DWORD    dwVnum;

        long    socket0;
        long    socket1;
        long    socket2;

        long     attr_type0;
        long     attr_value0;

        long     attr_type1;
        long     attr_value1;

        long     attr_type2;
        long     attr_value2;

        long     attr_type3;
        long     attr_value3;

        long     attr_type4;
        long     attr_value4;

        long     attr_type5;
        long     attr_value5;

        long     attr_type6;
        long     attr_value6;
    };

    const int MAX_INITIAL_ITEM = 10;

    static SInitialItem initialItems[JOB_MAX_NUM][MAX_INITIAL_ITEM] =
    {
        // {window_type, envanterdeki yeri, adeti, item_vnum, socket0, socket1, socket2, socket3, socket4, socket5, socket6}

        {
            // WARRIOR
            {EQUIPMENT,    0,    1,    11279,    0,    0,    0,    1,3000, 53,50, 23,10, 9,20, 39,15},    // Zirh
            {EQUIPMENT,    1,    1,    12249,    0,    0,    0,    21,20, 18,20, 22,20, 12,8, 7,8},    // Kafalik
            {EQUIPMENT,    2,    1,    15209,    0,    0,    0,    1,3000, 15,10, 7,8, 43,20, 44,20}, // Ayakkabi
            {EQUIPMENT,    3,    1,    14209,    0,    0,    0,    1,3000, 16,10, 23,10, 21,20, 22,20},    // Bilezik
            {EQUIPMENT,    4,    1,    299,      0,    0,    0,    72,45, 5,12, 6,12, 15,10, 16,10},    // Silah
            {EQUIPMENT,    5,    1,    16209,    0,    0,    0,    1,3000, 15,10, 10,30, 43,20, 44,20}, // Kolye
            {EQUIPMENT,    6,    1,    17109,    0,    0,    0,    8,20, 17,10, 45,20, 21,20, 22,20}, // Küpe
            {EQUIPMENT,    10,   1,    13049,    0,    0,    0,    5,12, 6,12, 43,20, 44,20, 17,10},    // Kalkan

          
        },

        {
            // ASSASSIN
            {EQUIPMENT,    0,    1,    11479,    0,    0,    0,    1,3000, 53,50, 23,10, 9,20, 39,15},    // Zirh
            {EQUIPMENT,    1,    1,    12389,    0,    0,    0,    21,20, 18,20, 22,20, 12,8, 7,8},    // Kafalik
            {EQUIPMENT,    2,    1,    15209,    0,    0,    0,    1,3000, 15,10, 7,8, 43,20, 44,20}, // Ayakkabi
            {EQUIPMENT,    3,    1,    14209,    0,    0,    0,    1,3000, 16,10, 23,10, 21,20, 22,20},    // Bilezik
            {EQUIPMENT,    4,    1,    1179,     0,    0,    0,    72,45, 5,12, 6,12, 15,10, 16,10},    // Silah
            {EQUIPMENT,    5,    1,    16209,    0,    0,    0,    1,3000, 15,10, 10,30, 43,20, 44,20}, // Kolye
            {EQUIPMENT,    6,    1,    17109,    0,    0,    0,    8,20, 17,10, 45,20, 21,20, 22,20}, // Küpe
            {EQUIPMENT,    10,   1,    13049,    0,    0,    0,    5,12, 6,12, 43,20, 44,20, 17,10},    // Kalkan

          
        },

        {
            // SURA
            {EQUIPMENT,    0,    1,    11679,    0,    0,    0,    1,3000, 53,50, 23,10, 9,20, 39,15},    // Zirh
            {EQUIPMENT,    1,    1,    12529,    0,    0,    0,    21,20, 18,20, 22,20, 12,8, 7,8},    // Kafalik
            {EQUIPMENT,    2,    1,    15209,    0,    0,    0,    1,3000, 15,10, 7,8, 43,20, 44,20}, // Ayakkabi
            {EQUIPMENT,    3,    1,    14209,    0,    0,    0,    1,3000, 16,10, 23,10, 21,20, 22,20},    // Bilezik
            {EQUIPMENT,    4,    1,    299,      0,    0,    0,    72,45, 5,12, 6,12, 15,10, 16,10},    // Silah
            {EQUIPMENT,    5,    1,    16209,    0,    0,    0,    1,3000, 15,10, 10,30, 43,20, 44,20}, // Kolye
            {EQUIPMENT,    6,    1,    17109,    0,    0,    0,    8,20, 17,10, 45,20, 21,20, 22,20}, // Küpe
            {EQUIPMENT,    10,    1,   13049,    0,    0,    0,    5,12, 6,12, 43,20, 44,20, 17,10},    // Kalkan

          
        },

        {
            // SHAMAN
            {EQUIPMENT,    0,    1,    11879,    0,    0,    0,    1,3000, 53,50, 23,10, 9,20, 39,15},    // Zirh
            {EQUIPMENT,    1,    1,    12669,    0,    0,    0,    21,20, 18,20, 22,20, 12,8, 7,8},    // Kafalik
            {EQUIPMENT,    2,    1,    15209,    0,    0,    0,    1,3000, 15,10, 7,8, 43,20, 44,20}, // Ayakkabi
            {EQUIPMENT,    3,    1,    14209,    0,    0,    0,    1,3000, 16,10, 23,10, 21,20, 22,20},    // Bilezik
            {EQUIPMENT,    4,    1,    5119,     0,    0,    0,    72,45, 5,12, 6,12, 15,10, 16,10},    // Silah
            {EQUIPMENT,    5,    1,    16209,    0,    0,    0,    1,3000, 15,10, 10,30, 43,20, 44,20}, // Kolye
            {EQUIPMENT,    6,    1,    17109,    0,    0,    0,    8,20, 17,10, 45,20, 21,20, 22,20}, // Küpe
            {EQUIPMENT,    10,   1,    13049,    0,    0,    0,    5,12, 6,12, 43,20, 44,20, 17,10},    // Kalkan

            //{INVENTORY,    0,    1,    50213,    0,    0,    0,    0,    0,    0}, //Cirak sandigi
        }
    };

    unsigned job = pPacketDB->player.byJob;
    RaceToJob(job, &job);
    for (int i = 0; i < MAX_INITIAL_ITEM; i++)
    {
        if (initialItems[job][i].dwVnum == 0)
            continue;

        t.id = ITEM_MANAGER::instance().GetNewID();
        t.window = initialItems[job][i].window;
        t.pos = initialItems[job][i].pos;
        t.count = initialItems[job][i].count;
        t.vnum = initialItems[job][i].dwVnum;

        t.alSockets[0] = initialItems[job][i].socket0;
        t.alSockets[1] = initialItems[job][i].socket1;
        t.alSockets[2] = initialItems[job][i].socket2;

        t.aAttr[0].bType = initialItems[job][i].attr_type0;
        t.aAttr[0].sValue = initialItems[job][i].attr_value0;

        t.aAttr[1].bType = initialItems[job][i].attr_type1;
        t.aAttr[1].sValue = initialItems[job][i].attr_value1;

        t.aAttr[2].bType = initialItems[job][i].attr_type2;
        t.aAttr[2].sValue = initialItems[job][i].attr_value2;

        t.aAttr[3].bType = initialItems[job][i].attr_type3;
        t.aAttr[3].sValue = initialItems[job][i].attr_value3;

        t.aAttr[4].bType = initialItems[job][i].attr_type4;
        t.aAttr[4].sValue = initialItems[job][i].attr_value4;

        t.aAttr[5].bType = initialItems[job][i].attr_type5;
        t.aAttr[5].sValue = initialItems[job][i].attr_value5;

        t.aAttr[6].bType = initialItems[job][i].attr_type6;
        t.aAttr[6].sValue = initialItems[job][i].attr_value6;

        db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));
        db_clientdesc->Packet(&t, sizeof(TPlayerItem));
    }
    //baslangic item verme bitis

    LogManager::instance().CharLog(pack.player.dwID, 0, 0, 0, "CREATE PLAYER", "", d->GetHostName());
}


Ek olarak, ilk başta efsunları eklemeden build etmiştim ve o zaman giyiliydi fakat efsunları ekledikten sonra envantere düştü. Efsun eklerken mi bir yerde hata var acaba ?
resim_2021-11-24_130035.png
 
Çözüm
Quest ile verdiğiniz level bu kodlardan sonra çalışıyor. Bu yüzden itemler verildiği zaman karakterinizin leveli yetersiz kalıyor ve bu soruna sebep oluyor.

game/src/input_login.cpp dosyasındaki NewPlayerTable2 fonksiyonu inceleyin. Level bilgisi şu satırda mevcut;
C++:
Genişlet Daralt Kopyala
    memset(table, 0, sizeof(TPlayerTable));

    strlcpy(table->name, name, sizeof(table->name));

    table->level        = 1;
    table->job            = race;    // 流诀措脚 辆练阑 持绰促
    table->voice        = 0;
    table->part_base    = shape;
Yeni karakter oluşturup denediniz mi? Ben kodda bir sorun göremedim
 
Karakter başlangıç leveli itemlerin levelinden düşükse giyili başlatmaz. Kodlara göre EQUIPMENT tanımlamalarınız doğru gözüküyor.
 
Karakter başlangıç leveli itemlerin levelinden düşükse giyili başlatmaz. Kodlara göre EQUIPMENT tanımlamalarınız doğru gözüküyor.
Evet, sorun orada sanırım. Karakterin seviyesini quest ile 55 level başlatıyorum sorunda oradan kaynaklı sanırım. Src'de hangi kısıma ekleme yaparak değiştirebilirim acaba başlangıç seviyesini ?
 
Quest ile verdiğiniz level bu kodlardan sonra çalışıyor. Bu yüzden itemler verildiği zaman karakterinizin leveli yetersiz kalıyor ve bu soruna sebep oluyor.

game/src/input_login.cpp dosyasındaki NewPlayerTable2 fonksiyonu inceleyin. Level bilgisi şu satırda mevcut;
C++:
Genişlet Daralt Kopyala
    memset(table, 0, sizeof(TPlayerTable));

    strlcpy(table->name, name, sizeof(table->name));

    table->level        = 1;
    table->job            = race;    // 流诀措脚 辆练阑 持绰促
    table->voice        = 0;
    table->part_base    = shape;
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst