From be425a705c8d4a4137e87d4380c7d913643d2747 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Wed, 17 Jun 2026 19:15:16 +0800 Subject: [PATCH] feat(dev-panel): add tick freeze toggle and fix TickType sign Add checkbox to freeze tick advancement in dev panel. Change TickType from unsigned long long to signed long long to prevent underflow. --- include/Cubed/dev_panel.hpp | 1 + include/Cubed/gameplay/game_time.hpp | 3 ++- include/Cubed/gameplay/world.hpp | 5 ++++- src/dev_panel.cpp | 6 ++++++ src/gameplay/world.cpp | 6 ++++-- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/Cubed/dev_panel.hpp b/include/Cubed/dev_panel.hpp index aa8fa1c..17917b1 100644 --- a/include/Cubed/dev_panel.hpp +++ b/include/Cubed/dev_panel.hpp @@ -46,6 +46,7 @@ private: int m_theme = 0; int m_pre_set_day_tick = 0; int m_pre_set_tick_speed = 1; + bool m_tick_frezze = false; void show_about_table_bar(); void show_biome_table_bar(); void show_time_table_bar(); diff --git a/include/Cubed/gameplay/game_time.hpp b/include/Cubed/gameplay/game_time.hpp index edd2e2d..5cb08b7 100644 --- a/include/Cubed/gameplay/game_time.hpp +++ b/include/Cubed/gameplay/game_time.hpp @@ -1,6 +1,7 @@ #pragma once -using TickType = unsigned long long; +// Prevent unsigned underflow issues in subtraction +using TickType = long long; constexpr int DEFAULT_PER_TICK_TIME = 50; diff --git a/include/Cubed/gameplay/world.hpp b/include/Cubed/gameplay/world.hpp index 7913903..21fe48c 100644 --- a/include/Cubed/gameplay/world.hpp +++ b/include/Cubed/gameplay/world.hpp @@ -69,7 +69,7 @@ private: std::atomic m_is_rebuilding{false}; std::atomic m_chunk_gen_finished{false}; std::atomic m_could_gen{true}; - std::atomic m_day_night_cycle{true}; + std::atomic m_tick_running{true}; std::atomic m_rendering_distance{24}; std::atomic m_chunk_gen_fraction{0.0f}; @@ -149,6 +149,9 @@ public: void day_tick(TickType tick); int per_tick_time() const; void per_tick_time(int ms); + + bool is_tick_running() const; + void tick_running(bool run); }; } // namespace Cubed diff --git a/src/dev_panel.cpp b/src/dev_panel.cpp index f7805ac..4bec87c 100644 --- a/src/dev_panel.cpp +++ b/src/dev_panel.cpp @@ -266,7 +266,13 @@ void DevPanel::show_biome_table_bar() { void DevPanel::show_time_table_bar() { World& world = m_app.world(); ImGui::Text("Game Tick %llu", world.game_tick()); + ImGui::SameLine(); ImGui::Text("Day Tick %llu", world.day_tick()); + m_tick_frezze = !world.is_tick_running(); + ImGui::SameLine(); + if (ImGui::Checkbox("Tick Frezze", &m_tick_frezze)) { + world.tick_running(!m_tick_frezze); + } if (ImGui::SliderInt("SetDayTick", &m_pre_set_day_tick, 0, DAY_TIME)) { } ImGui::SameLine(); diff --git a/src/gameplay/world.cpp b/src/gameplay/world.cpp index 837cf65..3bd4ebb 100644 --- a/src/gameplay/world.cpp +++ b/src/gameplay/world.cpp @@ -757,9 +757,9 @@ void World::serever_run(std::stop_token stoken) { Logger::info("Server Thread Started!"); while (!stoken.stop_requested()) { std::this_thread::sleep_for(milliseconds(m_per_tick_time)); - if (m_day_night_cycle) { + if (m_tick_running) { ++m_game_ticks; - m_day_tick = (++m_day_tick) % DAY_TIME; + m_day_tick = (m_day_tick + 1) % DAY_TIME; } } Logger::info("Server Thread Stopped!"); @@ -1078,4 +1078,6 @@ void World::day_tick(TickType tick) { int World::per_tick_time() const { return m_per_tick_time.load(); } void World::per_tick_time(int ms) { m_per_tick_time = ms; } +bool World::is_tick_running() const { return m_tick_running.load(); } +void World::tick_running(bool run) { m_tick_running = run; } } // namespace Cubed \ No newline at end of file