Öldürme İstatistiği[C++]

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 59

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Kullanımı:
Mob ekleyebilirsiniz öldürünce kaç defa öldürdüğünü yazar isteyen /istatistik yazarak bütün öldürme sayılarına ulaşabilirsiniz.Tekrar bakmak için 60 saniye beklemelisiniz.
(Butona'da bağlayabilirsiniz:

1NZdZp.jpg

LQR3RG.jpg

7A1v1W.jpg
Char.h açılır-aratılır:
Kod:
void            StartAffectEvent();
Altına Eklenir;
Kod:
void            Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(int chp_nin_amk);
Char.cpp açılır-sona eklenir;

Kod:
void CHARACTER::Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(int chpkk_nin_amk){     /*     /**         deli degiliz bizde MOB_RANK_BOSS kullanabilirdik         ama sadece boss degilde baska mob eklemek isteyen icin ayirdim..     */     int mob_kodlari[9] = {         2094,         692,         1091,         1092,         1093,         1094,         6091,         792,         6191};     const char* mob_isimleri[9] = {     "Mavi Ejderha",     "Ork Reisi", "Seytan Kral",     "Kibirli Seytan Krali",     "Lusifer",     "Elit Cirkin Seytan Krali",     "Razador",     "Karanlik Hayalet Lider",     "Nemere"     };     //     int     kac_defa_1 = GetQuestFlag("mob.m"), ///mali     kac_defa_2 = GetQuestFlag("mob.a"),     kac_defa_3 = GetQuestFlag("mob.b"),     kac_defa_4 = GetQuestFlag("mob.c"),     kac_defa_5 = GetQuestFlag("mob.d"),     kac_defa_6 = GetQuestFlag("mob.e"),     kac_defa_7 = GetQuestFlag("mob.f"),     kac_defa_8 = GetQuestFlag("mob.g"),     kac_defa_9 = GetQuestFlag("mob.h"),     kac_defa_10= GetQuestFlag("karsi.black"),     kac_defa_11= GetQuestFlag("ayni.black");     //     ///     //char black[61];//bellek     ///     int oduller[*] = {500, 469, 1}; // 1:Yang, 2:Item, 3:Item Adeti.     int odul_kacda_verilsin[*] = {     5, 10, 15, 20, 25, 30, 35, 40, 45, 50     };     if ((     odul_kacda_verilsin[0] ||     odul_kacda_verilsin[1] ||     odul_kacda_verilsin[2] ||     odul_kacda_verilsin[3] ||     odul_kacda_verilsin[4] ||     odul_kacda_verilsin[5] ||     odul_kacda_verilsin[6] ||     odul_kacda_verilsin[7] ||     odul_kacda_verilsin[8]     )     ==     (     GetQuestFlag("mob.m") ||     GetQuestFlag("mob.a") ||     GetQuestFlag("mob.b") ||     GetQuestFlag("mob.c") ||     GetQuestFlag("mob.d") ||     GetQuestFlag("mob.e") ||     GetQuestFlag("mob.f") ||     GetQuestFlag("mob.g") ||     GetQuestFlag("mob.h")     ))     {         /*GiveGold(oduller[0]);         AutoGiveItem(oduller[1], oduller[2]);*/         ///Buralari acma s. belani     }     if (!IsDead());     {              if (chpkk_nin_amk == mob_kodlari[0]){SetQuestFlag("mob.m", GetQuestFlag("mob.m")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[0], (kac_defa_1) + 1);}         else if (chpkk_nin_amk == mob_kodlari[1]){SetQuestFlag("mob.a", GetQuestFlag("mob.a")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[1], (kac_defa_2) + 1);}         else if (chpkk_nin_amk == mob_kodlari[2]){SetQuestFlag("mob.b", GetQuestFlag("mob.b")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[2], (kac_defa_3) + 1);}         else if (chpkk_nin_amk == mob_kodlari[3]){SetQuestFlag("mob.c", GetQuestFlag("mob.c")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[3], (kac_defa_4) + 1);}         else if (chpkk_nin_amk == mob_kodlari[4]){SetQuestFlag("mob.d", GetQuestFlag("mob.d")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[4], (kac_defa_5) + 1);}         else if (chpkk_nin_amk == mob_kodlari[5]){SetQuestFlag("mob.e", GetQuestFlag("mob.e")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[5], (kac_defa_6) + 1);}         else if (chpkk_nin_amk == mob_kodlari[6]){SetQuestFlag("mob.f", GetQuestFlag("mob.f")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[6], (kac_defa_7) + 1);}         else if (chpkk_nin_amk == mob_kodlari[7]){SetQuestFlag("mob.g", GetQuestFlag("mob.g")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[7], (kac_defa_8) + 1);}         else if (chpkk_nin_amk == mob_kodlari[8]){SetQuestFlag("mob.h", GetQuestFlag("mob.h")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, %s %d defa olduruldu."), GetName(), mob_isimleri[8], (kac_defa_9) + 1);}         else if (chpkk_nin_amk ==              61) {SetQuestFlag("karsi.black", GetQuestFlag("karsi.black")+1);ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, karsi krallik oyuncusu %d defa olduruldu."), GetName(), (kac_defa_10) + 1);}         else if (chpkk_nin_amk ==             1461){SetQuestFlag("ayni.black",  GetQuestFlag("ayni.black")+1); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Tebrikler %s, ayni krallik oyuncusu %d defa olduruldu."),     GetName(), (kac_defa_11) + 1);}         else                                                                                                ChatPacket(CHAT_TYPE_INFO, "Noluyo ***");     } }
Char_battle.cpp açılır-aratılır:
Kod:
sys_log(1, "DEAD_BY_PC: %s %p KILLER %s %p", GetName(), this, pkKiller->GetName(), get_pointer(pkKiller));
Altına Eklenir;
Kod:
if (GetEmpire() != pkKiller->GetEmpire())            {                 pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(61);             }             else///black..             {                 pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(1461);             }
Bu Şekilde:
Nk2APk.png

Tekrar Aratılır:
Kod:
sys_log(1, "DEAD_EVENT_CREATE: %s %p %p", GetName(), this, get_pointer(m_pkDeadEvent));     }
Kod Bloğunun altına(})

Kod:
if (true == IsMonster())    {         ///black..         int mob_kodlari[*] = {2493, 692, 1091, 1092, 1093, 1094, 6091, 792, 6191}; //kodlari degisin                   if (mob_kodlari[0] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[0]);         else if (mob_kodlari[1] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[1]);         else if (mob_kodlari[2] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[2]);         else if (mob_kodlari[3] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[3]);         else if (mob_kodlari[4] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[4]);         else if (mob_kodlari[5] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[5]);         else if (mob_kodlari[6] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[6]);         else if (mob_kodlari[7] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[7]);         else if (mob_kodlari[8] == GetMobTable().dwVnum) pkKiller->Canavar_Yolda_Yatmis_Bacagini_Acmis_CHPNIN_AMK_DEMIS(mob_kodlari[8]);     }
cmd.cpp açılır-aratılır:
Kod:
ACMD(do_user_horse_feed);
Altına Eklenir;
Kod:
ACMD(istatistik);
Tekrar Aratılır:
Kod:
{ "respawn",    do_respawn,        0,            POS_DEAD,    GM_WIZARD    },

Altına Eklenir;
Kod:
{ "istatistik",            istatistik,                0,            POS_DEAD,            GM_PLAYER    },
cmd_general.cpp açılır-aratılır:
Kod:
ACMD(do_party_request)
Altına Eklenir;

Kod:
ACMD(istatistik){     int sure[*] = {60}; //sure 60 saniye     const char* mob_isimleri[*] = {"Mavi Ejderha", "Ork Reisi", "Seytan Kral", "Kibirli Seytan Krali", "Lusifer", "Elit Cirkin Seytan Krali", "Razador", "Karanlık Hayalet Lider", "Nemere"};//isimler     int black = ch->GetQuestFlag("black.hobbit");     const char* dialoglar[*] = {"hopp dur lan %d saniye61!"};     if (get_global_time() - black < sure[0]){ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(dialoglar[0]), (sure[0] + black) - get_global_time()); return;}     ///blackdragonx61     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Mavi Ejderha:%d kez."), ch->GetQuestFlag("mob.m"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ork Reisi:%d kez."), ch->GetQuestFlag("mob.a"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Seytan Kral:%d kez."), ch->GetQuestFlag("mob.b"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Kibirli Seytan Krali:%d kez."), ch->GetQuestFlag("mob.c"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Lusifer:%d kez."), ch->GetQuestFlag("mob.d"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Elit Cirkin Seytan Krali:%d kez."), ch->GetQuestFlag("mob.e"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Razador:%d kez."), ch->GetQuestFlag("mob.f"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Karanlik Hayalet Lider:%d kez."), ch->GetQuestFlag("mob.g"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Nemere:%d kez."), ch->GetQuestFlag("mob.h"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Karsi Krallik:%d kez."), ch->GetQuestFlag("karsi.black"));     ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ayni Krallik:%d kez."), ch->GetQuestFlag("ayni.black"));     ch->SetQuestFlag("black.hobbit", get_global_time()); }
locale_string.txt'ye ekleyin:

Öldürme İstatistiği Sistemi Oluşturmak (C++) - Metin2 Private Server Geliştirme


Metin2 özel sunucularında oyun deneyimini artırmak adına geliştirilen sistemlerden biri de öldürme istatistiği sistemidir. Bu sistem sayesinde oyuncuların PvP etkinlikleri takip edilir, istatistiksel olarak analiz edilir ve oyun içi ödüllerle desteklenir. Bu yazıda, C++ tabanlı Metin2 sunucu geliştirme sürecinde nasıl bir öldürme istatistiği sistemi kurulacağını adım adım ele alacağız.

Neden Öldürme İstatistiği Sistemi?

Metin2 gibi MMORPG oyunlarında PvP (Player vs Player) sistemi oyunun çekiciliğini artıran en önemli unsurlardan biridir. Ancak, PvP etkinliklerinin takip edilebilir olması da oyuncuların motivasyonunu artırır. Öldürme istatistiği sistemi sayesinde oyuncular, kaç kez öldürüldüğünü, kimleri öldürdüğünü, hangi eşyalarla öldürdüklerini ve PvP kazançlarını görebilirler. Bu veriler, hem sunucu yöneticileri hem de oyuncular için değerlidir.

C++ ile Sistem Geliştirme Adımları

1. Veritabanı Yapısı Oluşturmak: Öncelikle, öldürmeleri saklayacağımız bir tablo oluşturmalıyız. Bu tabloya örnek olarak kill_log adını verebiliriz. İçeriği şu şekilde olabilir:
- killer_id (katil karakter ID)
- victim_id (mağdur karakter ID)
- kill_time (ölüm zamanı)
- weapon_used (kullanılan silah veya eşya)
- map_index (ölümün gerçekleştiği harita)

2. Game Sunucusuna Entegrasyon: Oyuncu bir başka karakteri öldürdüğünde, bu olayı yakalayıp veritabanına yazacak bir fonksiyon yazılır. Bu işlem genellikle char_battle.cpp dosyasında yapılır. Burada Character::Dead fonksiyonu üzerinde değişiklik yaparak öldürme olayını yakalayabiliriz.

3. Oyuncuya Gösterim: Oyuncuların bu istatistikleri görüntülemesi için bir komut veya GUI arayüzü tasarlanmalıdır. Örneğin, /killstats komutuyla kullanıcı kendi öldürme verilerini görebilir. Bu komut, input_main.cpp dosyasına entegre edilir.

4. Puanlama ve Sıralama Sistemi: Kill sayısına göre sıralama listesi oluşturmak için bir weekly veya monthly tablosu kullanılabilir. Haftalık veya aylık olarak sıralamalar yeniden hesaplanır ve oyunculara özel ödüller verilir.

Python GUI ile İstatistik Paneli (Py Root / Py UI Script)

Metin2 geliştiricileri genellikle Py UI Script ve Py Root kullanarak istatistik paneli oluştururlar. Bu paneller sayesinde oyuncular;
- Toplam öldürme sayısı
- Toplam ölüm sayısı
- Kazanma oranı
- En çok kullanılan silahlar
gibi bilgilere kolayca ulaşabilirler. Py GUI ile tasarlanmış bir panel, kullanıcı dostu ve görsel açıdan etkileyici bir arayüz sağlar.

Güvenlik ve Performans Konuları

Veritabanı sorguları dikkatli yapılmalıdır. Her öldürmede yapılan sorgu, sunucu performansını etkileyebilir. Bu yüzden asenkron sorgular veya toplu kayıt işlemleri tercih edilmelidir. Ayrıca, istatistik verilerinin manipülasyonuna karşı gerekli kontroller yapılmalıdır.

Sonuç

Metin2 özel sunucularında öldürme istatistiği sistemi, oyuncu etkileşimini ve rekabet ortamını ciddi anlamda artırır. C++ ile yazılmış güvenilir bir sistemle, veritabanı bağlantısı kurularak, PvP olayları detaylıca izlenebilir ve oyunculara özel ödüller sunulabilir. Bu tür gelişmiş sistemler, Metin2Dev süreçlerinde önemli yer tutar ve sunucunuzun farklılaşmasını sağlar.


Creating a Kill Statistics System (C++) - Metin2 Private Server Development


Metin2 private servers often implement advanced gameplay features to enhance player experience, one of which is the kill statistics system. This system tracks player PvP activities, analyzes them statistically, and rewards players based on their performance. In this article, we'll walk through step-by-step how to build a kill statistics system using C++ for Metin2 server development.

Why Implement a Kill Statistics System?

PvP (Player versus Player) systems are among the most engaging aspects of MMORPGs like Metin2. However, tracking PvP activity increases player motivation and engagement. With a kill statistics system, players can view how many times they have been killed, who they have defeated, what weapons were used, and their overall PvP gains. This data is valuable for both server administrators and players alike.

Steps to Develop the System in C++

1. Create Database Structure: First, we need to create a table to store kill events. An example table name could be kill_log with columns such as:
- killer_id (ID of the killer character)
- victim_id (ID of the victim character)
- kill_time (time of the kill)
- weapon_used (weapon or item used in the kill)
- map_index (map where the kill occurred)

2. Integrate into Game Server: When a player kills another character, this event must be captured and logged into the database. This is typically done by modifying functions in char_battle.cpp. By hooking into the Character::Dead function, you can capture kill events effectively.

3. Display to Players: A command or GUI interface should be created so that players can view their stats. For instance, typing /killstats could display personal kill statistics. This command would be integrated into input_main.cpp.

4. Scoring and Ranking System: To create leaderboards based on kill counts, you might use weekly or monthly tables that reset periodically and award prizes accordingly.

GUI Statistics Panel Using Python (Py Root / Py UI Script)

Developers often use Py UI Script and Py Root to design a statistics panel. These panels allow players to see:
- Total kills
- Total deaths
- Win ratio
- Most-used weapons
and more. A well-designed Py GUI provides a user-friendly and visually appealing interface.

Security and Performance Considerations

Database queries must be handled carefully. Each kill event triggering a query may impact server performance. Therefore, asynchronous queries or batch logging methods should be considered. Additionally, measures should be implemented to prevent data manipulation.

Conclusion

Implementing a kill statistics system on Metin2 private servers significantly boosts player interaction and competitive atmosphere. With a reliable C++-based system and proper database integration, PvP events can be tracked in detail and rewarded accordingly. Such advanced systems play a key role in Metin2Dev processes and help your server stand out.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt