Por padrão já existe uma função em que verifique a versão do cliente com a versão do servidor, funciona por tempo, ou seja, se a data de execução for maior que a data limite que está configurada no servidor, o jogador será desconectado do servidor. Agora fica como queres verificar esta "chave" ou data de limite da versão / "licença".
/// 1. @ Server/Game/input_login.cpp
// Procura
if (g_bCheckClientVersion)
{
[ ... ]
}
// Altere tudo por (verificar por data limite)
if (g_bCheckClientVersion)
{
sys_log(0, "VERSION CHECK %s %s", g_stClientVersion.c_str(), d->GetClientVersion());
if (!d->GetClientVersion())
{
d->DelayedDisconnect(10);
}
else
{
if (d->GetClientVersion() >= g_stClientVersion)
{
ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("Ŭ¶óÀÌ¾ðÆ® ¹öÀüÀÌ Æ²·Á ·Î±×¾Æ¿ô µË´Ï´Ù. Á¤»óÀûÀ¸·Î ÆÐÄ¡ ÈÄ Á¢¼ÓÇϼ¼¿ä."));
d->DelayedDisconnect(0);
LogManager::instance().HackLog("VERSION_CONFLICT", ch);
sys_log(0, "VERSION : WRONG VERSION USER : account:%s name:%s hostName:%s server_version:%s client_version:%s",
d->GetAccountTable().login,
ch->GetName(),
d->GetHostName(),
g_stClientVersion.c_str(),
d->GetClientVersion());
}
}
}
else
{
sys_log(0, "VERSION : NO CHECK");
}
// Ou altere por (verificar um valor fixo)
if (g_bCheckClientVersion)
{
sys_log(0, "VERSION CHECK %s %s", g_stClientVersion.c_str(), d->GetClientVersion());
if (!d->GetClientVersion())
{
d->DelayedDisconnect(10);
}
else
{
if (0 != g_stClientVersion.compare(d->GetClientVersion()))
{
ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("Ŭ¶óÀÌ¾ðÆ® ¹öÀüÀÌ Æ²·Á ·Î±×¾Æ¿ô µË´Ï´Ù. Á¤»óÀûÀ¸·Î ÆÐÄ¡ ÈÄ Á¢¼ÓÇϼ¼¿ä."));
d->DelayedDisconnect(0);
LogManager::instance().HackLog("VERSION_CONFLICT", ch);
sys_log(0, "VERSION : WRONG VERSION USER : account:%s name:%s hostName:%s server_version:%s client_version:%s",
d->GetAccountTable().login,
ch->GetName(),
d->GetHostName(),
g_stClientVersion.c_str(),
d->GetClientVersion());
}
}
}
else
{
sys_log(0, "VERSION : NO CHECK");
}
Eis algumas coisas que tens que considerar também; no ficheiro Server/Game /config.cpp tens que ativar esta verificação e também tens que alterar a "chave" ou data limite da versão / "licença".
/// 1. @ Server/Game/config.cpp
// Procura e confirme, altere g_stClientVersion conforme as tuas preferências.
bool g_bCheckClientVersion = true; // true = verificar | false = não verificar
std::string g_stClientVersion = "1640998800"; // Sat Jan 01 2022 01:00:00 GMT+0000
Também podes criar um ficheiro "VERSION" junto a ficheiro "CONFIG" no diretório dos teus canais e adicionar o valor lá em vez de modificares o código fonte sempre que queres alterar a "chave" ou data limite da versão / "licença".
Para isso também deves confirmar que essa função seja chamada.
/// 1. @ Server/Game/config.cpp
// Procura
LoadValidCRCList();
LoadStateUserCount();
// Adiciona abaixo
LoadClientVersion();
Finalmente na source do teu cliente terás que fazer algumas alterações também.
/// 1. @ Client/UserInterface/PythonNetworkPhaseGame.cpp
// Procura
strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp) - 1); // # python time.time ¾ÕÀÚ¸®
// Altere para (verificar por data limite)
strncpy(kVersionPacket.timestamp, static_cast<std::time_t>(std::time(0)), sizeof(kVersionPacket.timestamp) - 1);
// Ou altere para (verificar um valor fixo)
strncpy(kVersionPacket.timestamp, "1234567890", sizeof(kVersionPacket.timestamp) - 1);
O que deves saber sobre essas alterações.
1. Nem todos os clientes em que toca o código fonte são iguais, por isso deves-te guiar pela semelhança do código.
2. Este método apenas desconecta o jogador após entrar no jogo caso haja conflito entre a "chave" ou data limite da versão / "licença".
3. Há melhores formas de verificares o que pretendes, este é apenas o mais semelhante à tua pergunta e o mais simples que já existe no código fonte.
Cumprimentos, Owsap.