11#include < Services/CalendarService.h>
22
3- #include < Events/DisconnectedEvent .h>
3+ #include < World .h>
44#include < Events/UpdateEvent.h>
5+ #include < Events/DisconnectedEvent.h>
56#include < Messages/ServerTimeSettings.h>
6- #include < World.h>
77
8- #include < Forms/TESObjectCELL.h>
9- #include < PlayerCharacter.h>
108#include < TimeManager.h>
9+ #include < PlayerCharacter.h>
10+ #include < Forms/TESObjectCELL.h>
1111
1212constexpr float kTransitionSpeed = 5 .f;
1313
@@ -19,7 +19,8 @@ bool CalendarService::AllowGameTick() noexcept
1919}
2020
2121CalendarService::CalendarService (World& aWorld, entt::dispatcher& aDispatcher, TransportService& aTransport)
22- : m_world(aWorld), m_transport(aTransport)
22+ : m_world(aWorld)
23+ , m_transport(aTransport)
2324{
2425 m_timeUpdateConnection = aDispatcher.sink <ServerTimeSettings>().connect <&CalendarService::OnTimeUpdate>(this );
2526 m_updateConnection = aDispatcher.sink <UpdateEvent>().connect <&CalendarService::HandleUpdate>(this );
@@ -29,29 +30,16 @@ CalendarService::CalendarService(World& aWorld, entt::dispatcher& aDispatcher, T
2930void CalendarService::OnTimeUpdate (const ServerTimeSettings& acMessage) noexcept
3031{
3132 // disable the game clock
33+ m_onlineTime.TimeScale = acMessage.TimeScale ;
34+ m_onlineTime.Time = acMessage.Time ;
3235 ToggleGameClock (false );
33- m_onlineTime.m_timeModel .TimeScale = acMessage.timeModel .TimeScale ;
34- m_onlineTime.m_timeModel .Time = acMessage.timeModel .Time ;
35-
36- if (m_world.GetServerSettings ().SyncPlayerCalendar )
37- {
38- m_onlineTime.m_timeModel .Day = acMessage.timeModel .Day ;
39- m_onlineTime.m_timeModel .Month = acMessage.timeModel .Month ;
40- m_onlineTime.m_timeModel .Year = acMessage.timeModel .Year ;
41- }
42- else
43- {
44- m_onlineTime.m_timeModel .Day = m_offlineTime.m_timeModel .Day ;
45- m_onlineTime.m_timeModel .Month = m_offlineTime.m_timeModel .Month ;
46- m_onlineTime.m_timeModel .Year = m_offlineTime.m_timeModel .Year ;
47- }
4836}
4937
5038void CalendarService::OnDisconnected (const DisconnectedEvent&) noexcept
5139{
5240 // signal a time transition
5341 m_fadeTimer = 0 .f ;
54- ToggleGameClock ( true ) ;
42+ m_switchToOffline = true ;
5543}
5644
5745float CalendarService::TimeInterpolate (const TimeModel& aFrom, TimeModel& aTo) const
@@ -72,11 +60,24 @@ float CalendarService::TimeInterpolate(const TimeModel& aFrom, TimeModel& aTo) c
7260void CalendarService::ToggleGameClock (bool aEnable)
7361{
7462 auto * pGameTime = TimeData::Get ();
75- m_offlineTime.m_timeModel .Day = pGameTime->GameDay ->f ;
76- m_offlineTime.m_timeModel .Month = pGameTime->GameMonth ->f ;
77- m_offlineTime.m_timeModel .Year = pGameTime->GameYear ->f ;
78- m_offlineTime.m_timeModel .Time = pGameTime->GameHour ->f ;
79- m_offlineTime.m_timeModel .TimeScale = pGameTime->TimeScale ->f ;
63+ if (aEnable)
64+ {
65+ pGameTime->GameDay ->i = m_offlineTime.Day ;
66+ pGameTime->GameMonth ->i = m_offlineTime.Month ;
67+ pGameTime->GameYear ->i = m_offlineTime.Year ;
68+ pGameTime->TimeScale ->f = m_offlineTime.TimeScale ;
69+ pGameTime->GameDaysPassed ->f = (m_offlineTime.Time * (1 .f / 24 .f )) + m_offlineTime.Day ;
70+ pGameTime->GameHour ->f = m_offlineTime.Time ;
71+ m_switchToOffline = false ;
72+ }
73+ else
74+ {
75+ m_offlineTime.Day = pGameTime->GameDay ->i ;
76+ m_offlineTime.Month = pGameTime->GameMonth ->i ;
77+ m_offlineTime.Year = pGameTime->GameYear ->i ;
78+ m_offlineTime.Time = pGameTime->GameHour ->f ;
79+ m_offlineTime.TimeScale = pGameTime->TimeScale ->f ;
80+ }
8081
8182 s_gameClockLocked = !aEnable;
8283}
@@ -93,6 +94,23 @@ void CalendarService::HandleUpdate(const UpdateEvent& aEvent) noexcept
9394
9495 const auto now = m_world.GetTick ();
9596
97+ if (m_switchToOffline)
98+ {
99+ // time transition out
100+ if (m_fadeTimer < kTransitionSpeed )
101+ {
102+ pGameTime->GameHour ->f = TimeInterpolate (m_onlineTime, m_offlineTime);
103+ // before we quit here we fire this event
104+ if ((m_fadeTimer + updateDelta) > kTransitionSpeed )
105+ {
106+ m_fadeTimer += updateDelta;
107+ ToggleGameClock (true );
108+ }
109+ else
110+ m_fadeTimer += updateDelta;
111+ }
112+ }
113+
96114 // we got disconnected or the client got ahead of us
97115 if (now < m_lastTick)
98116 return ;
@@ -101,19 +119,19 @@ void CalendarService::HandleUpdate(const UpdateEvent& aEvent) noexcept
101119 m_lastTick = now;
102120
103121 m_onlineTime.Update (delta);
104- pGameTime->TimeScale -> f = m_onlineTime.m_timeModel . TimeScale ;
105- pGameTime->GameDay -> f = m_onlineTime.m_timeModel . Day ;
106- pGameTime->GameMonth -> f = m_onlineTime.m_timeModel . Month ;
107- pGameTime->GameYear ->f = m_onlineTime.m_timeModel . Year ;
108- pGameTime->GameDaysPassed ->f += m_onlineTime.GetDeltaTime (delta) ;
122+ pGameTime->GameDay -> i = m_onlineTime.Day ;
123+ pGameTime->GameMonth -> i = m_onlineTime.Month ;
124+ pGameTime->GameYear -> i = m_onlineTime.Year ;
125+ pGameTime->TimeScale ->f = m_onlineTime.TimeScale ;
126+ pGameTime->GameDaysPassed ->f = ( m_onlineTime.Time * ( 1 . f / 24 . f )) + m_onlineTime. Day ;
109127
110128 // time transition in
111129 if (m_fadeTimer < kTransitionSpeed )
112130 {
113- pGameTime->GameHour ->f = TimeInterpolate (m_offlineTime. m_timeModel , m_onlineTime. m_timeModel );
131+ pGameTime->GameHour ->f = TimeInterpolate (m_offlineTime, m_onlineTime);
114132 m_fadeTimer += updateDelta;
115133 }
116134 else
117- pGameTime->GameHour ->f = m_onlineTime.m_timeModel . Time ;
135+ pGameTime->GameHour ->f = m_onlineTime.Time ;
118136 }
119137}
0 commit comments