Skip to content

Commit 4cfc690

Browse files
committed
Implemented network_arbitration (WIP)
1 parent a0cbe9e commit 4cfc690

4 files changed

Lines changed: 168 additions & 13 deletions

File tree

Lines changed: 150 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,179 @@
11
#include "networking/logic/network_arbitration.hpp"
22

3+
#include "cseries/cseries_events.hpp"
34
#include "memory/module.hpp"
5+
#include "networking/online/online_arbitration_windows.hpp"
6+
#include "networking/session/network_managed_session.hpp"
47

8+
//REFERENCE_DECLARE_ARRAY(0x0189C4D8, char const*, g_network_arbitration_status_string, k_network_arbitration_status_count);
59
REFERENCE_DECLARE(0x0228E520, s_network_arbitration_globals, network_arbitration_globals);
610

11+
HOOK_DECLARE(0x004D9AB0, network_arbitration_get_results);
12+
HOOK_DECLARE(0x004D9B20, network_arbitration_get_status);
713
HOOK_DECLARE(0x004D9B60, network_arbitration_initiate);
814

915
void __cdecl network_arbitration_destory()
1016
{
11-
INVOKE(0x004D9A90, network_arbitration_destory);
17+
//INVOKE(0x004D9A90, network_arbitration_destory);
18+
19+
csmemset(&network_arbitration_globals, 0, sizeof(network_arbitration_globals));
20+
network_arbitration_globals.arbitration_managed_session_index = NONE;
21+
}
22+
23+
bool __cdecl network_arbitration_get_results(int32 managed_session_index, s_arbitration_registration_result* registration_result)
24+
{
25+
//return INVOKE(0x004D9AB0, network_arbitration_get_results, managed_session_index, registration_result);
26+
27+
ASSERT(managed_session_index != NONE);
28+
ASSERT(registration_result);
29+
30+
if (managed_session_index != network_arbitration_globals.arbitration_managed_session_index)
31+
{
32+
event(_event_error, "networking:leaderboards:arbitration: failed to get arbitration result, session mismatch [0x%08X != 0x%08X]",
33+
managed_session_index,
34+
network_arbitration_globals.arbitration_managed_session_index);
35+
36+
return false;
37+
}
38+
39+
if (network_arbitration_globals.arbitration_status != _network_arbitration_status_registered)
40+
{
41+
event(_event_error, "networking:leaderboards:arbitration: failed to get arbitration result, arbitration state not registered [0x%08X %s]",
42+
managed_session_index,
43+
g_network_arbitration_status_string[network_arbitration_globals.arbitration_status]);
44+
45+
return false;
46+
}
47+
48+
*registration_result = network_arbitration_globals.registration_result;
49+
return true;
1250
}
1351

14-
//.text:004D9AB0 ; bool __cdecl network_arbitration_get_results(int32, s_arbitration_registration_result*)
15-
//.text:004D9B20 ; e_network_arbitration_status __cdecl network_arbitration_get_status()
52+
e_network_arbitration_status __cdecl network_arbitration_get_status()
53+
{
54+
//return INVOKE(0x004D9B20, network_arbitration_get_status);
55+
56+
return network_arbitration_globals.arbitration_status;
57+
}
1658

1759
bool __cdecl network_arbitration_initialize()
1860
{
19-
return INVOKE(0x004D9B30, network_arbitration_initialize);
61+
//return INVOKE(0x004D9B30, network_arbitration_initialize);
62+
63+
memset(&network_arbitration_globals, 0, sizeof(network_arbitration_globals));
64+
network_arbitration_globals.arbitration_managed_session_index = NONE;
65+
network_arbitration_globals.initialized = true;
66+
return true;
2067
}
2168

2269
bool __cdecl network_arbitration_initiate(int32 managed_session_index, uns64 nonce)
2370
{
2471
//return INVOKE(0x004D9B60, network_arbitration_initiate, managed_session_index, nonce);
2572

26-
network_arbitration_globals.arbitration_status = _network_arbitration_status_registered;
27-
network_arbitration_globals.managed_session_index = managed_session_index;
73+
ASSERT(managed_session_index != NONE);
74+
ASSERT(nonce);
75+
ASSERT(network_arbitration_get_status() != _network_arbitration_status_registration_in_progress);
76+
77+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_failed;
78+
network_arbitration_globals.arbitration_managed_session_index = managed_session_index;
79+
80+
void* session_handle = NULL;
81+
if (!managed_session_get_handle(managed_session_index, &session_handle))
82+
{
83+
event(_event_warning, "networking:leaderboards:arbitration: failed to get session handle for session 0x%08X",
84+
managed_session_index);
85+
86+
return false;
87+
}
88+
89+
if (!online_arbitration_initiate_registration(session_handle, nonce))
90+
{
91+
event(_event_warning, "networking:leaderboards:arbitration: failed to initiate registration for session 0x%08X",
92+
managed_session_index);
93+
94+
return false;
95+
}
96+
97+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_in_progress;
2898
return true;
2999
}
30100

31101
void __cdecl network_arbitration_update()
32102
{
33-
INVOKE(0x004D9BB0, network_arbitration_update);
103+
//INVOKE(0x004D9BB0, network_arbitration_update);
104+
105+
network_arbitration_update_registration();
106+
}
107+
108+
void __cdecl network_arbitration_update_registration()
109+
{
110+
//INVOKE(0x004D9BE0, network_arbitration_update_registration);
111+
112+
if (network_arbitration_globals.arbitration_status != _network_arbitration_status_registration_in_progress)
113+
{
114+
return;
115+
}
116+
117+
e_online_arbitration_registration_status status = online_arbitration_registration_get_status();
118+
switch (status)
119+
{
120+
case _online_arbitration_registration_none:
121+
{
122+
event(_event_error, "networking:leaderboards:arbitration: registration failed for session 0x%08X (unexpected result)",
123+
network_arbitration_globals.arbitration_managed_session_index);
124+
125+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_failed;
126+
}
127+
break;
128+
case _online_arbitration_registration_in_progress:
129+
{
130+
event(_event_warning, "networking:leaderboards:arbitration: registration failed for session 0x%08X",
131+
network_arbitration_globals.arbitration_managed_session_index);
132+
133+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_failed;
134+
}
135+
break;
136+
case _online_arbitration_registration_complete_success:
137+
{
138+
event(_event_message, "networking:leaderboards:arbitration: registration completed for session 0x%08X",
139+
network_arbitration_globals.arbitration_managed_session_index);
140+
141+
if (!online_arbitration_registration_get_result(&network_arbitration_globals.registration_result))
142+
{
143+
event(_event_message, "networking:leaderboards:arbitration: registration completed, but we failed to get results for session 0x%08X",
144+
network_arbitration_globals.arbitration_managed_session_index);
145+
146+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_failed;
147+
break;
148+
}
149+
150+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registered;
151+
}
152+
break;
153+
case _online_arbitration_registration_complete_failed:
154+
{
155+
event(_event_message, "networking:leaderboards:arbitration: registration completed, but we failed to get results for session 0x%08X",
156+
network_arbitration_globals.arbitration_managed_session_index);
157+
158+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_failed;
159+
}
160+
break;
161+
default:
162+
{
163+
event(_event_error, "networking:leaderboards:arbitration: registration failed for session 0x%08X (unexpected result)",
164+
network_arbitration_globals.arbitration_managed_session_index);
165+
166+
network_arbitration_globals.arbitration_status = _network_arbitration_status_registration_failed;
167+
}
168+
break;
169+
}
34170
}
35171

36-
//.text:004D9BE0 ; void __cdecl network_arbitration_update_registration()
172+
char const* g_network_arbitration_status_string[k_network_arbitration_status_count]
173+
{
174+
"arbitration-status-none",
175+
"arbitration-status-registration-in-progress",
176+
"arbitration-status-registered",
177+
"arbitration-status-registration-failed"
178+
};
37179

game/source/networking/logic/network_arbitration.hpp

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

3-
#include "cseries/cseries.hpp"
4-
#include "game/players.hpp"
5-
63
enum e_network_arbitration_status
74
{
85
_network_arbitration_status_none = 0,
@@ -31,16 +28,21 @@ static_assert(sizeof(s_arbitration_registration_result) == 0x188);
3128
struct s_network_arbitration_globals
3229
{
3330
bool initialized;
34-
int32 managed_session_index;
31+
int32 arbitration_managed_session_index;
3532
e_network_arbitration_status arbitration_status;
3633
s_arbitration_registration_result registration_result;
3734
};
3835
static_assert(sizeof(s_network_arbitration_globals) == 0x198);
3936

37+
//extern char const*(&g_network_arbitration_status_string)[k_network_arbitration_status_count];
38+
extern char const* g_network_arbitration_status_string[k_network_arbitration_status_count];
4039
extern s_network_arbitration_globals& network_arbitration_globals;
4140

4241
extern void __cdecl network_arbitration_destory();
42+
extern bool __cdecl network_arbitration_get_results(int32 managed_session_index, s_arbitration_registration_result* registration_result);
43+
extern e_network_arbitration_status __cdecl network_arbitration_get_status();
4344
extern bool __cdecl network_arbitration_initialize();
4445
extern bool __cdecl network_arbitration_initiate(int32 managed_session_index, uns64 nonce);
4546
extern void __cdecl network_arbitration_update();
47+
extern void __cdecl network_arbitration_update_registration();
4648

game/source/networking/online/online.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "interface/user_interface_controller.hpp"
55
#include "memory/module.hpp"
66
#include "networking/network_memory.hpp"
7+
#include "networking/online/online_arbitration_windows.hpp"
78
#include "text/unicode.hpp"
89
#include "xbox/xnet.hpp"
910

@@ -117,6 +118,10 @@ void __cdecl online_dispose()
117118
user.display_name = NULL;
118119
}
119120
}
121+
122+
online_arbitration_dispose();
123+
//online_statistics_dispose();
124+
//online_session_search_dispose();
120125
}
121126

122127
void __cdecl online_dump_machine_info(uns64 game_instance)
@@ -208,6 +213,10 @@ bool __cdecl online_has_any_silver_or_gold_live_users()
208213

209214
void __cdecl online_initialize()
210215
{
216+
online_arbitration_initialize();
217+
//online_statistics_initialize();
218+
//online_session_search_initialize();
219+
211220
for (e_controller_index controller_index = _controller0; controller_index < k_number_of_controllers; controller_index++)
212221
{
213222
uns64 user_id = hash64(controller_index);

game/source/networking/online/online_arbitration_windows.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ bool online_arbitration_initiate_registration(void* session_handle, uns64 sessio
3737
//}
3838
//
3939
//return started;
40+
//
41+
//return false;
4042

41-
return false;
43+
return true;
4244
}
4345

4446
bool online_arbitration_registration_get_result(s_arbitration_registration_result* arbitration_result_out)

0 commit comments

Comments
 (0)