diff options
| author | untodesu <kirill@untode.su> | 2025-09-12 16:15:32 +0500 |
|---|---|---|
| committer | untodesu <kirill@untode.su> | 2025-09-12 16:15:32 +0500 |
| commit | 522a7514012da86f7b9643179f0763746f3b232e (patch) | |
| tree | 7c4ea8f03b6778572d59784dc28b600e3f8f2268 /game/server | |
| parent | f210a86c1406ccc6dfd6f14181dd7a1274ee0de4 (diff) | |
| download | voxelius-522a7514012da86f7b9643179f0763746f3b232e.tar.bz2 voxelius-522a7514012da86f7b9643179f0763746f3b232e.zip | |
Protocol and versioning changes
Diffstat (limited to 'game/server')
| -rw-r--r-- | game/server/sessions.cc | 24 | ||||
| -rw-r--r-- | game/server/status.cc | 6 |
2 files changed, 27 insertions, 3 deletions
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<std::string, Session*> username_map;
static emhash8::HashMap<std::uint64_t, Session*> identity_map;
static std::vector<DimensionListener> dimension_listeners;
@@ -49,20 +53,36 @@ static std::vector<Session> 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));
}
|
