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.
This commit is contained in:
2026-06-17 19:15:16 +08:00
parent 31bf337f6f
commit be425a705c
5 changed files with 17 additions and 4 deletions

View File

@@ -46,6 +46,7 @@ private:
int m_theme = 0; int m_theme = 0;
int m_pre_set_day_tick = 0; int m_pre_set_day_tick = 0;
int m_pre_set_tick_speed = 1; int m_pre_set_tick_speed = 1;
bool m_tick_frezze = false;
void show_about_table_bar(); void show_about_table_bar();
void show_biome_table_bar(); void show_biome_table_bar();
void show_time_table_bar(); void show_time_table_bar();

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
using TickType = unsigned long long; // Prevent unsigned underflow issues in subtraction
using TickType = long long;
constexpr int DEFAULT_PER_TICK_TIME = 50; constexpr int DEFAULT_PER_TICK_TIME = 50;

View File

@@ -69,7 +69,7 @@ private:
std::atomic<bool> m_is_rebuilding{false}; std::atomic<bool> m_is_rebuilding{false};
std::atomic<bool> m_chunk_gen_finished{false}; std::atomic<bool> m_chunk_gen_finished{false};
std::atomic<bool> m_could_gen{true}; std::atomic<bool> m_could_gen{true};
std::atomic<bool> m_day_night_cycle{true}; std::atomic<bool> m_tick_running{true};
std::atomic<int> m_rendering_distance{24}; std::atomic<int> m_rendering_distance{24};
std::atomic<float> m_chunk_gen_fraction{0.0f}; std::atomic<float> m_chunk_gen_fraction{0.0f};
@@ -149,6 +149,9 @@ public:
void day_tick(TickType tick); void day_tick(TickType tick);
int per_tick_time() const; int per_tick_time() const;
void per_tick_time(int ms); void per_tick_time(int ms);
bool is_tick_running() const;
void tick_running(bool run);
}; };
} // namespace Cubed } // namespace Cubed

View File

@@ -266,7 +266,13 @@ void DevPanel::show_biome_table_bar() {
void DevPanel::show_time_table_bar() { void DevPanel::show_time_table_bar() {
World& world = m_app.world(); World& world = m_app.world();
ImGui::Text("Game Tick %llu", world.game_tick()); ImGui::Text("Game Tick %llu", world.game_tick());
ImGui::SameLine();
ImGui::Text("Day Tick %llu", world.day_tick()); 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)) { if (ImGui::SliderInt("SetDayTick", &m_pre_set_day_tick, 0, DAY_TIME)) {
} }
ImGui::SameLine(); ImGui::SameLine();

View File

@@ -757,9 +757,9 @@ void World::serever_run(std::stop_token stoken) {
Logger::info("Server Thread Started!"); Logger::info("Server Thread Started!");
while (!stoken.stop_requested()) { while (!stoken.stop_requested()) {
std::this_thread::sleep_for(milliseconds(m_per_tick_time)); std::this_thread::sleep_for(milliseconds(m_per_tick_time));
if (m_day_night_cycle) { if (m_tick_running) {
++m_game_ticks; ++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!"); 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(); } int World::per_tick_time() const { return m_per_tick_time.load(); }
void World::per_tick_time(int ms) { m_per_tick_time = ms; } 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 } // namespace Cubed