diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2020-07-28 16:47:27 +0200 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2020-07-28 16:47:27 +0200 |
commit | 85574cb53c44610b230cb7ae69a5cc0b17bcf2f0 (patch) | |
tree | dc3be4950e1fb44f2a2c082e238333adf2808537 /src | |
parent | f7a042223f9c82c7764c0df3a3531bda04e9ad64 (diff) | |
download | dragonfireclient-85574cb53c44610b230cb7ae69a5cc0b17bcf2f0.tar.xz |
Improved Freecam
Diffstat (limited to 'src')
-rw-r--r-- | src/client/content_cao.cpp | 2 | ||||
-rw-r--r-- | src/client/game.cpp | 43 | ||||
-rw-r--r-- | src/client/game.h | 2 |
3 files changed, 31 insertions, 16 deletions
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 5f60c3375..2a3225b7a 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -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; diff --git a/src/client/game.cpp b/src/client/game.cpp index 3c3ce555d..4426c50cd 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -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"); diff --git a/src/client/game.h b/src/client/game.h index 21651c510..c24d57413 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -742,6 +742,7 @@ public: void toggleFog(); void toggleDebug(); void toggleUpdateCamera(); + void updatePlayerCAOVisibility(); void increaseViewRange(); void decreaseViewRange(); @@ -789,6 +790,7 @@ public: 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(); |