Source Üzerinden Başlangıç İtemi Verme c++ (Süreli İtem Dahil)

Metin2University

Metin2 Files Hizmetleri
Gold Üye
Geliştirici
MT Üye
Mesaj
420
Çözümler
8
Beğeni
337
Puan
839
Ticaret Puanı
0
Bu konuda başlangıç itemlerini source üzerinden verme mantığını paylaşıyorum. Diğer paylaşımlarda süreli item verme yoktu.
Sistem süreli itemleri de destekler, yani verilen itemler envantere girer girmez silinmez.


Bu yöntemle:


  • Başlangıçta verilen equipment ve inventory itemleri
  • Süreli (expire’lı) itemler
  • Efsunlu itemler

tam sorunsuz şekilde karaktere verilir.
Sistem 4 socket sayısına göre ayarlıdır kendi filesinize göre ayarlayın lütfen.


Süreli itemlerde expire zamanı socket’e yazıldığı için itemin süresi düzgün başlar.



game/src/input_db.cpp dosyasını açın.


Aşağıdaki fonksiyonu bulun:

input_db.cpp:
Genişlet Daralt Kopyala
void CInputDB::PlayerCreateSuccess(LPDESC d, const char * data)

Üstüne ekleyin

input_db.cpp:
Genişlet Daralt Kopyala
extern bool RaceToJob(unsigned race, unsigned* ret_job);


Tekrar fonksiyonun içinde şu satırı bulun:
input_db.cpp:
Genişlet Daralt Kopyala
d->Packet(&pack, sizeof(TPacketGCPlayerCreateSuccess));

d->Packet(&pack, sizeof(TPacketGCPlayerCreateSuccess));
bu satırın altındaki tüm kodları, fonksiyon bitişine kadar aşağıdaki kod ile değiştirin.

input_db.cpp:
Genişlet Daralt Kopyala
    // =====================================================
    // BASLANGIC İTEM SİSTEMİ ( GİYİLİ/EFSUNLU/SÜRELİ İTEMLİ )
    // =====================================================

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

    t.window = INVENTORY;
    t.owner = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;
    t.count = 1;

    struct SInitialItem
    {
        BYTE window;     // EQUIPMENT / INVENTORY
        short pos;       // WEAR_* veya inventory slot
        DWORD count;
        DWORD dwVnum;
        DWORD duration;

        long socket0;
        long socket1;
        long socket2;
        long socket3;

        BYTE attr_type0; short attr_value0;
        BYTE attr_type1; short attr_value1;
        BYTE attr_type2; short attr_value2;
        BYTE attr_type3; short attr_value3;
        BYTE attr_type4; short attr_value4;
    };

    const int MAX_INITIAL_ITEM = 17;

    static SInitialItem initialItems[JOB_MAX_NUM][MAX_INITIAL_ITEM] =
    {
        // WARRIOR
        {
            {EQUIPMENT, WEAR_BODY,   1, 9001,  0,0,0,0, 0,0,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_HEAD,   1, 12209, 0,0,0,0, 7,8,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_FOOTS,  1, 15009, 0,0,0,0, 15,10,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_WRIST,  1, 14009, 0,0,0,0, 1,2000,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_WEAPON, 1, 19,    0,0,0,0, 15,10,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_NECK,   1, 16009, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_EAR,    1, 17009, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_SHIELD, 1, 13009, 0,0,0,0, 6,0,0,0,0,0,0,0},
            {INVENTORY, 0, 1, 27053, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
            {INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
        },
        // ASSASSIN
        {
            {EQUIPMENT, WEAR_BODY,   1, 9002,  0,0,0,0, 0,0,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_HEAD,   1, 12349, 0,0,0,0, 7,8,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_FOOTS,  1, 15009, 0,0,0,0, 15,10,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_WRIST,  1, 14009, 0,0,0,0, 1,2000,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_WEAPON, 1, 1009,  0,0,0,0, 15,10,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_NECK,   1, 16009, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_EAR,    1, 17009, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {EQUIPMENT, WEAR_SHIELD, 1, 13009, 0,0,0,0, 6,0,0,0,0,0,0,0},
            {INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
            {INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
        },
    };

    unsigned job = pPacketDB->player.byJob;
    RaceToJob(job, &job);

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

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

        t.id     = ITEM_MANAGER::instance().GetNewID();
        t.owner  = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;
        t.window = initialItems[job][i].window;
        t.vnum   = initialItems[job][i].dwVnum;
        t.count  = initialItems[job][i].count;
        t.pos    = initialItems[job][i].pos;

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

        // Süreli item desteği
        if (initialItems[job][i].duration > 0)
            t.alSockets[0] = time(0) + initialItems[job][i].duration;

        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;

        if ((t.window == INVENTORY && t.pos >= 0 && t.pos < INVENTORY_MAX_NUM) ||
            (t.window == EQUIPMENT))
        {
            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());
}


Örnek kod bloğunu bırakıyorum bakarakta anlayabilirsiniz.

input_db.cpp:
Genişlet Daralt Kopyala
extern bool RaceToJob(unsigned race, unsigned* ret_job);
void CInputDB::PlayerCreateSuccess(LPDESC d, const char * data)
{
    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;

    #ifdef ENABLE_MOVE_CHANNEL
    if (!CMapLocation::instance().Get(pPacketDB->pl[HASH=2]#ifdef[/HASH], pPacketDB->player.y, lIndex, pPacketDB->player.lAddr, pPacketDB->player.wPort, g_bChannel))
    #else
    if (!CMapLocation::instance().Get(pPacketDB->player.x, pPacketDB->pl[HASH=2311]#else[/HASH]y, lIndex, pPacketDB->player.lAddr, pPacketDB->player.wPort))
    #endif
    {
        sys_err("InputDB::PlayerCreateSuccess: cannot find server[HASH=3]#endif[/HASH]apindex %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;
#ifdef ENABLE_NEWSTUFF
    if (!g_stProxyIP.empty())
        pack.player.lAddr#ifdefaddr(g_stProxyIP.c_str());
#endif
    d->Packet(&pack, sizeof(TPacketGCPlayerCreateSuccess));

    // ===[HASH=3]#endif[/HASH]============================================
    // BASLANGIC İTEM SİSTEMİ ( GİYİLİ/EFSUNLU/SÜRELİ İTEMLİ )
    // =====================================================

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

    t.window = INVENTORY;
    t.owner = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;
    t.count = 1;

    struct SInitialItem
    {
        BYTE window;     // EQUIPMENT / INVENTORY
        short pos;       // WEAR_* veya inventory slot
        DWORD count;
        DWORD dwVnum;
        DWORD duration;
  
        long socket0;
        long socket1;
        long socket2;
        long socket3;
  
        BYTE attr_type0; short attr_value0;
        BYTE attr_type1; short attr_value1;
        BYTE attr_type2; short attr_value2;
        BYTE attr_type3; short attr_value3;
        BYTE attr_type4; short attr_value4;
    };

    const int MAX_INITIAL_ITEM = 17;
  
    static SInitialItem initialItems[JOB_MAX_NUM][MAX_INITIAL_ITEM] =
    {
        // WARRIOR
        {////////////// ?TEM T?P? //// ?TEM VNUM //// EFSUN VNUM VE ORANLARI ////
            {EQUIPMENT, WEAR_BODY,   1, 9001,  0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_HEAD,   1, 12209, 0,0,0,0, 7,8, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_FOOTS,  1, 15009, 0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WRIST, 1, 14009, 0, 0,0,0,0, 1,2000, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WEAPON, 1, 19,    0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_NECK,   1, 16009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_EAR,    1, 17009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_SHIELD, 1, 13009, 0,0,0,0, 6,0, 0,0,0,0,0,0},
            {INVENTORY, 0,           1, 27053, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {INVENTORY, 1, 1, 71044, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 2, 1, 71045, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 3, 1, 72031, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 4, 1, 72034, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 5, 1, 72037, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 6, 1, 72040, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
            {INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
        },
        // ASSASSIN
        {////////////// ?TEM T?P? //// ?TEM VNUM //// EFSUN VNUM VE ORANLARI ////
            {EQUIPMENT, WEAR_BODY,   1, 9002,  0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_HEAD,   1, 12349, 0,0,0,0, 7,8, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_FOOTS,  1, 15009, 0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WRIST, 1, 14009, 0, 0,0,0,0, 1,2000, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WEAPON, 1, 1009,  0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_NECK,   1, 16009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_EAR,    1, 17009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_SHIELD, 1, 13009, 0,0,0,0, 6,0, 0,0,0,0,0,0},
            {INVENTORY, 0,           1, 27053, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {INVENTORY, 1, 1, 71044, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 2, 1, 71045, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 3, 1, 72031, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 4, 1, 72034, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 5, 1, 72037, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 6, 1, 72040, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
            {INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
        },
        // SURA
        {////////////// ?TEM T?P? //// ?TEM VNUM //// EFSUN VNUM VE ORANLARI ////
            {EQUIPMENT, WEAR_BODY,   1, 9003,  0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_HEAD,   1, 12489, 0,0,0,0, 7,8, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_FOOTS,  1, 15009, 0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WRIST, 1, 14009, 0, 0,0,0,0, 1,2000, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WEAPON, 1, 19,    0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_NECK,   1, 16009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_EAR,    1, 17009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_SHIELD, 1, 13009, 0,0,0,0, 6,0, 0,0,0,0,0,0},
            {INVENTORY, 0,           1, 27053, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {INVENTORY, 1, 1, 71044, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 2, 1, 71045, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 3, 1, 72031, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 4, 1, 72034, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 5, 1, 72037, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 6, 1, 72040, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
            {INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
        },
        // SHAMAN
        {////////////// ?TEM T?P? //// ?TEM VNUM //// EFSUN VNUM VE ORANLARI ////
            {EQUIPMENT, WEAR_BODY,   1, 9004,  0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_HEAD,   1, 12629, 0,0,0,0, 7,8, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_FOOTS,  1, 15009, 0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WRIST, 1, 14009, 0, 0,0,0,0, 1,2000, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_WEAPON, 1, 7009,  0,0,0,0, 15,10,0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_NECK,   1, 16009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_EAR,    1, 17009, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {EQUIPMENT, WEAR_SHIELD, 1, 13009, 0,0,0,0, 6,0, 0,0,0,0,0,0},
            {INVENTORY, 0,           1, 27053, 0,0,0,0, 0,0, 0,0, 0,0, 0,0},
            {INVENTORY, 1, 1, 71044, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 2, 1, 71045, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 3, 1, 72031, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 4, 1, 72034, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 5, 1, 72037, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 6, 1, 72040, 0,0,0,0, 0,0,0,0,0,0,0,0},
            {INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
            {INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
        },
    };

    unsigned job = pPacketDB->player.byJob;
    RaceToJob(job, &job);

    for (int i = 0; i < MAX_INITIAL_ITEM; ++i)
    {
        if (initialItems[job][i].dwVnum == 0)
            continue;
  
        memset(&t, 0, sizeof(TPlayerItem));
  
        t.id     = ITEM_MANAGER::instance().GetNewID();
        t.owner  = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;
        t.window = initialItems[job][i].window;
        t.vnum   = initialItems[job][i].dwVnum;
        t.count  = initialItems[job][i].count;
      
        // ?? HEM EQUIPMENT HEM INVENTORY AYNI MANTIK
        t.pos = initialItems[job][i].pos;
        // SOCKET
        t.alSockets[0] = initialItems[job][i].socket0;
        t.alSockets[1] = initialItems[job][i].socket1;
        t.alSockets[2] = initialItems[job][i].socket2;
        t.alSockets[3] = initialItems[job][i].socket3;

        if (initialItems[job][i].duration > 0)
        {
            // Guvenli expire socket
            t.alSockets[0] = time(0) + initialItems[job][i].duration;
        }


        // ATTR (efsunu BOZMADIK)
        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;
  
    if ((t.window == INVENTORY && t.pos >= 0 && t.pos < INVENTORY_MAX_NUM) ||
        (t.window == EQUIPMENT))
    {
        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());
}

SÜRELİ OLAN İTEMLER AŞAĞIDADIR.
{INVENTORY, 7, 1, 52045, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},
{INVENTORY, 8, 1, 72702, 60*60*24*7, 0,0,0,0, 0,0,0,0,0,0,0},


Ekran görüntüsü 2026-02-08 005735.webp
 
Son düzenleme:
teşekkürler verilen itemlere taş basılıyormu böyle bir sorun oluyordu bunda varmı socket kısmını ayarlamak gerekiyordu daha önce başıma gelmişti.
 
teşekkürler verilen itemlere taş basılıyormu böyle bir sorun oluyordu bunda varmı socket kısmını ayarlamak gerekiyordu daha önce başıma gelmişti.
O dikkatimi çekmedi ben emek yaptığımdan taş ekletmiyorum başlangıçta ama ona da bakayım çözersem güzel olur.
 
Geri
Üst