Environment: Time of day fixes and add serverside getter
authorest31 <MTest31@outlook.com>
Tue, 27 Oct 2015 20:03:59 +0000 (21:03 +0100)
committerest31 <MTest31@outlook.com>
Tue, 27 Oct 2015 22:19:17 +0000 (23:19 +0100)
-> Put access to time variables under the time lock.
-> Merge both time locks, there is no point to have two locks.
-> Fix the lock being released too early in Environment::setTimeOfDay
-> Add serverside getter so that you don't have to get
the environment if you only have the server

src/environment.cpp
src/environment.h
src/server.cpp
src/server.h

index 0b37212e5c1d6ddc49687e9a32e769349fceb03d..c15fe795ed326c84387c0e6c720027bb6211db89 100644 (file)
@@ -180,20 +180,21 @@ std::vector<Player*> Environment::getPlayers(bool ignore_disconnected)
 
 u32 Environment::getDayNightRatio()
 {
-       if(m_enable_day_night_ratio_override)
+       MutexAutoLock(this->m_time_lock);
+       if (m_enable_day_night_ratio_override)
                return m_day_night_ratio_override;
-       return time_to_daynight_ratio(m_time_of_day_f*24000, m_cache_enable_shaders);
+       return time_to_daynight_ratio(m_time_of_day_f * 24000, m_cache_enable_shaders);
 }
 
 void Environment::setTimeOfDaySpeed(float speed)
 {
-       MutexAutoLock(this->m_timeofday_lock);
+       MutexAutoLock(this->m_time_lock);
        m_time_of_day_speed = speed;
 }
 
 float Environment::getTimeOfDaySpeed()
 {
-       MutexAutoLock(this->m_timeofday_lock);
+       MutexAutoLock(this->m_time_lock);
        float retval = m_time_of_day_speed;
        return retval;
 }
@@ -221,29 +222,28 @@ float Environment::getTimeOfDayF()
 
 void Environment::stepTimeOfDay(float dtime)
 {
-       // getTimeOfDaySpeed lock the value we need to prevent MT problems
-       float day_speed = getTimeOfDaySpeed();
+       MutexAutoLock(this->m_time_lock);
 
        m_time_counter += dtime;
-       f32 speed = day_speed * 24000./(24.*3600);
-       u32 units = (u32)(m_time_counter*speed);
+       f32 speed = m_time_of_day_speed * 24000. / (24. * 3600);
+       u32 units = (u32)(m_time_counter * speed);
        bool sync_f = false;
-       if(units > 0){
+       if (units > 0) {
                // Sync at overflow
-               if(m_time_of_day + units >= 24000)
+               if (m_time_of_day + units >= 24000)
                        sync_f = true;
                m_time_of_day = (m_time_of_day + units) % 24000;
-               if(sync_f)
+               if (sync_f)
                        m_time_of_day_f = (float)m_time_of_day / 24000.0;
        }
        if (speed > 0) {
                m_time_counter -= (f32)units / speed;
        }
-       if(!sync_f){
-               m_time_of_day_f += day_speed/24/3600*dtime;
-               if(m_time_of_day_f > 1.0)
+       if (!sync_f) {
+               m_time_of_day_f += m_time_of_day_speed / 24 / 3600 * dtime;
+               if (m_time_of_day_f > 1.0)
                        m_time_of_day_f -= 1.0;
-               if(m_time_of_day_f < 0.0)
+               if (m_time_of_day_f < 0.0)
                        m_time_of_day_f += 1.0;
        }
 }
index 42faf5f6daab16ce56944cc67ed3abb14ff2cf33..1984cf40d8d81d8e1e63153cef6ee1d26c8f64aa 100644 (file)
@@ -104,6 +104,11 @@ public:
 protected:
        // peer_ids in here should be unique, except that there may be many 0s
        std::vector<Player*> m_players;
+
+
+       /*
+        *  Below: values under m_time_lock
+        */
        // Time of day in milli-hours (0-23999); determines day and night
        u32 m_time_of_day;
        // Time of day in 0...1
@@ -114,6 +119,9 @@ protected:
        // Overriding the day-night ratio is useful for custom sky visuals
        bool m_enable_day_night_ratio_override;
        u32 m_day_night_ratio_override;
+       /*
+        * Above: values under m_time_lock
+        */
 
        /* TODO: Add a callback function so these can be updated when a setting
         *       changes.  At this point in time it doesn't matter (e.g. /set
@@ -127,7 +135,6 @@ protected:
        bool m_cache_enable_shaders;
 
 private:
-       Mutex m_timeofday_lock;
        Mutex m_time_lock;
 
 };
index 3aff2fb977e6e601cd7ef65ae4a58c396cb3bd22..1e039631cf60c2c09698b09cc2c21a71abe1cd45 100644 (file)
@@ -1249,6 +1249,11 @@ void Server::setTimeOfDay(u32 time)
        m_time_of_day_send_timer = 0;
 }
 
+u32 Server::getTimeOfDay()
+{
+       return m_env->getTimeOfDay();
+}
+
 void Server::onMapEditEvent(MapEditEvent *event)
 {
        if(m_ignore_map_edit_events)
index 26ec3ab73a42e52c8adbdb6ed0b9eba237e7af91..fa732010a6d0e7616843270f0112bc8d467d0245 100644 (file)
@@ -220,8 +220,10 @@ public:
 
        void Send(NetworkPacket* pkt);
 
-       // Environment must be locked when called
+       // Both setter and getter need no envlock,
+       // can be called freely from threads
        void setTimeOfDay(u32 time);
+       inline u32 getTimeOfDay();
 
        /*
                Shall be called with the environment locked.