- 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
- M2 Yang
- 488,599
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:
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:
Üstüne ekleyin
Tekrar fonksiyonun içinde şu satırı bulun:
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.
Örnek kod bloğunu bırakıyorum bakarakta anlayabilirsiniz.
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},
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
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ı
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
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]
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.
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->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.
Kod:
// ===================================================== // 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.
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->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]Packe[HASH=2]#ifdef[/HASH]layer.y, lIndex, pPacketDB->player.lAddr, pPacketDB->player.wPort, g_bChannel)) #else if (!CMapLocation::instance().Get(pPacketDB->player.x, pPacketDB->pl[HASH=2311]#else[/HASH] lInd[HASH=2311]#else[/HASH]PacketDB->player.lAddr, pPacketDB->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->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#ifdefad#ifdeftProxyIP.c_str()); #endif d->Packet(&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(&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},
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.
