Yapılan en yüksek hasarı sisteme kaydeder ve yeni rekor kırıldıkça duyuru geçer isteğe göre ödül felanda ekleyebilirsiniz
*char.cpp
Arat:
Kod:
// MINING
Kod:
[COLOR=#BB0000][FONT=Verdana]m_pkMiningEvent = NULL;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]// END_OF_MINING[/FONT][/COLOR]
Üstüne ekle:
Kod:
m_pkRecordControlEvent = NULL;
Kod:
Arat:
Kod:
m_dwMountTime = 0;
Kod:
Üstüne ekle:
Kod:
m_nGetDamageRecord = quest::CQuestManager::instance().GetEventFlag("dam age_record");
Kod:
Arat:
Kod:
//DELAYED_WARP
Kod:
[COLOR=#BB0000][FONT=Verdana]event_cancel(&m_pkWarpEvent);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]event_cancel(&m_pkCheckSpeedHackEvent);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]//END_DELAYED_WARP[/FONT][/COLOR]
Altına ekle:
Kod:
event_cancel(&m_pkRecordControlEvent);
Kod:
Arat:
Kod:
int CHARACTER::GetSkillPowerByLevel(int level, bool bMob) const
Kod:
[COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return CTableBySkill::instance().GetSkillPowerByLevelFrom Type(GetJob(), GetSkillGroup(), MINMAX(0, level, SKILL_MAX_LEVEL), bMob);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR]
Altına ekle:
Kod:
void CHARACTER::SetDamageRecord(int igetnewrecord){
Kod:
[COLOR=#BB0000][FONT=Verdana]m_nGetDamageRecord = igetnewrecord;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]void CHARACTER::CheckDamageRecord(){[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]int igetnewrecord = quest::CQuestManager::instance().GetEventFlag("dam age_record");[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (igetnewrecord != GetDamageRecord())[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]SetDamageRecord(igetnewrecord);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]EVENTFUNC(record_check_event)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]char_event_info* info = dynamic_cast<char_event_info*>(event->info);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (info == NULL)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]sys_err("record_check_event> <Factor> Null pointer");[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return 0;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]LPCHARACTER ch = info->ch;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (ch == NULL) { // <Factor>[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return 0;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]ch->CheckDamageRecord();[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return PASSES_PER_SEC(10);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]void CHARACTER::InitRecordControlEvent(){[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (m_pkRecordControlEvent)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]char_event_info* info = AllocEventInfo<char_event_info>();[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]info->ch = this;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]m_pkRecordControlEvent = event_create(record_check_event, info, PASSES_PER_SEC(10));[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR]
*char.h
Arat:
Kod:
int m_iMaxAggro;
Kod:
[COLOR=#BB0000][FONT=Verdana]// End of Battle[/FONT][/COLOR]
Altına ekle:
Kod:
LPEVENT m_pkRecordControlEvent;
Kod:
[COLOR=#BB0000][FONT=Verdana]int m_nGetDamageRecord;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]public:[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]void InitRecordControlEvent();[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]int GetDamageRecord() const { return m_nGetDamageRecord; }[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]void SetDamageRecord(int igetnewrecord);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]void CheckDamageRecord();[/FONT][/COLOR]
*char_battle.cpp
Arat:
Kod:
if (GetHP() <= 0)
Kod:
[COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]Stun();[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (pAttacker && !pAttacker->IsNPC())[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]m_dwKillerPID = pAttacker->GetPlayerID();[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]else[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]m_dwKillerPID = 0;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR]
Altına ekle:
Kod:
if (pAttacker->IsPC()){
Kod:
[COLOR=#BB0000][FONT=Verdana]int newdam = dam;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (newdam > GetDamageRecord()) {[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]SetDamageRecord(newdam);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]quest::CQuestManager::instance().RequestSetEventFl ag("damage_record", newdam);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]quest::CQuestManager::instance().RequestSetEventFl ag("damage_record_own", pAttacker->GetPlayerID());[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]char buf[250];[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]snprintf(buf, sizeof(buf), "%s isimli oyuncu %d damage ile damage rekorunu kırdı !", pAttacker->GetName(), dam);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]SendNotice(buf);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR]
*input_login.cpp
Arat:
Kod:
if (g_noticeBattleZone)
Kod:
[COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (FN_is_battle_zone(ch))[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("ÀÌ ¸Ê¿¡¼± °Á¦ÀûÀÎ ´ëÀüÀÌ ÀÖÀ»¼ö µµ ÀÖ½À´Ï´Ù."));[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("ÀÌ Á¶Ç׿¡ µ¿ÀÇÇÏÁö ¾ÊÀ»½Ã"));[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("º»ÀÎÀÇ ÁÖ¼º ¹× ºÎ¼ºÀ¸·Î µ¹¾Æ°¡½Ã±â ¹Ù¶ø´Ï´Ù."));[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR]
Altına ekle:
Kod:
ch->InitRecordControlEvent();
Kod:
*questlua_global.cpp
Arat:
Kod:
{ "add_ox_quiz", _add_ox_quiz },
Kod:
Kod:
{ "reset_damage_record", _reload_damage_record },
Kod:
[COLOR=#BB0000][FONT=Verdana]{ "get_damage_record", _get_damage_record },[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]{ "get_damage_record_owner", _get_damage_record_owner },[/FONT][/COLOR]
Arat:
Kod:
void RegisterGlobalFunctionTable(lua_State* L)
Kod:
Kod:
int _reload_damage_record(lua_State* L)
Kod:
[COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]quest::CQuestManager::instance().SetEventFlag("dam age_record", 0);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]SendNotice("Damage rekoru sifirlandi");[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return 1;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]int _get_damage_record(lua_State* L)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]int iDamageRecord = quest::CQuestManager::instance().GetEventFlag("dam age_record");[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (iDamageRecord)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]lua_pushnumber(L, iDamageRecord);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]else[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]lua_pushnumber(L, 0);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return 1;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]int _get_damage_record_owner(lua_State* L)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]{[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]int iDamageRecordOwnerPid = quest::CQuestManager::instance().GetEventFlag("dam age_record_own");[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (iDamageRecordOwnerPid){[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]LPCHARACTER chRecordOwner = CHARACTER_MANAGER::instance().FindByPID(iDamageRec ordOwnerPid);[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if (chRecordOwner){[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]lua_pushstring(L, chRecordOwner->GetName());[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return 1;[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]}[/FONT][/COLOR]
Basit bir kontrol paneli:
Kod:
[COLOR=#BB0000][FONT=Verdana]--[[[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]Yeni quest fonksiyonlarını quest_functions dosyasına ekleyin:[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]get_damage_record[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]get_damage_record_owner[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]reset_damage_record[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]--]][/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]quest dmg_record begin[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]state start begin[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]when 20094.chat."Damage Rekor " with pc.is_gm() begin[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local s = select("Rekoru Sifirla", "Rekor sahibi", "Rekoru Oto Duyur", "Iptal")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if s == 1 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]reset_damage_record()[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]elseif s == 2 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local record, owner = get_damage_record(), get_damage_record_owner()[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]say_title("Damage Rekor bilgi")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]say("Damage rekoru:")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]say(record)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]say("Damage rekoru Sahibi:")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]say(owner)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]elseif s == 3 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local s_duyuru = select("Duyuruyu Ac", "Duyuruyu Kapat", "Iptal")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if s_duyuru == 1 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]clear_server_timer("oto_duyuru_rekor")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]server_loop_timer("oto_duyuru_rekor", 40)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]syschat("Otomatik Duyuru kisa sure icinde baslatilacak")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]elseif s_duyuru == 2 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]clear_server_timer("oto_duyuru_rekor")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]syschat("Otomatik Duyuru durduruldu")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]elseif s_duyuru == 3 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]elseif s == 4 then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]when oto_duyuru_rekor.server_timer begin[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local time = os.date("%X")[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local splitData = dmg_record.split(time, ':')[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local newtime = tostring(splitData[1].. ":".. splitData[2])[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]if newtime == "00:30" or newtime == "01:30" or newtime == "02:30" or newtime == "03:30" or newtime == "04:30" or newtime == "05:30" or newtime == "06:30" or newtime == "07:30" or newtime == "08:30" or newtime == "09:30" or newtime == "10:30" or newtime == "11:30" or newtime == "12:30" or newtime == "13:30" or newtime == "14:30" or newtime == "15:30" or newtime == "16:30" or newtime == "17:30" or newtime == "18:30" or newtime == "19:30" or newtime == "20:30" or newtime == "21:30" or newtime == "22:30" or newtime == "23:30" then[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local record, owner = get_damage_record(), get_damage_record_owner()[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]notice_all("Guncel damage rekor sahibi: "..owner .." Rekoru: "..record)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]function split(command_, x)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return dmg_record.split_(command_,x)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]function split_(string_,delimiter)[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local result = { }[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local from = 1[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]local delim_from, delim_to = string.find( string_, delimiter, from )[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]while delim_from do[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]table.insert( result, string.sub( string_, from , delim_from-1 ) )[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]from = delim_to + 1[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]delim_from, delim_to = string.find( string_, delimiter, from )[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]table.insert( result, string.sub( string_, from ) )[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]return result[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR] [COLOR=#BB0000][FONT=Verdana]end[/FONT][/COLOR]
Metin2 Oyununda Damage Rekor Sistemi Nedir?
Metin2 özel sunucularında oyun deneyimini artırmak ve oyuncular arasında rekabeti teşvik etmek için birçok farklı sistem geliştirilmiştir. Bu sistemlerden biri de Damage Rekor Sistemi'dir. Bu sistem, oyuncuların verdiği zarar miktarını takip ederek belirli aralıklarda rekor kıran kişilere ödüller sunar. Özellikle PvP odaklı sunucularda bu tür sistemler büyük önem taşır çünkü oyuncuların gelişimini ve motivasyonunu doğrudan etkiler.
Damage Rekor Sisteminin Amacı
Bu sistem, oyuncuların daha fazla zarar vermek için karakterlerini geliştirmeye çalışmasını teşvik eder. Aynı zamanda oyun içi etkinliği artırarak sunucu trafiğini pozitif yönde etkiler. Sistem sayesinde güçlü oyuncuların performansları görünür hale gelir ve diğer oyuncular için bir referans noktası oluşturur. Bu da sunucu içi rekabet ortamını güçlendirir.
Sistemin Teknik Yapısı
Damage Rekor Sistemi genellikle C++ dilinde yazılmış sunucu kaynak kodlarına entegre edilir. Oyuncunun verdiği hasarı hesaplayan fonksiyonlar izlenir ve bu veriler veritabanında (DB) saklanır. Hasar miktarı belirli bir eşiği aşarsa sistem bu rekoru kaydeder ve oyuncuya bildirim gönderilir. Sistemde genellikle Python tabanlı GUI panelleri de yer alabilir. Bu paneller ile sunucu yöneticisi rekor verilerini kolayca görüntüleyebilir veya sistem ayarlarını değiştirebilir.
Rekor Bildirimi ve Ödüller
Yeni bir rekor kırıldığında oyun içinde genellikle bir bildirim mesajı yayınlanır. Bu mesaj, rekoru kıran oyuncunun adını ve verdiği zarar miktarını içerir. Bazı sunucularda bu rekorla birlikte oyuncuya özel ödüller de verilebilir. Ödüller genellikle oyun içi para, eşya veya özel statüler olabilir. Böylece hem o anki başarı takdir edilir hem de oyuncu tekrar benzer performanslar sergilemesi için motive edilir.
Sistemin Uygulanması ve Geliştirilmesi
Metin2 özel sunucularında bu sistemi uygulamak isteyen geliştiriciler, öncelikle game core üzerinde değişiklik yapmalıdır. Sistem genellikle auth ve game sunucuları arasında veri aktarımı gerektirir. Bu nedenle db core yapılandırması da önemlidir. Sistem genellikle martysama gibi bilinen Metin2 geliştirme platformlarından alınan kaynaklarla geliştirilir. Kaynak kodlar üzerinde gerekli düzenlemeler yapıldıktan sonra sistem derlenir ve sunucuya entegre edilir. Bu süreçte compile işlemleri dikkatle yapılmalıdır.
Sunucu Performansı ve Güvenlik
Sistem tasarlanırken performans etkileri de göz önünde bulundurulmalıdır. Her saldırıda veritabanına yazma işlemi yapılması sunucuyu yavaşlatabilir. Bu nedenle bazı geliştiriciler, rekor kontrolünü belli aralıklarla yapan mekanizmalar geliştirir. Ayrıca sistemde güvenlik açıklarının olmaması için kodlar dikkatle incelenmelidir. Hatalı bir uygulama, oyuncuların sistemde oynamasına veya sunucunun genel performansına zarar verebilir.
Sonuç
Damage Rekor Sistemi, Metin2 özel sunucularında oyuncuların gelişimini teşvik etmek ve PvP atmosferini güçlendirmek için ideal bir özelliktir. Doğru uygulandığında hem oyuncu hem de sunucu yönetimi için faydalı bir sistem haline gelir. Bu tür sistemlerin geliştirilmesi, Metin2 geliştirme dünyasında önemli bir yere sahiptir ve Metin2Dev faaliyetlerine önemli katkılarda bulunur.
What is the Damage Record System in Metin2?
In Metin2 private servers, various systems have been developed to enhance the gaming experience and encourage competition among players. One such system is the Damage Record System. This system tracks the damage dealt by players and rewards those who break records at specific intervals. Particularly in PvP-focused servers, such systems are very important because they directly impact player improvement and motivation.
Purpose of the Damage Record System
This system encourages players to improve their characters in order to deal more damage. It also increases in-game activity, positively affecting server traffic. Through this system, strong players' performances become visible and serve as a reference for other players. This strengthens the competitive environment within the server.
Technical Structure of the System
The Damage Record System is generally integrated into server source codes written in C++. Functions that calculate the damage dealt by the player are monitored, and these data are stored in the database (DB). If the damage amount exceeds a certain threshold, the system saves this record and sends a notification to the player. The system often includes Python-based GUI panels, allowing server administrators to easily view records or modify system settings.
Record Notifications and Rewards
When a new record is broken, a notification message is usually broadcasted in the game. This message includes the name of the player who broke the record and the amount of damage dealt. In some servers, special rewards may be given along with the record. These rewards typically include in-game currency, items, or special titles. This way, both the immediate achievement is acknowledged and the player is motivated to achieve similar performances again.
Implementation and Development of the System
Developers wishing to implement this system on Metin2 private servers must first make modifications to the game core. The system generally requires data transfer between the auth and game servers, making db core configuration important. The system is often developed using sources from known Metin2 development platforms like martysama. After necessary adjustments are made to the source code, the system is compiled and integrated into the server. During this process, compile operations must be handled carefully.
Server Performance and Security
Performance impacts must be considered during the design of the system. Writing to the database after every attack can slow down the server. Therefore, some developers create mechanisms that check for records at specific intervals. Additionally, the code must be carefully reviewed to ensure there are no security vulnerabilities. Incorrect implementation could harm gameplay or the overall server performance.
Conclusion
The Damage Record System is an ideal feature for encouraging player growth and enhancing the PvP atmosphere in Metin2 private servers. When implemented correctly, it becomes beneficial for both players and server administration. Developing such systems holds significant importance in the world of Metin2 development and contributes significantly to Metin2Dev activities.
