]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Properly keep noclip state in Game and ClientMap
authorsfan5 <sfan5@live.de>
Sat, 21 May 2022 18:29:44 +0000 (20:29 +0200)
committersfan5 <sfan5@live.de>
Fri, 3 Jun 2022 19:48:52 +0000 (21:48 +0200)
src/client/clientmap.cpp
src/client/clientmap.h
src/client/game.cpp

index 98e3f40d3acb56fbe5485c6073e3e9b15ee05c69..38ba1daad2df308e0df0a8a6a09e2c259722c0cf 100644 (file)
@@ -219,13 +219,11 @@ void ClientMap::updateDrawList()
        // Number of blocks occlusion culled
        u32 blocks_occlusion_culled = 0;
 
-       // No occlusion culling when free_move is on and camera is
-       // inside ground
+       // No occlusion culling when free_move is on and camera is inside ground
        bool occlusion_culling_enabled = true;
-       if (g_settings->getBool("free_move") && g_settings->getBool("noclip")) {
+       if (m_control.allow_noclip) {
                MapNode n = getNode(cam_pos_nodes);
-               if (n.getContent() == CONTENT_IGNORE ||
-                               m_nodedef->get(n).solidness == 2)
+               if (n.getContent() == CONTENT_IGNORE || m_nodedef->get(n).solidness == 2)
                        occlusion_culling_enabled = false;
        }
 
@@ -678,19 +676,17 @@ void ClientMap::renderPostFx(CameraMode cam_mode)
 
        MapNode n = getNode(floatToInt(m_camera_position, BS));
 
-       // - If the player is in a solid node, make everything black.
-       // - If the player is in liquid, draw a semi-transparent overlay.
-       // - Do not if player is in third person mode
        const ContentFeatures& features = m_nodedef->get(n);
        video::SColor post_effect_color = features.post_effect_color;
-       if(features.solidness == 2 && !(g_settings->getBool("noclip") &&
-                       m_client->checkLocalPrivilege("noclip")) &&
-                       cam_mode == CAMERA_MODE_FIRST)
-       {
+
+       // If the camera is in a solid node, make everything black.
+       // (first person mode only)
+       if (features.solidness == 2 && cam_mode == CAMERA_MODE_FIRST &&
+               !m_control.allow_noclip) {
                post_effect_color = video::SColor(255, 0, 0, 0);
        }
-       if (post_effect_color.getAlpha() != 0)
-       {
+
+       if (post_effect_color.getAlpha() != 0) {
                // Draw a full-screen rectangle
                video::IVideoDriver* driver = SceneManager->getVideoDriver();
                v2u32 ss = driver->getScreenSize();
index 823870c6860d699a3623a0b45c1f7d4de0851a67..8c45b538276215a4d70120dbfe049d8258f7060b 100644 (file)
@@ -27,10 +27,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 struct MapDrawControl
 {
-       // Overrides limits by drawing everything
-       bool range_all = false;
        // Wanted drawing range
        float wanted_range = 0.0f;
+       // Overrides limits by drawing everything
+       bool range_all = false;
+       // Allow rendering out of bounds
+       bool allow_noclip = false;
        // show a wire frame for debugging
        bool show_wireframe = false;
 };
index f93bd34a3b6ff56fb88fddded059bb525adffd3f..d6e0cc8b8e26bc8632f7919f069819f55b6408a9 100644 (file)
@@ -1743,6 +1743,8 @@ void Game::processQueues()
 void Game::updateDebugState()
 {
        LocalPlayer *player = client->getEnv().getLocalPlayer();
+
+       // debug UI and wireframe
        bool has_debug = client->checkPrivilege("debug");
        bool has_basic_debug = has_debug || (player->hud_flags & HUD_FLAG_BASIC_DEBUG);
 
@@ -1757,6 +1759,9 @@ void Game::updateDebugState()
                hud->disableBlockBounds();
        if (!has_debug)
                draw_control->show_wireframe = false;
+
+       // noclip
+       draw_control->allow_noclip = m_cache_enable_noclip && client->checkPrivilege("noclip");
 }
 
 void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times,
@@ -3762,7 +3767,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
        float direct_brightness;
        bool sunlight_seen;
 
-       if (m_cache_enable_noclip && m_cache_enable_free_move) {
+       // When in noclip mode force same sky brightness as above ground so you
+       // can see properly
+       if (draw_control->allow_noclip && m_cache_enable_free_move &&
+               client->checkPrivilege("fly")) {
                direct_brightness = time_brightness;
                sunlight_seen = true;
        } else {