Fix rtt >= 0.0f assertion and free_move crash
authorSmallJoker <mk939@ymail.com>
Sun, 24 Jun 2018 12:35:29 +0000 (14:35 +0200)
committerSmallJoker <mk939@ymail.com>
Sun, 24 Jun 2018 12:48:19 +0000 (14:48 +0200)
src/network/connectionthreads.cpp
src/player.cpp
src/player.h

index 9d948c59a2790868b61b9e5ac755d554eb5dfc5c..c4e51211938c30690422d90aad22ba45397433e6 100644 (file)
@@ -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);
index c7036663a63af13e35e19686989574a35ffc47a8..b700053e85c1b9c48c08b51348aa04b80996522a 100644 (file)
@@ -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();
 }
 
index ca16111e1b0ebf77acbbf491a3441b01eb55d501..66cd0f5cfa8f494063126d1b684dd4627e8e5e08 100644 (file)
@@ -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();
 };