Skip to content

Commit 3a58ff1

Browse files
Merge pull request #677 from tiltedphoques/revert/calendarSync
Revert: calendar sync
2 parents b9ef03d + 217a9c1 commit 3a58ff1

20 files changed

+156
-301
lines changed

Code/client/Services/CalendarService.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include <DateTime.h>
3+
#include <Structs/TimeModel.h>
44
#include <Events/EventDispatcher.h>
55
#include <Games/Events.h>
66

@@ -32,13 +32,13 @@ class CalendarService final : public BSTEventSink<TESActivateEvent>
3232
entt::scoped_connection m_updateConnection;
3333
entt::scoped_connection m_disconnectedConnection;
3434

35-
DateTime m_onlineTime;
36-
DateTime m_offlineTime;
35+
TimeModel m_onlineTime;
36+
TimeModel m_offlineTime;
3737
float m_fadeTimer = 0.f;
38+
bool m_switchToOffline = false;
3839
static bool s_gameClockLocked;
3940

4041
uint64_t m_lastTick = 0;
41-
uint64_t m_lastLogTick = 0;
4242
World& m_world;
4343
TransportService& m_transport;
4444
};
Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
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

1212
constexpr float kTransitionSpeed = 5.f;
1313

@@ -19,7 +19,8 @@ bool CalendarService::AllowGameTick() noexcept
1919
}
2020

2121
CalendarService::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
2930
void 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

5038
void 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

5745
float CalendarService::TimeInterpolate(const TimeModel& aFrom, TimeModel& aTo) const
@@ -72,11 +60,24 @@ float CalendarService::TimeInterpolate(const TimeModel& aFrom, TimeModel& aTo) c
7260
void 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
}

Code/client/Services/Generic/TransportService.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
#include <Forms/TESWorldSpace.h>
1212
#include <Forms/TESObjectCELL.h>
1313

14-
#include <TimeManager.h>
15-
1614
#include <Forms/TESNPC.h>
1715
#include <TiltedOnlinePCH.h>
1816
#include <World.h>
@@ -153,13 +151,6 @@ void TransportService::OnConnected()
153151

154152
request.Level = pPlayer->GetLevel();
155153

156-
auto* pGameTime = TimeData::Get();
157-
request.PlayerTime.TimeScale = pGameTime->TimeScale->f;
158-
request.PlayerTime.Time = pGameTime->GameHour->f;
159-
request.PlayerTime.Year = pGameTime->GameYear->f;
160-
request.PlayerTime.Month = pGameTime->GameMonth->f;
161-
request.PlayerTime.Day = pGameTime->GameDay->f;
162-
163154
Send(request);
164155
}
165156

Code/common/DateTime.cpp

Lines changed: 0 additions & 46 deletions
This file was deleted.

Code/common/DateTime.h

Lines changed: 0 additions & 21 deletions
This file was deleted.

Code/common/Structs/TimeModel.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
#include <Structs/TimeModel.h>
3+
4+
const int cDayLengthArray[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5+
6+
int TimeModel::GetNumerOfDaysByMonthIndex(int aIndex)
7+
{
8+
if (aIndex < 12)
9+
{
10+
return cDayLengthArray[aIndex];
11+
}
12+
13+
return 0;
14+
}
15+
16+
void TimeModel::Update(uint64_t aDelta)
17+
{
18+
float deltaSeconds = static_cast<float>(aDelta) / 1000.f;
19+
Time += (deltaSeconds * (TimeScale * 0.00027777778f));
20+
21+
if (Time > 24.f)
22+
{
23+
int maxDays = GetNumerOfDaysByMonthIndex(Month);
24+
25+
while (Time > 24.f)
26+
{
27+
Time = Time + -24.f;
28+
Day++;
29+
}
30+
31+
if (Day > maxDays)
32+
{
33+
Month++;
34+
Day = Day - maxDays;
35+
36+
if (Month > 12)
37+
{
38+
Month = Month + -12;
39+
Year++;
40+
}
41+
}
42+
}
43+
}

Code/common/Structs/TimeModel.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
5+
struct TimeModel
6+
{
7+
// Default time: 01/01/01 at 12:00
8+
float TimeScale = 20.f;
9+
float Time = 12.f;
10+
int Year = 1;
11+
int Month = 1;
12+
int Day = 1;
13+
14+
void Update(uint64_t aDelta);
15+
[[nodiscard]] static int GetNumerOfDaysByMonthIndex(int index);
16+
};

Code/encoding/Messages/AuthenticationRequest.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ void AuthenticationRequest::SerializeRaw(TiltedPhoques::Buffer::Writer& aWriter)
1212
WorldSpaceId.Serialize(aWriter);
1313
CellId.Serialize(aWriter);
1414
Serialization::WriteVarInt(aWriter, Level);
15-
PlayerTime.Serialize(aWriter);
1615
}
1716

1817
void AuthenticationRequest::DeserializeRaw(TiltedPhoques::Buffer::Reader& aReader) noexcept
@@ -29,5 +28,4 @@ void AuthenticationRequest::DeserializeRaw(TiltedPhoques::Buffer::Reader& aReade
2928
WorldSpaceId.Deserialize(aReader);
3029
CellId.Deserialize(aReader);
3130
Level = Serialization::ReadVarInt(aReader) & 0xFFFF;
32-
PlayerTime.Deserialize(aReader);
3331
}

Code/encoding/Messages/AuthenticationRequest.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <Structs/Mods.h>
55
#include <TiltedCore/Buffer.hpp>
66
#include <Structs/GameId.h>
7-
#include <Structs/TimeModel.h>
87

98
struct AuthenticationRequest final : ClientMessage
109
{
@@ -23,8 +22,7 @@ struct AuthenticationRequest final : ClientMessage
2322
bool operator==(const AuthenticationRequest& achRhs) const noexcept
2423
{
2524
return GetOpcode() == achRhs.GetOpcode() && DiscordId == achRhs.DiscordId && SKSEActive == achRhs.SKSEActive && MO2Active == achRhs.MO2Active && Token == achRhs.Token && Version == achRhs.Version && UserMods == achRhs.UserMods && Username == achRhs.Username &&
26-
WorldSpaceId == achRhs.WorldSpaceId && CellId == achRhs.CellId && Level == achRhs.Level
27-
&& PlayerTime == achRhs.PlayerTime;
25+
WorldSpaceId == achRhs.WorldSpaceId && CellId == achRhs.CellId && Level == achRhs.Level;
2826
}
2927

3028
uint64_t DiscordId{};
@@ -37,5 +35,4 @@ struct AuthenticationRequest final : ClientMessage
3735
GameId WorldSpaceId{};
3836
GameId CellId{};
3937
uint16_t Level{};
40-
TimeModel PlayerTime{};
4138
};

Code/encoding/Messages/ServerTimeSettings.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,21 @@
22

33
void ServerTimeSettings::SerializeRaw(TiltedPhoques::Buffer::Writer& aWriter) const noexcept
44
{
5-
timeModel.Serialize(aWriter);
5+
// poor man's std::bitcast
6+
aWriter.WriteBits(*reinterpret_cast<const uint32_t*>(&TimeScale), 32);
7+
aWriter.WriteBits(*reinterpret_cast<const uint32_t*>(&Time), 32);
68
}
79

810
void ServerTimeSettings::DeserializeRaw(TiltedPhoques::Buffer::Reader& aReader) noexcept
911
{
10-
timeModel.Deserialize(aReader);
12+
uint64_t tmp = 0;
13+
uint32_t cVal = 0;
14+
15+
aReader.ReadBits(tmp, 32);
16+
cVal = tmp & 0xFFFFFFFF;
17+
TimeScale = *reinterpret_cast<float*>(&cVal);
18+
19+
aReader.ReadBits(tmp, 32);
20+
cVal = tmp & 0xFFFFFFFF;
21+
Time = *reinterpret_cast<float*>(&cVal);
1122
}

0 commit comments

Comments
 (0)