Herkese Merhaba
Sistemin Çalışma Prensibi Şu Şekilde;
Bölüm 1
1: Cesaret Pelerinine Her Tıkladığımızda "SetRestless" Çalıştırıyoruz.
2: Eğer "unordered_map" İçinde Sakladığı Sürenin İsmiyle Birlikte Değişkenin Süresi Büyük İse Şimdiki Zamandan (STOP)
3: Rastgele Üretilen Sayı(1, 100) Küçük ve Eşit İse 15'den
4: Rastgele Üretilen Sayı(15, 30)
5: SetProtectTime ile Bir İsim ve Bu İsime Değişken Aracığıyla Süre(15, 30) Veriyoruz.
6: "Tüm canavarlar huzursuzlaştı. %d saniye boyunca 2 katı hasar alacaksın."
Bölüm 2
1: Eğer Bir Saldıran Var ve Saldıran "IsPC" değil İse
2: Eğer "unordered_map" İçinde Sakladığı Sürenin İsmiyle Birlikte Değişkenin Süresi Büyük İse Şimdiki Zamandan
3: Gelen Hasara *2 Ekliyoruz.
İşte Kodlarımız:
Char.cpp Açın ve En Alta Ekleyin:
Char.h Açın ve Aratın:
Üstüne Ekleyin:
Char_Battle.cpp Açın ve En Alta Ekleyin:
Tekrar Aratın:
Üstüne Ekleyin:
Char_Item.cpp Açın ve Aratın:
Altına Ekleyin:
CommonDefines veya Service.h Ekleyin:
KANIT:
1: Canavarlar Huzursuzlaşmadan Önce Verdikleri Hasar
Sistemin Çalışma Prensibi Şu Şekilde;
Bölüm 1
1: Cesaret Pelerinine Her Tıkladığımızda "SetRestless" Çalıştırıyoruz.
2: Eğer "unordered_map" İçinde Sakladığı Sürenin İsmiyle Birlikte Değişkenin Süresi Büyük İse Şimdiki Zamandan (STOP)
3: Rastgele Üretilen Sayı(1, 100) Küçük ve Eşit İse 15'den
4: Rastgele Üretilen Sayı(15, 30)
5: SetProtectTime ile Bir İsim ve Bu İsime Değişken Aracığıyla Süre(15, 30) Veriyoruz.
6: "Tüm canavarlar huzursuzlaştı. %d saniye boyunca 2 katı hasar alacaksın."
Bölüm 2
1: Eğer Bir Saldıran Var ve Saldıran "IsPC" değil İse
2: Eğer "unordered_map" İçinde Sakladığı Sürenin İsmiyle Birlikte Değişkenin Süresi Büyük İse Şimdiki Zamandan
3: Gelen Hasara *2 Ekliyoruz.
İşte Kodlarımız:
Char.cpp Açın ve En Alta Ekleyin:
Kod:
#ifdef ENABLE_PROTECTION_TIME void CHARACTER::SetProtectTime(const std::string& flagname, int value) { auto it = m_protection_Time.find(flagname); if (it != m_protection_Time.end()) it->second = value; else m_protection_Time.emplace(flagname, value); } int CHARACTER::GetProtectTime(const std::string& flagname) const { auto it = m_protection_Time.find(flagname); if (it != m_protection_Time.end()) return it->second; return 0; } #endif
Char.h Açın ve Aratın:
Kod:
}; ESex GET_SEX(LPCHARACTER ch);
Üstüne Ekleyin:
Kod:
#ifdef ENABLE_RESTLESS_SYSTEM public: void SetRestless(); #endif #ifdef ENABLE_PROTECTION_TIME public: void SetProtectTime(const std::string& flagname, int value); int GetProtectTime(const std::string& flagname) const; protected: std::unordered_map<std::string, int> m_protection_Time; #endif
Char_Battle.cpp Açın ve En Alta Ekleyin:
Kod:
#ifdef ENABLE_RESTLESS_SYSTEM void CHARACTER::SetRestless() { if (!GetDesc()) { sys_err("CHARACTER::SetRestless: There is no identifier. (name: %s)", GetName()); return; } # ifdef ENABLE_PROTECTION_TIME if (GetProtectTime("restless") > get_global_time()) return; int execution_rate = number (1 , 100); int damage_duration = number (15 , 30); if (execution_rate <= 15) { SetProtectTime("restless", get_global_time() + damage_duration); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("All the monsters became restless. You will take 2x damage for %d."), damage_duration); } # endif } #endif
Tekrar Aratın:
Kod:
if (DAMAGE_TYPE_MAGIC == type) { dam = (int)((float)dam * (100 + (pAttacker->GetPoint(POINT_MAGIC_ATT_BONUS_PER) + pAttacker->GetPoint(POINT_MELEE_MAGIC_ATT_BONUS_PER))) / 100.f + 0.5f); }
Üstüne Ekleyin:
Kod:
#ifdef ENABLE_RESTLESS_SYSTEM if (pAttacker && !pAttacker->IsPC()) { # ifdef ENABLE_PROTECTION_TIME if (GetProtectTime("restless") > get_global_time()) dam *= 2; # endif } #endif
Char_Item.cpp Açın ve Aratın:
Kod:
case UNIQUE_ITEM_CAPE_OF_COURAGE: case 70057: case REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE: AggregateMonster();
Altına Ekleyin:
Kod:
#ifdef ENABLE_RESTLESS_SYSTEM SetRestless(); #endif
CommonDefines veya Service.h Ekleyin:
Kod:
#define ENABLE_RESTLESS_SYSTEM #define ENABLE_PROTECTION_TIME
KANIT:
1: Canavarlar Huzursuzlaşmadan Önce Verdikleri Hasar
2: Cesaret Pelerini Kullandıktan Sonra Eğer Canavarlar Huzursuzlaşırsa Verdikleri Hasar
Yazı Sonundaki "damage for 25" (Buradaki 25 Saniyedir.)
3: Saniye Bittikten Sonra Tekrar Verdikleri Hasar
Metin2 Sunucularında [C++] Cesaret Pelerini İle Tüm Canavarları Huzursuzlaştırma Sistemi
Giriş
Metin2 özel sunucularında geliştirilen sistemlerden biri olan Cesaret Pelerini ile canavarları huzursuzlaştırma mekanizması, oyuncuların PvP ve PvE deneyimini zenginleştirmektedir. Bu sistem sayesinde belirli bir ekipman olan Cesaret Pelerini, sahibinin yakınında bulunan tüm canavarları etkileyerek onları huzursuzlaştırabilir. Bu yazıda, [C++] dilinde yazılmış bir sistem üzerinden bu işlevselliği nasıl entegre edeceğinizi detaylıca inceleyeceğiz.
Sistem Mimarisi
Bu sistem, oyuncu envanterinde belirli bir item (örneğin Cesaret Pelerini) aktif olduğunda, o oyuncunun belirli bir menzilindeki tüm canavarları hedef alır. Canavarlar artık otomatik olarak o oyuncuya saldırır veya onu takip eder. Bu işlem, sunucu tarafında belirlenen bir aralıkta tetiklenir ve canavarların AI yapısı üzerinde küçük değişikliklerle sağlanır.
Kodlama Aşaması
Öncelikle, oyuncunun envanterinde Cesaret Pelerini varsa ve bu item kullanılmışsa, sistem bunu algılamalıdır. Bunun için item_usage.cpp dosyasına özel bir fonksiyon yazılır:
void UseCourageCloak(LPCHARACTER ch, LPITEM item)
{
if (item->GetVnum() == COURAGE_CLOAK_VNUM) {
ch->SetQuestFlag('courage_cloak_active', true);
ch->SendSysMessage('Cesaret Pelerini aktif edildi!');
ActivateMonsterAggro(ch);
}
}
Canavar Huzursuzlaştırma Fonksiyonu[/LEXER]
Aşağıdaki fonksiyon, oyuncunun etrafındaki canavarları hedef almasını sağlar:
void ActivateMonsterAggro(LPCHARACTER ch)
{
int range = 100; // 100 birim mesafe
std::vector<LPCHARACTER> monsters = FindMonstersInRange(ch, range);
for (auto& mon : monsters) {
mon->SetVictim(ch);
mon->StartAttack();
}
}
Sistem Entegrasyonu
Bu sistem, Metin2 server src dosyalarında game_core kısmında düzenlenmelidir. Özellikle CHARACTER_MANAGER.cpp ve questlua.cpp gibi dosyalarda gerekli değişiklikler yapılmalıdır. Ayrıca, DB tarafında da oyuncu flag bilgileri tutulmalıdır. Bu sistem aynı zamanda client tarafından da desteklenmelidir. Uygun efektler, animasyonlar ve UI uyarıları eklenmelidir.
Test ve Performans
Sistemin test aşamasında, farklı harita tiplerinde, farklı NPC türlerinde ve yüksek oyuncu yoğunluğunda çalışıp çalışmadığı kontrol edilmelidir. Performans açısından, her canavar için ayrı ayrı işlem yapılmaması için optimize edilmiş fonksiyonlar yazılmalıdır. Özellikle çok oyunculu ortamlarda hafızada fazla yer kaplamaması için event-driven yapılar kullanılmalıdır.
Sonuç
Cesaret Pelerini sistemi, Metin2 özel sunucularında dikkat çeken ve oyuncuların ilgisini çekebilecek keyifli bir mekanik sunar. Oyuncuların stratejik planlamasını teşvik ederken, PvP ve PvE arasında bir köprü kurar. [C++] tabanlı bu sistem, doğru implementasyon ile Metin2 sunucularınızda güçlü bir fark yaratabilir.
[C++] System for Agitating All Monsters with the Cloak of Courage in Metin2
Introduction
The Cloak of Courage monster agitation mechanism is one of the systems developed for Metin2 private servers, enriching players' PvP and PvE experiences. With this system, a specific equipment item, the Cloak of Courage, can agitate all nearby monsters upon activation by its owner. In this article, we will examine in detail how to integrate this functionality through a [C++] coded system.
System Architecture
When the Cloak of Courage item is active in the player's inventory, all monsters within a certain radius will be targeted. The monsters will start attacking or following that player automatically. This process is triggered at a specified interval on the server side and achieved with minor modifications to the AI structure of the monsters.
Coding Phase
Firstly, the system must detect when the Cloak of Courage is present in the player's inventory and used. A custom function should be added to the item_usage.cpp file:
void UseCourageCloak(LPCHARACTER ch, LPITEM item)
{
if (item->GetVnum() == COURAGE_CLOAK_VNUM) {
ch->SetQuestFlag('courage_cloak_active', true);
ch->SendSysMessage('Cloak of Courage activated!');
ActivateMonsterAggro(ch);
}
}
Monster Agitation Function
The following function targets nearby monsters around the player:
void ActivateMonsterAggro(LPCHARACTER ch)
{
int range = 100; // 100 unit distance
std::vector<LPCHARACTER> monsters = FindMonstersInRange(ch, range);
for (auto& mon : monsters) {
mon->SetVictim(ch);
mon->StartAttack();
}
}
System Integration
This system must be edited within the game_core section of Metin2 server source files. Necessary modifications should be made in files such as CHARACTER_MANAGER.cpp and questlua.cpp. Additionally, player flag information must be stored in the database. The system also needs to be supported by the client. Appropriate effects, animations, and UI notifications should be added.
Testing and Performance
During the testing phase, the system’s behavior across different map types, various NPC types, and under high player loads must be checked. For performance, optimized functions must be written so that each monster isn’t processed individually. Event-driven structures are recommended to avoid excessive memory usage, especially in multiplayer environments.
Conclusion
The Cloak of Courage system offers an engaging and attention-grabbing mechanic for Metin2 private servers. While encouraging strategic planning among players, it bridges PvP and PvE. Implemented correctly, this [C++]-based system can create a significant difference in your Metin2 server.
