Require 'basic_debug' priv to view gameplay-relevant debug info, require 'debug' priv to view wireframe (#9315)

Fixes #7245.
This commit is contained in:
Wuzzy 2021-06-24 18:21:19 +00:00 committed by GitHub
parent 51bf4a6e26
commit 63fc728a84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 85 additions and 20 deletions

@ -97,10 +97,13 @@ core.register_privilege("rollback", {
description = S("Can use the rollback functionality"), description = S("Can use the rollback functionality"),
give_to_singleplayer = false, give_to_singleplayer = false,
}) })
core.register_privilege("debug", { core.register_privilege("basic_debug", {
description = S("Allows enabling various debug options that may affect gameplay"), description = S("Can view more debug info that might give a gameplay advantage"),
give_to_singleplayer = false,
})
core.register_privilege("debug", {
description = S("Can enable wireframe"),
give_to_singleplayer = false, give_to_singleplayer = false,
give_to_admin = true,
}) })
core.register_can_bypass_userlimit(function(name, ip) core.register_can_bypass_userlimit(function(name, ip)

@ -676,6 +676,7 @@ protected:
bool handleCallbacks(); bool handleCallbacks();
void processQueues(); void processQueues();
void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime); void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime);
void updateBasicDebugState();
void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime); void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime);
void updateProfilerGraphs(ProfilerGraph *graph); void updateProfilerGraphs(ProfilerGraph *graph);
@ -693,6 +694,7 @@ protected:
void toggleFast(); void toggleFast();
void toggleNoClip(); void toggleNoClip();
void toggleCinematic(); void toggleCinematic();
void toggleBlockBounds();
void toggleAutoforward(); void toggleAutoforward();
void toggleMinimap(bool shift_pressed); void toggleMinimap(bool shift_pressed);
@ -1108,6 +1110,7 @@ void Game::run()
m_game_ui->clearInfoText(); m_game_ui->clearInfoText();
hud->resizeHotbar(); hud->resizeHotbar();
updateProfilers(stats, draw_times, dtime); updateProfilers(stats, draw_times, dtime);
processUserInput(dtime); processUserInput(dtime);
// Update camera before player movement to avoid camera lag of one frame // Update camera before player movement to avoid camera lag of one frame
@ -1119,10 +1122,11 @@ void Game::run()
updatePlayerControl(cam_view); updatePlayerControl(cam_view);
step(&dtime); step(&dtime);
processClientEvents(&cam_view_target); processClientEvents(&cam_view_target);
updateBasicDebugState();
updateCamera(draw_times.busy_time, dtime); updateCamera(draw_times.busy_time, dtime);
updateSound(dtime); updateSound(dtime);
processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud, processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud,
m_game_ui->m_flags.show_debug); m_game_ui->m_flags.show_basic_debug);
updateFrame(&graph, &stats, dtime, cam_view); updateFrame(&graph, &stats, dtime, cam_view);
updateProfilerGraphs(&graph); updateProfilerGraphs(&graph);
@ -1723,6 +1727,19 @@ void Game::processQueues()
shader_src->processQueue(); shader_src->processQueue();
} }
void Game::updateBasicDebugState()
{
if (m_game_ui->m_flags.show_basic_debug) {
if (!client->checkPrivilege("basic_debug")) {
m_game_ui->m_flags.show_basic_debug = false;
hud->disableBlockBounds();
}
} else if (m_game_ui->m_flags.show_minimal_debug) {
if (client->checkPrivilege("basic_debug")) {
m_game_ui->m_flags.show_basic_debug = true;
}
}
}
void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times, void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times,
f32 dtime) f32 dtime)
@ -1935,7 +1952,7 @@ void Game::processKeyInput()
} else if (wasKeyDown(KeyType::SCREENSHOT)) { } else if (wasKeyDown(KeyType::SCREENSHOT)) {
client->makeScreenshot(); client->makeScreenshot();
} else if (wasKeyDown(KeyType::TOGGLE_BLOCK_BOUNDS)) { } else if (wasKeyDown(KeyType::TOGGLE_BLOCK_BOUNDS)) {
hud->toggleBlockBounds(); toggleBlockBounds();
} else if (wasKeyDown(KeyType::TOGGLE_HUD)) { } else if (wasKeyDown(KeyType::TOGGLE_HUD)) {
m_game_ui->toggleHud(); m_game_ui->toggleHud();
} else if (wasKeyDown(KeyType::MINIMAP)) { } else if (wasKeyDown(KeyType::MINIMAP)) {
@ -2173,6 +2190,15 @@ void Game::toggleCinematic()
m_game_ui->showTranslatedStatusText("Cinematic mode disabled"); m_game_ui->showTranslatedStatusText("Cinematic mode disabled");
} }
void Game::toggleBlockBounds()
{
if (client->checkPrivilege("basic_debug")) {
hud->toggleBlockBounds();
} else {
m_game_ui->showTranslatedStatusText("Can't show block bounds (need 'basic_debug' privilege)");
}
}
// Autoforward by toggling continuous forward. // Autoforward by toggling continuous forward.
void Game::toggleAutoforward() void Game::toggleAutoforward()
{ {
@ -2236,24 +2262,41 @@ void Game::toggleFog()
void Game::toggleDebug() void Game::toggleDebug()
{ {
// Initial / 4x toggle: Chat only // Initial: No debug info
// 1x toggle: Debug text with chat // 1x toggle: Debug text
// 2x toggle: Debug text with profiler graph // 2x toggle: Debug text with profiler graph
// 3x toggle: Debug text and wireframe // 3x toggle: Debug text and wireframe (needs "debug" priv)
if (!m_game_ui->m_flags.show_debug) { // Next toggle: Back to initial
m_game_ui->m_flags.show_debug = true; //
// The debug text can be in 2 modes: minimal and basic.
// * Minimal: Only technical client info that not gameplay-relevant
// * Basic: Info that might give gameplay advantage, e.g. pos, angle
// Basic mode is used when player has "basic_debug" priv,
// otherwise the Minimal mode is used.
if (!m_game_ui->m_flags.show_minimal_debug) {
m_game_ui->m_flags.show_minimal_debug = true;
if (client->checkPrivilege("basic_debug")) {
m_game_ui->m_flags.show_basic_debug = true;
}
m_game_ui->m_flags.show_profiler_graph = false; m_game_ui->m_flags.show_profiler_graph = false;
draw_control->show_wireframe = false; draw_control->show_wireframe = false;
m_game_ui->showTranslatedStatusText("Debug info shown"); m_game_ui->showTranslatedStatusText("Debug info shown");
} else if (!m_game_ui->m_flags.show_profiler_graph && !draw_control->show_wireframe) { } else if (!m_game_ui->m_flags.show_profiler_graph && !draw_control->show_wireframe) {
if (client->checkPrivilege("basic_debug")) {
m_game_ui->m_flags.show_basic_debug = true;
}
m_game_ui->m_flags.show_profiler_graph = true; m_game_ui->m_flags.show_profiler_graph = true;
m_game_ui->showTranslatedStatusText("Profiler graph shown"); m_game_ui->showTranslatedStatusText("Profiler graph shown");
} else if (!draw_control->show_wireframe && client->checkPrivilege("debug")) { } else if (!draw_control->show_wireframe && client->checkPrivilege("debug")) {
if (client->checkPrivilege("basic_debug")) {
m_game_ui->m_flags.show_basic_debug = true;
}
m_game_ui->m_flags.show_profiler_graph = false; m_game_ui->m_flags.show_profiler_graph = false;
draw_control->show_wireframe = true; draw_control->show_wireframe = true;
m_game_ui->showTranslatedStatusText("Wireframe shown"); m_game_ui->showTranslatedStatusText("Wireframe shown");
} else { } else {
m_game_ui->m_flags.show_debug = false; m_game_ui->m_flags.show_minimal_debug = false;
m_game_ui->m_flags.show_basic_debug = false;
m_game_ui->m_flags.show_profiler_graph = false; m_game_ui->m_flags.show_profiler_graph = false;
draw_control->show_wireframe = false; draw_control->show_wireframe = false;
if (client->checkPrivilege("debug")) { if (client->checkPrivilege("debug")) {

@ -99,7 +99,8 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
{ {
v2u32 screensize = RenderingEngine::getWindowSize(); v2u32 screensize = RenderingEngine::getWindowSize();
if (m_flags.show_debug) { // Minimal debug text must only contain info that can't give a gameplay advantage
if (m_flags.show_minimal_debug) {
static float drawtime_avg = 0; static float drawtime_avg = 0;
drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05; drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05;
u16 fps = 1.0 / stats.dtime_jitter.avg; u16 fps = 1.0 / stats.dtime_jitter.avg;
@ -125,9 +126,10 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
} }
// Finally set the guitext visible depending on the flag // Finally set the guitext visible depending on the flag
m_guitext->setVisible(m_flags.show_debug); m_guitext->setVisible(m_flags.show_minimal_debug);
if (m_flags.show_debug) { // Basic debug text also shows info that might give a gameplay advantage
if (m_flags.show_basic_debug) {
LocalPlayer *player = client->getEnv().getLocalPlayer(); LocalPlayer *player = client->getEnv().getLocalPlayer();
v3f player_position = player->getPosition(); v3f player_position = player->getPosition();
@ -160,7 +162,7 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
)); ));
} }
m_guitext2->setVisible(m_flags.show_debug); m_guitext2->setVisible(m_flags.show_basic_debug);
setStaticText(m_guitext_info, m_infotext.c_str()); setStaticText(m_guitext_info, m_infotext.c_str());
m_guitext_info->setVisible(m_flags.show_hud && g_menumgr.menuCount() == 0); m_guitext_info->setVisible(m_flags.show_hud && g_menumgr.menuCount() == 0);
@ -204,7 +206,8 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
void GameUI::initFlags() void GameUI::initFlags()
{ {
m_flags = GameUI::Flags(); m_flags = GameUI::Flags();
m_flags.show_debug = g_settings->getBool("show_debug"); m_flags.show_minimal_debug = g_settings->getBool("show_debug");
m_flags.show_basic_debug = false;
} }
void GameUI::showMinimap(bool show) void GameUI::showMinimap(bool show)
@ -225,8 +228,10 @@ void GameUI::setChatText(const EnrichedString &chat_text, u32 recent_chat_count)
// Update gui element size and position // Update gui element size and position
s32 chat_y = 5; s32 chat_y = 5;
if (m_flags.show_debug) if (m_flags.show_minimal_debug)
chat_y += 2 * g_fontengine->getLineHeight(); chat_y += g_fontengine->getLineHeight();
if (m_flags.show_basic_debug)
chat_y += g_fontengine->getLineHeight();
const v2u32 &window_size = RenderingEngine::getWindowSize(); const v2u32 &window_size = RenderingEngine::getWindowSize();

@ -58,7 +58,8 @@ public:
bool show_chat = true; bool show_chat = true;
bool show_hud = true; bool show_hud = true;
bool show_minimap = false; bool show_minimap = false;
bool show_debug = true; bool show_minimal_debug = false;
bool show_basic_debug = false;
bool show_profiler_graph = false; bool show_profiler_graph = false;
}; };

@ -870,6 +870,11 @@ void Hud::toggleBlockBounds()
} }
} }
void Hud::disableBlockBounds()
{
m_block_bounds_mode = BLOCK_BOUNDS_OFF;
}
void Hud::drawBlockBounds() void Hud::drawBlockBounds()
{ {
if (m_block_bounds_mode == BLOCK_BOUNDS_OFF) { if (m_block_bounds_mode == BLOCK_BOUNDS_OFF) {

@ -52,6 +52,7 @@ public:
~Hud(); ~Hud();
void toggleBlockBounds(); void toggleBlockBounds();
void disableBlockBounds();
void drawBlockBounds(); void drawBlockBounds();
void drawHotbar(u16 playeritem); void drawHotbar(u16 playeritem);

@ -896,6 +896,11 @@ void Client::handleCommand_Privileges(NetworkPacket* pkt)
m_privileges.insert(priv); m_privileges.insert(priv);
infostream << priv << " "; infostream << priv << " ";
} }
// Enable basic_debug on server versions before it was added
if (m_proto_ver < 40)
m_privileges.insert("basic_debug");
infostream << std::endl; infostream << std::endl;
} }

@ -205,9 +205,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Updated set_sky packet Updated set_sky packet
Adds new sun, moon and stars packets Adds new sun, moon and stars packets
Minimap modes Minimap modes
PROTOCOL VERSION 40:
Added 'basic_debug' privilege
*/ */
#define LATEST_PROTOCOL_VERSION 39 #define LATEST_PROTOCOL_VERSION 40
#define LATEST_PROTOCOL_VERSION_STRING TOSTRING(LATEST_PROTOCOL_VERSION) #define LATEST_PROTOCOL_VERSION_STRING TOSTRING(LATEST_PROTOCOL_VERSION)
// Server's supported network protocol range // Server's supported network protocol range