]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/gameui.cpp
CSM: Do not index files within hidden directories
[minetest.git] / src / client / gameui.cpp
index 7e0a7ef67736a6fba20f4218e61c157cbd08268e..32396755023d3792c0d44eaf958d8544ef96d078 100644 (file)
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <irrlicht_changes/static_text.h>
 #include <gettext.h>
 #include "gui/mainmenumanager.h"
+#include "gui/guiChatConsole.h"
 #include "util/pointedthing.h"
 #include "client.h"
 #include "clientmap.h"
@@ -33,7 +34,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 inline static const char *yawToDirectionString(int yaw)
 {
-       static const char *direction[4] = {"N +Z", "W -X", "S -Z", "E +X"};
+       static const char *direction[4] =
+               {"North +Z", "West -X", "South -Z", "East +X"};
 
        yaw = wrapDegrees_0_360(yaw);
        yaw = (yaw + 45) % 360 / 90;
@@ -59,36 +61,46 @@ void GameUI::init()
        m_guitext2 = gui::StaticText::add(guienv, L"", core::rect<s32>(0, 0, 0, 0), false,
                false, guiroot);
 
+       // Chat text
+       m_guitext_chat = gui::StaticText::add(guienv, L"", core::rect<s32>(0, 0, 0, 0),
+               //false, false); // Disable word wrap as of now
+               false, true, guiroot);
+       u16 chat_font_size = g_settings->getU16("chat_font_size");
+       if (chat_font_size != 0) {
+               m_guitext_chat->setOverrideFont(g_fontengine->getFont(
+                       chat_font_size, FM_Unspecified));
+       }
+
        // At the middle of the screen
        // Object infos are shown in this
+       u32 chat_font_height = m_guitext_chat->getActiveFont()->getDimension(L"Ay").Height;
        m_guitext_info = gui::StaticText::add(guienv, L"",
-               core::rect<s32>(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5)
-                       + v2s32(100, 200), false, true, guiroot);
+               core::rect<s32>(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5) +
+                       v2s32(100, chat_font_height *
+                       (g_settings->getU16("recent_chat_messages") + 3)),
+                       false, true, guiroot);
 
        // Status text (displays info when showing and hiding GUI stuff, etc.)
        m_guitext_status = gui::StaticText::add(guienv, L"<Status>",
                core::rect<s32>(0, 0, 0, 0), false, false, guiroot);
        m_guitext_status->setVisible(false);
 
-       // Chat text
-       m_guitext_chat = gui::StaticText::add(guienv, L"", core::rect<s32>(0, 0, 0, 0),
-               //false, false); // Disable word wrap as of now
-               false, true, guiroot);
-
        // Profiler text (size is updated when text is updated)
        m_guitext_profiler = gui::StaticText::add(guienv, L"<Profiler>",
                core::rect<s32>(0, 0, 0, 0), false, false, guiroot);
-       m_guitext_profiler->setBackgroundColor(video::SColor(120, 0, 0, 0));
+       m_guitext_profiler->setOverrideFont(g_fontengine->getFont(
+               g_fontengine->getDefaultFontSize() * 0.9f, FM_Mono));
        m_guitext_profiler->setVisible(false);
-       m_guitext_profiler->setWordWrap(true);
 }
 
 void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_control,
-       const CameraOrientation &cam, const PointedThing &pointed_old, float dtime)
+       const CameraOrientation &cam, const PointedThing &pointed_old,
+       const GUIChatConsole *chat_console, float dtime)
 {
-       v2u32 screensize = RenderingEngine::get_instance()->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;
                drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05;
                u16 fps = 1.0 / stats.dtime_jitter.avg;
@@ -96,17 +108,17 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
                std::ostringstream os(std::ios_base::binary);
                os << std::fixed
                        << PROJECT_NAME_C " " << g_version_hash
-                       << ", FPS: " << fps
+                       << " | FPS: " << fps
                        << std::setprecision(0)
-                       << ", drawtime: " << drawtime_avg << "ms"
+                       << " | drawtime: " << drawtime_avg << "ms"
                        << std::setprecision(1)
-                       << ", dtime jitter: "
+                       << " | dtime jitter: "
                        << (stats.dtime_jitter.max_fraction * 100.0) << "%"
                        << std::setprecision(1)
-                       << ", view range: "
+                       << " | view range: "
                        << (draw_control->range_all ? "All" : itos(draw_control->wanted_range))
-                       << std::setprecision(3)
-                       << ", RTT: " << client->getRTT() << "s";
+                       << std::setprecision(2)
+                       << " | RTT: " << (client->getRTT() * 1000.0f) << "ms";
                setStaticText(m_guitext, utf8_to_wide(os.str()).c_str());
 
                m_guitext->setRelativePosition(core::rect<s32>(5, 5, screensize.X,
@@ -114,9 +126,10 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
        }
 
        // 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();
                v3f player_position = player->getPosition();
 
@@ -125,14 +138,15 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
                        << "pos: (" << (player_position.X / BS)
                        << ", " << (player_position.Y / BS)
                        << ", " << (player_position.Z / BS)
-                       << "), yaw: " << (wrapDegrees_0_360(cam.camera_yaw)) << "° "
+                       << ") | yaw: " << (wrapDegrees_0_360(cam.camera_yaw)) << "° "
                        << yawToDirectionString(cam.camera_yaw)
-                       << ", seed: " << ((u64)client->getMapSeed());
+                       << " | pitch: " << (-wrapDegrees_180(cam.camera_pitch)) << "°"
+                       << " | seed: " << ((u64)client->getMapSeed());
 
                if (pointed_old.type == POINTEDTHING_NODE) {
                        ClientMap &map = client->getEnv().getClientMap();
                        const NodeDefManager *nodedef = client->getNodeDefManager();
-                       MapNode n = map.getNodeNoEx(pointed_old.node_undersurface);
+                       MapNode n = map.getNode(pointed_old.node_undersurface);
 
                        if (n.getContent() != CONTENT_IGNORE && nodedef->get(n).name != "unknown") {
                                os << ", pointed: " << nodedef->get(n).name
@@ -148,9 +162,9 @@ 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, translate_string(m_infotext).c_str());
+       setStaticText(m_guitext_info, m_infotext.c_str());
        m_guitext_info->setVisible(m_flags.show_hud && g_menumgr.menuCount() == 0);
 
        static const float statustext_time_max = 1.5f;
@@ -164,7 +178,7 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
                }
        }
 
-       setStaticText(m_guitext_status, translate_string(m_statustext).c_str());
+       setStaticText(m_guitext_status, m_statustext.c_str());
        m_guitext_status->setVisible(!m_statustext.empty());
 
        if (!m_statustext.empty()) {
@@ -184,14 +198,16 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_
                m_guitext_status->setOverrideColor(fade_color);
                m_guitext_status->enableOverrideColor(true);
        }
+
+       // Hide chat when console is visible
+       m_guitext_chat->setVisible(isChatVisible() && !chat_console->isVisible());
 }
 
 void GameUI::initFlags()
 {
        m_flags = GameUI::Flags();
-       m_flags.show_chat = true;
-       m_flags.show_hud = true;
-       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)
@@ -208,57 +224,48 @@ void GameUI::showTranslatedStatusText(const char *str)
 
 void GameUI::setChatText(const EnrichedString &chat_text, u32 recent_chat_count)
 {
-       setStaticText(m_guitext_chat, chat_text);
 
        // Update gui element size and position
        s32 chat_y = 5;
 
-       if (m_flags.show_debug)
-               chat_y += 2 * g_fontengine->getLineHeight();
+       if (m_flags.show_minimal_debug)
+               chat_y += g_fontengine->getLineHeight();
+       if (m_flags.show_basic_debug)
+               chat_y += g_fontengine->getLineHeight();
 
-       // first pass to calculate height of text to be set
-       const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize();
-       s32 width = std::min(g_fontengine->getTextWidth(chat_text.c_str()) + 10,
-               window_size.X - 20);
-       m_guitext_chat->setRelativePosition(core::rect<s32>(10, chat_y, width,
-               chat_y + window_size.Y));
+       const v2u32 &window_size = RenderingEngine::getWindowSize();
 
-       // now use real height of text and adjust rect according to this size
-       m_guitext_chat->setRelativePosition(core::rect<s32>(10, chat_y, width,
-               chat_y + m_guitext_chat->getTextHeight()));
+       core::rect<s32> chat_size(10, chat_y,
+               window_size.X - 20, 0);
+       chat_size.LowerRightCorner.Y = std::min((s32)window_size.Y,
+               m_guitext_chat->getTextHeight() + chat_y);
 
-       // Don't show chat if disabled or empty or profiler is enabled
-       m_guitext_chat->setVisible(m_flags.show_chat &&
-               recent_chat_count != 0 && m_profiler_current_page == 0);
+       m_guitext_chat->setRelativePosition(chat_size);
+       setStaticText(m_guitext_chat, chat_text);
+
+       m_recent_chat_count = recent_chat_count;
 }
 
 void GameUI::updateProfiler()
 {
        if (m_profiler_current_page != 0) {
                std::ostringstream os(std::ios_base::binary);
-               g_profiler->printPage(os, m_profiler_current_page, m_profiler_max_page);
-
-               std::wstring text = translate_string(utf8_to_wide(os.str()));
-               setStaticText(m_guitext_profiler, text.c_str());
-
-               s32 w = g_fontengine->getTextWidth(text);
-
-               if (w < 400)
-                       w = 400;
-
-               u32 text_height = g_fontengine->getTextHeight();
-
-               core::position2di upper_left, lower_right;
+               os << "   Profiler page " << (int)m_profiler_current_page <<
+                               ", elapsed: " << g_profiler->getElapsedMs() << " ms)" << std::endl;
 
-               upper_left.X  = 6;
-               upper_left.Y  = (text_height + 5) * 2;
-               lower_right.X = 12 + w;
-               lower_right.Y = upper_left.Y + (text_height + 1) * MAX_PROFILER_TEXT_ROWS;
+               int lines = g_profiler->print(os, m_profiler_current_page, m_profiler_max_page);
+               ++lines;
 
-               s32 screen_height = RenderingEngine::get_video_driver()->getScreenSize().Height;
+               EnrichedString str(utf8_to_wide(os.str()));
+               str.setBackground(video::SColor(120, 0, 0, 0));
+               setStaticText(m_guitext_profiler, str);
 
-               if (lower_right.Y > screen_height * 2 / 3)
-                       lower_right.Y = screen_height * 2 / 3;
+               core::dimension2d<u32> size = m_guitext_profiler->getOverrideFont()->
+                               getDimension(str.c_str());
+               core::position2di upper_left(6, 50);
+               core::position2di lower_right = upper_left;
+               lower_right.X += size.Width + 10;
+               lower_right.Y += size.Height;
 
                m_guitext_profiler->setRelativePosition(core::rect<s32>(upper_left, lower_right));
        }
@@ -302,3 +309,14 @@ void GameUI::toggleProfiler()
                showTranslatedStatusText("Profiler hidden");
        }
 }
+
+
+void GameUI::deleteFormspec()
+{
+       if (m_formspec) {
+               m_formspec->drop();
+               m_formspec = nullptr;
+       }
+
+       m_formname.clear();
+}