- Mesaj
- 614
- Çözümler
- 21
- Beğeni
- 501
- Puan
- 829
- Ticaret Puanı
- 0
Merhaba arkadaşlar, geçenlerde ücretli bir yapay zeka ile tüm metin2 dosyalarını client pack source herşeyi tek tek dahil analiz ettirdim ve böyle bir rehber hazırladı. Tek mesaja sığmadığı için birkaç mesaj şeklinde alt kısma ekleyeceğim. İşe yarayıp yaramadığına siz değerli forum üyeleri karar verecektir.
# Metin2 Geliştirici Kılavuzu: Kaynak Kod Analizi
# Metin2 Geliştirici Kılavuzu: Kaynak Kod Analizi ve Sistem Mimarisi
Bu proje, Metin2 oyununun hem sunucu (Server) hem de istemci (Client) tarafındaki kaynak kodlarını (Source Code) detaylı bir şekilde analiz eden, teknik bir eğitim rehberidir. Bir kitap formatında hazırlanan bu dökümantasyon, 7 cilt ve 40 bölümden oluşmaktadır.
##
Cilt 1: Temeller ve Altyapı
* **Bölüm 1:** [Giriş ve Teknolojiler](volume1_altyapi/bolum1_giris.md) - Metin2 Source nedir?
* **Bölüm 2:** [Dizin Yapısı](volume1_altyapi/bolum2_dizin_yapisi.md) - Klasör ve dosya hiyerarşisi.
* **Bölüm 3:** [Ağ ve Paket Yapısı](volume1_altyapi/bolum3_network.md) - Sunucu-Client iletişimi.
* **Bölüm 4:** [Girdi İşleme ve Chat](volume1_altyapi/bolum4_input.md) - Klavye verileri ve sohbet sistemi.
* **Bölüm 5:** [Bağlantı Tanımlayıcıları (DESC)](volume1_altyapi/bolum5_baglanti_tanimlayicilari.md) - Güvenlik ve el sıkışma.
##
Cilt 2: Karakter ve Varlık Sistemi
* **Bölüm 1:** [CHARACTER Sınıfı](volume2_karakter/bolum1_char_sinifi.md) - Oyuncu ve varlık nesnesi.
* **Bölüm 2:** [Savaş Mekanikleri](volume2_karakter/bolum2_savas_mekanikleri.md) - Hasar hesaplama ve savunma.
* **Bölüm 3:** [Eşya Sistemi](volume2_karakter/bolum3_item_sistemi.md) - Item nesnesi ve düşme mantığı.
* **Bölüm 4:** [Beceri Sistemi](volume2_karakter/bolum4_beceri_sistemi.md) - Skill ilerlemesi ve alan hasarı.
* **Bölüm 5:** [Affect Sistemi](volume2_karakter/bolum5_affect_sistemi.md) - Buff ve debuff yönetimi.
* **Bölüm 6:** [CHARACTER_MANAGER](volume2_karakter/bolum6_char_manager.md) - Varlık takibi ve spawn.
* **Bölüm 7:** [Savaş ve Ölüm](volume2_karakter/bolum7_savas_yonetimi.md) - Stun, ölüm ve EXP kaybı.
* **Bölüm 8:** [At ve Binek Sistemi](volume2_karakter/bolum8_at_sistemi.md) - Binicilik mekanikleri.
* **Bölüm 9:** [MobManager](volume2_karakter/bolum9_mob_manager.md) - Canavar veri yapıları ve gruplar.
##
Cilt 3: Dünya ve Harita Dinamikleri
* **Bölüm 1:** [Zindan Sistemi](volume3_dunya/bolum1_zindan_sistemi.md) - Private Map ve kopyalama.
* **Bölüm 2:** [Yapay Zeka (AI)](volume3_dunya/bolum2_yapay_zeka.md) - Canavar agresifliği ve kaçış.
* **Bölüm 3:** [Regen Sistemi](volume3_dunya/bolum3_regen_sistemi.md) - Harita popülasyonu ve doğum.
* **Bölüm 4:** [Harita Koordinatları](volume3_dunya/bolum4_harita_sistemi.md) - Sectree ve global konumlar.
* **Bölüm 5:** [Zindan Yönetimi](volume3_dunya/bolum5_zindan_yonetimi.md) - CDungeon ve yaşam döngüsü.
##
Cilt 4: Sosyal ve Ekonomik Sistemler
* **Bölüm 1:** [Lonca Sistemi](volume4_ekonomi/bolum1_lonca_sistemi.md) - Üyelik, rütbe ve online takibi.
* **Bölüm 2:** [Ticaret ve Güvenlik](volume4_ekonomi/bolum2_ticaret_sistemi.md) - Eşya takası ve anti-dupe.
* **Bölüm 3:** [Privilege Oranları](volume4_ekonomi/bolum3_oran_yonetimi.md) - DROP ve EXP bonusları.
* **Bölüm 4:** [Çevrimdışı Pazar](volume4_ekonomi/bolum4_offline_shop.md) - Offline Shop mimarisi.
* **Bölüm 5:** [Market (Shop) Sistemi](volume4_ekonomi/bolum5_market_sistemi.md) - NPC market ve para akışı.
##
Cilt 5: Görev (Quest) ve Etkinlik Motoru
* **Bölüm 1:** [Quest Motoru ve Lua](volume5_quest/bolum1_quest_motoru.md) - C++ ve Lua entegrasyonu.
* **Bölüm 2:** [PC Lua Köprüsü](volume5_quest/bolum2_quest_lua_pc.md) - Oyuncu yetkileri ve güvenliği.
* **Bölüm 3:** [Zindan Lua Köprüsü](volume5_quest/bolum3_quest_lua_dungeon.md) - Zindan otomasyonu.
* **Bölüm 4:** [Lonca Lua Köprüsü](volume5_quest/bolum4_quest_lua_guild.md) - Lonca savaşları ve liderlik.
##
Cilt 6: İstemci (Client) Mimarisi
* **Bölüm 1:** [Grafik Döngüsü](volume6_client/bolum1_client_mimarisi.md) - Update ve Render döngüsü.
* **Bölüm 2:** [InstanceBase](volume6_client/bolum2_instance_base.md) - Görsel modeller ve zırh kaplama.
* **Bölüm 3:** [Network Stream](volume6_client/bolum3_network_stream.md) - İstemci paket dağıtımı.
* **Bölüm 4:** [Yerdeki Eşyalar](volume6_client/bolum4_yerdeki_esyalar.md) - Ground Items ve fizik.
* **Bölüm 5:** [Efekt Sistemi](volume6_client/bolum5_efekt_sistemi.md) - Görsel efektler ve PVP işaretleri.
* **Bölüm 6:** [Oyuncu Mantığı](volume6_client/bolum6_oyuncu_mantigi.md) - Otomatik saldırı ve statüler.
* **Bölüm 7:** [Sohbet Sistemi](volume6_client/bolum7_sohbet_sistemi.md) - Chat scrolling ve filtreleme.
##
Cilt 7: Veri Yönetimi ve MySQL
* **Bölüm 1:** [Database Yönetimi](volume7_database/bolum1_db_yonetimi.md) - ClientManager ve SQL köprüsü.
* **Bölüm 2:** [Cache Mekanizması](volume7_database/bolum2_cache_mekanizmasi.md) - Performanslı veri saklama.
* **Bölüm 3:** [Proto Okuma](volume7_database/bolum3_proto_okuma.md) - Veri dönüştürme ve proto yazımı.
* **Bölüm 4:** [Giriş İşlemleri](volume7_database/bolum4_giris_islemleri.md) - Login ve karakter seçimi.
* **Bölüm 5:** [Hediye Sistemi](volume7_database/bolum5_hediye_sistemi.md) - ItemAward ve Nesne Market.
---
**Not:** Bu kılavuz Metin2 kaynak kodlarını anlamak isteyen geliştiriciler için hazırlanmıştır. Ticari amaç gütmez.
# Metin2 Geliştirici Kılavuzu: Kaynak Kod Analizi
# Metin2 Geliştirici Kılavuzu: Kaynak Kod Analizi ve Sistem Mimarisi
Bu proje, Metin2 oyununun hem sunucu (Server) hem de istemci (Client) tarafındaki kaynak kodlarını (Source Code) detaylı bir şekilde analiz eden, teknik bir eğitim rehberidir. Bir kitap formatında hazırlanan bu dökümantasyon, 7 cilt ve 40 bölümden oluşmaktadır.
##
Cilt 1: Temeller ve Altyapı* **Bölüm 1:** [Giriş ve Teknolojiler](volume1_altyapi/bolum1_giris.md) - Metin2 Source nedir?
* **Bölüm 2:** [Dizin Yapısı](volume1_altyapi/bolum2_dizin_yapisi.md) - Klasör ve dosya hiyerarşisi.
* **Bölüm 3:** [Ağ ve Paket Yapısı](volume1_altyapi/bolum3_network.md) - Sunucu-Client iletişimi.
* **Bölüm 4:** [Girdi İşleme ve Chat](volume1_altyapi/bolum4_input.md) - Klavye verileri ve sohbet sistemi.
* **Bölüm 5:** [Bağlantı Tanımlayıcıları (DESC)](volume1_altyapi/bolum5_baglanti_tanimlayicilari.md) - Güvenlik ve el sıkışma.
##
Cilt 2: Karakter ve Varlık Sistemi* **Bölüm 1:** [CHARACTER Sınıfı](volume2_karakter/bolum1_char_sinifi.md) - Oyuncu ve varlık nesnesi.
* **Bölüm 2:** [Savaş Mekanikleri](volume2_karakter/bolum2_savas_mekanikleri.md) - Hasar hesaplama ve savunma.
* **Bölüm 3:** [Eşya Sistemi](volume2_karakter/bolum3_item_sistemi.md) - Item nesnesi ve düşme mantığı.
* **Bölüm 4:** [Beceri Sistemi](volume2_karakter/bolum4_beceri_sistemi.md) - Skill ilerlemesi ve alan hasarı.
* **Bölüm 5:** [Affect Sistemi](volume2_karakter/bolum5_affect_sistemi.md) - Buff ve debuff yönetimi.
* **Bölüm 6:** [CHARACTER_MANAGER](volume2_karakter/bolum6_char_manager.md) - Varlık takibi ve spawn.
* **Bölüm 7:** [Savaş ve Ölüm](volume2_karakter/bolum7_savas_yonetimi.md) - Stun, ölüm ve EXP kaybı.
* **Bölüm 8:** [At ve Binek Sistemi](volume2_karakter/bolum8_at_sistemi.md) - Binicilik mekanikleri.
* **Bölüm 9:** [MobManager](volume2_karakter/bolum9_mob_manager.md) - Canavar veri yapıları ve gruplar.
##
Cilt 3: Dünya ve Harita Dinamikleri* **Bölüm 1:** [Zindan Sistemi](volume3_dunya/bolum1_zindan_sistemi.md) - Private Map ve kopyalama.
* **Bölüm 2:** [Yapay Zeka (AI)](volume3_dunya/bolum2_yapay_zeka.md) - Canavar agresifliği ve kaçış.
* **Bölüm 3:** [Regen Sistemi](volume3_dunya/bolum3_regen_sistemi.md) - Harita popülasyonu ve doğum.
* **Bölüm 4:** [Harita Koordinatları](volume3_dunya/bolum4_harita_sistemi.md) - Sectree ve global konumlar.
* **Bölüm 5:** [Zindan Yönetimi](volume3_dunya/bolum5_zindan_yonetimi.md) - CDungeon ve yaşam döngüsü.
##
Cilt 4: Sosyal ve Ekonomik Sistemler* **Bölüm 1:** [Lonca Sistemi](volume4_ekonomi/bolum1_lonca_sistemi.md) - Üyelik, rütbe ve online takibi.
* **Bölüm 2:** [Ticaret ve Güvenlik](volume4_ekonomi/bolum2_ticaret_sistemi.md) - Eşya takası ve anti-dupe.
* **Bölüm 3:** [Privilege Oranları](volume4_ekonomi/bolum3_oran_yonetimi.md) - DROP ve EXP bonusları.
* **Bölüm 4:** [Çevrimdışı Pazar](volume4_ekonomi/bolum4_offline_shop.md) - Offline Shop mimarisi.
* **Bölüm 5:** [Market (Shop) Sistemi](volume4_ekonomi/bolum5_market_sistemi.md) - NPC market ve para akışı.
##
Cilt 5: Görev (Quest) ve Etkinlik Motoru* **Bölüm 1:** [Quest Motoru ve Lua](volume5_quest/bolum1_quest_motoru.md) - C++ ve Lua entegrasyonu.
* **Bölüm 2:** [PC Lua Köprüsü](volume5_quest/bolum2_quest_lua_pc.md) - Oyuncu yetkileri ve güvenliği.
* **Bölüm 3:** [Zindan Lua Köprüsü](volume5_quest/bolum3_quest_lua_dungeon.md) - Zindan otomasyonu.
* **Bölüm 4:** [Lonca Lua Köprüsü](volume5_quest/bolum4_quest_lua_guild.md) - Lonca savaşları ve liderlik.
##
Cilt 6: İstemci (Client) Mimarisi* **Bölüm 1:** [Grafik Döngüsü](volume6_client/bolum1_client_mimarisi.md) - Update ve Render döngüsü.
* **Bölüm 2:** [InstanceBase](volume6_client/bolum2_instance_base.md) - Görsel modeller ve zırh kaplama.
* **Bölüm 3:** [Network Stream](volume6_client/bolum3_network_stream.md) - İstemci paket dağıtımı.
* **Bölüm 4:** [Yerdeki Eşyalar](volume6_client/bolum4_yerdeki_esyalar.md) - Ground Items ve fizik.
* **Bölüm 5:** [Efekt Sistemi](volume6_client/bolum5_efekt_sistemi.md) - Görsel efektler ve PVP işaretleri.
* **Bölüm 6:** [Oyuncu Mantığı](volume6_client/bolum6_oyuncu_mantigi.md) - Otomatik saldırı ve statüler.
* **Bölüm 7:** [Sohbet Sistemi](volume6_client/bolum7_sohbet_sistemi.md) - Chat scrolling ve filtreleme.
##
Cilt 7: Veri Yönetimi ve MySQL* **Bölüm 1:** [Database Yönetimi](volume7_database/bolum1_db_yonetimi.md) - ClientManager ve SQL köprüsü.
* **Bölüm 2:** [Cache Mekanizması](volume7_database/bolum2_cache_mekanizmasi.md) - Performanslı veri saklama.
* **Bölüm 3:** [Proto Okuma](volume7_database/bolum3_proto_okuma.md) - Veri dönüştürme ve proto yazımı.
* **Bölüm 4:** [Giriş İşlemleri](volume7_database/bolum4_giris_islemleri.md) - Login ve karakter seçimi.
* **Bölüm 5:** [Hediye Sistemi](volume7_database/bolum5_hediye_sistemi.md) - ItemAward ve Nesne Market.
---
**Not:** Bu kılavuz Metin2 kaynak kodlarını anlamak isteyen geliştiriciler için hazırlanmıştır. Ticari amaç gütmez.
Metin2Source (Kaynak Kodları), oyunun beynini oluşturan, geliştiriciler tarafından yazılmış ham C++, Python ve Lua dosyalarının bütünüdür. Bu kaynak kodlarına sahip olmak, oyunun her türlü kuralını değiştirebilmek, yeni sistemler eklemek ve hataları kökten çözebilmek anlamına gelir.
## 1.1. Metin2'nin Teknolojik Mirası
Metin2, 2000'li yılların başındaki teknoloji standartlarına göre inşa edilmiştir. Temel bileşenleri şunlardır:
* **Sunucu Tarafı (Server Side):** Tamamen **C++** diliyle yazılmıştır. Nesne yönelimli programlama (OOP) mantığıyla karakterler, eşyalar ve haritalar yönetilir. Veritabanı olarak **MySQL** kullanılır, ancak sunucu hızı için özel bir önbellekleme (Caching) sistemi geliştirilmiştir.
* **İstemci Tarafı (Client Side):** Sunucu ile aynı teknolojide, C++ üzerinde çalışan **EterEngine** motorunu kullanır. Karayüz (UI) ve görev ekranları gibi esnek olması gereken kısımlar **Python** diliyle yazılmış ve C++ ile köprülenmiştir.
* **Görev Sistemi (Quest Engine):** Oyun içi hikayeler ve etkinlik tetikleyicileri için **Lua** dili kullanılır. Lua, C++'ın hızı ile Python'ın esnekliği arasında bir köprü görevi görür.
## 1.2. Neden Source Kodlarına İhtiyaç Duyulur?
Metin2 gibi devasa bir oyunu "Binary" (Yani sadece çalıştırılabilir dosyalarla) yönetmek çok kısıtlıdır. Source kodları şu imkanları sunar:
1. **Güvenlik:** Oyunun paket yapılarını (Network packets) değiştirerek hilelerin önüne geçmek.
2. **Optimizasyon:** Sunucu işlemci ve RAM kullanımını iyileştirerek daha fazla oyuncuyu aynı anda barındırmak.
3. **Modernizasyon:** Oyuna HD doku desteği, yeni simyalar, kuşak sistemleri veya güncel dillerdeki eklentileri entegre etmek.
## 1.3. Geliştirme Ortamı (Compiler)
Metin2 Source dosyalarını derlemek (Compile) için kullanılan standart araçlar:
* **Sunucu:** FreeBSD işletim sistemi üzerinde **gcc** (GNU Compiler Collection).
* **İstemci:** Windows üzerinde **Microsoft Visual Studio**.
* **Veritabanı:** MySQL Server ve yönetim için genellikle **Navicat**.
## 1.4. Bu Kitabın Amacı
Bu rehber, Metin2'nin "Kara Kutusunu" açmayı amaçlar. Kodların arasında kaybolmak yerine, hangi dosyanın hangi amaçla yazıldığını, bir fonksiyonun neden orada olduğunu ve sistemlerin birbirine nasıl bağlandığını adım adım açıklayacağız.
---
**Önemli Uyarı:** Kod üzerinde yapacağınız en küçük bir noktalı virgül (
hatası, sunucunun açılmamasına veya oyuna girerken aniden kapanmalara yol açabilir. Bu yüzden her zaman değişiklik öncesi bir yedek (Backup) bulundurmak, profesyonel Metin2 geliştiriciliğinin ilk kuralıdır.
## 1.1. Metin2'nin Teknolojik Mirası
Metin2, 2000'li yılların başındaki teknoloji standartlarına göre inşa edilmiştir. Temel bileşenleri şunlardır:
* **Sunucu Tarafı (Server Side):** Tamamen **C++** diliyle yazılmıştır. Nesne yönelimli programlama (OOP) mantığıyla karakterler, eşyalar ve haritalar yönetilir. Veritabanı olarak **MySQL** kullanılır, ancak sunucu hızı için özel bir önbellekleme (Caching) sistemi geliştirilmiştir.
* **İstemci Tarafı (Client Side):** Sunucu ile aynı teknolojide, C++ üzerinde çalışan **EterEngine** motorunu kullanır. Karayüz (UI) ve görev ekranları gibi esnek olması gereken kısımlar **Python** diliyle yazılmış ve C++ ile köprülenmiştir.
* **Görev Sistemi (Quest Engine):** Oyun içi hikayeler ve etkinlik tetikleyicileri için **Lua** dili kullanılır. Lua, C++'ın hızı ile Python'ın esnekliği arasında bir köprü görevi görür.
## 1.2. Neden Source Kodlarına İhtiyaç Duyulur?
Metin2 gibi devasa bir oyunu "Binary" (Yani sadece çalıştırılabilir dosyalarla) yönetmek çok kısıtlıdır. Source kodları şu imkanları sunar:
1. **Güvenlik:** Oyunun paket yapılarını (Network packets) değiştirerek hilelerin önüne geçmek.
2. **Optimizasyon:** Sunucu işlemci ve RAM kullanımını iyileştirerek daha fazla oyuncuyu aynı anda barındırmak.
3. **Modernizasyon:** Oyuna HD doku desteği, yeni simyalar, kuşak sistemleri veya güncel dillerdeki eklentileri entegre etmek.
## 1.3. Geliştirme Ortamı (Compiler)
Metin2 Source dosyalarını derlemek (Compile) için kullanılan standart araçlar:
* **Sunucu:** FreeBSD işletim sistemi üzerinde **gcc** (GNU Compiler Collection).
* **İstemci:** Windows üzerinde **Microsoft Visual Studio**.
* **Veritabanı:** MySQL Server ve yönetim için genellikle **Navicat**.
## 1.4. Bu Kitabın Amacı
Bu rehber, Metin2'nin "Kara Kutusunu" açmayı amaçlar. Kodların arasında kaybolmak yerine, hangi dosyanın hangi amaçla yazıldığını, bir fonksiyonun neden orada olduğunu ve sistemlerin birbirine nasıl bağlandığını adım adım açıklayacağız.
---
**Önemli Uyarı:** Kod üzerinde yapacağınız en küçük bir noktalı virgül (
hatası, sunucunun açılmamasına veya oyuna girerken aniden kapanmalara yol açabilir. Bu yüzden her zaman değişiklik öncesi bir yedek (Backup) bulundurmak, profesyonel Metin2 geliştiriciliğinin ilk kuralıdır.Metin2 geliştiriciliğine yeni başlayanların en çok zorlandığı konu, binlerce dosya arasından doğru olanı bulmaktır. Bu bölüm, standart bir Metin2 source projesinin klasör yapısını ve hangi dosyanın nerede bulunduğunu haritasını çıkarır.
## 2.1. Sunucu Source Yapısı (Server/Src)
Sunucu kodları genellikle üç ana klasöre ayrılır:
1. **game:** Oyunun kalbi burasıdır. Savaşlar, ticaret, hareketler, skiller ve tüm oyun mekanikleri burada yazılıdır.
* `src/`: Tüm `.cpp` ve `.h` dosyaları burada toplanır.
* `config.cpp`: Sunucunun `CONFIG` dosyasından okuduğu ayarların (IP, Port, Oranlar) tanımlandığı yerdir.
2. **db:** Veritabanı ile oyun sunucusu arasındaki köprüdür.
* `src/ClientManager.cpp`: MySQL'den veri çekme ve gönderme işlemlerini yönetir.
* `src/ProtoReader.cpp`: `item_proto` ve `mob_proto` dosyalarının okunmasını sağlar.
3. **common:** Hem `game` hem de `db` sunucusunun ortak kullandığı rehber dosyalarıdır.
* `tables.h`: Paketlerin (Packets) ve veritabanı tablolarının yapısını tanımlar.
* `service.h`: Oyununuzun özelliklerini (Örn: `ENABLE_GUILD_DRAGONLAIR`) açıp kapatabileceğiniz anahtarlar buradadır.
## 2.2. İstemci Source Yapısı (Client)
İstemci tarafı, görselleştirme ve kullanıcı arayüzü ile ilgilenir:
1. **UserInterface:** Oyunun başlatıcı (Launcher) ve ana motor kısmıdır.
* `PythonNetworkStream.cpp`: Sunucudan gelen paketlerin Python arayüzüne aktarıldığı merkezdir.
* `InstanceBase.cpp`: 3D modellerin (Zırh, Silah, Saç) karakter üzerinde nasıl duracağını yönetir.
2. **EterLib / EterGrn:** Oyunun grafik motoru (Render) kütüphaneleridir.
3. **SpeedTree:** Haritadaki ağaçların ve bitkilerin rüzgar animasyonlarını yöneten sistemdir.
## 2.3. Python ve Pack Yapısı (Client/Root)
C++ kodları derlendikten sonra, oyunun görsel arayüzü `pack` dosyaları içindeki `.py` dosyalarıyla şekillenir:
* **root.eix/epk:** Oyunun tüm Python mantığı buradadır.
* `game.py`: Oyun penceresindeki klavye/fare tıklamalarını yönetir.
* `uiInventory.py`: Envanter penceresinin tasarımı ve butonlarıdır.
* **locale_tr.eix/epk:** Oyunun dil dosyaları ve eşya isimleri (`item_proto`) burada saklanır.
* **uiscript.eix/epk:** Pencerelerin tasarımları (Butonların yerleri, resim yolları) burada tanımlanır.
## 2.4. Ek Dosyalar ve Araçlar
* **Extern:** C++ projelerinin ihtiyaç duyduğu harici kütüphaneler (Cryptopp, Boost, LZO, Lua).
* **Tools:** DumpProto (Veritabanı dosyalarını kapatmak için) gibi geliştirici araçları.
---
**Geliştirici Notu:** Bir sistem ekleyeceğiniz zaman işe her zaman `common/tables.h` dosyasından başlayın. Önce verinin nasıl saklanacağını belirlemek (Structure), kodun geri kalanını yazarken size rehberlik edecektir. Ayrıca, sunucu tarafında yaptığınız bir paket değişikliğini (`packet.h`), client tarafındaki `packet.h` dosyasına da birebir uygulamayı unutmayın. Aksi takdirde sunucu ve client farklı dillerde konuşmaya başlayacak ve bağlantı kopacaktır.
## 2.1. Sunucu Source Yapısı (Server/Src)
Sunucu kodları genellikle üç ana klasöre ayrılır:
1. **game:** Oyunun kalbi burasıdır. Savaşlar, ticaret, hareketler, skiller ve tüm oyun mekanikleri burada yazılıdır.
* `src/`: Tüm `.cpp` ve `.h` dosyaları burada toplanır.
* `config.cpp`: Sunucunun `CONFIG` dosyasından okuduğu ayarların (IP, Port, Oranlar) tanımlandığı yerdir.
2. **db:** Veritabanı ile oyun sunucusu arasındaki köprüdür.
* `src/ClientManager.cpp`: MySQL'den veri çekme ve gönderme işlemlerini yönetir.
* `src/ProtoReader.cpp`: `item_proto` ve `mob_proto` dosyalarının okunmasını sağlar.
3. **common:** Hem `game` hem de `db` sunucusunun ortak kullandığı rehber dosyalarıdır.
* `tables.h`: Paketlerin (Packets) ve veritabanı tablolarının yapısını tanımlar.
* `service.h`: Oyununuzun özelliklerini (Örn: `ENABLE_GUILD_DRAGONLAIR`) açıp kapatabileceğiniz anahtarlar buradadır.
## 2.2. İstemci Source Yapısı (Client)
İstemci tarafı, görselleştirme ve kullanıcı arayüzü ile ilgilenir:
1. **UserInterface:** Oyunun başlatıcı (Launcher) ve ana motor kısmıdır.
* `PythonNetworkStream.cpp`: Sunucudan gelen paketlerin Python arayüzüne aktarıldığı merkezdir.
* `InstanceBase.cpp`: 3D modellerin (Zırh, Silah, Saç) karakter üzerinde nasıl duracağını yönetir.
2. **EterLib / EterGrn:** Oyunun grafik motoru (Render) kütüphaneleridir.
3. **SpeedTree:** Haritadaki ağaçların ve bitkilerin rüzgar animasyonlarını yöneten sistemdir.
## 2.3. Python ve Pack Yapısı (Client/Root)
C++ kodları derlendikten sonra, oyunun görsel arayüzü `pack` dosyaları içindeki `.py` dosyalarıyla şekillenir:
* **root.eix/epk:** Oyunun tüm Python mantığı buradadır.
* `game.py`: Oyun penceresindeki klavye/fare tıklamalarını yönetir.
* `uiInventory.py`: Envanter penceresinin tasarımı ve butonlarıdır.
* **locale_tr.eix/epk:** Oyunun dil dosyaları ve eşya isimleri (`item_proto`) burada saklanır.
* **uiscript.eix/epk:** Pencerelerin tasarımları (Butonların yerleri, resim yolları) burada tanımlanır.
## 2.4. Ek Dosyalar ve Araçlar
* **Extern:** C++ projelerinin ihtiyaç duyduğu harici kütüphaneler (Cryptopp, Boost, LZO, Lua).
* **Tools:** DumpProto (Veritabanı dosyalarını kapatmak için) gibi geliştirici araçları.
---
**Geliştirici Notu:** Bir sistem ekleyeceğiniz zaman işe her zaman `common/tables.h` dosyasından başlayın. Önce verinin nasıl saklanacağını belirlemek (Structure), kodun geri kalanını yazarken size rehberlik edecektir. Ayrıca, sunucu tarafında yaptığınız bir paket değişikliğini (`packet.h`), client tarafındaki `packet.h` dosyasına da birebir uygulamayı unutmayın. Aksi takdirde sunucu ve client farklı dillerde konuşmaya başlayacak ve bağlantı kopacaktır.
Metin2 Sunucusu (Game) ile İstemcisi (Client) arasındaki tüm iletişim, **Packet (Paket)** adı verilen yapılandırılmış veri blokları üzerinden yürütülür. Bu bölüm, `packet.h` dosyasını temel alarak Metin2'nin "sinir sistemini" her detayıyla analiz eder.
## 3.1. Paket Protokolü Nedir?
Bir paket, sunucuya gönderilen veya sunucudan gelen küçük bir veri paketidir. Her paketin bir **Header (Başlık)** değeri vardır. Bu başlık, paketin ne tür bir işlem olduğunu (hareket, sohbet, envanter güncelleme vb.) belirtir.
Metin2'de 3 ana paket türü vardır:
1. **CG (Client to Game):** Oyuncunun bilgisayarından sunucuya giden emirler.
2. **GC (Game to Client):** Sunucudan oyuncunun ekranına giden güncellemeler.
3. **GG (Game to Game):** Sunucular (CH1, CH2 vb.) arasındaki iç konuşmalar (P2P).
## 3.2. `packet.h` dosyasının Anatomisi
İncelediğimiz `packet.h` dosyasında paketlerin başlıkları `enum` olarak tanımlanmıştır. İşte bazı kritik başlıklar ve anlamları:
### GC (Game to Client) Önemli Başlıklar:
* `HEADER_GC_CHAT (4)`: Sohbet satırlarını istemciye gönderir.
* `HEADER_GC_LOGIN_SUCCESS (6)`: Giriş başarılı olduğunda karakter bilgilerini yollar.
* `HEADER_GC_CHARACTER_UPDATE (19)`: Bir karakterin ekipmanı veya tipi değiştiğinde çevredekilere haber verir.
* `HEADER_GC_ITEM_SET (21)`: Envanterdeki bir slotun içeriğini günceller.
* `HEADER_GC_OFFLINE_SHOP (47)`: (Eklenti) Çevrimdışı pazar verilerini yönetir.
### 3.3. Paketlerin Hafızadaki Yapısı (`#pragma pack(1)`)
Metin2'de paketler `struct` yapıları kullanılarak tanımlanır. En önemli kural şudur: **Paketler arasında boşluk (padding) olmamalıdır.** Bu yüzden `#pragma pack(1)` komutu kullanılır. Bu, işlemcinin veri yapılarını hız için boşluklarla hizalamasını engeller ve verinin "olduğu gibi" internet üzerinden gönderilmesini sağlar.
#### Örnek Analiz: `TPacketGGLogin`
Bu paket, bir oyuncu bir kanala (CH) girdiğinde diğer kanallara "Bu oyuncu buraya girdi" bilgisi verir.
```cpp
typedef struct SPacketGGLogin
{
BYTE bHeader; // Paketin kimliği (HEADER_GG_LOGIN)
char szName[CHARACTER_NAME_MAX_LEN + 1]; // Karakter adı
DWORD dwPID; // Karakterin benzersiz Player ID'si
BYTE bEmpire; // İmparatorluk ID (1: Kırmızı, 2: Sarı, 3: Mavi)
long lMapIndex; // Hangi haritada olduğu
BYTE bChannel; // Hangi kanalda (CH) olduğu
} TPacketGGLogin;
```
Bu paket internet hattında şöyle görünür (basitleştirilmiş):
`[HEADER][MEHMET][P_ID][EMPIRE][MAP][CH]`
## 3.4. Dinamik Boyutlu Paketler
Sabit boyutlu paketler (yukarıdaki gibi) işlenmesi kolaydır. Ancak sohbet mesajları veya lonca isimleri gibi veriler değişken boyutludur. Bu durumda:
1. Önce bir başlık gönderilir.
2. Başlığın hemen ardından verinin uzunluğu (`long lSize`) gönderilir.
3. Son olarak gerçek veri bloğu gönderilir.
**Örnek:** `TPacketGGNotice` (Duyuru paketi)
```cpp
typedef struct SPacketGGNotice
{
BYTE bHeader;
long lSize; // Gelecek olan duyuru metninin karakter sayısı
} TPacketGGNotice;
```
## 3.5. Ağ Akışı ve Input İşleme (Input Main)
Sunucu taraflı `input_main.cpp` dosyası, istemciden gelen paketleri bir `switch-case` döngüsünde karşılar:
1. Paketi oku.
2. Header'a bak (Örn: `HEADER_CG_MOVE`).
3. O başlığa ait fonksiyonu çağır (`AnalyzeMove`).
4. Gelen verileri doğrula (Hız hilesi var mı? Duvar içinden mi geçiyor?).
5. Eğer güvenliyse işlemi onayla.
## Özet ve Dikkat Edilmesi Gerekenler
* Bir paketin boyutunu değiştirdiğinizde, hem **Server Source** hem de **Client Source** tarafında aynı değişikliği yapmalısınız. Aksi takdirde sunucu ile istemci arasındaki "senkronizasyon" bozulur ve oyuncular oyuna girer girmez hata alıp kapanır (**Core/Crash**).
* Paketlerdeki veri türleri (`BYTE`, `WORD`, `DWORD`) boyutları optimize etmek için çok önemlidir. Gereksiz yere `long` kullanmak ağ trafiğini şişirir.
---
*Bu bölüm, Metin2'nin iletişim temelini atmaktadır. Sonraki bölümlerde bu paketlerin `input_main.cpp` içerisinde nasıl işlendiğini daha derin inceleyeceğiz.*
## 3.1. Paket Protokolü Nedir?
Bir paket, sunucuya gönderilen veya sunucudan gelen küçük bir veri paketidir. Her paketin bir **Header (Başlık)** değeri vardır. Bu başlık, paketin ne tür bir işlem olduğunu (hareket, sohbet, envanter güncelleme vb.) belirtir.
Metin2'de 3 ana paket türü vardır:
1. **CG (Client to Game):** Oyuncunun bilgisayarından sunucuya giden emirler.
2. **GC (Game to Client):** Sunucudan oyuncunun ekranına giden güncellemeler.
3. **GG (Game to Game):** Sunucular (CH1, CH2 vb.) arasındaki iç konuşmalar (P2P).
## 3.2. `packet.h` dosyasının Anatomisi
İncelediğimiz `packet.h` dosyasında paketlerin başlıkları `enum` olarak tanımlanmıştır. İşte bazı kritik başlıklar ve anlamları:
### GC (Game to Client) Önemli Başlıklar:
* `HEADER_GC_CHAT (4)`: Sohbet satırlarını istemciye gönderir.
* `HEADER_GC_LOGIN_SUCCESS (6)`: Giriş başarılı olduğunda karakter bilgilerini yollar.
* `HEADER_GC_CHARACTER_UPDATE (19)`: Bir karakterin ekipmanı veya tipi değiştiğinde çevredekilere haber verir.
* `HEADER_GC_ITEM_SET (21)`: Envanterdeki bir slotun içeriğini günceller.
* `HEADER_GC_OFFLINE_SHOP (47)`: (Eklenti) Çevrimdışı pazar verilerini yönetir.
### 3.3. Paketlerin Hafızadaki Yapısı (`#pragma pack(1)`)
Metin2'de paketler `struct` yapıları kullanılarak tanımlanır. En önemli kural şudur: **Paketler arasında boşluk (padding) olmamalıdır.** Bu yüzden `#pragma pack(1)` komutu kullanılır. Bu, işlemcinin veri yapılarını hız için boşluklarla hizalamasını engeller ve verinin "olduğu gibi" internet üzerinden gönderilmesini sağlar.
#### Örnek Analiz: `TPacketGGLogin`
Bu paket, bir oyuncu bir kanala (CH) girdiğinde diğer kanallara "Bu oyuncu buraya girdi" bilgisi verir.
```cpp
typedef struct SPacketGGLogin
{
BYTE bHeader; // Paketin kimliği (HEADER_GG_LOGIN)
char szName[CHARACTER_NAME_MAX_LEN + 1]; // Karakter adı
DWORD dwPID; // Karakterin benzersiz Player ID'si
BYTE bEmpire; // İmparatorluk ID (1: Kırmızı, 2: Sarı, 3: Mavi)
long lMapIndex; // Hangi haritada olduğu
BYTE bChannel; // Hangi kanalda (CH) olduğu
} TPacketGGLogin;
```
Bu paket internet hattında şöyle görünür (basitleştirilmiş):
`[HEADER][MEHMET][P_ID][EMPIRE][MAP][CH]`
## 3.4. Dinamik Boyutlu Paketler
Sabit boyutlu paketler (yukarıdaki gibi) işlenmesi kolaydır. Ancak sohbet mesajları veya lonca isimleri gibi veriler değişken boyutludur. Bu durumda:
1. Önce bir başlık gönderilir.
2. Başlığın hemen ardından verinin uzunluğu (`long lSize`) gönderilir.
3. Son olarak gerçek veri bloğu gönderilir.
**Örnek:** `TPacketGGNotice` (Duyuru paketi)
```cpp
typedef struct SPacketGGNotice
{
BYTE bHeader;
long lSize; // Gelecek olan duyuru metninin karakter sayısı
} TPacketGGNotice;
```
## 3.5. Ağ Akışı ve Input İşleme (Input Main)
Sunucu taraflı `input_main.cpp` dosyası, istemciden gelen paketleri bir `switch-case` döngüsünde karşılar:
1. Paketi oku.
2. Header'a bak (Örn: `HEADER_CG_MOVE`).
3. O başlığa ait fonksiyonu çağır (`AnalyzeMove`).
4. Gelen verileri doğrula (Hız hilesi var mı? Duvar içinden mi geçiyor?).
5. Eğer güvenliyse işlemi onayla.
## Özet ve Dikkat Edilmesi Gerekenler
* Bir paketin boyutunu değiştirdiğinizde, hem **Server Source** hem de **Client Source** tarafında aynı değişikliği yapmalısınız. Aksi takdirde sunucu ile istemci arasındaki "senkronizasyon" bozulur ve oyuncular oyuna girer girmez hata alıp kapanır (**Core/Crash**).
* Paketlerdeki veri türleri (`BYTE`, `WORD`, `DWORD`) boyutları optimize etmek için çok önemlidir. Gereksiz yere `long` kullanmak ağ trafiğini şişirir.
---
*Bu bölüm, Metin2'nin iletişim temelini atmaktadır. Sonraki bölümlerde bu paketlerin `input_main.cpp` içerisinde nasıl işlendiğini daha derin inceleyeceğiz.*
Bir oyuncu tıkladığında veya bir şey yazdığında, bu bilgi sunucuya bir paket olarak ulaşır. Sunucu tarafında bu paketleri karşılayan ve işleyen ana birim `CInputMain` sınıfıdır (`input_main.cpp`). Bu bölüm, oyuncu emirlerinin nasıl denetlendiğini ve filtrelendiğini inceler.
## 4.1. `input_main.cpp`'nin Rolü
Sunucu ağdan bir paket aldığında (Örn: `HEADER_CG_WHISPER`), bu paketi `input_main.cpp` içerisindeki ilgili fonksiyona yönlendirir. Burası oyunun **"Gümrük Kapısı"**dır. Her emir burada şu denetimlerden geçer:
* **Hız Sınırı (Rate Limit):** Oyuncu bu işlemi çok mu hızlı yapıyor? (Flood engelleme)
* **Yetki Kontrolü:** Oyuncunun bu işlemi yapmaya yetkisi var mı?
* **Mesafe Kontrolü:** Oyuncu çok uzaktaki bir NPC ile mi konuşmaya çalışıyor?
## 4.2. Sohbet ve Fısıltı Sistemi (`Whisper`)
Fısıltı paketi işlenirken (`CInputMain::Whisper`) sunucu şu adımları izler:
1. **Engelleme Kontrolü:** Alıcı veya gönderici birbirini engellemiş mi? (`IsBlockMode`)
2. **Mesafe/Durum Kontrolü:** Karakter o an sohbet edebilir durumda mı? (Susturulmuş mu? `AFFECT_BLOCK_CHAT`)
3. **Hedef Bulma:** Alıcı aynı kanaldaysa (`FindPC`), farklı kanaldaysa (`P2P_MANAGER`) bulunur.
4. **İmparatorluk Filtresi:** Eğer imparatorluk dilleri konuşulmuyorsa, rakip imparatorluğun yazıları anlamsız karakterler olarak görünür.
## 4.3. Spam Engelleme Sistemi (`SpamBlockCheck`)
Metin2, sunucuyu yoran ve oyuncuları rahatsız eden mesaj saldırılarını (Chat Spam) otomatik olarak engeller.
* **Spam Puanı:** Her mesajın içeriğine göre bir puanı vardır.
* **Anlık Ceza:** Eğer bir IP adresi belirli bir puanı (`g_uiSpamBlockScore`) aşarsa, `block_chat_by_ip_event` tetiklenir ve o IP belirli bir süre susturulur.
## 4.4. Metin Etiketleri (Text Tags) ve Renkli Yazılar
Metin2'de gördüğünüz renkli isimler veya eşya linkleri (`|Hitem:Vnum|h[İsim]|h`) özel etiketlerdir. Sunucu bu etiketleri `GetTextTag` fonksiyonu ile analiz eder:
* `|cffff0000`: Yazının rengini değiştirir (RGB).
* `|Hitem...|h`: Eşya üzerine tıklandığında özelliklerini gösteren bir **Hyperlink** oluşturur.
* **Cam Küre (Prism) Kontrolü:** Bağırma kanalında eşya yansıtmak bazen "Cam Küre" eşyası gerektirir. Sunucu bunu `ProcessTextTag` içinde kontrol eder ve gerekirse eşyayı envanterden siler.
## 4.5. P2P (Sunucular Arası) İletişim
Eğer fısıltı attığınız kişi farklı bir CH'de ise, mesaj doğrudan ona gidemez. `P2P_MANAGER` devreye girer:
1. Sunucu, mesajı diğer sunuculara (CH2, CH3, CH4) bir **P2P Paketi** olarak yayınlar.
2. Hedef oyuncunun bulunduğu sunucu mesajı alır ve oyuncuya iletir.
3. Bu sayede Metin2'de kanallar arası "Kesintisiz İletişim" sağlanır.
---
**Geliştirici Notu:** Eğer bir sistem eklediyseniz ve çalışmıyorsa (Örn: Bir butona basıyorsunuz ama tepki yok), ilk bakmanız gereken yer `input_main.cpp`'de o butonun gönderdiği paket başlığının (Header) tanımlı olup olmadığıdır.
## 4.1. `input_main.cpp`'nin Rolü
Sunucu ağdan bir paket aldığında (Örn: `HEADER_CG_WHISPER`), bu paketi `input_main.cpp` içerisindeki ilgili fonksiyona yönlendirir. Burası oyunun **"Gümrük Kapısı"**dır. Her emir burada şu denetimlerden geçer:
* **Hız Sınırı (Rate Limit):** Oyuncu bu işlemi çok mu hızlı yapıyor? (Flood engelleme)
* **Yetki Kontrolü:** Oyuncunun bu işlemi yapmaya yetkisi var mı?
* **Mesafe Kontrolü:** Oyuncu çok uzaktaki bir NPC ile mi konuşmaya çalışıyor?
## 4.2. Sohbet ve Fısıltı Sistemi (`Whisper`)
Fısıltı paketi işlenirken (`CInputMain::Whisper`) sunucu şu adımları izler:
1. **Engelleme Kontrolü:** Alıcı veya gönderici birbirini engellemiş mi? (`IsBlockMode`)
2. **Mesafe/Durum Kontrolü:** Karakter o an sohbet edebilir durumda mı? (Susturulmuş mu? `AFFECT_BLOCK_CHAT`)
3. **Hedef Bulma:** Alıcı aynı kanaldaysa (`FindPC`), farklı kanaldaysa (`P2P_MANAGER`) bulunur.
4. **İmparatorluk Filtresi:** Eğer imparatorluk dilleri konuşulmuyorsa, rakip imparatorluğun yazıları anlamsız karakterler olarak görünür.
## 4.3. Spam Engelleme Sistemi (`SpamBlockCheck`)
Metin2, sunucuyu yoran ve oyuncuları rahatsız eden mesaj saldırılarını (Chat Spam) otomatik olarak engeller.
* **Spam Puanı:** Her mesajın içeriğine göre bir puanı vardır.
* **Anlık Ceza:** Eğer bir IP adresi belirli bir puanı (`g_uiSpamBlockScore`) aşarsa, `block_chat_by_ip_event` tetiklenir ve o IP belirli bir süre susturulur.
## 4.4. Metin Etiketleri (Text Tags) ve Renkli Yazılar
Metin2'de gördüğünüz renkli isimler veya eşya linkleri (`|Hitem:Vnum|h[İsim]|h`) özel etiketlerdir. Sunucu bu etiketleri `GetTextTag` fonksiyonu ile analiz eder:
* `|cffff0000`: Yazının rengini değiştirir (RGB).
* `|Hitem...|h`: Eşya üzerine tıklandığında özelliklerini gösteren bir **Hyperlink** oluşturur.
* **Cam Küre (Prism) Kontrolü:** Bağırma kanalında eşya yansıtmak bazen "Cam Küre" eşyası gerektirir. Sunucu bunu `ProcessTextTag` içinde kontrol eder ve gerekirse eşyayı envanterden siler.
## 4.5. P2P (Sunucular Arası) İletişim
Eğer fısıltı attığınız kişi farklı bir CH'de ise, mesaj doğrudan ona gidemez. `P2P_MANAGER` devreye girer:
1. Sunucu, mesajı diğer sunuculara (CH2, CH3, CH4) bir **P2P Paketi** olarak yayınlar.
2. Hedef oyuncunun bulunduğu sunucu mesajı alır ve oyuncuya iletir.
3. Bu sayede Metin2'de kanallar arası "Kesintisiz İletişim" sağlanır.
---
**Geliştirici Notu:** Eğer bir sistem eklediyseniz ve çalışmıyorsa (Örn: Bir butona basıyorsunuz ama tepki yok), ilk bakmanız gereken yer `input_main.cpp`'de o butonun gönderdiği paket başlığının (Header) tanımlı olup olmadığıdır.
Metin2 sunucusuna bağlanan her bir istemci (Client), sunucu tarafında bir `DESC` (Descriptor - Tanımlayıcı) nesnesi ile temsil edilir. Bu nesne, ağ bağlantısının düşük seviyeli yönetiminden, paketlerin şifrelenmesine kadar tüm temel hattı korur. `desc.cpp` dosyası, bu iletişimin güvenli limanıdır.
## 5.1. Bağlantı Kurulumu ve El Sıkışma (Handshake)
Yeni bir bağlantı geldiğinde `Setup` fonksiyonu tetiklenir:
* **IP ve Port Kaydı:** İstemcinin adresi (`m_stHost`) ve kapısı (`m_wPort`) kaydedilir.
* **Bellek Hazırlığı:** Gelen (`Input`) ve giden (`Output`) veriler için tampon bölgeler (Buffers) oluşturulur.
* **Handshake:** Sunucu ve istemci, paket alışverişine başlamadan önce birbirlerini doğrularlar. Bu süreçte paylaşılan gizli bir anahtar (`_handshake`) kullanılır.
## 5.2. Veri Okuma ve Şifre Çözme (`ProcessInput`)
Soketten gelen ham veriler doğrudan işlenemez. Önce şifrelerinin çözülmesi (Decryption) gerekir:
* **TEA Şifrelemesi:** Eski nesil serverlarda `TEA_Decrypt` fonksiyonu kullanılır. Veriler 8 baytlık bloklar halinde çözülür.
* **Gelişmiş Şifreleme:** Modern sistemlerde (`_IMPROVED_PACKET_ENCRYPTION_`) daha karmaşık `cipher` yapıları kullanılır.
* **İşlemciye Sevk:** Şifresi çözülen veri, o anki faza (Login, Game vb.) ait `InputProcessor` sınıfına gönderilerek anlamlandırılır.
## 5.3. Paket Gönderme ve Sıralama (`Packet`)
Sunucu bir paket göndermek istediğinde veriyi doğrudan sokete yazmaz, önce `Packet` fonksiyonuna gönderir:
* **Tamponlama (Buffering):** Eğer gönderilecek veri çok küçükse, işlemci yükünü azaltmak için `m_lpBufferedOutputBuffer` içinde biriktirilir ve tek bir hamlede gönderilir.
* **Şifreleme (Encryption):** Veri istemciye gitmeden hemen önce sunucunun şifreleme anahtarı (`m_adwEncryptionKey`) ile mühürlenir.
* **Büyük Paketler:** Eğer bir lonca logosu veya uzun bir liste gönderiliyorsa, `LargePacket` fonksiyonu ile bellek alanı dinamik olarak genişletilir.
## 5.4. Bağlantı Sağlık Kontrolü: PING ve PONG
Oyuncunun bağlantısının kopup kopmadığını anlamak için her `ping_event_second_cycle` (Genellikle 10 saniye) süresinde bir kontrol yapılır:
* **PING:** Sunucu istemciye bir "Ping" paketi gönderir.
* **PONG:** İstemci bu pakete "Pong" ile cevap vermelidir.
* **Zaman Aşımı:** Eğer belirli bir süre içinde cevap gelmezse, `DESC` nesnesi `PHASE_CLOSE` durumuna alınır ve bağlantı koparılır (Oyuncunun "Karakter Atması").
## 5.5. Röle (Relay) Sistemi
Bazı durumlarda bir paket doğrudan dışarıya değil, başka bir sunucuya (Örn: P2P üzerinden diğer kanallara) iletilmelidir. `HEADER_GG_RELAY` başlığı kullanılan bu sistemde, `m_stRelayName` yardımıyla paketler sunucular arası tünellerden geçer.
---
**Geliştirici Notu:** `desc.cpp` içerisindeki "testtesttesttest" olarak görünen varsayılan şifreleme anahtarları, oyunun güvenliği için en zayıf halkadır. Profesyonel bir sunucuda bu anahtarlar hem sunucu hem de istemci tarafında benzersiz ve karmaşık dizilerle değiştirilmelidir. Aksi takdirde, paket dinleme yazılımları (Sniffers) ile oyuncuların verilerini çalmak çok kolaydır.
## 5.1. Bağlantı Kurulumu ve El Sıkışma (Handshake)
Yeni bir bağlantı geldiğinde `Setup` fonksiyonu tetiklenir:
* **IP ve Port Kaydı:** İstemcinin adresi (`m_stHost`) ve kapısı (`m_wPort`) kaydedilir.
* **Bellek Hazırlığı:** Gelen (`Input`) ve giden (`Output`) veriler için tampon bölgeler (Buffers) oluşturulur.
* **Handshake:** Sunucu ve istemci, paket alışverişine başlamadan önce birbirlerini doğrularlar. Bu süreçte paylaşılan gizli bir anahtar (`_handshake`) kullanılır.
## 5.2. Veri Okuma ve Şifre Çözme (`ProcessInput`)
Soketten gelen ham veriler doğrudan işlenemez. Önce şifrelerinin çözülmesi (Decryption) gerekir:
* **TEA Şifrelemesi:** Eski nesil serverlarda `TEA_Decrypt` fonksiyonu kullanılır. Veriler 8 baytlık bloklar halinde çözülür.
* **Gelişmiş Şifreleme:** Modern sistemlerde (`_IMPROVED_PACKET_ENCRYPTION_`) daha karmaşık `cipher` yapıları kullanılır.
* **İşlemciye Sevk:** Şifresi çözülen veri, o anki faza (Login, Game vb.) ait `InputProcessor` sınıfına gönderilerek anlamlandırılır.
## 5.3. Paket Gönderme ve Sıralama (`Packet`)
Sunucu bir paket göndermek istediğinde veriyi doğrudan sokete yazmaz, önce `Packet` fonksiyonuna gönderir:
* **Tamponlama (Buffering):** Eğer gönderilecek veri çok küçükse, işlemci yükünü azaltmak için `m_lpBufferedOutputBuffer` içinde biriktirilir ve tek bir hamlede gönderilir.
* **Şifreleme (Encryption):** Veri istemciye gitmeden hemen önce sunucunun şifreleme anahtarı (`m_adwEncryptionKey`) ile mühürlenir.
* **Büyük Paketler:** Eğer bir lonca logosu veya uzun bir liste gönderiliyorsa, `LargePacket` fonksiyonu ile bellek alanı dinamik olarak genişletilir.
## 5.4. Bağlantı Sağlık Kontrolü: PING ve PONG
Oyuncunun bağlantısının kopup kopmadığını anlamak için her `ping_event_second_cycle` (Genellikle 10 saniye) süresinde bir kontrol yapılır:
* **PING:** Sunucu istemciye bir "Ping" paketi gönderir.
* **PONG:** İstemci bu pakete "Pong" ile cevap vermelidir.
* **Zaman Aşımı:** Eğer belirli bir süre içinde cevap gelmezse, `DESC` nesnesi `PHASE_CLOSE` durumuna alınır ve bağlantı koparılır (Oyuncunun "Karakter Atması").
## 5.5. Röle (Relay) Sistemi
Bazı durumlarda bir paket doğrudan dışarıya değil, başka bir sunucuya (Örn: P2P üzerinden diğer kanallara) iletilmelidir. `HEADER_GG_RELAY` başlığı kullanılan bu sistemde, `m_stRelayName` yardımıyla paketler sunucular arası tünellerden geçer.
---
**Geliştirici Notu:** `desc.cpp` içerisindeki "testtesttesttest" olarak görünen varsayılan şifreleme anahtarları, oyunun güvenliği için en zayıf halkadır. Profesyonel bir sunucuda bu anahtarlar hem sunucu hem de istemci tarafında benzersiz ve karmaşık dizilerle değiştirilmelidir. Aksi takdirde, paket dinleme yazılımları (Sniffers) ile oyuncuların verilerini çalmak çok kolaydır.
CT;
estroy` tetiklenir ve harita kopyası bellekten silinir.