Skip to content

Commit 50bba45

Browse files
committed
Added handler_matchmaking_arbitration functions
Implemented `initial_stats_write_mark_complete` Implemented `initial_stats_write_mark_failed` Implemented `initialize` Implemented `mark_arbitration_failed` Updated `ready_to_start` Implemented `start_match_mark_complete` Implemented `start_match_mark_failed`
1 parent 4cfc690 commit 50bba45

3 files changed

Lines changed: 241 additions & 24 deletions

File tree

game/source/networking/logic/life_cycle/life_cycle_handler_end_game_write_stats.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ void c_life_cycle_state_handler_end_game_write_stats::initialize(c_life_cycle_st
3131

3232
c_life_cycle_state_handler_flags parent_flags;
3333
parent_flags.set(_life_cycle_state_handler_requires_squad_session_bit, true);
34-
c_life_cycle_state_handler::initialize(manager, _life_cycle_state_end_game_write_stats, &parent_flags, 0ULL,0ULL);
34+
c_life_cycle_state_handler::initialize(manager, _life_cycle_state_end_game_write_stats, &parent_flags, 0ULL, 0ULL);
3535
}
3636

3737
void c_life_cycle_state_handler_end_game_write_stats::update()

game/source/networking/logic/life_cycle/life_cycle_handler_matchmaking_arbitration.cpp

Lines changed: 214 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "networking/logic/life_cycle/life_cycle_handler_matchmaking_arbitration.hpp"
22

3+
#include "cseries/cseries_events.hpp"
34
#include "memory/module.hpp"
45
#include "networking/session/network_session.hpp"
56

@@ -34,16 +35,59 @@ void c_life_cycle_state_handler_matchmaking_arbitration::exit(c_life_cycle_state
3435
INVOKE_CLASS_MEMBER(0x004947E0, c_life_cycle_state_handler_matchmaking_arbitration, exit, to);
3536
}
3637

38+
//.text:00494930 ;
39+
//.text:00494940 ;
40+
41+
void c_life_cycle_state_handler_matchmaking_arbitration::get_progress(s_life_cycle_matchmaking_progress* progress_out)
42+
{
43+
INVOKE_CLASS_MEMBER(0x00494950, c_life_cycle_state_handler_matchmaking_arbitration, get_progress, progress_out);
44+
45+
//c_life_cycle_state_handler::get_matchmaking_progress_for_setting_up_match(progress_out);
46+
}
47+
3748
void c_life_cycle_state_handler_matchmaking_arbitration::handle_missing_required_session_parameter(e_network_session_type session_type)
3849
{
3950
INVOKE_CLASS_MEMBER(0x00494960, c_life_cycle_state_handler_matchmaking_arbitration, handle_missing_required_session_parameter, session_type);
51+
52+
//ASSERT(session_type == _network_session_type_group);
53+
//event(_event_warning, "networking:logic:life_cycle:matchmaking_arbitration: became host without required session parameters, restarting matchmaking");
54+
//c_life_cycle_state_handler::disband_group_session();
55+
}
56+
57+
void c_life_cycle_state_handler_matchmaking_arbitration::initial_stats_write_mark_complete()
58+
{
59+
//INVOKE_CLASS_MEMBER(0x00494980, c_life_cycle_state_handler_matchmaking_arbitration, initial_stats_write_mark_complete);
60+
61+
ASSERT(!m_flags.test(_matchmaking_arbitration_start_match_initial_stats_write_completed_bit));
62+
network_session_interface_set_peer_status_flag(_network_session_peer_properties_status_match_initial_stats_written_bit, true);
63+
m_flags.set(_matchmaking_arbitration_start_match_initial_stats_write_completed_bit, true);
64+
}
65+
66+
void c_life_cycle_state_handler_matchmaking_arbitration::initial_stats_write_mark_failed()
67+
{
68+
//INVOKE_CLASS_MEMBER(0x004949A0, c_life_cycle_state_handler_matchmaking_arbitration, initial_stats_write_mark_failed);
69+
70+
ASSERT(!m_flags.test(_matchmaking_arbitration_start_match_initial_stats_write_failed_bit));
71+
c_life_cycle_state_handler_matchmaking_arbitration::start_match_mark_complete();
72+
network_session_interface_set_peer_status_flag(_network_session_peer_properties_status_match_initial_stats_write_failed_bit, true);
73+
m_flags.set(_matchmaking_arbitration_start_match_initial_stats_write_failed_bit, true);
4074
}
4175

4276
void c_life_cycle_state_handler_matchmaking_arbitration::initialize(c_life_cycle_state_manager* manager)
4377
{
44-
INVOKE_CLASS_MEMBER(0x004949D0, c_life_cycle_state_handler_matchmaking_arbitration, initialize, manager);
78+
//INVOKE_CLASS_MEMBER(0x004949D0, c_life_cycle_state_handler_matchmaking_arbitration, initialize, manager);
79+
80+
c_life_cycle_state_handler_flags parent_flags;
81+
parent_flags.set(_life_cycle_state_handler_requires_squad_session_bit, true);
82+
parent_flags.set(_life_cycle_state_handler_requires_group_session_bit, true);
83+
parent_flags.set(_life_cycle_state_handler_allows_group_session_bit, true);
84+
parent_flags.set(_life_cycle_state_handler_group_session_disconnect_leaves_squad_bit, true);
85+
parent_flags.set(_life_cycle_state_handler_live_disconnection_returns_to_pre_game_bit, true);
86+
c_life_cycle_state_handler::initialize(manager, _life_cycle_state_matchmaking_assemble_match, &parent_flags, 0ULL, 0xAE0004C80ULL);
4587
}
4688

89+
//.text:00494A00 ;
90+
4791
void c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_complete()
4892
{
4993
//INVOKE_CLASS_MEMBER(0x00494A10, c_life_cycle_state_handler_matchmaking_arbitration, mark_arbitration_complete);
@@ -60,51 +104,62 @@ void c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_comple
60104
}
61105
}
62106

63-
bool c_life_cycle_state_handler_matchmaking_arbitration::ready_to_start()
107+
void c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_failed()
64108
{
65-
return INVOKE_CLASS_MEMBER(0x00494AF0, c_life_cycle_state_handler_matchmaking_arbitration, ready_to_start);
109+
//INVOKE_CLASS_MEMBER(0x00494A40, c_life_cycle_state_handler_matchmaking_arbitration, mark_arbitration_failed);
66110

67-
c_network_session* group_session = get_manager()->get_group_session();
68-
bool arbitration_completed = 0;
69-
bool all_players_have_initial_participants = 0;
70-
bool all_players_session_started = 0;
71-
bool stats_written = 0;
111+
ASSERT(!m_flags.test(_matchmaking_arbitration_failed_bit));
112+
113+
c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_complete();
114+
network_session_interface_set_peer_status_flag(_network_session_peer_properties_status_match_arbitration_failed_bit, true);
115+
m_flags.set(_matchmaking_arbitration_failed_bit, true);
116+
}
117+
118+
//.text:00494A90 ;
119+
//.text:00494AA0 ;
120+
//.text:00494AC0 ;
121+
//.text:00494AD0 ;
122+
123+
bool c_life_cycle_state_handler_matchmaking_arbitration::ready_to_start()
124+
{
125+
//return INVOKE_CLASS_MEMBER(0x00494AF0, c_life_cycle_state_handler_matchmaking_arbitration, ready_to_start);
72126

73127
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: c_life_cycle_state_handler_matchmaking_arbitration::ready_to_start");
74128

75-
const c_network_session_membership* session_membership = group_session->get_session_membership();
129+
c_network_session* group_session = get_manager()->get_group_session();
130+
c_network_session_membership const* session_membership = group_session->get_session_membership();
76131

132+
bool arbitration_completed = false;
77133
if (m_flags.test(_matchmaking_arbitration_complete_bit))
78134
{
79135
arbitration_completed = !m_flags.test(_matchmaking_arbitration_failed_bit);
80136
}
81137

138+
bool initial_participants_transmitted_to_peers = false;
82139
if (m_flags.test(_matchmaking_arbitration_set_initial_participants_bit))
83140
{
84141
c_network_session_parameters* session_parameters = group_session->get_session_parameters();
85-
all_players_have_initial_participants = session_parameters->parameters_transmitted_to_peers(FLAG(_network_session_parameter_type_initial_participants)) != 0;
86-
if (!all_players_have_initial_participants)
142+
initial_participants_transmitted_to_peers = session_parameters->parameters_transmitted_to_peers(FLAG(_network_session_parameter_type_initial_participants)) != 0;
143+
if (!initial_participants_transmitted_to_peers)
87144
{
88145
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Warning! It seems a player hasn't got initial participants!");
89146
}
90147
}
91148

149+
bool match_started_for_peers = false;
92150
if (m_flags.test(_matchmaking_arbitration_start_match_session_completed_bit) && !m_flags.test(_matchmaking_arbitration_start_match_session_failed_bit))
93151
{
94-
all_players_session_started = session_membership->peer_property_flag_test(_peer_property_flag_test_all_peers, _network_session_peer_properties_status_match_started_bit);
95-
if (!all_players_session_started)
152+
match_started_for_peers = session_membership->peer_property_flag_test(_peer_property_flag_test_all_peers, _network_session_peer_properties_status_match_started_bit);
153+
if (!match_started_for_peers)
96154
{
97155
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Warning! It seems a peer hasn't finished starting their session!");
98156
}
99157
}
100158

159+
bool stats_written_for_peers = false;
101160
if (m_flags.test(_matchmaking_arbitration_start_match_initial_stats_write_completed_bit) && !m_flags.test(_matchmaking_arbitration_start_match_initial_stats_write_failed_bit))
102161
{
103-
stats_written = session_membership->peer_property_flag_test(_peer_property_flag_test_all_peers, _network_session_peer_properties_status_match_initial_stats_written_bit);
104-
}
105-
else
106-
{
107-
stats_written = 0;
162+
stats_written_for_peers = session_membership->peer_property_flag_test(_peer_property_flag_test_all_peers, _network_session_peer_properties_status_match_initial_stats_written_bit);
108163
}
109164

110165
if (m_flags.test(_matchmaking_arbitration_start_match_session_failed_bit))
@@ -117,13 +172,20 @@ bool c_life_cycle_state_handler_matchmaking_arbitration::ready_to_start()
117172
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Warning! Stats write has failed!");
118173
}
119174

175+
bool ready = arbitration_completed && initial_participants_transmitted_to_peers && match_started_for_peers && stats_written_for_peers;
176+
120177
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Arbitration completed? %s", arbitration_completed ? "YES" : "NO");
121-
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Peers have initial participants? %s", all_players_have_initial_participants ? "YES" : "NO");
122-
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Session started? %s", all_players_session_started ? "YES" : "NO");
123-
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Stats written? %s", stats_written ? "YES" : "NO");
124-
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Are we ready? %s", arbitration_completed && all_players_have_initial_participants && all_players_session_started && stats_written ? "YES" : "NO");
178+
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Peers have initial participants? %s", initial_participants_transmitted_to_peers ? "YES" : "NO");
179+
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Session started? %s", match_started_for_peers ? "YES" : "NO");
180+
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Stats written? %s", stats_written_for_peers ? "YES" : "NO");
181+
c_console::write_line("donkey:networking:logic:life_cycle:matchmaking_arbitration: Are we ready? %s", ready ? "YES" : "NO");
125182

126-
return arbitration_completed && all_players_have_initial_participants && all_players_session_started && stats_written;
183+
return ready;
184+
}
185+
186+
bool c_life_cycle_state_handler_matchmaking_arbitration::ready_to_update_repeated_play()
187+
{
188+
return INVOKE_CLASS_MEMBER(0x00494BF0, c_life_cycle_state_handler_matchmaking_arbitration, ready_to_update_repeated_play);
127189
}
128190

129191
bool c_life_cycle_state_handler_matchmaking_arbitration::session_membership_matches_arbitration_registration_results()
@@ -133,6 +195,29 @@ bool c_life_cycle_state_handler_matchmaking_arbitration::session_membership_matc
133195
return true;
134196
}
135197

198+
//.text:00494E50 ;
199+
200+
void c_life_cycle_state_handler_matchmaking_arbitration::start_match_mark_complete()
201+
{
202+
//INVOKE_CLASS_MEMBER(0x00494E80, c_life_cycle_state_handler_matchmaking_arbitration, start_match_mark_complete);
203+
204+
ASSERT(!m_flags.test(_matchmaking_arbitration_start_match_session_completed_bit));
205+
network_session_interface_set_peer_status_flag(_network_session_peer_properties_status_match_started_bit, true);
206+
m_flags.set(_matchmaking_arbitration_start_match_session_completed_bit, true);
207+
}
208+
209+
void c_life_cycle_state_handler_matchmaking_arbitration::start_match_mark_failed()
210+
{
211+
//INVOKE_CLASS_MEMBER(0x00494EA0, c_life_cycle_state_handler_matchmaking_arbitration, start_match_mark_failed);
212+
213+
ASSERT(!m_flags.test(_matchmaking_arbitration_start_match_session_failed_bit));
214+
c_life_cycle_state_handler_matchmaking_arbitration::start_match_mark_complete();
215+
network_session_interface_set_peer_status_flag(_network_session_peer_properties_status_match_start_failed_bit, true);
216+
m_flags.set(_matchmaking_arbitration_start_match_session_failed_bit, true);
217+
}
218+
219+
//.text:00494ED0 ;
220+
136221
void c_life_cycle_state_handler_matchmaking_arbitration::update()
137222
{
138223
//INVOKE_CLASS_MEMBER(0x00494EF0, c_life_cycle_state_handler_matchmaking_arbitration, update);
@@ -157,10 +242,116 @@ void c_life_cycle_state_handler_matchmaking_arbitration::update()
157242
void c_life_cycle_state_handler_matchmaking_arbitration::update_arbitration()
158243
{
159244
INVOKE_CLASS_MEMBER(0x004952F0, c_life_cycle_state_handler_matchmaking_arbitration, update_arbitration);
245+
246+
//c_life_cycle_state_manager* manager = get_manager();
247+
//c_network_session* group_session = manager->get_group_session();
248+
//int32 managed_session_index = group_session->m_managed_session_index;
249+
//
250+
//ASSERT(!m_flags.test(_matchmaking_arbitration_complete_bit));
251+
//
252+
//if (!m_flags.test(_matchmaking_arbitration_initiated_bit))
253+
//{
254+
// if (network_arbitration_get_status() == _network_arbitration_status_registration_in_progress)
255+
// {
256+
// if (!m_flags.test(_matchmaking_arbitration_blocked_bit))
257+
// {
258+
// event(_event_warning, "networking:logic:life_cycle:arbitration: arbitration blocked, can't initiate");
259+
// m_flags.set(_matchmaking_arbitration_blocked_bit, true);
260+
// }
261+
// }
262+
// else
263+
// {
264+
// c_network_session_parameters* session_parameters = group_session->get_session_parameters();
265+
// uns64 arbitration_nonce = *session_parameters->matchmaking_arbitration_nonce.get();
266+
// if (m_flags.test(_matchmaking_arbitration_blocked_bit))
267+
// {
268+
// event(_event_warning, "networking:logic:life_cycle:arbitration: arbitration unblocked, starting...");
269+
// m_flags.set(_matchmaking_arbitration_blocked_bit, false);
270+
// }
271+
//
272+
// if (!network_arbitration_initiate(managed_session_index, arbitration_nonce))
273+
// {
274+
// event(_event_error, "networking:logic:life_cycle:arbitration: failed to initiate arbitration for managed session 0x%08X",
275+
// managed_session_index);
276+
// c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_failed();
277+
// }
278+
//
279+
// m_flags.set(_matchmaking_arbitration_initiated_bit, true);
280+
// }
281+
//}
282+
//
283+
//if (m_flags.test(_matchmaking_arbitration_initiated_bit) && m_flags.test(_matchmaking_arbitration_failed_bit))
284+
//{
285+
// e_network_arbitration_status status = network_arbitration_get_status();
286+
// switch (status)
287+
// {
288+
// case _network_arbitration_status_none:
289+
// {
290+
// event(_event_error, "networking:logic:life_cycle:arbitration: found arbitration in bad state for managed session 0x%08X",
291+
// managed_session_index);
292+
// c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_failed();
293+
// }
294+
// break;
295+
// //case _network_arbitration_status_registration_in_progress:
296+
// //{
297+
// //}
298+
// //break;
299+
// case _network_arbitration_status_registered:
300+
// {
301+
// if (!network_arbitration_get_results(managed_session_index, &m_registration_result))
302+
// {
303+
// event(_event_error, "networking:logic:life_cycle:arbitration: failed to get arbitration results for managed session 0x%08X",
304+
// managed_session_index);
305+
// c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_failed();
306+
// break;
307+
// }
308+
//
309+
// event(_event_message, "networking:logic:life_cycle:arbitration: arbitration completed successfully");
310+
// c_life_cycle_state_handler_matchmaking_arbitration::mark_arbitration_complete();
311+
// }
312+
// break;
313+
// case _network_arbitration_status_registration_failed:
314+
// {
315+
// event(_event_error, "networking:logic:life_cycle:arbitration: arbitration failed for managed session 0x%08X",
316+
// managed_session_index);
317+
// }
318+
// break;
319+
// }
320+
//}
160321
}
161322

162323
e_life_cycle_state_transition_type c_life_cycle_state_handler_matchmaking_arbitration::update_for_state_transition()
163324
{
164325
return INVOKE_CLASS_MEMBER(0x004952F0, c_life_cycle_state_handler_matchmaking_arbitration, update_for_state_transition);
165326
}
166327

328+
void c_life_cycle_state_handler_matchmaking_arbitration::update_initial_stats_write()
329+
{
330+
INVOKE_CLASS_MEMBER(0x00495550, c_life_cycle_state_handler_matchmaking_arbitration, update_initial_stats_write);
331+
}
332+
333+
void c_life_cycle_state_handler_matchmaking_arbitration::update_progress()
334+
{
335+
INVOKE_CLASS_MEMBER(0x00495700, c_life_cycle_state_handler_matchmaking_arbitration, update_progress);
336+
337+
//c_life_cycle_state_manager* manager = get_manager();
338+
//c_network_session* group_session = manager->get_group_session();
339+
//c_network_session_parameters* session_parameters = group_session->get_session_parameters();
340+
//
341+
//ASSERT(group_session->is_host());
342+
//
343+
//s_replicated_life_cycle_matchmaking_progress replicated_progress{};
344+
//replicated_progress.progress_type = _life_cycle_matchmaking_progress_setting_up_match;
345+
//session_parameters->matchmaking_progress.set(&replicated_progress);
346+
}
347+
348+
void c_life_cycle_state_handler_matchmaking_arbitration::update_repeated_play()
349+
{
350+
INVOKE_CLASS_MEMBER(0x00495750, c_life_cycle_state_handler_matchmaking_arbitration, update_repeated_play);
351+
}
352+
353+
void c_life_cycle_state_handler_matchmaking_arbitration::update_start_match()
354+
{
355+
INVOKE_CLASS_MEMBER(0x00495900, c_life_cycle_state_handler_matchmaking_arbitration, update_start_match);
356+
}
357+

game/source/networking/logic/life_cycle/life_cycle_handler_matchmaking_arbitration.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "networking/logic/life_cycle/life_cycle_state_handler.hpp"
44
#include "networking/logic/network_arbitration.hpp"
55

6+
struct s_life_cycle_matchmaking_progress;
7+
68
enum e_matchmaking_arbitration_flags
79
{
810
_matchmaking_arbitration_entered_as_host_bit = 0,
@@ -41,14 +43,38 @@ struct c_life_cycle_state_handler_matchmaking_arbitration :
4143
virtual char const* get_state_string() override;
4244
virtual void handle_missing_required_session_parameter(e_network_session_type session_type) override;
4345

46+
public:
4447
c_life_cycle_state_handler_matchmaking_arbitration();
48+
void get_progress(s_life_cycle_matchmaking_progress* progress_out);
49+
50+
private:
51+
void initial_stats_write_mark_complete();
52+
void initial_stats_write_mark_failed();
53+
54+
public:
4555
void initialize(c_life_cycle_state_manager* manager);
56+
57+
private:
4658
void mark_arbitration_complete();
59+
void mark_arbitration_failed();
60+
61+
public:
4762
bool ready_to_start();
63+
64+
private:
65+
bool ready_to_update_repeated_play();
66+
67+
public:
4868
bool session_membership_matches_arbitration_registration_results();
4969

5070
private:
71+
void start_match_mark_complete();
72+
void start_match_mark_failed();
5173
void update_arbitration();
74+
void update_initial_stats_write();
75+
void update_progress();
76+
void update_repeated_play();
77+
void update_start_match();
5278

5379
public:
5480
//protected:

0 commit comments

Comments
 (0)