feat(gameplay): implement server stop and client exit handling

Add server_stop flag to LogoutRsp protocol. Modify client_world to check for server stop or own logout to set exit flag. Add ServerWorld::stop() to broadcast stop and cleanly shut down. Refactor chunk ownership to unique_ptr. Remove name parameter from get_look_block_pos.
This commit is contained in:
2026-06-28 15:27:51 +08:00
parent 429520b1f7
commit a5764e901b
7 changed files with 54 additions and 22 deletions

View File

@@ -29,8 +29,7 @@ public:
void init(std::string_view player_name,
std::shared_ptr<NetworkClient> client);
void update(float delta_time);
const std::optional<LookBlock>&
get_look_block_pos(const std::string& name) const;
const std::optional<LookBlock>& get_look_block_pos() const;
ClientPlayer& get_player();
int get_block(const glm::ivec3& block_pos) const;
bool is_solid(const glm::ivec3& block_pos) const;
@@ -66,8 +65,9 @@ public:
const std::vector<RemotePlayerRenderData>& render_player_data() const;
glm::vec3 sunlight_dir() const;
void receive_chunk(ChunkDataRsp data);
void receive_exit();
void request_exit();
bool is_receive_exit();
template <typename Fn>
void register_timer(std::string_view id, TickType threshold, Fn&& f) {
m_timers.emplace(std::piecewise_construct,

View File

@@ -26,6 +26,7 @@ public:
enum class ThreadPoolKind { NET, GEN };
ServerWorld();
~ServerWorld();
void stop();
void handle_player_exit(const std::string& uuid);
void init_world();
void need_gen(std::string uuid);
@@ -78,7 +79,6 @@ public:
void handle_block_change(const BlockChangeReq& req);
int chunk_size() const;
template <typename Fn>
void register_timer(std::string_view id, TickType threshold, Fn&& f) {
m_timers.emplace(std::piecewise_construct,
@@ -100,12 +100,12 @@ private:
ChunkPos pos;
};
struct PendingChunk {
ServerChunk chunk;
std::unique_ptr<ServerChunk> chunk;
std::future<void> future;
};
struct FinishedChunk {
ChunkPos pos;
std::shared_ptr<ServerChunk> chunk;
std::unique_ptr<ServerChunk> chunk;
};
using ChunkHashMap =
@@ -136,6 +136,7 @@ private:
std::atomic<bool> m_need_gen_chunk{false};
std::atomic<bool> m_is_rebuilding{false};
std::atomic<bool> m_init{false};
std::atomic<bool> m_stopped{false};
std::atomic<int> m_rendering_distance{24};
std::atomic<int> m_gen_pool_threads{0};
std::atomic<int> m_net_pool_threads{0};
@@ -185,5 +186,6 @@ private:
int
change_pool_threads(std::atomic<std::shared_ptr<ThreadPool>>& thread_pool,
int threads);
void send_server_stop();
};
} // namespace Cubed