[C++] Cesaret Pelerini İle Tüm Canavarları Huzursuzlaştırma Sistemi

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
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:


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

161869_13855da6e0bc32193b546aed5525bcc2.png


2: Cesaret Pelerini Kullandıktan Sonra Eğer Canavarlar Huzursuzlaşırsa Verdikleri Hasar

Yazı Sonundaki "damage for 25" (Buradaki 25 Saniyedir.)


161871_71ce77443ef0f20214370f906bb2b28c.png


3: Saniye Bittikten Sonra Tekrar Verdikleri Hasar

161873_de5509132d22cc39444d1feb877156fd.png

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.
 

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

Benzer konular

Geri
Üst Alt