From 1d1cf000c023b77721ad8cb226330ca6a72a1acc Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 24 Jun 2018 14:35:29 +0200 Subject: [PATCH] Fix rtt >= 0.0f assertion and free_move crash --- src/network/connectionthreads.cpp | 5 +++-- src/player.cpp | 18 +++++++----------- src/player.h | 4 ++++ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/network/connectionthreads.cpp b/src/network/connectionthreads.cpp index 9d948c59a..c4e512119 100644 --- a/src/network/connectionthreads.cpp +++ b/src/network/connectionthreads.cpp @@ -1167,7 +1167,7 @@ SharedBuffer ConnectionReceiveThread::handlePacketType_Control(Channel *chan // a overflow is quite unlikely but as it'd result in major // rtt miscalculation we handle it here - float rtt; + float rtt = 0.0f; if (current_time > p.absolute_send_time) { rtt = (current_time - p.absolute_send_time) / 1000.0f; } else if (p.totaltime > 0) { @@ -1176,7 +1176,8 @@ SharedBuffer ConnectionReceiveThread::handlePacketType_Control(Channel *chan // Let peer calculate stuff according to it // (avg_rtt and resend_timeout) - dynamic_cast(peer)->reportRTT(rtt); + if (rtt != 0.0f) + dynamic_cast(peer)->reportRTT(rtt); } // put bytes for max bandwidth calculation channel->UpdateBytesSent(p.data.getSize(), 1); diff --git a/src/player.cpp b/src/player.cpp index c7036663a..b700053e8 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -76,22 +76,18 @@ Player::Player(const char *name, IItemDefManager *idef): hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT; m_player_settings.readGlobalSettings(); - g_settings->registerChangedCallback("free_move", &Player::settingsChangedCallback, - &m_player_settings); - g_settings->registerChangedCallback("fast_move", &Player::settingsChangedCallback, - &m_player_settings); - g_settings->registerChangedCallback("continuous_forward", + // Register player setting callbacks + for (const std::string &name : m_player_settings.setting_names) + g_settings->registerChangedCallback(name, &Player::settingsChangedCallback, &m_player_settings); - g_settings->registerChangedCallback("always_fly_fast", - &Player::settingsChangedCallback, &m_player_settings); - g_settings->registerChangedCallback("aux1_descends", - &Player::settingsChangedCallback, &m_player_settings); - g_settings->registerChangedCallback( - "noclip", &Player::settingsChangedCallback, &m_player_settings); } Player::~Player() { + // m_player_settings becomes invalid, remove callbacks + for (const std::string &name : m_player_settings.setting_names) + g_settings->deregisterChangedCallback(name, + &Player::settingsChangedCallback, &m_player_settings); clearHud(); } diff --git a/src/player.h b/src/player.h index ca16111e1..66cd0f5cf 100644 --- a/src/player.h +++ b/src/player.h @@ -93,6 +93,10 @@ struct PlayerSettings bool aux1_descends = false; bool noclip = false; + const std::string setting_names[6] = { + "free_move", "fast_move", "continuous_forward", "always_fly_fast", + "aux1_descends", "noclip" + }; void readGlobalSettings(); };