From 9a510d23199064b0476eb9d0d17ad5897acaa971 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Fri, 10 Jul 2026 20:47:25 +0800 Subject: [PATCH] refactor(config): separate game and server configuration with explicit paths --- .gitignore | 1 + include/Cubed/app.hpp | 2 +- include/Cubed/config.hpp | 5 ++--- include/Cubed/gameplay/network_server.hpp | 9 ++++++--- include/Cubed/gameplay/server_world.hpp | 6 +++++- src/app.cpp | 14 ++++++++------ src/config.cpp | 2 +- src/gameplay/network_server.cpp | 10 +++++++++- src/gameplay/server_world.cpp | 5 ++--- 9 files changed, 35 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index b3536eb..34d5687 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ CMakeError.log *~ .DS_Store assets/config.toml +assets/server-config.toml .venv/ pyout/ vcpkg_installed/ \ No newline at end of file diff --git a/include/Cubed/app.hpp b/include/Cubed/app.hpp index 95a0b48..bde0f9c 100644 --- a/include/Cubed/app.hpp +++ b/include/Cubed/app.hpp @@ -55,7 +55,7 @@ public: AudioEngine& audio(); private: - Config m_config; + Config m_game_config; Camera m_camera; TextureManager m_texture_manager; NetworkServer m_server; diff --git a/include/Cubed/config.hpp b/include/Cubed/config.hpp index a964e0f..9acb689 100644 --- a/include/Cubed/config.hpp +++ b/include/Cubed/config.hpp @@ -5,7 +5,7 @@ namespace Cubed { class Config { public: - Config(); + explicit Config(std::string_view path); Config(const Config&) = delete; Config(Config&&) = delete; Config& operator=(const Config&) = delete; @@ -54,8 +54,7 @@ public: private: toml::table m_tbl; - constexpr static inline std::string_view CONGIF_PATH = - ASSETS_PATH "config.toml"; + const std::string CONGIF_PATH; const toml::node* find_node(const toml::table& root, std::string_view path) const; // Follow the path to find the last-level toml::table, creating it if it diff --git a/include/Cubed/gameplay/network_server.hpp b/include/Cubed/gameplay/network_server.hpp index 5ed0ace..f12fbd6 100644 --- a/include/Cubed/gameplay/network_server.hpp +++ b/include/Cubed/gameplay/network_server.hpp @@ -1,4 +1,5 @@ #pragma once +#include "Cubed/config.hpp" #include "Cubed/gameplay/server_world.hpp" #include "Cubed/gameplay/session.hpp" @@ -8,17 +9,19 @@ namespace Cubed { class NetworkServer { public: - NetworkServer(int port = 25530); + explicit NetworkServer(); ~NetworkServer(); void stop(); // Run in another thread after initialization is complete - void start_server(int port = 25530); - + void start_server(int port); + void start_server(); int port() const; ServerWorld& server_world(); private: + Config m_config; + asio::io_context m_io; std::thread m_net_thread; int m_port = 25530; diff --git a/include/Cubed/gameplay/server_world.hpp b/include/Cubed/gameplay/server_world.hpp index 49e65a4..2c86e2e 100644 --- a/include/Cubed/gameplay/server_world.hpp +++ b/include/Cubed/gameplay/server_world.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Cubed/config.hpp" #include "Cubed/gameplay/cave_carver.hpp" #include "Cubed/gameplay/chunk_pos.hpp" #include "Cubed/gameplay/game_time.hpp" @@ -25,7 +26,7 @@ class Session; class ServerWorld { public: enum class ThreadPoolKind { NET, GEN }; - ServerWorld(); + ServerWorld(Config& config); ~ServerWorld(); void stop(); void handle_player_exit(const std::string& uuid); @@ -118,6 +119,9 @@ private: using uuid_acc = PlayerUUIDMap::accessor; using uuid_cacc = PlayerUUIDMap::const_accessor; + + Config& m_config; + // key = uuid PlayerHashMap m_players; ChunkHashMap m_chunks; diff --git a/src/app.cpp b/src/app.cpp index e1e4923..196b7e0 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -13,11 +13,13 @@ namespace Cubed { App::App() - : m_texture_manager(m_config), m_audio(m_config), - m_client_world(m_audio, m_config), m_dev_panel(*this), + + : m_game_config(ASSETS_PATH "config.toml"), + m_texture_manager(m_game_config), m_audio(m_game_config), + m_client_world(m_audio, m_game_config), m_dev_panel(*this), m_renderer(m_camera, m_client_world, m_texture_manager, m_dev_panel, - m_config), - m_window(m_renderer, m_config) {} + m_game_config), + m_window(m_renderer, m_game_config) {} App::~App() { if (m_client) { @@ -362,7 +364,7 @@ void App::update() { const auto& player = m_client_world.get_player(); if (player_gait != player.get_gait()) { player_gait = player.get_gait(); - float fov = m_config.get("player.fov", 70.0f); + float fov = m_game_config.get("player.fov", 70.0f); if (player_gait == Gait::WALK) { m_renderer.update_fov(fov); } @@ -406,7 +408,7 @@ TextureManager& App::texture_manager() { return m_texture_manager; } Window& App::window() { return m_window; } ClientWorld& App::client_world() { return m_client_world; } ServerWorld& App::server_world() { return m_server.server_world(); } -Config& App::config() { return m_config; } +Config& App::config() { return m_game_config; } const App::Argument& App::argument() const { return m_argument; } AudioEngine& App::audio() { return m_audio; } } // namespace Cubed \ No newline at end of file diff --git a/src/config.cpp b/src/config.cpp index afdd4ea..762233b 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -10,7 +10,7 @@ using namespace std::string_view_literals; namespace Cubed { -Config::Config() { load_config(); } +Config::Config(std::string_view path) : CONGIF_PATH(path) { load_config(); } Config::~Config() { save_to_file(); } diff --git a/src/gameplay/network_server.cpp b/src/gameplay/network_server.cpp index 9e696c8..39d1ca5 100644 --- a/src/gameplay/network_server.cpp +++ b/src/gameplay/network_server.cpp @@ -4,7 +4,10 @@ using asio::ip::tcp; namespace Cubed { -NetworkServer::NetworkServer(int port) : m_port(port) {} +NetworkServer::NetworkServer() + : m_config(ASSETS_PATH "server-config.toml"), m_world(m_config) { + m_port = m_config.get("port", 25530); +} NetworkServer::~NetworkServer() { stop(); } @@ -84,6 +87,11 @@ void NetworkServer::net_run() { void NetworkServer::start_server(int port) { m_port = port; + m_config.set("port", m_port); + start_server(); +} + +void NetworkServer::start_server() { m_world.init_world(); net_run(); m_started = true; diff --git a/src/gameplay/server_world.cpp b/src/gameplay/server_world.cpp index e98f5cc..b75552b 100644 --- a/src/gameplay/server_world.cpp +++ b/src/gameplay/server_world.cpp @@ -13,7 +13,7 @@ using namespace std::chrono_literals; using namespace google::protobuf; namespace Cubed { -ServerWorld::ServerWorld() {} +ServerWorld::ServerWorld(Config& config) : m_config(config) {} ServerWorld::~ServerWorld() { stop(); } @@ -500,8 +500,7 @@ bool ServerWorld::set_block(const glm::ivec3& block_pos, unsigned id) { } void ServerWorld::hot_reload() { - - int dist = 24; + int dist = m_config.get("server_distance", 24); m_rendering_distance = dist <= MAX_DISTANCE ? dist : MAX_DISTANCE; }