Move hard coded minimap to builtin (#14071)

This commit is contained in:
cx384 2024-02-07 20:13:23 +01:00 committed by GitHub
parent f2b99332d9
commit adaa4cc2f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 51 additions and 87 deletions

@ -24,6 +24,13 @@ local bar_definitions = {
size = {x = 24, y = 24}, size = {x = 24, y = 24},
offset = {x = 25, y= -(48 + 24 + 16)}, offset = {x = 25, y= -(48 + 24 + 16)},
}, },
minimap = {
hud_elem_type = "minimap",
position = {x = 1, y = 0},
alignment = {x = -1, y = 1},
offset = {x = -10, y = 10},
size = {x = 256 , y = 256},
},
} }
local hud_ids = {} local hud_ids = {}
@ -92,6 +99,16 @@ local function update_builtin_statbars(player)
end, name, hud.id_breathbar) end, name, hud.id_breathbar)
hud.id_breathbar = nil hud.id_breathbar = nil
end end
-- Don't add a minimap for clients which already have it hardcoded in C++.
local show_minimap = flags.minimap and
minetest.get_player_information(name).protocol_version >= 44
if show_minimap and not hud.id_minimap then
hud.id_minimap = player:hud_add(bar_definitions.minimap)
elseif not show_minimap and hud.id_minimap then
player:hud_remove(hud.id_minimap)
hud.id_minimap = nil
end
end end
local function cleanup_builtin_statbars(player) local function cleanup_builtin_statbars(player)
@ -138,8 +155,7 @@ local function player_event_handler(player,eventname)
end end
function core.hud_replace_builtin(hud_name, definition) function core.hud_replace_builtin(hud_name, definition)
if type(definition) ~= "table" or if type(definition) ~= "table" then
(definition.type or definition.hud_elem_type) ~= "statbar" then
return false return false
end end
@ -175,6 +191,20 @@ function core.hud_replace_builtin(hud_name, definition)
return true return true
end end
if hud_name == "minimap" then
bar_definitions.minimap = definition
for name, ids in pairs(hud_ids) do
local player = core.get_player_by_name(name)
if player and ids.id_minimap then
player:hud_remove(ids.id_minimap)
ids.id_minimap = nil
update_builtin_statbars(player)
end
end
return true
end
return false return false
end end

@ -6800,7 +6800,7 @@ Misc.
(regardless of online status) (regardless of online status)
* `minetest.hud_replace_builtin(name, hud_definition)` * `minetest.hud_replace_builtin(name, hud_definition)`
* Replaces definition of a builtin hud element * Replaces definition of a builtin hud element
* `name`: `"breath"` or `"health"` * `name`: `"breath"`, `"health"` or `"minimap"`
* `hud_definition`: definition to replace builtin definition * `hud_definition`: definition to replace builtin definition
* `minetest.parse_relative_number(arg, relative_to)`: returns number or nil * `minetest.parse_relative_number(arg, relative_to)`: returns number or nil
* Helper function for chat commands. * Helper function for chat commands.

@ -1971,21 +1971,11 @@ void Client::makeScreenshot()
raw_image->drop(); raw_image->drop();
} }
bool Client::shouldShowMinimap() const
{
return !m_minimap_disabled_by_server;
}
void Client::pushToEventQueue(ClientEvent *event) void Client::pushToEventQueue(ClientEvent *event)
{ {
m_client_event_queue.push(event); m_client_event_queue.push(event);
} }
void Client::showMinimap(const bool show)
{
m_game_ui->showMinimap(show);
}
// IGameDef interface // IGameDef interface
// Under envlock // Under envlock
IItemDefManager* Client::getItemDefManager() IItemDefManager* Client::getItemDefManager()

@ -369,8 +369,6 @@ public:
Camera* getCamera () { return m_camera; } Camera* getCamera () { return m_camera; }
scene::ISceneManager *getSceneManager(); scene::ISceneManager *getSceneManager();
bool shouldShowMinimap() const;
// IGameDef interface // IGameDef interface
IItemDefManager* getItemDefManager() override; IItemDefManager* getItemDefManager() override;
const NodeDefManager* getNodeDefManager() override; const NodeDefManager* getNodeDefManager() override;
@ -412,8 +410,6 @@ public:
void pushToEventQueue(ClientEvent *event); void pushToEventQueue(ClientEvent *event);
void showMinimap(bool show = true);
// IP and port we're connected to // IP and port we're connected to
const Address getServerAddress(); const Address getServerAddress();
@ -498,7 +494,6 @@ private:
ELoginRegister m_allow_login_or_register = ELoginRegister::Any; ELoginRegister m_allow_login_or_register = ELoginRegister::Any;
Camera *m_camera = nullptr; Camera *m_camera = nullptr;
Minimap *m_minimap = nullptr; Minimap *m_minimap = nullptr;
bool m_minimap_disabled_by_server = false;
// Server serialization version // Server serialization version
u8 m_server_ser_ver; u8 m_server_ser_ver;

@ -1290,9 +1290,6 @@ void Game::run()
updateFrame(&graph, &stats, dtime, cam_view); updateFrame(&graph, &stats, dtime, cam_view);
updateProfilerGraphs(&graph); updateProfilerGraphs(&graph);
// Update if minimap has been disabled by the server
m_game_ui->m_flags.show_minimap &= client->shouldShowMinimap();
if (m_does_lost_focus_pause_game && !device->isWindowFocused() && !isMenuActive()) { if (m_does_lost_focus_pause_game && !device->isWindowFocused() && !isMenuActive()) {
showPauseMenu(); showPauseMenu();
} }
@ -2474,23 +2471,16 @@ void Game::toggleMinimap(bool shift_pressed)
// --> // -->
u32 hud_flags = client->getEnv().getLocalPlayer()->hud_flags; u32 hud_flags = client->getEnv().getLocalPlayer()->hud_flags;
if (!(hud_flags & HUD_FLAG_MINIMAP_VISIBLE)) { if (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) {
m_game_ui->m_flags.show_minimap = false;
} else {
// If radar is disabled, try to find a non radar mode or fall back to 0 // If radar is disabled, try to find a non radar mode or fall back to 0
if (!(hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE)) if (!(hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE))
while (mapper->getModeIndex() && while (mapper->getModeIndex() &&
mapper->getModeDef().type == MINIMAP_TYPE_RADAR) mapper->getModeDef().type == MINIMAP_TYPE_RADAR)
mapper->nextMode(); mapper->nextMode();
m_game_ui->m_flags.show_minimap = mapper->getModeDef().type !=
MINIMAP_TYPE_OFF;
} }
// <-- // <--
// End of 'not so satifying code' // End of 'not so satifying code'
if ((hud_flags & HUD_FLAG_MINIMAP_VISIBLE) || if (hud && hud->hasElementOfType(HUD_ELEM_MINIMAP))
(hud && hud->hasElementOfType(HUD_ELEM_MINIMAP)))
m_game_ui->showStatusText(utf8_to_wide(mapper->getModeDef().label)); m_game_ui->showStatusText(utf8_to_wide(mapper->getModeDef().label));
else else
m_game_ui->showTranslatedStatusText("Minimap currently disabled by game or mod"); m_game_ui->showTranslatedStatusText("Minimap currently disabled by game or mod");
@ -4358,7 +4348,7 @@ void Game::drawScene(ProfilerGraph *graph, RunStats *stats)
draw_crosshair = false; draw_crosshair = false;
#endif #endif
this->m_rendering_engine->draw_scene(sky_color, this->m_game_ui->m_flags.show_hud, this->m_rendering_engine->draw_scene(sky_color, this->m_game_ui->m_flags.show_hud,
this->m_game_ui->m_flags.show_minimap, draw_wield_tool, draw_crosshair); draw_wield_tool, draw_crosshair);
/* /*
Profiler graph Profiler graph

@ -219,11 +219,6 @@ void GameUI::initFlags()
m_flags.show_minimal_debug = g_settings->getBool("show_debug"); m_flags.show_minimal_debug = g_settings->getBool("show_debug");
} }
void GameUI::showMinimap(bool show)
{
m_flags.show_minimap = show;
}
void GameUI::showTranslatedStatusText(const char *str) void GameUI::showTranslatedStatusText(const char *str)
{ {
showStatusText(wstrgettext(str)); showStatusText(wstrgettext(str));

@ -57,7 +57,6 @@ public:
{ {
bool show_chat = true; bool show_chat = true;
bool show_hud = true; bool show_hud = true;
bool show_minimap = false;
bool show_minimal_debug = false; bool show_minimal_debug = false;
bool show_basic_debug = false; bool show_basic_debug = false;
bool show_profiler_graph = false; bool show_profiler_graph = false;
@ -71,8 +70,6 @@ public:
void initFlags(); void initFlags();
const Flags &getFlags() const { return m_flags; } const Flags &getFlags() const { return m_flags; }
void showMinimap(bool show);
inline void setInfoText(const std::wstring &str) { m_infotext = str; } inline void setInfoText(const std::wstring &str) { m_infotext = str; }
inline void clearInfoText() { m_infotext.clear(); } inline void clearInfoText() { m_infotext.clear(); }

@ -340,6 +340,14 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
std::vector<HudElement*> elems; std::vector<HudElement*> elems;
elems.reserve(player->maxHudId()); elems.reserve(player->maxHudId());
// Add builtin minimap if the server doesn't send it.
HudElement minimap;
if (client->getProtoVersion() < 44 && (player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE)) {
minimap = {HUD_ELEM_MINIMAP, v2f(1, 0), "", v2f(), "", 0 , 0, 0, v2f(-1, 1),
v2f(-10, 10), v3f(), v2s32(256, 256), 0, "", 0};
elems.push_back(&minimap);
}
for (size_t i = 0; i != player->maxHudId(); i++) { for (size_t i = 0; i != player->maxHudId(); i++) {
HudElement *e = player->getHud(i); HudElement *e = player->getHud(i);
if (!e) if (!e)

@ -571,17 +571,6 @@ scene::SMeshBuffer *Minimap::getMinimapMeshBuffer()
return buf; return buf;
} }
void Minimap::drawMinimap()
{
// Non hud managed minimap drawing (legacy minimap)
v2u32 screensize = RenderingEngine::getWindowSize();
const u32 size = 0.25 * screensize.Y;
drawMinimap(core::rect<s32>(
screensize.X - size - 10, 10,
screensize.X - 10, size + 10));
}
void Minimap::drawMinimap(core::rect<s32> rect) { void Minimap::drawMinimap(core::rect<s32> rect) {
video::ITexture *minimap_texture = getMinimapTexture(); video::ITexture *minimap_texture = getMinimapTexture();

@ -152,7 +152,6 @@ public:
void removeMarker(MinimapMarker **marker); void removeMarker(MinimapMarker **marker);
void updateActiveMarkers(); void updateActiveMarkers();
void drawMinimap();
void drawMinimap(core::rect<s32> rect); void drawMinimap(core::rect<s32> rect);
video::IVideoDriver *driver; video::IVideoDriver *driver;

@ -36,7 +36,7 @@ RenderingCore::~RenderingCore()
delete shadow_renderer; delete shadow_renderer;
} }
void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_minimap, void RenderingCore::draw(video::SColor _skycolor, bool _show_hud,
bool _draw_wield_tool, bool _draw_crosshair) bool _draw_wield_tool, bool _draw_crosshair)
{ {
v2u32 screensize = device->getVideoDriver()->getScreenSize(); v2u32 screensize = device->getVideoDriver()->getScreenSize();
@ -46,7 +46,6 @@ void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_min
context.draw_crosshair = _draw_crosshair; context.draw_crosshair = _draw_crosshair;
context.draw_wield_tool = _draw_wield_tool; context.draw_wield_tool = _draw_wield_tool;
context.show_hud = _show_hud; context.show_hud = _show_hud;
context.show_minimap = _show_minimap;
pipeline->reset(context); pipeline->reset(context);
pipeline->run(context); pipeline->run(context);

@ -53,7 +53,7 @@ public:
RenderingCore &operator=(const RenderingCore &) = delete; RenderingCore &operator=(const RenderingCore &) = delete;
RenderingCore &operator=(RenderingCore &&) = delete; RenderingCore &operator=(RenderingCore &&) = delete;
void draw(video::SColor _skycolor, bool _show_hud, bool _show_minimap, void draw(video::SColor _skycolor, bool _show_hud,
bool _draw_wield_tool, bool _draw_crosshair); bool _draw_wield_tool, bool _draw_crosshair);
v2u32 getVirtualSize() const; v2u32 getVirtualSize() const;

@ -46,7 +46,6 @@ struct PipelineContext
v2u32 target_size; v2u32 target_size;
bool show_hud {true}; bool show_hud {true};
bool show_minimap {true};
bool draw_wield_tool {true}; bool draw_wield_tool {true};
bool draw_crosshair {true}; bool draw_crosshair {true};
}; };

@ -64,9 +64,6 @@ void DrawHUD::run(PipelineContext &context)
context.hud->drawHotbar(context.client->getEnv().getLocalPlayer()->getWieldIndex()); context.hud->drawHotbar(context.client->getEnv().getLocalPlayer()->getWieldIndex());
context.hud->drawLuaElements(context.client->getCamera()->getOffset()); context.hud->drawLuaElements(context.client->getCamera()->getOffset());
context.client->getCamera()->drawNametags(); context.client->getCamera()->drawNametags();
auto mapper = context.client->getMinimap();
if (mapper && context.show_minimap)
mapper->drawMinimap();
} }
context.device->getGUIEnvironment()->drawAll(); context.device->getGUIEnvironment()->drawAll();
} }

@ -319,9 +319,9 @@ void RenderingEngine::finalize()
} }
void RenderingEngine::draw_scene(video::SColor skycolor, bool show_hud, void RenderingEngine::draw_scene(video::SColor skycolor, bool show_hud,
bool show_minimap, bool draw_wield_tool, bool draw_crosshair) bool draw_wield_tool, bool draw_crosshair)
{ {
core->draw(skycolor, show_hud, show_minimap, draw_wield_tool, draw_crosshair); core->draw(skycolor, show_hud, draw_wield_tool, draw_crosshair);
} }
const VideoDriverInfo &RenderingEngine::getVideoDriverInfo(irr::video::E_DRIVER_TYPE type) const VideoDriverInfo &RenderingEngine::getVideoDriverInfo(irr::video::E_DRIVER_TYPE type)

@ -118,7 +118,7 @@ public:
float dtime = 0, int percent = 0, bool sky = true); float dtime = 0, int percent = 0, bool sky = true);
void draw_scene(video::SColor skycolor, bool show_hud, void draw_scene(video::SColor skycolor, bool show_hud,
bool show_minimap, bool draw_wield_tool, bool draw_crosshair); bool draw_wield_tool, bool draw_crosshair);
void initialize(Client *client, Hud *hud); void initialize(Client *client, Hud *hud);
void finalize(); void finalize();

@ -1281,24 +1281,15 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt)
LocalPlayer *player = m_env.getLocalPlayer(); LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL); assert(player != NULL);
bool was_minimap_visible = player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE;
bool was_minimap_radar_visible = player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE; bool was_minimap_radar_visible = player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE;
player->hud_flags &= ~mask; player->hud_flags &= ~mask;
player->hud_flags |= flags; player->hud_flags |= flags;
m_minimap_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE);
bool m_minimap_radar_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE); bool m_minimap_radar_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE);
// Not so satisying code to keep compatibility with old fixed mode system // Not so satisying code to keep compatibility with old fixed mode system
// --> // -->
// Hide minimap if it has been disabled by the server
if (m_minimap && m_minimap_disabled_by_server && was_minimap_visible)
// defers a minimap update, therefore only call it if really
// needed, by checking that minimap was visible before
m_minimap->setModeIndex(0);
// If radar has been disabled, try to find a non radar mode or fall back to 0 // If radar has been disabled, try to find a non radar mode or fall back to 0
if (m_minimap && m_minimap_radar_disabled_by_server if (m_minimap && m_minimap_radar_disabled_by_server
&& was_minimap_radar_visible) { && was_minimap_radar_visible) {

@ -222,6 +222,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
PROTOCOL VERSION 44: PROTOCOL VERSION 44:
AO_CMD_SET_BONE_POSITION extended AO_CMD_SET_BONE_POSITION extended
Add TOCLIENT_MOVE_PLAYER_REL Add TOCLIENT_MOVE_PLAYER_REL
Move default minimap from client-side C++ to server-side builtin Lua
[scheduled bump for 5.9.0] [scheduled bump for 5.9.0]
*/ */

@ -144,7 +144,6 @@ int LuaMinimap::l_show(lua_State *L)
if (m->getModeIndex() == 0 && m->getMaxModeIndex() > 0) if (m->getModeIndex() == 0 && m->getMaxModeIndex() > 0)
m->setModeIndex(1); m->setModeIndex(1);
client->showMinimap(true);
return 1; return 1;
} }
@ -162,7 +161,6 @@ int LuaMinimap::l_hide(lua_State *L)
if (m->getModeIndex() != 0) if (m->getModeIndex() != 0)
m->setModeIndex(0); m->setModeIndex(0);
client->showMinimap(false);
return 1; return 1;
} }

@ -30,7 +30,6 @@ public:
void runTests(IGameDef *gamedef); void runTests(IGameDef *gamedef);
void testInit(); void testInit();
void testFlagSetters();
void testInfoText(); void testInfoText();
void testStatusText(); void testStatusText();
}; };
@ -40,7 +39,6 @@ static TestGameUI g_test_instance;
void TestGameUI::runTests(IGameDef *gamedef) void TestGameUI::runTests(IGameDef *gamedef)
{ {
TEST(testInit); TEST(testInit);
TEST(testFlagSetters);
TEST(testInfoText); TEST(testInfoText);
TEST(testStatusText); TEST(testStatusText);
} }
@ -51,30 +49,18 @@ void TestGameUI::testInit()
// Ensure flags on GameUI init // Ensure flags on GameUI init
UASSERT(gui.getFlags().show_chat) UASSERT(gui.getFlags().show_chat)
UASSERT(gui.getFlags().show_hud) UASSERT(gui.getFlags().show_hud)
UASSERT(!gui.getFlags().show_minimap)
UASSERT(!gui.getFlags().show_profiler_graph) UASSERT(!gui.getFlags().show_profiler_graph)
// And after the initFlags init stage // And after the initFlags init stage
gui.initFlags(); gui.initFlags();
UASSERT(gui.getFlags().show_chat) UASSERT(gui.getFlags().show_chat)
UASSERT(gui.getFlags().show_hud) UASSERT(gui.getFlags().show_hud)
UASSERT(!gui.getFlags().show_minimap)
UASSERT(!gui.getFlags().show_profiler_graph) UASSERT(!gui.getFlags().show_profiler_graph)
// @TODO verify if we can create non UI nulldevice to test this function // @TODO verify if we can create non UI nulldevice to test this function
// gui.init(); // gui.init();
} }
void TestGameUI::testFlagSetters()
{
GameUI gui{};
gui.showMinimap(true);
UASSERT(gui.getFlags().show_minimap);
gui.showMinimap(false);
UASSERT(!gui.getFlags().show_minimap);
}
void TestGameUI::testStatusText() void TestGameUI::testStatusText()
{ {
GameUI gui{}; GameUI gui{};