Anlatım Tamamen Bana Aittir.
DungeonInfo Sisteminden Örnek Vereceğim.
Benim DungeonInfo Sistemim'de Zindan Süre Sıfırlama Buton İle Yapılıyor.
self.dungeonIndex İsimli Bir Tanımlamam Var. Bu Tanımlama DungeonInfo'daki Butonlara Bastığımda Bana Bir Sayı Verir.
Örneğin : Zodyak Tapınağı-> self.dungeonIndex = 0 , Ork Labirenti-> self.dungeonIndex = 1
(Zindan Süre Sıfırlama Butonunu Nasıl Yaptım Gibi İşlemleri Anlatmayacağım.)
Geçelim İşin Özüne;
Zodyak Tapınağı Butonuna Basıyorum ve Ardından Zindan Süre Sıfırlama Butonuna Bastığımda ClientSource/PythonNetworkStreamModule.cpp'deki Modül Dizisindeki Fonksiyonu Kullanmasını Söylüyorum.
net.DungeonInfoResetTime(self.dungeonIndex)
DungeonInfo Sisteminden Örnek Vereceğim.
Benim DungeonInfo Sistemim'de Zindan Süre Sıfırlama Buton İle Yapılıyor.
self.dungeonIndex İsimli Bir Tanımlamam Var. Bu Tanımlama DungeonInfo'daki Butonlara Bastığımda Bana Bir Sayı Verir.
Örneğin : Zodyak Tapınağı-> self.dungeonIndex = 0 , Ork Labirenti-> self.dungeonIndex = 1
(Zindan Süre Sıfırlama Butonunu Nasıl Yaptım Gibi İşlemleri Anlatmayacağım.)
Geçelim İşin Özüne;
Zodyak Tapınağı Butonuna Basıyorum ve Ardından Zindan Süre Sıfırlama Butonuna Bastığımda ClientSource/PythonNetworkStreamModule.cpp'deki Modül Dizisindeki Fonksiyonu Kullanmasını Söylüyorum.
net.DungeonInfoResetTime(self.dungeonIndex)
Argüman Olarak self.dungeonIndex Alıyor. (self.dungeonIndex Ne İşe Yaradığını Yukarıda Anlattım.)
Şimdi Gelelim PythonNetworkStreamModule.cpp'ye
BYTE Veri Tipinde Bir Tanımlama Yapıyorum. Karşısına Bir Değer Yazmıyorum Çünkü Değerin Kullanıcıdan Gelmesini İstiyorum.
Bu Tanımlama Benim 1.Argümanım ve Zaten 1 Tane Argümanımız Var.
if (!PyTuple_GetByte(poArgs, 0, &dungeonIdx)) = Buradaki 0 Aslında 1.ci Argümanımız. 2.ci Bir Argümanımız Olsaydı Yeni Bir Tanımlama Yapıp Veri Tipine Göre Tuplemimizi Alıp İçine 1 Yazacaktık.
rkNetStream.DungeonInfoResetTime(dungeonIdx);
CPythonNetworkStream Sınıfından Bir Fonksiyona Göndereceğimizi Söylüyoruz Argüman İle Birlikte.
O Fonksiyona Geldik.
Bir struct Türünde Yapımız Var ve Bu Yapımızın Değişkeni ve Elemenları Var. Küçük P ise Bu Değişkeni Temsil Ediyor.
Ayrıca Tanımlaması + Ek
Packet.h
Burada Client Artık Game'ye Gönderiyor. Gelelim Game Tarafına
ClientSource/Packet.h 'deki Olayı Game/Packet.h'de Anlatmayacağım Bir Fark Yok. Copy - Paste
GameSource/InputMain.cpp
Client'den Gelen Paketimiz. Paket Çalıştığında Nelerin Olacağını, Altta Bir Fonksiyona Göndereceğimizi Söylüyoruz.
Burada DungeonInfo Sınıfından DungeonInfoResetTime İsimli Bir Fonksiyonu Çalıştıracağımı ve Argümanı Olarak LPCHARACTER Sınıfının ve Packet.h'deki Struct Yapımızdan dungeonIdx isimli Elemanı Alacağımı Söylüyorum.
Gelelim DungeonInfo.cpp'ye
Karakter Ölü İse ve ClientSourceden Gelen Sayının 0'dan Küçük ve 16'dan Büyük ise İşlemin Durdurulmasını Söylüyorum.
(Daha Farklı Engeller Var Konu Uzamasın Diye Bu Kadarını Gösteriyorum.)
71129 Vnumlu İtem Envanterimde Yok ise Hata Mesajı Vermesini ve İşlemi Durdurmasını Söylüyorum.
1 Adet Sabit Tanımlı std::string Türü ve flag_dungeon ismini veriyorum.
İçeriğinden Örnek:
Sabitler İçin DungeonInfo.h
Burada flag_dungeon Dizisindeki Sayıları Client'den Gelen dungeonIdx = idx Sayısına Karşılık Belirtiyorum. ve Burada Süre Kontrolü Yapıyorum.
Örneğin: Client'den Gelen idx == 6 'ya Dizideki 6.cı Diziyi Alacak.
Burada İtemi Sildiriyorum, SetQuestFlag İle Süreyi Sıfırlıyorum ve Oyuna Zindan Süresinin Sıfırlandığını Söyleyen Bir Mesaj Gönderiyorum.
Bu Pencerede Anlık Yenilenmez. Anlık Yenilenmesi İçin Client Tarafına Tekrar Bir Paket Göndermeniz Gerekir. Fakat Işınlandığınızda Pencere'de Güncellenecektir.
Tekrar Client Tarafına Gönderimi'de Ekleyeceğim.
packet_info.cpp
İnput.h
DungeonInfo.h
KANIT:
C++ ile Metin2 Client-Game Paket Transferi Nedir?
Metin2 özel sunucu geliştirme sürecinde, client-server iletişim sistemi hayati öneme sahiptir. Bu iletişim, oyuncuların gerçekleştirdiği eylemleri sunucuya iletmek ve sunucudan gelen verileri ekranda göstermek için kullanılır. Bu veri aktarımı genellikle paketler (packets) aracılığıyla gerçekleşir. Bu yazıda, C++ tabanlı Metin2 istemcisi ile oyun sunucusu arasında nasıl bir paket transferi yapıldığına dair detaylı bilgiler sunacağız.
Paket Yapısı ve Tanımlamalar
Metin2 client-game iletişimi genellikle TCP üzerinden yapılır ve her paket belirli bir yapıya sahiptir. Bir paket genellikle başlık (header), uzunluk (size) ve veri (data) kısmından oluşur. Bu yapılar genellikle C++ struct yapısı ile tanımlanır. Örneğin:
Kod:
[COLOR=#9365b8]struct TPacketGCChat[/COLOR]
Kod:
{
Kod:
BYTE header;
Kod:
WORD size;
Kod:
char msg[CHAT_MAX_LEN];
Kod:
};
Client Tarafında Paket Gönderimi
Client tarafında bir eylem gerçekleştiğinde, örneğin oyuncu bir mesaj yazıp gönderdiğinde, bu bilgi bir paket olarak sunucuya gönderilir. Bu işlem genellikle CNetworkStream::Send() fonksiyonu ile gerçekleştirilir. Bu fonksiyon, paketi doğrudan sunucuya gönderir. Paketler genellikle byte dizisi halinde hazırlanır ve ağ üzerinden aktarılır.
Sunucu Tarafında Paket Alma ve İşleme
Sunucu tarafında, gelen paketler CInputQueue gibi sınıflar tarafından alınır ve işlenir. Sunucu, paketin başlığına göre hangi işlemi yapması gerektiğini anlar. Örneğin, sohbet mesajı geldiğinde HEADER_GC_CHAT başlığı kontrol edilir ve ilgili işlem başlatılır.
Paket Güvenliği ve Doğrulama
Güvenlik açısından, tüm paketlerin doğrulanması önemlidir. Paketlerin boyutları, içerikleri ve kimden geldiği gibi bilgiler kontrol edilmelidir. Aksi takdirde, sunucu hack saldırılarına açık hale gelir. Checksum mekanizmaları veya şifreleme algoritmaları kullanılabilir.
Özel Paket Oluşturma
Metin2 özel sunucularında yeni özellikler eklemek isteyen geliştiriciler, kendi özel paketlerini tanımlayabilir. Bu paketlerin hem client hem de server tarafında tanımlanması gerekir. Paket numaraları çakışmamalıdır ve genellikle 0x00 ile 0xFF arasında olmalıdır.
Hata Ayıklama ve Test Süreçleri
Paket transferi sırasında hatalar oluşabilir. Bu durumda loglama sistemleri kullanarak paket içeriğini incelemek faydalı olur. Ayrıca Wireshark gibi araçlarla paket trafiğini izlemek, sorun gidermede yardımcı olabilir.
Sonuç
Metin2 client-game paket transferi, oyunun temel taşlarından biridir. Doğru tanımlanmış paket yapıları, güvenli veri aktarımı ve iyi test süreçleri ile güçlü ve stabil bir oyun deneyimi sağlanabilir. Geliştiricilerin bu konuda dikkatli ve titiz olması, sunucuların güvenliğini ve performansını doğrudan etkiler.
What is C++ Client-Game Packet Transfer?
In the process of developing private Metin2 servers, the client-server communication system is of vital importance. This communication is used to send player actions to the server and display received data on the screen. This data transfer usually occurs via packets. In this article, we will provide detailed information about how packet transfer works between the C++-based Metin2 client and the game server.
Packet Structure and Definitions
Communication between the Metin2 client and game server typically occurs over TCP, and each packet has a specific structure. A packet generally consists of a header, size, and data parts. These structures are usually defined using C++ struct definitions. For example:
Kod:
[COLOR=#9365b8]struct TPacketGCChat[/COLOR]
Kod:
{
Kod:
BYTE header;
Kod:
WORD size;
Kod:
char msg[CHAT_MAX_LEN];
Kod:
};
Sending Packets from Client Side
When an action occurs on the client side, such as when a player sends a chat message, this information is sent to the server as a packet. This process is typically handled by functions like CNetworkStream::Send(). The function sends the packet directly to the server. Packets are usually prepared as byte arrays and transferred over the network.
Receiving and Processing Packets on Server Side
On the server side, incoming packets are received and processed by classes like CInputQueue. The server identifies what action to take based on the packet's header. For example, if a chat message arrives, the HEADER_GC_CHAT header is checked and the relevant process is initiated.
Packet Security and Validation
From a security standpoint, all packets must be validated. Packet sizes, contents, and origins should be checked. Otherwise, the server becomes vulnerable to hack attacks. Checksum mechanisms or encryption algorithms can be used for additional security.
Creating Custom Packets
Developers looking to add new features to private Metin2 servers can define their own custom packets. These packets must be defined on both the client and server sides. Packet numbers must not conflict and are typically within the range of 0x00 to 0xFF.
Debugging and Testing Processes
Errors may occur during packet transfers. In such cases, using logging systems to inspect packet contents can be helpful. Additionally, tools like Wireshark can assist in monitoring packet traffic for troubleshooting purposes.
Conclusion
Client-game packet transfer in Metin2 is one of the fundamental elements of the game. With correctly defined packet structures, secure data transmission, and well-tested processes, a strong and stable gaming experience can be achieved. Developers must be careful and meticulous in this area, as it directly impacts the security and performance of the servers.
