#include #include "console.hpp" #include "loader/component_loader.hpp" #include "game/game.hpp" #include "scheduler.hpp" #include namespace dedicated_info { class component final : public component_interface { public: void post_unpack() override { if (!game::environment::is_dedi()) { return; } scheduler::once([]() { console::set_title("iw6-mod Dedicated Server"); console::set_size(800, 600); }); scheduler::loop([]() { const auto* sv_running = game::Dvar_FindVar("sv_running"); if (!sv_running || !sv_running->current.enabled) { console::set_title("iw6-mod Dedicated Server"); return; } const auto* sv_hostname = game::Dvar_FindVar("sv_hostname"); const auto* sv_maxclients = game::Dvar_FindVar("sv_maxclients"); const auto* mapname = game::Dvar_FindVar("mapname"); auto client_count = 0; auto bot_count = 0; for (auto i = 0; i < sv_maxclients->current.integer; ++i) { auto* client = &game::mp::svs->clients[i]; auto* self = &game::mp::g_entities[i]; if (client->header.state > game::CS_FREE && self && self->client) { ++client_count; if (game::SV_BotIsBot(i)) { ++bot_count; } } } std::string cleaned_hostname = sv_hostname->current.string; utils::string::strip(sv_hostname->current.string, cleaned_hostname.data(), cleaned_hostname.size() + 1); console::set_title(utils::string::va("%s on %s [%d/%d] (%d)", cleaned_hostname.c_str(), mapname->current.string, client_count, sv_maxclients->current.integer, bot_count)); }, scheduler::pipeline::main, 1s); } }; } REGISTER_COMPONENT(dedicated_info::component)