Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ReconnectSerializer.c
Go to the documentation of this file.
2{
3 UUID m_sPlayerIdentity;
4 float m_fRemainingValidity;
5 UUID m_sReservedEntityId;
6
7 //------------------------------------------------------------------------------------------------
8 void ReadFrom(notnull PersistenceSystem persistence, notnull SCR_ReconnectData data)
9 {
10 if (data.m_ValidUntil)
11 m_fRemainingValidity = data.m_ValidUntil.DiffSeconds(GetGame().GetWorld().GetTimestamp());
12
13 m_sReservedEntityId = persistence.GetId(data.m_ReservedEntity);
14 }
15
16 //------------------------------------------------------------------------------------------------
17 void ApplyTo(notnull PersistenceSystem persistence, notnull SCR_ReconnectData data)
18 {
19 if (m_fRemainingValidity > 0)
20 data.m_ValidUntil = GetGame().GetWorld().GetTimestamp().PlusSeconds(m_fRemainingValidity);
21
24 persistence.WhenAvailable(m_sReservedEntityId, task);
25 }
26
27 //------------------------------------------------------------------------------------------------
28 protected static void OnEntityAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
29 {
30 auto entity = IEntity.Cast(instance);
31 if (!entity)
32 return;
33
34 auto ctx = Tuple1<SCR_ReconnectData>.Cast(context);
35 if (ctx.param1)
36 ctx.param1.m_ReservedEntity = entity;
37 }
38}
39
40class SCR_PlayerReconnectData : PersistentState
41{
42 ref set<UUID> m_aPlayerCharacters = new set<UUID>();
43
44 //------------------------------------------------------------------------------------------------
46 {
47 if (newState != EPersistenceSystemState.ACTIVE)
48 return;
49
50 int removeAfterMs = 60000; // 1 Minute by default to connect back or character is deleted.
51
52 // Remove after reconnect period would end
54 if (reconnect)
55 removeAfterMs = reconnect.GetReconnectTimeout() * 1000;
56
57 GetGame().GetCallqueue().CallLater(RemoveUnusedCharacters, removeAfterMs);
58 }
59
60 //------------------------------------------------------------------------------------------------
61 protected void RemoveUnusedCharacters()
62 {
63 const PersistenceSystem persistence = PersistenceSystem.GetInstance();
64 const PlayerManager playerManager = GetGame().GetPlayerManager();
65 const SCR_RespawnSystemComponent respawn = SCR_RespawnSystemComponent.GetInstance();
66 foreach (UUID charId : m_aPlayerCharacters)
67 {
68 IEntity character = IEntity.Cast(persistence.FindById(charId));
69 if (!character)
70 continue;
71
72 if (playerManager.GetPlayerIdFromControlledEntity(character) > 0)
73 continue; // Player connected back and has active control
74
75 respawn.OnPlayerEntityCleanup_S(character);
76 SCR_EntityHelper.DeleteEntityAndChildren(character);
77 }
78 m_aPlayerCharacters.Clear();
79 }
80}
81
83{
84 //------------------------------------------------------------------------------------------------
85 override static typename GetTargetType()
86 {
87 return SCR_PlayerReconnectData;
88 }
89
90 //------------------------------------------------------------------------------------------------
91 override ESerializeResult Serialize(notnull Managed instance, notnull SaveContext context)
92 {
93 const SCR_PlayerReconnectData state = SCR_PlayerReconnectData.Cast(instance);
94 array<int> players();
95 const PlayerManager manager = GetGame().GetPlayerManager();
96 manager.GetPlayers(players);
97 foreach (int player : players)
98 {
99 const UUID characterId = GetSystem().GetId(manager.GetPlayerControlledEntity(player));
100 if (!characterId.IsNull())
101 state.m_aPlayerCharacters.Insert(characterId);
102 }
103
104 array<ref SCR_PersistentReconnectData> reconnectData();
106 if (reconnect)
107 {
108 foreach (UUID playerIdentity, SCR_ReconnectData data : reconnect.m_mReconnectData)
109 {
110 SCR_PersistentReconnectData persistentData();
111 persistentData.m_sPlayerIdentity = playerIdentity;
112 persistentData.ReadFrom(GetSystem(), data);
113 reconnectData.Insert(persistentData);
114 }
115 }
116
117 if (state.m_aPlayerCharacters.IsEmpty() && reconnectData.IsEmpty())
118 return ESerializeResult.DEFAULT;
119
120 context.WriteValue("version", 1);
121
122 if (!state.m_aPlayerCharacters.IsEmpty() || !context.CanSeekMembers())
123 context.WriteValue("active", state.m_aPlayerCharacters);
124
125 if (!reconnectData.IsEmpty() || !context.CanSeekMembers())
126 {
127 const bool prev = context.EnableTypeDiscriminator(false);
128 context.WriteValue("reconnect", reconnectData);
129 context.EnableTypeDiscriminator(prev);
130 }
131
132 return ESerializeResult.OK;
133 }
134
135 //------------------------------------------------------------------------------------------------
136 override bool Deserialize(notnull Managed instance, notnull LoadContext context)
137 {
138 SCR_PlayerReconnectData state = SCR_PlayerReconnectData.Cast(instance);
139
140 int version;
141 context.Read(version);
142
143 context.ReadValue("active", state.m_aPlayerCharacters);
144 if (!state.m_aPlayerCharacters.IsEmpty())
145 SCR_PersistenceSystem.Cast(GetSystem()).GetOnStateChanged().Insert(state.HandleStateChange);
146
148 if (!reconnect)
149 return true;
150
151 array<ref SCR_PersistentReconnectData> data;
152 const bool prev = context.EnableTypeDiscriminator(false);
153 context.ReadValue("reconnect", data);
154 context.EnableTypeDiscriminator(prev);
155 if (data)
156 {
157 foreach (SCR_PersistentReconnectData persistentData : data)
158 {
159 SCR_ReconnectData entry();
160 persistentData.ApplyTo(GetSystem(), entry);
161 reconnect.m_mReconnectData.Set(persistentData.m_sPlayerIdentity, entry);
162 }
163 }
164
165 reconnect.UpdateExpieryCheck();
166 return true;
167 }
168}
class SCR_PersistentThreatSector GetTargetType()
ArmaReforgerScripted GetGame()
Definition game.c:1398
Get all prefabs that have the spawner data
void HandleStateChange(EPersistenceSystemState oldState, EPersistenceSystemState newState)
class SCR_PersistentReconnectData m_aPlayerCharacters
void RemoveUnusedCharacters()
sealed ScriptInvokerBase< SCR_PersistenceSystem_OnStateChanged > GetOnStateChanged()
static void OnEntityAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
static SCR_ReconnectComponent GetInstance()
int GetReconnectTimeout()
For how many seconds a player can reconnect before the controlled character is removed.
ref map< UUID, ref SCR_ReconnectData > m_mReconnectData
Data class for reconnecting players.
Definition UUID.c:28
ESerializeResult
EPersistenceSystemState
void Tuple1(T1 p1)
Definition tuple.c:37