Bana Bu Fikri Veren Can Arkadaşıma Teşekkür Ediyorum. Kendisini Etiketleyemiyorum Ama O Kendisini Biliyor.
Bana Dediği;
"Bir bool Değişken Türü Yapıp Bu Değişkenin Döndürdüğü Duruma Göre Pelerin'de Sorguyu Yap Böylelikle Sunucu Açısından Daha Sağlıklı Olur. "
O Halde Hemen Yapalım.
Öncelikle Bu Konumu Yapın ve Sonra Bu Konu'dan Gerekli Yerleri Düzenleyin:
Hadi Hep Beraber Bir Değişken Tanımlayalım.
GameSource/Char.cpp Açın ve Aratın:
Altına Ekleyin:
Değişkenimizi Tanımladık. Bu Değişkenimiz Bize False ve True Döndüreceği İçin Tanımlarken bool Olarak Tanımlayacağız.
Fakat Bu Değişkeni Bazı Yerlerde True Yada False Olarak Değiştirmem Gerekecek.
Hadi O Halde O Zaman Bunların Tanımlamalarını Yapalım.
GameSource/Char.h Açın ve Aratın:
Üstüne Ekleyin:
Bana Dediği;
"Bir bool Değişken Türü Yapıp Bu Değişkenin Döndürdüğü Duruma Göre Pelerin'de Sorguyu Yap Böylelikle Sunucu Açısından Daha Sağlıklı Olur. "
O Halde Hemen Yapalım.
Öncelikle Bu Konumu Yapın ve Sonra Bu Konu'dan Gerekli Yerleri Düzenleyin:
Hadi Hep Beraber Bir Değişken Tanımlayalım.
GameSource/Char.cpp Açın ve Aratın:
Kod:
m_bDetailLog = false; m_bMonsterLog = false;
Altına Ekleyin:
Kod:
#if defined(ENABLE_ATTRACT_RANGER) m_iAttractRangerFindAffect = false; #endif
Değişkenimizi Tanımladık. Bu Değişkenimiz Bize False ve True Döndüreceği İçin Tanımlarken bool Olarak Tanımlayacağız.
Fakat Bu Değişkeni Bazı Yerlerde True Yada False Olarak Değiştirmem Gerekecek.
Hadi O Halde O Zaman Bunların Tanımlamalarını Yapalım.
GameSource/Char.h Açın ve Aratın:
Kod:
}; /*class CHARACTER : public CEntity, public CFSM, public CHorseRider*/ ESex GET_SEX(LPCHARACTER ch);
Üstüne Ekleyin:
Burada Ne Yapmış Bulunduk?
GetAttractRangerFindAffect() Doğrudan Bize Değişkenimizin Değerini Verecek. (TRUE yada FALSE)
SetAttractRangerAffect(bool affect) İse Argümana Girilecek Değere Göre Değişkenimize Doğrudan Alacağı Değeri Verecek.
Örnek : SetAttractRangerAffect(true) Çıktı: m_iAttractRangerFindAffect = true
Örnek 2 : SetAttractRangerAffect(false) Çıktı: m_iAttractRangerFindAffect = false
Burayı Anladık Şimdi GameSource/Char_İtem.cpp Değiştirelim:
Eski Konuda Eklediğiniz case 72000: Değiştirin:
Eski Konumuzdaki Pelerin case Parçalarının İçine Eklediğimiz Kodu Değiştirin:
Şimdi Buraya Kadar Herşey İyi. Peki Ben Bu Değişkenimize True Değerini Nasıl Vereceğim.
Not: Dilerseniz Bunu case 72000 İçinde de Yapabilirsiniz. Ben Char_Affect.cpp İçinden Yaptım.
Hadi Hep Beraber Char_Affect.cpp Açalım ve Aratın:
Kod:
if (lDuration == 0) { sys_err("Character::AddAffect lDuration == 0 type %d", lDuration, dwType); lDuration = 1; }
Üstüne Ekleyelim:
Şimdi Burada Ne Demek İstedik? Char_İtem.cpp'de 72000 Kodlu İteme Tıkladığımızda AddAffect Veriyoruz Yani AddAffecti Çalıştırmış Oluyoruz.
Peki AddAffectin İlk Argümanı Nedir?
Resimde Görmüş Olduğunuz dwType'dır.
Ben İteme Tıkladım AddAffect(AFFECT_CALL_ARCHER,...,....,....,...)
Sonra Ne Oldu? Char_Affect.cpp İçinde Olan AddAffect Fonksiyonu Çalıştı. Altındaki Kodlara Baka Baka Geliyor Gel Babam Gel Gel Babam Gel Takkkkkk dwType Yani AddAffectin İlk Argümanındaki Sayı Eşit İse Benim Affect.h'deki Sayıma Bu Değişkenimize True Değerini Ver Dedim.
Buraya Kadar Herşeyi İyi. Fakat Bir Sıkıntı Daha Var. Ben Oyuna Her Girdiğimde Bu Değişkenimiz Sürekli İlk Değerini Döndürecekti.
O Nedenle Ne Yapıyoruz?
Char_Affect.cpp İçerisinde Olan LoadAffect Fonksiyonu İçerisinde Arat:
Kod:
if (pElements->bApplyOn >= POINT_MAX_NUM)[/SIZE][/COLOR][/CENTER][/SIZE][/COLOR][/CENTER][/SIZE][/COLOR][/CENTER][/SIZE][/COLOR][/CENTER] [COLOR=rgb(204, 204, 204)][SIZE=4][CENTER][COLOR=rgb(204, 204, 204)][SIZE=4][CENTER][COLOR=rgb(204, 204, 204)][SIZE=4][CENTER][COLOR=rgb(204, 204, 204)][SIZE=4][CENTER] { sys_err("invalid affect data %s ApplyOn %u ApplyValue %d", GetName(), pElements->bApplyOn, pElements->lApplyValue); continue; }
Üstüne Ekle:
Burada Ne Yaptık?
Valla pElements->dwType Buraya Tam Bakmadım Ama Büyük İhtimalle Bu Affectin Sayısı Eşit İse Affect.sql'daki dwType Stünunda Olan Bu Affectin Sayısına
Değişkenimize Tekrar True Değeri Vereceğiz.
Peki Sonra Ben Birşeyi Unuttum Herşeyi Derledim O İyi Güzel /affect_remove ile Affecti Sildim.
İteme Tekrar Tıkladım. Ulan Bu etki zaten devam ediyor Diyor. Nasıl Devam Ediyor Heyy Sildim Ya Dedim.
Ama Ne Fayda. Çünkü Hala Değişkenimizin Değeri True
Hemen Tekrar Char_Affect.cpp'ye Geliyoruz ve Aratıyoruz:
bool CHARACTER::RemoveAffect(CAffect* pkAff, bool single)
İçinde Tekrar Aratıyoruz:
Kod:
CheckMaximumPoints(); if (test_server) sys_log(0, "AFFECT_REMOVE: %s (flag %u apply: %u)", GetName(), pkAff->dwFlag, pkAff->bApplyOn);
Üstüne Ekliyoruz:
Heh Şimdi Oldu. Artık Affectim Silindiği Zaman Değişkenime False Değeri Veriyorum. Böylelikle 72000 Kodlu İteme Tıkladığım Vakit Artık Bu Etki Devam Ediyor Diye Söylenmeyecek.
Buraya Kadar Okuduysanız Teşekkür Ederim. 10 Kere Test Ettim Gayet İyi Çalışıyor.
C++ ile Metin2'de Okçular Dibimde Sistemi Affect Kullanarak Yönetme (Versiyon 2)
Giriş
Metin2 özel sunucularında geliştirme yapan geliştiriciler, oyuncu deneyimini artırmak adına birçok özel mekanik ve sistem geliştirmektedir. Bunlardan birisi de 'Okçular Dibimde Sistemi'dir. Bu sistem, okçu karakterlerin belirli bir mesafe içindeyken düşmanlara otomatik vuruş yapmasını sağlar. Bu yazıda, C++ tabanlı Affect sistemini kullanarak bu özelliğin nasıl entegre edileceğini detaylıca inceleyeceğiz.
Affect Nedir?
Affect, Metin2 oyun motorunda bir karaktere kalıcı ya da geçici olarak bir özellik kazandıran sistemdir. Örneğin, bir karakterin hızı, hasarı veya savunması affect aracılığıyla değiştirilebilir. Bu yapı sayesinde, özel efektler kolayca tanımlanabilir ve yönetilebilir.
Sistem Mimarisi
Bu sistemde, okçuların dibimde etkisi, bir Affect ID ile tanımlanır. Bu ID, oyuncuya belirli bir efekt uygulandığında devreye girer. Bu efekt, oyuncunun etrafındaki rakiplere karşı otomatik saldırı başlatılmasını sağlar.
Kurulum Adımları
1. Affect ID'si tanımlamak için game/src/char_affect.cpp dosyasında gerekli tanımlamalar yapılır.
2. Oyuncuya bu affect uygulanacaksa, SetAffect fonksiyonu üzerinden kontrol sağlanır.
3. ProcessAffect fonksiyonuna özel mantık eklenerek, okçunun dibinde bulunan hedeflere karşı saldırı başlatılır.
4. Hedef tespiti için FindEnemyInRadius gibi yardımcı fonksiyonlar yazılır.
Avantajları
- Oyuncu deneyimini artırır.
- PvP senaryolarında stratejik derinlik katar.
- Geliştiricilere özelleştirme imkanı sunar.
Özet
C++ tabanlı bir Affect sistemi kullanarak 'Okçular Dibimde' özelliğini entegre etmek, Metin2 özel sunucularında hem teknik hem de oynanış açısından önemli gelişmeler sağlar. Bu sistem, doğru şekilde uygulandığında, oyuncuların daha aktif ve stratejik bir oyun tarzı benimsemesini teşvik eder.
Managing Close Range Archer System with Affect in C++ (Version 2)
Introduction
Developers working on custom Metin2 servers often create special mechanics and systems to enhance player experience. One such system is the 'Close Range Archer System'. This system allows archer characters to automatically attack enemies when they are within a certain distance. In this article, we will examine in detail how to implement this feature using the C++ based Affect system.
What is Affect?
Affect is a system in the Metin2 game engine that grants temporary or permanent attributes to a character. For example, a character's speed, damage, or defense can be modified via Affect. This structure allows for easy definition and management of special effects.
System Architecture
In this system, the 'archer close range effect' is defined by an Affect ID. When this effect is applied to a player, it triggers automatic attacks against nearby enemies.
Installation Steps
1. Define the Affect ID by making necessary definitions in game/src/char_affect.cpp.
2. If the affect is to be applied to a player, control is provided through the SetAffect function.
3. Special logic is added to the ProcessAffect function to initiate attacks against targets near the archer.
4. Helper functions like FindEnemyInRadius are written to detect targets.
Benefits
- Enhances player experience.
- Adds strategic depth to PvP scenarios.
- Provides customization opportunities for developers.
Summary
Implementing the 'Close Range Archer' feature using a C++ based Affect system brings significant technical and gameplay improvements to custom Metin2 servers. When properly implemented, this system encourages players to adopt more active and strategic playstyles.
