From 522a7514012da86f7b9643179f0763746f3b232e Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 12 Sep 2025 16:15:32 +0500 Subject: Protocol and versioning changes --- game/server/sessions.cc | 24 ++++++++++++++++++++++-- game/server/status.cc | 6 +++++- 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'game/server') diff --git a/game/server/sessions.cc b/game/server/sessions.cc index 2ab9d74..6758648 100644 --- a/game/server/sessions.cc +++ b/game/server/sessions.cc @@ -12,6 +12,8 @@ #include "core/utils/string.hh" +#include "core/version.hh" + #include "shared/entity/factory.hh" #include "shared/entity/head.hh" #include "shared/entity/player.hh" @@ -42,6 +44,8 @@ private: config::Unsigned sessions::max_players(8U, 1U, 128U); unsigned int sessions::num_players = 0U; +static config::Boolean strict_version_matching(true); + static emhash8::HashMap username_map; static emhash8::HashMap identity_map; static std::vector dimension_listeners; @@ -49,20 +53,36 @@ static std::vector sessions_vector; static void on_login_request_packet(const protocol::LoginRequest& packet) { - if(packet.version > protocol::VERSION) { + if(packet.game_version_major > version::major) { protocol::Disconnect response; response.reason = "protocol.outdated_server"; protocol::send(packet.peer, protocol::encode(response)); return; } - if(packet.version < protocol::VERSION) { + if(packet.game_version_minor < version::minor) { protocol::Disconnect response; response.reason = "protocol.outdated_client"; protocol::send(packet.peer, protocol::encode(response)); return; } + if(strict_version_matching.get_value()) { + if(packet.game_version_minor > version::minor || packet.game_version_patch > version::patch) { + protocol::Disconnect response; + response.reason = "protocol.outdated_server"; + protocol::send(packet.peer, protocol::encode(response)); + return; + } + + if(packet.game_version_minor < version::minor || packet.game_version_patch < version::patch) { + protocol::Disconnect response; + response.reason = "protocol.outdated_client"; + protocol::send(packet.peer, protocol::encode(response)); + return; + } + } + // FIXME: calculate voxel registry checksum ahead of time // instead of figuring it out every time a new player connects if(packet.voxel_registry_checksum != world::voxel_registry::get_checksum()) { diff --git a/game/server/status.cc b/game/server/status.cc index ba1d59d..0edd0a0 100644 --- a/game/server/status.cc +++ b/game/server/status.cc @@ -4,6 +4,8 @@ #include "core/config/number.hh" +#include "core/version.hh" + #include "shared/protocol.hh" #include "shared/splash.hh" @@ -13,10 +15,12 @@ static void on_status_request_packet(const protocol::StatusRequest& packet) { protocol::StatusResponse response; - response.version = protocol::VERSION; + response.game_version_major = version::major; response.max_players = sessions::max_players.get_value(); response.num_players = sessions::num_players; response.motd = splash::get(); + response.game_version_minor = version::minor; + response.game_version_patch = version::patch; protocol::send(packet.peer, protocol::encode(response)); } -- cgit