]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Improved Freecam
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 28 Jul 2020 14:47:27 +0000 (16:47 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 28 Jul 2020 14:47:27 +0000 (16:47 +0200)
src/client/content_cao.cpp
src/client/game.cpp
src/client/game.h

index 5f60c33753b687e933f30764b64d2ad96262097a..2a3225b7a8e727cd764f25ab53486559265e830c 100644 (file)
@@ -943,7 +943,7 @@ void GenericCAO::updateNodePos()
 void GenericCAO::step(float dtime, ClientEnvironment *env)
 {
        // Handle model animations and update positions instantly to prevent lags
-       if (m_is_local_player) {
+       if (m_is_local_player && ! g_settings->getBool("freecam")) {
                LocalPlayer *player = m_env->getLocalPlayer();
                m_position = player->getPosition();
                pos_translator.val_current = m_position;
index 3c3ce555df30b4d04268fe8eb323d89e172643e0..4426c50cd965cab53506a7d0e59921b66bfdb60c 100644 (file)
@@ -108,7 +108,9 @@ Game::Game() :
                &settingChangedCallback, this);
        g_settings->registerChangedCallback("camera_smoothing",
                &settingChangedCallback, this);
-
+       g_settings->registerChangedCallback("freecam",
+               &freecamChangedCallback, this);
+               
        readSettings();
 
 #ifdef __ANDROID__
@@ -1432,16 +1434,12 @@ void Game::toggleKillaura()
 
 void Game::toggleFreecam()
 {
-       LocalPlayer *player = client->getEnv().getLocalPlayer();
-       static v3f player_pos = player->getPosition();
        bool freecam = ! g_settings->getBool("freecam");
        g_settings->set("freecam", bool_to_cstr(freecam));
 
        if (freecam) {
-               player_pos = player->getPosition();
                m_game_ui->showTranslatedStatusText("Freecam enabled");
        } else {
-               player->setPosition(player_pos);
                m_game_ui->showTranslatedStatusText("Freecam disabled");
        }
 }
@@ -1566,6 +1564,8 @@ void Game::toggleDebug()
 
 void Game::toggleUpdateCamera()
 {
+       if (g_settings->getBool("freecam"))
+               return;
        m_flags.disable_camera_update = !m_flags.disable_camera_update;
        if (m_flags.disable_camera_update)
                m_game_ui->showTranslatedStatusText("Camera update disabled");
@@ -2193,17 +2193,9 @@ void Game::updateCamera(u32 busy_time, f32 dtime)
 
        v3s16 old_camera_offset = camera->getOffset();
 
-       if (wasKeyDown(KeyType::CAMERA_MODE)) {
-               GenericCAO *playercao = player->getCAO();
-
-               // If playercao not loaded, don't change camera
-               if (!playercao)
-                       return;
-
+       if (wasKeyDown(KeyType::CAMERA_MODE) && ! g_settings->getBool("freecam")) {
                camera->toggleCameraMode();
-
-               playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST);
-               playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST);
+               updatePlayerCAOVisibility();
        }
 
        float full_punch_interval = playeritem_toolcap.full_punch_interval;
@@ -2234,6 +2226,15 @@ void Game::updateCamera(u32 busy_time, f32 dtime)
        }
 }
 
+void Game::updatePlayerCAOVisibility()
+{
+       LocalPlayer *player = client->getEnv().getLocalPlayer();
+       GenericCAO *playercao = player->getCAO();
+       if (!playercao)
+               return;
+       playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST || g_settings->getBool("freecam"));
+       playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST || g_settings->getBool("freecam"));
+}
 
 void Game::updateSound(f32 dtime)
 {
@@ -3322,6 +3323,18 @@ void Game::settingChangedCallback(const std::string &setting_name, void *data)
        ((Game *)data)->readSettings();
 }
 
+void Game::freecamChangedCallback(const std::string &setting_name, void *data)
+{
+       Game *game = (Game *) data;
+       LocalPlayer *player = game->client->getEnv().getLocalPlayer();
+       static v3f player_pos = player->getPosition();
+       if (g_settings->getBool("freecam"))
+               player_pos = player->getPosition();
+       else
+               player->setPosition(player_pos);
+       game->updatePlayerCAOVisibility();
+}
+
 void Game::readSettings()
 {
        m_cache_doubletap_jump               = g_settings->getBool("doubletap_jump");
index 21651c510be46ff0a5066c6e26a10f6d8d4adb8a..c24d57413bce089cb9af6407c909c8d77a621abd 100644 (file)
@@ -742,6 +742,7 @@ class Game {
        void toggleFog();
        void toggleDebug();
        void toggleUpdateCamera();
+       void updatePlayerCAOVisibility();
 
        void increaseViewRange();
        void decreaseViewRange();
@@ -789,6 +790,7 @@ class Game {
        void showOverlayMessage(const char *msg, float dtime, int percent,
                        bool draw_clouds = true);
 
+       static void freecamChangedCallback(const std::string &setting_name, void *data);
        static void settingChangedCallback(const std::string &setting_name, void *data);
        void readSettings();