- Katılım
- 6 Mayıs 2022
- Konular
- 48,291
- Mesajlar
- 48,601
- Tepkime puanı
- 75
- M2 Yaşı
- 3 yıl 11 ay 10 gün
- Trophy Puan
- 48
- M2 Yang
- 488,879
Öncelikle Okçular Dibimde Sistemini Paylaşan Değerli Üyemiz
Onun Paylaşmız Olduğu İşleyiş'te Eğer 72000 Kodlu İtem'i Kullanırsanız AttackRanger(); Fonksiyonun Çalışmasını Sağlarsınız.
Öncelikle Cesaret Pelerini Kullanıp Ardından Canavarlar Yanınıza Geldikten Sonra Bu Sefer 7200 Kodlu İtem'e Tıklayıp Size Uzaktan Vuran Canavarları Dibinize Çağırmış Olacaksınız.
Bu Konuda Şimdi Affect Üzerinden Kullanılmasını Yapacağız.
GameSource/Affect.h Açalım ve Aratın:
AFFECT_QUEST_START_IDX = 1000
Üstüne Ekleyin:
Şimdi Genel İşleyişi Yapalım
GameSource/Char_İtem.cpp Açın ve Aratın:
Üstüne Ekleyin:
Burada Ne Yapmış Bulunduk, 72000 Kodlu İtem'ı Kullandığımızda Eğer Karakterimiz de Bu Affect Var İse "Zaten Bu Efekt Sende Var" Gibi Oyuna Bir Mesaj Göndermesini Sağladık ve İşlemi Anlayacağınız Şekilde Söylemem Gerekirse Sonlandırdık ki; Altındaki Kodların Çalışmasını Engelledik.
Tamam Peki Eğer Karakterde Bu Efekt Yok İse O Zaman AddAffect İle Affect.h'deki Sabit Sayımızı Veriyoruz ve Bu Efektin Karakterde Kalacağı Süreyi İtemin(Protodaki) Value0 Kısmından Almasını İstiyoruz.
Sonra İtemi, Kişinin Var Olan İtem Sayısından 1 Adet Silmesini İstiyoruz.
Buraya Kadar Herşey İyi ve Bu Sayede Efekti Vermiş Olduk.
Şimdi Oyuncu Cesaret Pelerini'ni Kullandığında Eğer Bu Efekt Var İse Ona Uzaktan Vuran Canavarlarıda Dibine Çağırmasını Sağlayalım.
GameSource/Char_İtem.cpp Açın ve Aratın:
Ve Şu Şekilde Değiştirin (Yada Kendinize Göre Düzenleyin)
Sınırsız Cesaret Pelerini Kullanıyorsanız ENABLE_GETCOUNT ve Altındaki endif'e Kadar Silin veya Bu Tanım Sizin CommonDefine'nizde veya Service.h'nizde Varsa ENABLE_GETCOUNT İsmini Değiştirin.
Eğer Cesaret Pelerinin Her Kullandığınızda -1 Adet Silinmesini İstiyorsanız ENABLE_GETCOUNT ve Altındaki endi'i Silin. veya Bu Tanımı CommonDefines'e veya Service.h'ye Ekleyin.
CommonDefines.h veya Service.h Ekleyin:
#define ENABLE_ATTRACT_RANGER
Kusura Bakmayın Her Kesim İçin Açıklayıcı Şekilde Yazıyorum.
Şimdi GameSource Derleyebilirsiniz.
* CLIENT SOURCE *
InstanceBase.h
Üstüne Ekleyelim:
PythonCharacterModule.cpp Açalım ve En Alta Ekleyelim:
PythonApplicationModule.cpp Açalım ve En Alta Ekleyelim:
Locale_inc.h Açın ve Ekleyin:
#define ENABLE_ATTRACT_RANGER
ClientSource Derleyebilirsiniz.
Root/uiAffectShower.py Açın ve Aratın:
Altına Ekleyelim:[/COLOR
Lütfen Buradaki "d:/ymir work/ui/skill/common/affect/call_archer.sub" Sub İsmini Değiştirin
Locale_Game.txt Ekleyin:
Locale_Game -> Bağları Çöz İsmini Dilediğiniz Gibi Değiştirebilirsiniz. Sol Yukarıya Gelen Efektin Üstüne Geldiğinizde Çıkacak Yazı.
Örnek: Bağları Çöz (Kalan Süre: 15 gün)
locale ve root Paketleyip Oyuna Girebilirsiniz.
İtem_Names ve Proto'ya İtemi Eklemeyi Unutmayın. Efektin Karakterde Ne Kadar Sürede Kalacağını İtem'in Value0 Kısmına Eklemeyi Unutmayın.
Saniye Cinsinden Örnek 100 Saniye Kalmasını İstiyorsanız Value0 -> 100
KANIT:
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
Arkadaşımıza Teşekkür Ediyorum.Onun Paylaşmız Olduğu İşleyiş'te Eğer 72000 Kodlu İtem'i Kullanırsanız AttackRanger(); Fonksiyonun Çalışmasını Sağlarsınız.
Öncelikle Cesaret Pelerini Kullanıp Ardından Canavarlar Yanınıza Geldikten Sonra Bu Sefer 7200 Kodlu İtem'e Tıklayıp Size Uzaktan Vuran Canavarları Dibinize Çağırmış Olacaksınız.
Bu Konuda Şimdi Affect Üzerinden Kullanılmasını Yapacağız.
GameSource/Affect.h Açalım ve Aratın:
AFFECT_QUEST_START_IDX = 1000
Üstüne Ekleyin:
Kod:
#if defined(ENABLE_ATTRACT_RANGER) AFFECT_CALL_ARCHER = 757, #endif
Şimdi Genel İşleyişi Yapalım
GameSource/Char_İtem.cpp Açın ve Aratın:
Kod:
case UNIQUE_ITEM_CAPE_OF_COURAGE: case UNIQUE_ITEM_CAPE_OF_COURAGE_ORIGINAL: case REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE:
Üstüne Ekleyin:
Kod:
#if defined(ENABLE_ATTRACT_RANGER) case 72000: { if (FindAffect(AFFECT_CALL_ARCHER)) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BU_ETKI_DEVAM_EDIYOR")); return false; } AddAffect(AFFECT_CALL_ARCHER, POINT_NONE, 0, AFF_NONE, item->GetValue(0), 0, true); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Archers can now come to you.")); item->SetCount(item->GetCount() - 1); } break; #endif
Burada Ne Yapmış Bulunduk, 72000 Kodlu İtem'ı Kullandığımızda Eğer Karakterimiz de Bu Affect Var İse "Zaten Bu Efekt Sende Var" Gibi Oyuna Bir Mesaj Göndermesini Sağladık ve İşlemi Anlayacağınız Şekilde Söylemem Gerekirse Sonlandırdık ki; Altındaki Kodların Çalışmasını Engelledik.
Tamam Peki Eğer Karakterde Bu Efekt Yok İse O Zaman AddAffect İle Affect.h'deki Sabit Sayımızı Veriyoruz ve Bu Efektin Karakterde Kalacağı Süreyi İtemin(Protodaki) Value0 Kısmından Almasını İstiyoruz.
Sonra İtemi, Kişinin Var Olan İtem Sayısından 1 Adet Silmesini İstiyoruz.
Buraya Kadar Herşey İyi ve Bu Sayede Efekti Vermiş Olduk.
Şimdi Oyuncu Cesaret Pelerini'ni Kullandığında Eğer Bu Efekt Var İse Ona Uzaktan Vuran Canavarlarıda Dibine Çağırmasını Sağlayalım.
GameSource/Char_İtem.cpp Açın ve Aratın:
Kod:
case UNIQUE_ITEM_CAPE_OF_COURAGE: case UNIQUE_ITEM_CAPE_OF_COURAGE_ORIGINAL: case REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE: { AggregateMonster();
Ve Şu Şekilde Değiştirin (Yada Kendinize Göre Düzenleyin)
Kod:
case UNIQUE_ITEM_CAPE_OF_COURAGE: case UNIQUE_ITEM_CAPE_OF_COURAGE_ORIGINAL: case REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE: { AggregateMonster(); #if defined(ENABLE_ATTRACT_RANGER) if (FindAffect(AFFECT_CALL_ARCHER)) AttractRanger(); #endif #ifdef ENABLE_GETCOUNT item->SetCount(item->GetCount() - 1); #endif } break;
Sınırsız Cesaret Pelerini Kullanıyorsanız ENABLE_GETCOUNT ve Altındaki endif'e Kadar Silin veya Bu Tanım Sizin CommonDefine'nizde veya Service.h'nizde Varsa ENABLE_GETCOUNT İsmini Değiştirin.
Eğer Cesaret Pelerinin Her Kullandığınızda -1 Adet Silinmesini İstiyorsanız ENABLE_GETCOUNT ve Altındaki endi'i Silin. veya Bu Tanımı CommonDefines'e veya Service.h'ye Ekleyin.
CommonDefines.h veya Service.h Ekleyin:
#define ENABLE_ATTRACT_RANGER
Kusura Bakmayın Her Kesim İçin Açıklayıcı Şekilde Yazıyorum.
Şimdi GameSource Derleyebilirsiniz.
* CLIENT SOURCE *
InstanceBase.h
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
Aratalım:
Kod:
NEW_AFFECT_QUEST_START_IDX = 1000,
Üstüne Ekleyelim:
Kod:
#if defined(ENABLE_ATTRACT_RANGER) AFFECT_CALL_ARCHER = 757, #endif
PythonCharacterModule.cpp Açalım ve En Alta Ekleyelim:
Kod:
#if defined(ENABLE_ATTRACT_RANGER) PyModule_AddIntConstant(poModule, "AFFECT_CALL_ARCHER", CInstanceBase::AFFECT_CALL_ARCHER); #endif
PythonApplicationModule.cpp Açalım ve En Alta Ekleyelim:
Kod:
#ifdef ENABLE_ATTRACT_RANGER PyModule_AddIntConstant(poModule, "ENABLE_ATTRACT_RANGER", true); #else PyModule_AddIntConstant(poModule, "ENABLE_ATTRACT_RANGER", false); #endif
Locale_inc.h Açın ve Ekleyin:
#define ENABLE_ATTRACT_RANGER
ClientSource Derleyebilirsiniz.
Root/uiAffectShower.py Açın ve Aratın:
Kod:
if app.ENABLE_DRAGON_SOUL_SYSTEM: AFFECT_DATA_DICT[chr.NEW_AFFECT_DRAGON_SOUL_DECK1] = (localeInfo.TOOLTIP_DRAGON_SOUL_DECK1, "d:/ymir work/ui/dragonsoul/buff_ds_sky1.tga") AFFECT_DATA_DICT[chr.NEW_AFFECT_DRAGON_SOUL_DECK2] = (localeInfo.TOOLTIP_DRAGON_SOUL_DECK2, "d:/ymir work/ui/dragonsoul/buff_ds_land1.tga")
Altına Ekleyelim:[/COLOR
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
]
Kod:
if app.ENABLE_ATTRACT_RANGER: AFFECT_DATA_DICT[chr.AFFECT_CALL_ARCHER] = (localeInfo.TOOLTIP_AFFECT_CALL_ARCHER, "d:/ymir work/ui/skill/common/affect/call_archer.sub")
Lütfen Buradaki "d:/ymir work/ui/skill/common/affect/call_archer.sub" Sub İsmini Değiştirin
Locale_Game.txt Ekleyin:
Kod:
TOOLTIP_AFFECT_CALL_ARCHER Bağları Çöz SNA
Locale_Game -> Bağları Çöz İsmini Dilediğiniz Gibi Değiştirebilirsiniz. Sol Yukarıya Gelen Efektin Üstüne Geldiğinizde Çıkacak Yazı.
Örnek: Bağları Çöz (Kalan Süre: 15 gün)
locale ve root Paketleyip Oyuna Girebilirsiniz.
İtem_Names ve Proto'ya İtemi Eklemeyi Unutmayın. Efektin Karakterde Ne Kadar Sürede Kalacağını İtem'in Value0 Kısmına Eklemeyi Unutmayın.
Saniye Cinsinden Örnek 100 Saniye Kalmasını İstiyorsanız Value0 -> 100
KANIT:
VİDEO:
1: Efekt Karakter'de Varken
2. Efekt Karakterde Yokken
[C++/Python] Okçular Dibimde Sistemi'ni Affect İle Yönetme
Metin2 özel sunucularında oyun içi deneyimi zenginleştirmek için geliştirilen sistemlerden birisi de 'Okçular Dibimde Sistemi'dir.
Bu sistem sayesinde okçu sınıfına ait karakterlerin yakın dövüş yetenekleri geliştirilerek PvP senaryolarında daha güçlü ve etkili bir rol üstlenmesi sağlanabilir.
Bu yazımızda, C++ ve Python tabanlı sistemler üzerinden 'Okçular Dibimde Sistemi'ni Affect yani statü efekti olarak nasıl yönetebileceğimizi detaylıca ele alacağız.
Sistem Nedir ve Nasıl Çalışır?
Okçular Dibimde Sistemi, okçu karakterlerin menzilli saldırıları sırasında belirli bir mesafe altına düşen rakiplere karşı yakın dövüş bonusu kazanmalarını sağlar.
Bu bonuslar genellikle saldırı gücü, hız artışı veya hasar çarpanı gibi statik değerlerle tanımlanır.
Sistem, oyun içi affect mekanizması ile aktif edilir ve karakterin statüsünde belirli bir süre boyunca etkin kalır.
C++ Tarafında Affect Tanımı
Game sunucusu tarafında C++ kodlama ile affect tanımlamak oldukça kritiktir.
Öncelikle char_affect.h ve char_affect.cpp dosyalarında gerekli affect ID'si tanımlanmalıdır.
Örnek olarak:
AFFECT_OKCU_DIBIMDE = 5000,
Bu ID, karakterin bu efekt ile tanınmasını sağlar.
Daha sonra CHAR::ComputeBattlePoints() fonksiyonuna bu affect'in etkileri eklenmelidir.
Önemli Not: Affect sistemi doğru tanımlanmadığında karakterlerde beklemediğiniz performans düşüklüğü ya da hatalar oluşabilir.
Python Tarafında GUI ve Kullanıcı Etkileşimi
Client tarafında kullanıcıya bu sistemin etkin olduğunu göstermek için Python GUI (UIScript) üzerinde bir status icon veya buff window oluşturulabilir.
root/uiscript/ klasöründe okcu_dibimde.py gibi bir dosya tanımlanarak bu efektin süresi, adı ve açıklaması kullanıcıya gösterilebilir.
Ayrıca, bu efektin ne zaman aktif olduğunu belirtmek için sound effect veya particle effect gibi görsel destekler de eklenebilir.
Affect Yönetimi ve Süre Kontrolü
Oyun içinde affect efektlerinin süresi genellikle tick bazında kontrol edilir.
Bu süreçte, CHAR::UpdateAffect() fonksiyonu sürekli olarak çağrılır ve efekt süresi kontrol edilir.
Efekt süresi dolunca RemoveAffect komutu ile sistemden silinir.
Sistem Güvenliği ve Hile Engelleme
Herhangi bir affect sistemi, doğru şekilde doğrulanmadığı takdirde exploit riski taşır.
Bu nedenle, game server tarafında gelen isteklerin auth server ile senkronize şekilde doğrulanması gerekir.
Ayrıca, packet yapıları üzerinde filtreleme yapılması önerilir.
Sonuç
Okçular Dibimde Sistemi, Metin2 özel sunucularında oyun içi deneyimi artırmak için harika bir özelliktir.
Bu sistemin C++ ve Python tabanlı doğru entegrasyonu, kullanıcı memnuniyetini ve PvP dengesini artırabilir.
Dilerseniz bu sistemi kendi sunucunuza uyarlamak için Metin2Lobby üzerinden bize ulaşabilirsiniz.
[C++/Python] Managing the Archers Beside Me System with Affect
One of the systems developed to enhance the in-game experience on Metin2 private servers is the 'Archers Beside Me System.'
Thanks to this system, close combat abilities of archer-class characters can be enhanced, allowing them to play a more powerful and effective role in PvP scenarios.
In this article, we will detail how to manage the 'Archers Beside Me System' as an affect, i.e., status effect, through C++ and Python-based systems.
What Is The System and How Does It Work?
The Archers Beside Me System allows archer characters to gain close combat bonuses against enemies who come within a certain range during ranged attacks.
These bonuses are typically defined by static values such as attack power, speed increase, or damage multipliers.
The system is activated via the in-game affect mechanism and remains active in the character's status for a certain period of time.
Affect Definition in C++
Defining affect in C++ code on the game server side is critical.
Firstly, the required affect ID must be defined in the char_affect.h and char_affect.cpp files.
As an example:
AFFECT_ARCHER_BESIDE_ME = 5000,
This ID ensures that the character is recognized with this effect.
Then, the effects of this affect must be added into the CHAR::ComputeBattlePoints() function.
Important Note: If the affect system is not correctly defined, unexpected performance drops or errors may occur in characters.
GUI and User Interaction in Python
To show the user that this system is active on the client side, a status icon or buff window can be created in Python GUI (UIScript).
In the root/uiscript/ folder, a file like archer_beside_me.py can be defined to display the duration, name, and description of this effect to the user.
Additionally, visual enhancements such as sound effect or particle effect can be added to indicate when the effect is active.
Affect Management and Time Control
Within the game, the duration of affect effects is usually controlled based on ticks.
During this process, the CHAR::UpdateAffect() function is continuously called and the effect duration is checked.
When the effect duration expires, it is removed from the system with the RemoveAffect command.
System Security and Exploit Prevention
Any affect system carries an exploit risk if not properly validated.
Therefore, requests received must be validated synchronously with the auth server on the game server side.
Moreover, filtering on packet structures is recommended.
Conclusion
The Archers Beside Me System is a great feature to enhance the in-game experience on Metin2 private servers.
Correct integration of this system based on C++ and Python can increase user satisfaction and PvP balance.
If you wish to adapt this system to your own server, you can contact us via Metin2Lobby.
