Anlatım Tamamen Bana Aittir.
Dün ki Konumuzda Client-Game İle Arasındaki İletişimden Bahsettik. Bugün ise Game-Client İletişiminden Bahsedeceğim.
Dün ki Konumuzda DungeonInfo Sisteminden Örnek Alarak Başladık ve Tekrar DungeonInfo İle Devam Edeceğiz. DungeonInfo Sistemimiz de Buton İle Soğuma Süresini Sıfırladık. Fakat Bu İşlem QuestFlag ile Gerçekleştiği İçin Soğuma Süresi Anlık Penceremizde Güncellenmiyordu. Işınlandığımızda Güncelleniyordu. Çünkü Karakter Tekrar Load Olduğu İçin affect.sql, quest.sql vs. Tekrar Load Ediyordu.
Dün ki Konumuzu Okuduysanız Şimdi ki Anlatacaklarımı da İyi Anlayacaksınız.
Öncelikle Paket.h'de Bir Adet Sabit Sayı Tanımlıyorum.
Dün ki Konumuzda Client-Game İle Arasındaki İletişimden Bahsettik. Bugün ise Game-Client İletişiminden Bahsedeceğim.
Dün ki Konumuzda DungeonInfo Sisteminden Örnek Alarak Başladık ve Tekrar DungeonInfo İle Devam Edeceğiz. DungeonInfo Sistemimiz de Buton İle Soğuma Süresini Sıfırladık. Fakat Bu İşlem QuestFlag ile Gerçekleştiği İçin Soğuma Süresi Anlık Penceremizde Güncellenmiyordu. Işınlandığımızda Güncelleniyordu. Çünkü Karakter Tekrar Load Olduğu İçin affect.sql, quest.sql vs. Tekrar Load Ediyordu.
Dün ki Konumuzu Okuduysanız Şimdi ki Anlatacaklarımı da İyi Anlayacaksınız.
Öncelikle Paket.h'de Bir Adet Sabit Sayı Tanımlıyorum.
Ardından Bir Struct Yapısı Oluşturup İçine Elemanlarımı Veri Tipleri İle Birlikte Ekliyorum.
Burayı Hallettik.
Şimdi Dün Yaptığımız DungeonInfo.cpp Dosyamızdaki Fonksiyon İçindeki Nelerin Client Tarafına İletileceğini Yapalım.
TPacketGCSendResetTime Yapımızı packet adlı Bir Değişkenin Temsil Etmesini İstiyorum.
packet.bHeader Değişkenine HEADER_GC_DUNGEON_INFO_RESET_TIME Sabit Değeri Atıyorum.
packet.dungeonIdx Elamanımıza idx (Client'den Gelen Sayımız) Atıyorum.
packet.iFlagTime Elamanımıza iTime Değişkenin Değerini Atıyorum.
Özet:
bHeader Bizim Sabit Sayımız.
dungeonIdx Client'e Göndereceğimiz ve Client'deki Butonlardan Gelen Sayımızı Alacak Eleman.
iFlagTime Sıfırlama Süremiz. Yani Client'e 0 Olarak Göndereceğiz.
GameSource Bu Kadar Şimdi Client Source Tarafına Geçelim.
GameSource/Packet.h 'deki Olayı ClientSource/Packet.h 'de Anlatmayacağım Bir Fark Yok Copy-Paste
ClientSource/PythonNetworkStream.cpp
Burada Başlık ve Boyutları Belirliyoruz.
ClientSource/PythonNetworkStream.h
Burada Tanımlamayı Yapıyorum.
ClientSource/PythonNetworkStreamPhaseGame.cpp
Burada Aynı Mantık İnput_Main.cpp'deki Gibi Fakat Bu Sefer Game'den Gelen Paketimiz
Burada Kısa ve Özetle Anlatmam Gerekirse (Burada Herşey Döngü İçindedir): header Değişkenimiz Her Döngüde Paket Başlıklarımıza Karşılık Gelir. Bizim Paket Başlığımıza Karşılık Geldiğinde Bizi RecvDungeonInfoResetTime() Adlı Fonksiyona Gönderir ve Bu Fonksiyon Paketi Okur ve İlgili İşlemleri Yapar.
Gelelim Fonksiyona
TPacketGCSendResetTime Yapımızı packet adlı Bir Değişkenin Temsil Etmesini İstiyorum.
Ardından Bu Paket Yapısının Boyutu Kadar Veri Almasını ve Bu Verilerin Paket Değişkenine Yerleştirilmesini Yapıyorum.
Son Olarak;
PyCallClassMemberFunc ()
İşlemi İle Root Tarafında Kullanacaklarımı Yazıyorum. Game Tarafından Ne Getirdiysek Onların Root Tarafına Aktarılması İçin.
Client Source İşlemi Bitti Şimdi Root Tarafına Geçelim.
Root/Game.py
Client'den Gelen 2 Argümanlı İşlev İsmimizi Yazıyoruz.
Herşey Bu Kadar. Sizin Böyle Bir Sisteminizin Olmasına Gerek Yok veya constInfo.dungeonDurations[*] Ne İşe Yaradığını Anlatmayacağım Burada Size Client-Game ve Game-Client İlişkisinin Nasıl Çalıştığından Bahsetmek İstedim.
Dün Sadece Client'den Game Tarafına Gönderdiğimizde Pencerede Anlık Yenilenmiyordu Sadece Işınlandığımızda Yenileniyordu. Şimdi Game-Client Tarafını Yaptık.
O Nedenle Artık Anlık Güncelleniyor.
KANIT:
C++ ile Metin2 Oyun İstemcisi Paket Aktarımı
Metin2 özel sunucu geliştirmesi sırasında, oyun istemcisi ile sunucu arasında veri alışverişinin sağlanması kritik öneme sahiptir. Bu veri alışverişi genellikle paket (packet) adı verilen küçük veri blokları üzerinden gerçekleşir. Paket transferi, oyun içindeki hareketler, eşya işlemleri, sohbet mesajları gibi pek çok işlem için temel yapı taşını oluşturur. Bu yazıda, C++ dilini kullanarak Metin2 oyun istemcisinde nasıl güvenli ve verimli bir şekilde paket aktarımı yapılacağını detaylıca inceleyeceğiz.
Paket Aktarımının Temelleri
Metin2 özel sunucularında, oyun istemcisi (client) ve sunucu (server) arasındaki iletişim TCP/IP protokolü üzerinden sağlanır. İstemci, sunucuya belirli bir paket formatında veri gönderir; sunucu da buna karşılık gelen yanıtı yollar. Bu paketler genellikle C++ yapıları (structs) ile tanımlanır. Örneğin:
Kod:
struct TPacketCGMove{[BR][/BR] BYTE header;[BR][/BR] WORD x;[BR][/BR] WORD y;[BR][/BR] BYTE rotation;[BR][/BR]};
Bu yapı, oyuncunun hareket etmesi durumunda istemcinin sunucuya gönderdiği paketi tanımlar. Header, paketin türünü belirtirken, x ve y koordinatları, rotation ise karakterin yönünü içerir.
Paket Gönderme Süreci
C++ kullanarak bir paket göndermek için genellikle socket programlama teknikleri kullanılır. Socket bağlantısı kurulduktan sonra, paket yapılandırılır ve send() fonksiyonu aracılığıyla gönderilir. Aşağıda örnek bir gönderim işlemi gösterilmiştir:
Kod:
TPacketCGMove packet;[BR][/BR]packet.header = HEADER_CG_MOVE;[BR][/BR]packet.x = playerX;[BR][/BR]packet.y = playerY;[BR][/BR]packet.rotation = playerRotation;[BR][/BR][BR][/BR]send(clientSocket, (char*)&packet, sizeof(packet), 0);
Bu kod parçası, oyuncunun konum bilgilerini sunucuya aktarır. Paket boyutu sabitse, bu tür yapılarla verimli bir şekilde veri aktarımı sağlanabilir.
Paket Alma Süreci
Sunucu tarafında, gelen paketler recv() fonksiyonu ile alınır. Ancak, paketlerin doğru şekilde yorumlanabilmesi için header değerine göre ayrıştırılması gerekir. Örneğin:
Kod:
TPacketCGMove packet;[BR][/BR]int result = recv(clientSocket, (char*)&packet, sizeof(packet), 0);[BR][/BR][BR][/BR]if(result > 0 && packet.header == HEADER_CG_MOVE){[BR][/BR] // Oyuncunun hareketini işle[BR][/BR]}
Bu şekilde, gelen paketin türüne göre farklı işlemler yapılabilir.
Hata Kontrolleri ve Güvenlik Önlemleri
Oyun istemcisi ile sunucu arasındaki veri aktarımında, güvenlik oldukça önemlidir. Paketlerin manipülasyonu veya yanlışlıkla gönderimi, oyun içinde ciddi sorunlara yol açabilir. Bu nedenle, her paketin doğrulanması (validation) ve kontrollü bir şekilde işlenmesi gerekir. Örneğin, bir oyuncunun mevcut konumu ile gönderdiği yeni konum arasında mantıksal bir fark varsa, bu durum hile olasılığını gösterir.
Metin2 Özel Sunucularında Paket Geliştirme Pratikleri
Metin2 özel sunucu geliştiricileri, paket yapılarını düzenlerken hem performans hem de güvenlik açısından dikkat etmelidir. Paket boyutlarının olabildiğince küçük tutulması, ağ trafiğini azaltır. Ayrıca, paketlerdeki verilerin şifrelenmesi veya hash ile doğrulanması gibi yöntemler, güvenliği artırır. Martysama gibi geliştiriciler, bu tür sistemleri optimize etmek için C++ dilini etkin şekilde kullanmaktadır.
Sonuç
Metin2 özel sunucularında paket aktarımı, oyun içindeki her türlü etkileşimin temelini oluşturur. C++ dilini kullanarak güvenli, hızlı ve verimli bir şekilde paket gönderip almak mümkündür. Bu süreçte dikkat edilmesi gereken en önemli konular, paket doğrulama, hata kontrolü ve güvenlik önlemleridir. Bu yapılar doğru implemente edildiğinde, kullanıcı deneyimi artar ve hile yapma riski minimize edilir.
C++ Game Client Packet Transfer for Metin2
In Metin2 private server development, ensuring data exchange between the game client and the server is critical. This data exchange typically occurs through small data blocks called packets. Packet transfer forms the foundation for many in-game operations such as movements, item transactions, chat messages, and more. In this article, we will examine in detail how to securely and efficiently handle packet transfers in the Metin2 game client using C++.
Basics of Packet Transfer
In Metin2 private servers, communication between the game client and the server happens via the TCP/IP protocol. The client sends data to the server in a specific packet format, and the server responds accordingly. These packets are usually defined using C++ structures. For example:
Kod:
struct TPacketCGMove{[BR][/BR] BYTE header;[BR][/BR] WORD x;[BR][/BR] WORD y;[BR][/BR] BYTE rotation;[BR][/BR]};
This structure defines the packet sent by the client to the server when the player moves. The header specifies the type of packet, while x and y coordinates, and rotation indicate the character's direction.
Sending Packets
To send a packet using C++, socket programming techniques are generally used. After establishing a socket connection, the packet is configured and sent via the send() function. Below is an example of a sending operation:
Kod:
TPacketCGMove packet;[BR][/BR]packet.header = HEADER_CG_MOVE;[BR][/BR]packet.x = playerX;[BR][/BR]packet.y = playerY;[BR][/BR]packet.rotation = playerRotation;[BR][/BR][BR][/BR]send(clientSocket, (char*)&packet, sizeof(packet), 0);
This code snippet transfers the player's location data to the server. When the packet size is fixed, efficient data transfer can be achieved with such structures.
Receiving Packets
On the server side, incoming packets are received using the recv() function. However, packets must be parsed according to the header value to be interpreted correctly. For example:
Kod:
TPacketCGMove packet;[BR][/BR]int result = recv(clientSocket, (char*)&packet, sizeof(packet), 0);[BR][/BR][BR][/BR]if(result > 0 && packet.header == HEADER_CG_MOVE){[BR][/BR] // Process player movement[BR][/BR]}
In this way, different operations can be performed based on the packet type received.
Error Checks and Security Measures
Security is highly important during data transmission between the game client and the server. Manipulation or incorrect sending of packets can cause serious issues within the game. Therefore, each packet must be validated and processed carefully. For example, if there is a logical difference between a player's current position and their newly sent location, this could indicate cheating.
Best Practices for Packet Development in Metin2 Private Servers
Developers working on Metin2 private servers should pay attention to both performance and security when structuring packet formats. Keeping packet sizes as small as possible reduces network traffic. Additionally, encrypting data within packets or validating them using hashing methods increases security. Developers like Martysama effectively use the C++ language to optimize these types of systems.
Conclusion
Packet transfer in Metin2 private servers forms the basis of all in-game interactions. It is possible to securely, quickly, and efficiently send and receive packets using the C++ language. The most important aspects to consider during this process are packet validation, error checking, and security measures. When these structures are implemented correctly, user experience improves and the risk of cheating is minimized.
