forked from Mirrorlandia_minetest/minetest
Require 'basic_debug' priv to view gameplay-relevant debug info, require 'debug' priv to view wireframe (#9315)
Fixes #7245.
This commit is contained in:
parent
51bf4a6e26
commit
63fc728a84
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user