Neler yeni

Foruma hoş geldin, Ziyaretçi

Metin2Lobby.com Metin2 Private Server Tanıtım Advertising Ve Geliştirme Forumudur.Metin2 pvp serverler,1-99,1-105,1-120,55-120 global serverları paylaş yada ara.
Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Konular
48,263
Mesajlar
48,573
Tepkime puanı
74
M2 Yaşı
3 yıl 11 ay 10 gün
Trophy Puan
48
Konum
Web sitesi
M2 Yang
488,599
Ticaret : 1 / 0 / 0
Ticaret Oranı : 100%
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:



  • <li data-xf-list-type="ul">Başlangıçta verilen equipment ve inventory itemleri <li data-xf-list-type="ul">Süreli (expire’lı) itemler <li data-xf-list-type="ul">Efsunlu itemler

tam sorunsuz şekilde karaktere verilir.


Süreli itemlerde expire zamanı socket’e yazıldığı için itemin süresi düzgün başlar.
Sistem 4 socket sayısına göre ayarlıdır kendi filesinize göre ayarlayın lütfen.




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


Aşağıdaki fonksiyonu bulun:

Kod:
void CInputDB::PlayerCreateSuccess(LPDESC d, const char * data)

Üstüne ekleyin

Kod:
extern bool RaceToJob(unsigned race, unsigned* ret_job);


Tekrar fonksiyonun içinde şu satırı bulun:
Kod:
d-&gt;Packet(&amp;pack, sizeof(TPacketGCPlayerCreateSuccess));

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

Kod:
// =====================================================     // BASLANGIC İTEM SİSTEMİ ( GİYİLİ/EFSUNLU/SÜRELİ İTEMLİ )     // =====================================================     TPlayerItem t;     memset(&amp;t, 0, sizeof(TPlayerItem));     t.window = INVENTORY;     t.owner = r_Tab.players[pPacketDB-&gt;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-&gt;player.byJob;     RaceToJob(job, &amp;job);     for (int i = 0; i &lt; MAX_INITIAL_ITEM; ++i)     {         if (initialItems[job][i].dwVnum == 0)             continue;         memset(&amp;t, 0, sizeof(TPlayerItem));         t.id     = ITEM_MANAGER::instance().GetNewID();         t.owner  = r_Tab.players[pPacketDB-&gt;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 &gt; 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 &amp;&amp; t.pos &gt;= 0 &amp;&amp; t.pos &lt; INVENTORY_MAX_NUM) ||             (t.window == EQUIPMENT))         {             db_clientdesc-&gt;DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));             db_clientdesc-&gt;Packet(&amp;t, sizeof(TPlayerItem));         }     }     LogManager::instance().CharLog(pack.player.dwID, 0, 0, 0, "CREATE PLAYER", "", d-&gt;GetHostName()); }


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

Kod:
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-&gt;bAccountCharacterIndex &gt;= PLAYER_PER_ACCOUNT)     {         d-&gt;Packet(encode_byte(HEADER_GC_CHARACTER_CREATE_FAILURE), 1);         return;     }     long lIndex = 0;     #ifdef ENABLE_MOVE_CHANNEL     if (!CMapLocation::instance().Get(pPacketDB-&gt;pl[HASH=2]#ifdef[/HASH]Packe[HASH=2]#ifdef[/HASH]layer.y, lIndex, pPacketDB-&gt;player.lAddr, pPacketDB-&gt;player.wPort, g_bChannel))     #else     if (!CMapLocation::instance().Get(pPacketDB-&gt;player.x, pPacketDB-&gt;pl[HASH=2311]#else[/HASH] lInd[HASH=2311]#else[/HASH]PacketDB-&gt;player.lAddr, pPacketDB-&gt;player.wPort))     #endif     {         sys_err("InputDB::PlayerCreateSuccess: cannot find server[HASH=3]#endif[/HASH]ndex [HASH=3]#endif[/HASH]x %d (name %s)",                 lIndex,                 pPacketDB-&gt;player.x,                 pPacketDB-&gt;player.y,                 pPacketDB-&gt;player.szName);     }     TAccountTable &amp; r_Tab = d-&gt;GetAccountTable();     r_Tab.players[pPacketDB-&gt;bAccountCharacterIndex] = pPacketDB-&gt;player;     TPacketGCPlayerCreateSuccess pack;     pack.header = HEADER_GC_CHARACTER_CREATE_SUCCESS;     pack.bAccountCharacterIndex = pPacketDB-&gt;bAccountCharacterIndex;     pack.player = pPacketDB-&gt;player; #ifdef ENABLE_NEWSTUFF     if (!g_stProxyIP.empty())         pack.player.lAddr#ifdefad#ifdeftProxyIP.c_str()); #endif     d-&gt;Packet(&amp;pack, sizeof(TPacketGCPlayerCreateSuccess));     // ===[HASH=3]#endif[/HASH]=====[HASH=3]#endif[/HASH]==============================     // BASLANGIC İTEM SİSTEMİ ( GİYİLİ/EFSUNLU/SÜRELİ İTEMLİ )     // =====================================================     TPlayerItem t;     memset(&amp;t, 0, sizeof(TPlayerItem));     t.window = INVENTORY;     t.owner = r_Tab.players[pPacketDB-&gt;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-&gt;player.byJob;     RaceToJob(job, &amp;job);     for (int i = 0; i &lt; MAX_INITIAL_ITEM; ++i)     {         if (initialItems[job][i].dwVnum == 0)             continue;              memset(&amp;t, 0, sizeof(TPlayerItem));              t.id     = ITEM_MANAGER::instance().GetNewID();         t.owner  = r_Tab.players[pPacketDB-&gt;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 &gt; 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 &amp;&amp; t.pos &gt;= 0 &amp;&amp; t.pos &lt; INVENTORY_MAX_NUM) ||         (t.window == EQUIPMENT))     {         db_clientdesc-&gt;DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));         db_clientdesc-&gt;Packet(&amp;t, sizeof(TPlayerItem));     }     }     LogManager::instance().CharLog(pack.player.dwID, 0, 0, 0, "CREATE PLAYER", "", d-&gt;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},
288877_a4286659f777fbd25871724387cf7e90.png

Source Üzerinden Başlangıç İtemi Verme (Süreli İtem Dahil) - Metin2 Lobby

Metin2 özel sunucularında kullanıcı deneyimini artırmak ve oyuncuların oyun içi gelişimini desteklemek adına başlangıç itemleri oldukça önemlidir. Bu sistem, oyuncuların karakter oluşturduklarında veya belirli durumlarda otomatik olarak belirli itemler almasını sağlar. Bu makalede, C++ tabanlı Metin2 kaynak kodları üzerinde nasıl başlangıç itemi verileceğini ve bunun sürelı versiyonunun nasıl uygulanacağını detaylı şekilde ele alacağız.

Başlangıç Item Sistemi Nedir?
Metin2 özel sunucularında başlangıç itemi verme işlemi, oyuncuların yeni bir karakter oluşturduklarında ya da giriş yaptıklarında otomatik olarak belirli itemler almasını sağlayan bir sistemdir. Bu itemler; silah, zırh, para, pet, süper avata gibi önemli ögeler olabilir. Bu sayede oyuncular, oyun içi başlangıç süreçlerini daha hızlı ve keyifli geçirebilirler.

C++ Kaynak Kodlarında Başlangıç Item Sistemi Nasıl Eklenir?
Bu işlem için öncelikle Metin2 oyun sunucusu kaynak kodlarına (game src) erişmeniz gerekir. Bu sistem genellikle CHARACTER::Spawn methodu veya CHARACTER::SavePost metodunda tanımlanır. Aşağıda basit bir örnek verilmiştir:

Örnek Kod Yapısı:
CHARACTER_MANAGER::instance().SpawnAt(info.x, info.y, info.z, info.map_idx, this);
if (!m_bIsNewPlayer)
{
return true;
}

// Burada başlangıç itemleri verilir
AutoGiveItem(71001); // Örnek item ID
AutoGiveItem(71002); // Başka bir item

Not: AutoGiveItem fonksiyonu, item verme işlemini kolaylaştıran bir yöntemdir. Ancak bu fonksiyonun doğru tanımlandığından emin olmalısınız.

Süreli Item Sistemi
Bazı özel sunucularda, başlangıç itemleri sadece bir süreliğine verilir. Bu tür itemler, oyun içi zamanlayıcılarla (timer) ya da item süresi (time limited) ile yönetilir. Süreli itemler, oyuncunun belirli bir süre boyunca kullanabileceği ancak süresi dolunca yok olan itemlerdir. Bu sistem genellikle sunucu tanıtımı veya özel etkinlikler için tercih edilir.

Süreli Item Verme Kodu Örneği:
ITEM_MANAGER::instance().CreateItem(item_vnum, count, 0, 0, 0, 0, 0, true);
// Bu itemin süresi expire_time kadar geçerli kalacak

Dikkat Edilmesi Gerekenler
  • Oyuncunun envanterinde yeterli boşluk olup olmadığı kontrol edilmelidir.
  • Item ID'lerin doğru girildiğinden emin olunmalıdır.
  • Süreli itemler için DB tarafında expire_time sütunu oluşturulmuş olmalıdır.
  • Sunucu yeniden başlatıldığında bu sistemlerin çalışmaya devam etmesi sağlanmalıdır.

Metin2 Lobby olarak Destek
Metin2 Lobby olarak, C++ sistem geliştirme, kaynak kodlama ve özel sunucu oluşturma konularında tecrübeliyiz. Kaynak kodlar üzerinde yapılacak değişikliklerle hem başlangıç item sistemi hem de sürelı item verme işlemleri kolayca entegre edilebilir. Bu tür sistemlerin doğru çalışması için hem game src hem de client tarafında gerekli ayarlamalar yapılmalıdır.

Kaynak Kod Düzenleme İpuçları
  • Her zaman önce test sunucusunda değişiklikleri deneyin.
  • Değişikliklerden sonra derleme işlemini unutmayın (compile).
  • DB tarafında gerekli item ve timer ayarlarını yapın.
  • Client kısmında item görünürlüğünü sağlayın.

Sonuç:
Metin2 özel sunucularında başlangıç itemi sistemi, oyuncu memnuniyetini artırır. Süreli item desteğiyle birlikte, sunucu yöneticileri daha dinamik ve sürprizli sistemler kurabilirler. Bu sistemleri C++ kaynak kodlar üzerinden entegre etmek, profesyonel düzeyde sunucu yönetimi için gereklidir.


Giving Starting Items via Source (Including Time-limited Items) - Metin2 Lobby

In Metin2 private servers, providing starting items to players enhances user experience and supports character progression from the beginning. This system allows automatic distribution of specific items upon character creation or login events. In this article, we will cover how to implement such a system in C++ based Metin2 game sources, including time-limited items.

What Is a Starting Item System?
In Metin2 private servers, a starting item system provides new characters with predefined items upon creation or login. These items can be weapons, armor, gold, pets, or super avatars. This helps players start their journey faster and enjoyably within the game world.

How to Add a Starting Item System in C++ Source Code?
To implement this feature, you need access to the game server source code (game src). The implementation often occurs in the CHARACTER::Spawn or CHARACTER::SavePost methods. Here is a basic example:

Sample Code Structure:
CHARACTER_MANAGER::instance().SpawnAt(info.x, info.y, info.z, info.map_idx, this);
if (!m_bIsNewPlayer)
{
return true;
}

// Give starting items here
AutoGiveItem(71001); // Example item ID
AutoGiveItem(71002); // Another item

Note: The AutoGiveItem function simplifies item distribution but must be properly defined in your source code.

Time-Limited Item System
Some private servers distribute temporary items that expire after a certain duration. These items are managed through timers or item expiration settings. Such items allow temporary use by the player before disappearing, commonly used for promotions or events.

Example for Giving Time-Limited Items:
ITEM_MANAGER::instance().CreateItem(item_vnum, count, 0, 0, 0, 0, 0, true);
// This item will expire after expire_time

Important Considerations
  • Ensure the player’s inventory has enough space.
  • Verify that item IDs are correctly entered.
  • The DB must have an 'expire_time' column for time-limited items.
  • Systems should continue to work after server restarts.

Support at Metin2 Lobby
As Metin2 Lobby, we specialize in C++ system development, source coding, and custom server creation. Modifications on source codes allow seamless integration of both starting item and time-limited item systems. Proper configuration is required on both game src and client sides for these features to work effectively.

Tips for Source Code Editing[/BR][/BR]
  • Always test changes on a test server first.
  • Remember to recompile after modifications.
  • Set up necessary item and timer configurations in the DB.
  • Ensure the client displays the items correctly.

Conclusion:
A starting item system in Metin2 private servers significantly improves player satisfaction. With time-limited item support, server admins can create dynamic and surprising gameplay experiences. Integrating such systems via C++ source code is essential for professional-level server management.
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kaydol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Üye ol
Giriş Yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş Yap

Tema düzenleyici

Tema özelletirmeleri