GİRİŞ & PROBLEM
Merhaba, bu sefer üstünde çalışacağımız konu aslında önemli, oyuncuların çeşitli PvP (Lonca savaşı, Arena, PvP Event Mapleri vs. -bunlara ek olarak OX ve Düğün mapi de yasaklı haritalar arasında-) maplerinde binek/at kullanmasını engelleyecek veya bir binek/at üzerinde bu haritalara giriş yaptıklarında binekten/attan inmelerini sağlayacağız. Çeşitli yerlerde bununla ilgili pek çok konu olmasına rağmen hiçbiri tam ve eksiksiz bir çözüm sunmuyor dolayısıyla kendi altyapım için yaptığım tüm kontrolleri sizlerle paylaşıyorum.
NEDEN & NELERİ DEĞİŞTİRDİK ?
Özellikle Lonca Savaşları gibi PvP odaklı haritalarda oyuncuların binek/at kullanarak kendine avantaj sağlaması çoğunlukla istenmeyen bir durum, bunun önüne geçmek için doğru yerlere gerekli kontrolleri ekleyeceğiz ve karakterlerin binek/at kullanmasını istemediğimiz haritaları içeren bir fonksiyon oluşturacağız. (Bu fonksiyon içerisine yeni bir case oluşturup, ekstra olarak listeye dahil etmek istediğiniz map index kodunu ekleyebilirsiniz, böylece istediğiniz mapte bu engeli aktif etmeniz çok kolay olacaktır.)
!!! DİKKAT !!!
1- Kendi altyapımda COSTUME_MOUNT sistemini kullanmıyorum, dolayısıyla bu konuyu oluştururken kodları buna göre yazdım o yüzden eğer siz bu sistemi kullanıyorsanız, bu sistemin içine de gerekli kontrolleri eklemeli ve benim verdiğim bazı kontrolleri kendinize göre düzenlemelisiniz (çünkü bazı bölümler eski mount sistemi baz alınarak yazıldı), aksi takdirde doğru veya efektif çalışmayabilir !
2- Anlatım esnasında söylediğim şekilde aradığınız kodun altına veya üstüne (anlatımda hangisini söylemişsem) ekleme yapın, konumları önemli ! Bir çok kod farklı yerleşimlere sahip o yüzden bu rehberi takip ederken altına veya üstüne diye belirttiğim kısımlarda hata yapmadığınıza emin olun..
NASIL YAPILIR ?
Öncelikle "char.h" dosyası açılır.
Sonrasında "char_horse.cpp" dosyası açılır.
Sonrasında "char_item.cpp" dosyası açılır.
Sonrasında "cmd_general.cpp" dosyası açılır.
Sonrasında "cmd_gm.cpp" dosyası açılır.
Sonrasında "input_login.cpp" dosyası açılır.
Sonrasında "questlua_horse.cpp" dosyası açılır.
Sonrasında "questlua_pc.cpp" dosyası açılır.
Src ile işimiz bitti, şimdi SF tarafında düzenleme yapmamız gerek. Öncelikle quest dosyanızı açın ve başta "ride.quest" olmak üzere "ride_xxx.quest" tarzındaki tüm questlerinizi açın ve hepsinde aşağıdaki işlemi yapın.
Son olarak "locale_string.txt" dosyanızı açın.
[/RIGHT]
Merhaba, bu sefer üstünde çalışacağımız konu aslında önemli, oyuncuların çeşitli PvP (Lonca savaşı, Arena, PvP Event Mapleri vs. -bunlara ek olarak OX ve Düğün mapi de yasaklı haritalar arasında-) maplerinde binek/at kullanmasını engelleyecek veya bir binek/at üzerinde bu haritalara giriş yaptıklarında binekten/attan inmelerini sağlayacağız. Çeşitli yerlerde bununla ilgili pek çok konu olmasına rağmen hiçbiri tam ve eksiksiz bir çözüm sunmuyor dolayısıyla kendi altyapım için yaptığım tüm kontrolleri sizlerle paylaşıyorum.
NEDEN & NELERİ DEĞİŞTİRDİK ?
Özellikle Lonca Savaşları gibi PvP odaklı haritalarda oyuncuların binek/at kullanarak kendine avantaj sağlaması çoğunlukla istenmeyen bir durum, bunun önüne geçmek için doğru yerlere gerekli kontrolleri ekleyeceğiz ve karakterlerin binek/at kullanmasını istemediğimiz haritaları içeren bir fonksiyon oluşturacağız. (Bu fonksiyon içerisine yeni bir case oluşturup, ekstra olarak listeye dahil etmek istediğiniz map index kodunu ekleyebilirsiniz, böylece istediğiniz mapte bu engeli aktif etmeniz çok kolay olacaktır.)
!!! DİKKAT !!!
1- Kendi altyapımda COSTUME_MOUNT sistemini kullanmıyorum, dolayısıyla bu konuyu oluştururken kodları buna göre yazdım o yüzden eğer siz bu sistemi kullanıyorsanız, bu sistemin içine de gerekli kontrolleri eklemeli ve benim verdiğim bazı kontrolleri kendinize göre düzenlemelisiniz (çünkü bazı bölümler eski mount sistemi baz alınarak yazıldı), aksi takdirde doğru veya efektif çalışmayabilir !
2- Anlatım esnasında söylediğim şekilde aradığınız kodun altına veya üstüne (anlatımda hangisini söylemişsem) ekleme yapın, konumları önemli ! Bir çok kod farklı yerleşimlere sahip o yüzden bu rehberi takip ederken altına veya üstüne diye belirttiğim kısımlarda hata yapmadığınıza emin olun..
NASIL YAPILIR ?
Öncelikle "char.h" dosyası açılır.
Kod:
// BULUNUR; bool Show (long lMapIndex, long x, long y, long z = LONG_MAX, bool bShowSpawnMotion = false); // HEMEN ÜSTÜNE EKLENİR; bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115
Sonrasında "char_horse.cpp" dosyası açılır.
Kod:
// BULUNUR; bool CHARACTER::StartRiding() // ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!) extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115 // BULUNUR; if (IsPolymorphed()) { ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("변신 상태에서는 말에 탈 수 없습니다.")); return false; } // ALTINA EKLENİR; if (false == IS_RIDEABLE_ZONE (GetMapIndex())) // DevFix 115 { ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return false; } // BULUNUR; if (IsRiding()) { return; } // ALTINA EKLENİR; if (false == IS_RIDEABLE_ZONE (GetMapIndex())) // DevFix 115 { ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return; }
Sonrasında "char_item.cpp" dosyası açılır.
Kod:
// BULUNUR; static bool FN_check_item_socket (LPITEM item) // ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!) static bool IS_MOUNT_ITEM (int MountItemVnum) // DevFix 115 { if ((MountItemVnum >= 52001 && MountItemVnum <= 52120) || (MountItemVnum >= 71114 && MountItemVnum <= 71121)) // Old Mounts. { return true; } switch (MountItemVnum) // New Mounts. { // If you add new mounts in the game, make sure add their vnums here too ! - [MT2Dev Note] - 27/06/2024 case 71124: case 71125: case 71126: case 71127: case 71128: case 71131: case 71132: case 71133: case 71134: case 71137: case 71138: case 71139: case 71140: case 71141: case 71142: case 71161: case 71164: case 71165: case 71166: case 71171: case 71172: case 71176: case 71177: return true; } return false; } bool IS_RIDEABLE_ZONE (int map_index) // DevFix 115 { switch (map_index) { case 64: // 3Way War case 81: // Wedding case 103: // Guild I case 105: // Guild II case 110: // Guild III case 111: // Guild IV case 112: // Duel case 113: // OX case 114: // Sungzi case 121: // Sungzi Snow case 125: // Sungzi Desert case 181: // Empire War I case 182: // Empire War II case 183: // Empire War III return false; } // NOTE: Actually we don't need under this, cuz i already added the map index above, (Except Battle Arena) // but this extras don't hurt anyone so i'm gonna leave it like this. - [MT2Dev Note] - 27/06/2024 // War if (CWarMapManager::instance().IsWarMap (map_index)) { return false; } // Arena if (CArenaManager::instance().IsArenaMap (map_index)) { return false; } // Battle Arena if (CBattleArena::IsBattleArenaMap (map_index)) { return false; } return true; } // BULUNUR; if (false == FN_check_item_sex (this, item)) { ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("성별이 맞지않아 이 아이템을 사용할 수 없습니다.")); return false; } // ALTINA EKLENİR; if (IS_MOUNT_ITEM (item->GetVnum())) // DevFix 115 { if (false == IS_RIDEABLE_ZONE (GetMapIndex())) { ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return false; } }
Sonrasında "cmd_general.cpp" dosyası açılır.
Kod:
// BULUNUR; ACMD (do_user_horse_ride) // ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!) extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115 // ACMD (do_user_horse_ride) İÇERİSİNDE BULUNUR; if (ch->IsDead() || ch->IsStun()) { return; } // ALTINA EKLENİR; if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115 { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return; } // ACMD (do_ride) İÇERİSİNDE BULUNUR; if (ch->IsDead() || ch->IsStun()) { return; } // ALTINA EKLENİR; if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115 { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return; }
Sonrasında "cmd_gm.cpp" dosyası açılır.
Kod:
// BULUNUR; void Command_ApplyAffect (LPCHARACTER ch, const char* argument, const char* affectName, int cmdAffect) // ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!) extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115 // BULUNUR; if (ch->IsHorseRiding()) { ch->StopRiding(); } else { ch->StartRiding(); } // ÜSTÜNE EKLENİR; if (ch->GetGMLevel() < GM_WIZARD) // DevFix 115 { if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return; } } // BULUNUR; ch->HorseSummon (true, true); // ÜSTÜNE EKLENİR; if (ch->GetGMLevel() < GM_WIZARD) // DevFix 115 { if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP")); return; } }
Sonrasında "input_login.cpp" dosyası açılır.
Kod:
// BULUNUR; static void _send_bonus_info (LPCHARACTER ch) // ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!) extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115 // BULUNUR; else if (ch->GetMapIndex() == 113) { if (COXEventManager::instance().Enter (ch) == false) { // Denied entry to OX map.. If player, send to town. - [Ymir Dev Note] if (ch->GetGMLevel() == GM_PLAYER) { ch->WarpSet (EMPIRE_START_X (ch->GetEmpire()), EMPIRE_START_Y (ch->GetEmpire())); } } } // HEMEN BİTİMİNE YENİ BİR ELSE IF BLOĞU OLARAK EKLENİR; else if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115 { if (ch->IsHorseRiding()) { ch->StopRiding(); ch->HorseSummon (false); } // IMPORTANT NOTE: We don't have costume mount system right now, if we add this in the future, we should be change some controls for sure. - [MT2Dev Note] - 28/06/2024 if (ch->GetMountVnum()) { ch->UnEquipSpecialRideUniqueItem(); ch->RemoveAffect (AFFECT_MOUNT); ch->RemoveAffect (AFFECT_MOUNT_BONUS); ch->UpdatePacket(); } }
Sonrasında "questlua_horse.cpp" dosyası açılır.
Kod:
// BULUNUR; extern int (*check_name) (const char* str); // ALTINA EKLENİR; extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115 // BULUNUR; ch->StartRiding(); // ÜSTÜNE EKLENİR; if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115 { return 0; } // BULUNUR; bool bFromFar = lua_isboolean (L, 1) ? lua_toboolean (L, 1) : false; // ÜSTÜNE EKLENİR; if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115 { return 0; }
Sonrasında "questlua_pc.cpp" dosyası açılır.
Kod:
// BULUNUR; namespace quest // ÜSTÜNE EKLENİR; (Classın dışına, dikkat!) extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115 // BULUNUR; int pc_mount (lua_State* L) // FONKSİYONUN İÇİNDE BULUNUR; ch->RemoveAffect (AFFECT_MOUNT); ch->RemoveAffect (AFFECT_MOUNT_BONUS); // ÜSTÜNE EKLENİR; if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115 { return 0; }
Src ile işimiz bitti, şimdi SF tarafında düzenleme yapmamız gerek. Öncelikle quest dosyanızı açın ve başta "ride.quest" olmak üzere "ride_xxx.quest" tarzındaki tüm questlerinizi açın ve hepsinde aşağıdaki işlemi yapın.
Kod:
-- AŞAĞIDAKİ KODU ARAYIN (Tam olarak aynı olmasa da benzer şekilde de bulunabilir); if pc.level < ride_info[vnum][5] then say("") say(gameforge.ride._010_say) say("") else if 112 == pc.get_map_index() then return end -- EĞER BU VEYA BUNA BENZER BİR KOD BULURSANIZ ŞU ŞEKİLDE DÜZENLEYİN; if pc.level < ride_info[vnum][5] then say("") say(gameforge.ride._010_say) say("") else -- Fix for prevent mount&horse in PvP maps. - [MT2Dev Note] - 28/06/2024 local mapIndex = pc.get_map_index() if mapIndex == 64 or mapIndex == 81 or mapIndex == 103 or mapIndex == 105 or mapIndex == 110 or mapIndex == 111 or mapIndex == 112 or mapIndex == 114 or mapIndex == 121 or mapIndex == 125 or mapIndex == 181 or mapIndex == 182 or mapIndex == 183 or mapIndex == 113 then return end
Son olarak "locale_string.txt" dosyanızı açın.
Kod:
"CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"; "<Kontrol> Bu haritada at veya binek kullanamazsınız! ";
Kolay gelsin, MT2Dev.
Metin2'de PvP Haritalarında Binmeyi Engelleme Sistemi (Ride Prevention)
Metin2 özel sunucularında PvP sistemlerini daha adil ve stratejik hale getirmek adına bazı mekanik değişiklikler yapmak oldukça önemlidir. Bu sistemlerden birisi de PvP haritalarında oyuncuların binmelerini (ride) engelleme işlemidir. Bu yazıda, C++ tabanlı bir sistem kullanarak Metin2 özel sunucularında nasıl binme engeli getirebileceğinizi detaylı olarak ele alacağız.
Binmenin PvP'deki Etkileri
Metin2 oyununda binmek, oyuncuların hareket hızlarını ciddi anlamda artırır. Ancak PvP haritalarında bu avantaj, bazı oyuncuların kaçış stratejileriyle savaşmadan avantaj elde etmesine neden olabilir. Bu durum, oyuncu deneyimini olumsuz etkileyebilir. Bu sebeple, bazı haritalarda binmeyi devre dışı bırakmak, dengeli bir PvP deneyimi sunmak için önemlidir.
Sistem Geliştirme Aşaması
Metin2 özel sunucularında binmeyi engellemek için öncelikle game_src üzerinde değişiklik yapmanız gerekir. Binme sistemi genellikle char.cpp, char.h veya char_manager.cpp gibi dosyalarda tanımlıdır. Burada belirli harita numaraları kontrol edilerek binme komutları engellenebilir.
Örnek C++ Kod Yapısı
Aşağıda örnek bir kontrol yapısı sunulmuştur:
Yukarıdaki kodda, belirlenen PvP haritasında oyuncunun binme isteği karşılanmaz ve kullanıcıya bilgi mesajı gönderilir. Bu tür kontroller, horse.cpp, input_main.cpp gibi dosyalarda da yapılabilir.
Harita Tanımı ve Kontrolü
Her haritanın bir numarası vardır. Bu numaralar genellikle locale_inc.h veya benzeri dosyalarda tanımlanır. PvP haritalarınızın numaralarını buradan alabilir ve kodunuzu bu numaralara göre güncelleyebilirsiniz.
Client Tarafında Görsel Engelleme
Sunucu tarafında binme engellenirse bile, client tarafında görsel olarak da engellemek iyi olur. Bu işlem için Python GUI dosyalarında uiscript düzenlemeleri yapılabilir. Binme butonu belirli haritalarda griye alınabilir veya tamamen gizlenebilir.
Test ve Derleme
Değişikliklerinizi yaptıktan sonra server_src klasörünü derlemeniz gerekir. Hatalar olup olmadığını kontrol etmek için bir test ortamı oluşturmanız önerilir. Derleme sırasında hata alınırsa, header dosyalarındaki eksiklikler veya syntax hataları kontrol edilmelidir.
Sonuç
Metin2 özel sunucularında PvP haritalarında binmeyi engelleme sistemi, oyun içi dengeleri korumak ve adil rekabet ortamı sağlamak için oldukça faydalıdır. C++ tabanlı bu tür sistemler, sunucu performansını etkilemeden kolayca entegre edilebilir. Bu sayede hem geliştiriciler hem de oyuncular için daha keyifli bir PvP deneyimi sağlanabilir.
Preventing Ride in PvP Maps (Metin2)
To make PvP systems more fair and strategic in Metin2 private servers, implementing certain mechanical changes is crucial. One of these systems is preventing players from riding mounts in PvP maps. In this article, we will detail how to implement such a mount prevention mechanism using a C++ based system in Metin2 private servers.
Effects of Riding in PvP
In Metin2, riding significantly increases player movement speed. However, in PvP maps, this advantage can lead some players to gain unfair benefits by escaping combat easily. This can negatively impact the overall player experience. Therefore, disabling mounts on certain maps is important for creating balanced PvP gameplay.
System Development Phase
To prevent riding in Metin2 private servers, you need to modify the game_src. The mount system is generally defined in files like char.cpp, char.h, or char_manager.cpp. By checking specific map indices, you can block ride commands in those areas.
Example C++ Code Structure
Below is an example control structure:
In the above code, if the player attempts to mount in the designated PvP map, the action is blocked and a message is sent to the user. Such controls can also be implemented in files like horse.cpp or input_main.cpp.
Map Definition and Control
Each map has an index number. These numbers are usually defined in files like locale_inc.h. You can retrieve your PvP map indices from there and update your code accordingly.
Visual Blocking on Client Side
Even if mounts are blocked server-side, it's good practice to visually disable them on the client side too. This can be achieved by editing uiscript files in Python GUI modules. The mount button can be grayed out or hidden completely in certain maps.
Testing and Compilation
After making changes, you need to compile the server_src folder. It is recommended to set up a test environment to check for errors. If errors occur during compilation, check for missing headers or syntax issues.
Conclusion
Implementing a mount prevention system in PvP maps in Metin2 private servers is highly beneficial for maintaining in-game balance and ensuring fair competition. C++ based systems like this can be integrated easily without affecting server performance. This way, a more enjoyable PvP experience can be provided for both developers and players.
Metin2'de PvP Haritalarında Binmeyi Engelleme Sistemi (Ride Prevention)
Metin2 özel sunucularında PvP sistemlerini daha adil ve stratejik hale getirmek adına bazı mekanik değişiklikler yapmak oldukça önemlidir. Bu sistemlerden birisi de PvP haritalarında oyuncuların binmelerini (ride) engelleme işlemidir. Bu yazıda, C++ tabanlı bir sistem kullanarak Metin2 özel sunucularında nasıl binme engeli getirebileceğinizi detaylı olarak ele alacağız.
Binmenin PvP'deki Etkileri
Metin2 oyununda binmek, oyuncuların hareket hızlarını ciddi anlamda artırır. Ancak PvP haritalarında bu avantaj, bazı oyuncuların kaçış stratejileriyle savaşmadan avantaj elde etmesine neden olabilir. Bu durum, oyuncu deneyimini olumsuz etkileyebilir. Bu sebeple, bazı haritalarda binmeyi devre dışı bırakmak, dengeli bir PvP deneyimi sunmak için önemlidir.
Sistem Geliştirme Aşaması
Metin2 özel sunucularında binmeyi engellemek için öncelikle game_src üzerinde değişiklik yapmanız gerekir. Binme sistemi genellikle char.cpp, char.h veya char_manager.cpp gibi dosyalarda tanımlıdır. Burada belirli harita numaraları kontrol edilerek binme komutları engellenebilir.
Örnek C++ Kod Yapısı
Aşağıda örnek bir kontrol yapısı sunulmuştur:
Kod:
[COLOR=red]if (map_index == MAP_INDEX_PVP_1 || map_index == MAP_INDEX_PVP_2)[/COLOR][BR][/BR]{[BR][/BR] [COLOR=red]ch->ChatPacket(CHAT_TYPE_INFO, 'Bu haritada binek kullanamazsiniz.');[/COLOR][BR][/BR] return;[BR][/BR]}
Yukarıdaki kodda, belirlenen PvP haritasında oyuncunun binme isteği karşılanmaz ve kullanıcıya bilgi mesajı gönderilir. Bu tür kontroller, horse.cpp, input_main.cpp gibi dosyalarda da yapılabilir.
Harita Tanımı ve Kontrolü
Her haritanın bir numarası vardır. Bu numaralar genellikle locale_inc.h veya benzeri dosyalarda tanımlanır. PvP haritalarınızın numaralarını buradan alabilir ve kodunuzu bu numaralara göre güncelleyebilirsiniz.
Client Tarafında Görsel Engelleme
Sunucu tarafında binme engellenirse bile, client tarafında görsel olarak da engellemek iyi olur. Bu işlem için Python GUI dosyalarında uiscript düzenlemeleri yapılabilir. Binme butonu belirli haritalarda griye alınabilir veya tamamen gizlenebilir.
Test ve Derleme
Değişikliklerinizi yaptıktan sonra server_src klasörünü derlemeniz gerekir. Hatalar olup olmadığını kontrol etmek için bir test ortamı oluşturmanız önerilir. Derleme sırasında hata alınırsa, header dosyalarındaki eksiklikler veya syntax hataları kontrol edilmelidir.
Sonuç
Metin2 özel sunucularında PvP haritalarında binmeyi engelleme sistemi, oyun içi dengeleri korumak ve adil rekabet ortamı sağlamak için oldukça faydalıdır. C++ tabanlı bu tür sistemler, sunucu performansını etkilemeden kolayca entegre edilebilir. Bu sayede hem geliştiriciler hem de oyuncular için daha keyifli bir PvP deneyimi sağlanabilir.
Preventing Ride in PvP Maps (Metin2)
To make PvP systems more fair and strategic in Metin2 private servers, implementing certain mechanical changes is crucial. One of these systems is preventing players from riding mounts in PvP maps. In this article, we will detail how to implement such a mount prevention mechanism using a C++ based system in Metin2 private servers.
Effects of Riding in PvP
In Metin2, riding significantly increases player movement speed. However, in PvP maps, this advantage can lead some players to gain unfair benefits by escaping combat easily. This can negatively impact the overall player experience. Therefore, disabling mounts on certain maps is important for creating balanced PvP gameplay.
System Development Phase
To prevent riding in Metin2 private servers, you need to modify the game_src. The mount system is generally defined in files like char.cpp, char.h, or char_manager.cpp. By checking specific map indices, you can block ride commands in those areas.
Example C++ Code Structure
Below is an example control structure:
Kod:
[COLOR=red]if (map_index == MAP_INDEX_PVP_1 || map_index == MAP_INDEX_PVP_2)[/COLOR][BR][/BR]{[BR][/BR] [COLOR=red]ch->ChatPacket(CHAT_TYPE_INFO, 'You cannot use mounts in this map.');[/COLOR][BR][/BR] return;[BR][/BR]}
In the above code, if the player attempts to mount in the designated PvP map, the action is blocked and a message is sent to the user. Such controls can also be implemented in files like horse.cpp or input_main.cpp.
Map Definition and Control
Each map has an index number. These numbers are usually defined in files like locale_inc.h. You can retrieve your PvP map indices from there and update your code accordingly.
Visual Blocking on Client Side
Even if mounts are blocked server-side, it's good practice to visually disable them on the client side too. This can be achieved by editing uiscript files in Python GUI modules. The mount button can be grayed out or hidden completely in certain maps.
Testing and Compilation
After making changes, you need to compile the server_src folder. It is recommended to set up a test environment to check for errors. If errors occur during compilation, check for missing headers or syntax issues.
Conclusion
Implementing a mount prevention system in PvP maps in Metin2 private servers is highly beneficial for maintaining in-game balance and ensuring fair competition. C++ based systems like this can be integrated easily without affecting server performance. This way, a more enjoyable PvP experience can be provided for both developers and players.
