Bu sistemle oyuncu giriş yaparken client version kontrolü yapılır. Yani oyuncu eski client ile oyuna girmeye çalışırsa karakter seçimine ya da oyuna geçmeden direkt login ekranında uyarı alır. Böylece “Oyuna giriyorum, direkt kapanıyor” ya da “Login sonrası düşüyorum” gibi karışıklıklar azalır.

Mantık basit. Binary tarafında login paketi içine bir version değeri ekliyoruz. Source tarafında da gelen değeri kontrol ediyoruz. Eğer client tarafındaki değer ile server tarafındaki değer uyuşmuyorsa oyuncuya login failure gönderiliyor.
Bu sistem özellikle patcher kullanan serverlarda işe yarar. Oyuncu eski client ile giriş yapmaya çalışırsa sistem bunu yakalar ve patcher üzerinden güncel client ile giriş yapması gerektiğini söyler.
Binary Düzenlemeleri
UserInterface/Locale_inc.h
Dosyayı aç ve içine şu define satırını ekle:
#define NEW_CHECK_VERSION 1
Buradaki 1 değeri client version gibi düşünebilirsin. Client ve server tarafında aynı olmak zorunda. İleride büyük bir güncelleme yaptığında bu değeri hem binary hem source tarafında artırabilirsin.
Örnek:
#define NEW_CHECK_VERSION 2
Ama unutma, iki taraf da aynı değer olmalı.
UserInterface/PythonNetworkStreamPhaseLogin.cpp
Bu dosyada şu fonksiyonu bul:
bool CPythonNetworkStream::SendLoginPacketNew
Fonksiyon içinde şu satırı ara:
LoginPacket.login_key = m_dwLoginKey;
Bu satırın hemen altına şunu ekle:
LoginPacket.NewCheckVersion = NEW_CHECK_VERSION;
Örnek kullanım şu şekilde görünür:
LoginPacket.login_key = m_dwLoginKey;
LoginPacket.NewCheckVersion = NEW_CHECK_VERSION;
Burada login paketi gönderilirken client version değeri de pakete eklenmiş oluyor.
UserInterface/Packet.h
Bu dosyada şu yapıyı bul:
typedef struct command_login2
Aynı yapı içinde şu satırı bul:
DWORD adwClientKey[4];
Hemen altına bunu ekle:
int NewCheckVersion;
Örnek görünüm:
DWORD adwClientKey[4];
int NewCheckVersion;
Burada dikkat etmen gereken nokta şu: Bu alan hem binary hem source tarafındaki packet yapısında aynı yerde olmalı. Eğer bir tarafta ekleyip diğer tarafta eklemezsen paket boyutu bozulur ve login sırasında problem yaşarsın.
Source Düzenlemeleri
game/src/input_login.cpp
Dosyayı aç ve şu fonksiyonu bul:
void CInputLogin::LoginByKey
Fonksiyon içinde şu bloğu ara:
if (g_bNoMoreClient)
{
TPacketGCLoginFailure failurePacket; failurePacket.header = HEADER_GC_LOGIN_FAILURE;
strlcpy(failurePacket.szStatus, "SHUTDOWN", sizeof(failurePacket.szStatus));
d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure));
return;
}
Bu bloğun hemen altına şu kontrolü ekle:
if (pinfo->NewCheckVersion != (int)NEW_CHECK_VERSION)
{
TPacketGCLoginFailure failurePacket; failurePacket.header = HEADER_GC_LOGIN_FAILURE;
strlcpy(failurePacket.szStatus, "VERSION", sizeof(failurePacket.szStatus));
d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure));
return;
}
Bu kontrol şunu yapar: Login paketinden gelen NewCheckVersion değeri server tarafındaki NEW_CHECK_VERSION değeriyle aynı değilse oyuncunun girişini durdurur. Sonra client tarafına VERSION login failure mesajı gönderir.
game/src/packet.h
Bu dosyada şu yapıyı bul:
typedef struct command_login2
Aynı yapı içinde şu satırı bul:
DWORD adwClientKey[4];
Hemen altına bunu ekle:
int NewCheckVersion;
Örnek:
DWORD adwClientKey[4];
int NewCheckVersion;
Binary tarafındaki Packet.h ile source tarafındaki packet.h aynı sırada olmalı. Burada sıra önemli. Alanı farklı yere eklersen paket karşılığı bozulabilir.
common/service.h
Dosyayı aç ve içine şu define satırını ekle:
#define NEW_CHECK_VERSION 1
Bu değer binary tarafındaki Locale_inc.h içinde yazdığın değerle aynı olmalı.
Yani binary tarafında:
#define NEW_CHECK_VERSION 1
Source tarafında da:
#define NEW_CHECK_VERSION 1
Eğer client güncel değil uyarısı vermek istiyorsan ileride bu değeri artırabilirsin. Mesela yeni client dağıttığında hem source hem binary tarafında 2 yaparsın. Eski client hâlâ 1 gönderdiği için login sırasında engellenir.
Client Düzenlemesi
root/intrologin.py
Bu dosyada şu fonksiyonu bul:
def Open(self):
Fonksiyon içinde self.loginFailureMsgDict kısmını bul.
Bu sözlüğe şu satırı ekle:
"VERSION" : "Eski client tespit edildi, lütfen oyunu patcher üzerinden açın.",
Örnek:
self.loginFailureMsgDict = {
"ALREADY" : localeInfo.LOGIN_FAILURE_ALREAY,
"NOID" : localeInfo.LOGIN_FAILURE_NOT_EXIST_ID,
"WRONGPWD" : localeInfo.LOGIN_FAILURE_WRONG_PASSWORD,
"FULL" : localeInfo.LOGIN_FAILURE_TOO_MANY_USER,
"SHUTDOWN" : localeInfo.LOGIN_FAILURE_SHUTDOWN,
"VERSION" : "Eski client tespit edildi, lütfen oyunu patcher üzerinden açın.",
}Eğer dil dosyası üzerinden kullanmak istersen mesajı localeInfo içine de taşıyabilirsin.
Örnek:
"VERSION" : localeInfo.LOGIN_FAILURE_VERSION,
Sonra locale dosyana şu tarz bir tanım ekleyebilirsin:
LOGIN_FAILURE_VERSION = "Eski client tespit edildi, lütfen oyunu patcher üzerinden açın."
Bu daha temiz olur. Ama hızlı kullanım için direkt string olarak da yazabilirsin.
Sistem Nasıl Çalışıyor
Oyuncu login olmaya çalıştığında binary tarafı login paketi içine şu değeri koyar:
LoginPacket.NewCheckVersion = NEW_CHECK_VERSION;
Server tarafı da aynı değeri burada kontrol eder:
if (pinfo->NewCheckVersion != (int)NEW_CHECK_VERSION)
Eğer değerler eşleşirse login devam eder. Eğer eşleşmezse server client’a şu status değerini gönderir:
"VERSION"
Client tarafında intrologin.py bu status değerini yakalar ve oyuncuya eski client kullandığını söyler.
Dikkat Edilmesi Gerekenler
Bu sistemin düzgün çalışması için packet yapısı iki tarafta da aynı olmalı. Yani hem binary Packet.h, hem de source packet.h içinde NewCheckVersion aynı struct içinde, aynı noktada bulunmalı.
Ayrıca NEW_CHECK_VERSION değeri iki tarafta da aynı olmalı. Binary tarafında 1, source tarafında 2 yazarsan herkes eski client gibi algılanır ve kimse giriş yapamaz.
Canlı serverda kullanmadan önce test client ile denemek iyi olur. Önce iki tarafta da aynı version değeriyle login dene. Sonra client tarafındaki değeri farklı yapıp eski client uyarısı geliyor mu kontrol et.
Binary tarafında NEW_CHECK_VERSION tanımlanır.
Login paketine NewCheckVersion alanı eklenir.
Source tarafında aynı packet alanı eklenir.
Login sırasında gelen version değeri kontrol edilir.
Version uyuşmuyorsa oyuncuya VERSION login failure gönderilir.
Client tarafında VERSION mesajı için “Eski client tespit edildi, lütfen patcher üzerinden açın.” uyarısı gösterilir.
Paylaş :








