aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2018-06-24 14:35:29 +0200
committerSmallJoker <mk939@ymail.com>2018-06-24 14:48:19 +0200
commit1d1cf000c023b77721ad8cb226330ca6a72a1acc (patch)
treee39263af36b0db039cb4b0d318014b1ae652b149 /src
parent6b72d8d090d001737f18561ae5e036a440a01cbb (diff)
downloadminetest-1d1cf000c023b77721ad8cb226330ca6a72a1acc.tar.gz
minetest-1d1cf000c023b77721ad8cb226330ca6a72a1acc.tar.bz2
minetest-1d1cf000c023b77721ad8cb226330ca6a72a1acc.zip
Fix rtt >= 0.0f assertion and free_move crash
Diffstat (limited to 'src')
-rw-r--r--src/network/connectionthreads.cpp5
-rw-r--r--src/player.cpp18
-rw-r--r--src/player.h4
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<u8> 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<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan
// Let peer calculate stuff according to it
// (avg_rtt and resend_timeout)
- dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt);
+ if (rtt != 0.0f)
+ dynamic_cast<UDPPeer *>(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();
};