aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2020-07-28 16:47:27 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2020-07-28 16:47:27 +0200
commit85574cb53c44610b230cb7ae69a5cc0b17bcf2f0 (patch)
treedc3be4950e1fb44f2a2c082e238333adf2808537 /src
parentf7a042223f9c82c7764c0df3a3531bda04e9ad64 (diff)
downloaddragonfireclient-85574cb53c44610b230cb7ae69a5cc0b17bcf2f0.tar.xz
Improved Freecam
Diffstat (limited to 'src')
-rw-r--r--src/client/content_cao.cpp2
-rw-r--r--src/client/game.cpp43
-rw-r--r--src/client/game.h2
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();