Skip to content

Commit 4847136

Browse files
committed
Implemented update_controller_properties
`c_controller_interface::update_controller_properties` Added `managed_user_clear` Added `gamer_achievements_begin_retrieval` Added `user_interface_interactive_session_is_squad` Added `network_squad_session_get_membership`
1 parent a4b8fd7 commit 4847136

12 files changed

+125
-79
lines changed

game/game.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
290290
<ClCompile Include="source\motor\mover.cpp" />
291291
<ClCompile Include="source\motor\sync_action.cpp" />
292292
<ClCompile Include="source\networking\logic\life_cycle\life_cycle_state_handler.cpp" />
293+
<ClCompile Include="source\networking\logic\logic_managed_user.cpp" />
293294
<ClCompile Include="source\networking\logic\network_bandwidth.cpp" />
294295
<ClCompile Include="source\networking\logic\network_banhammer.cpp" />
295296
<ClCompile Include="source\networking\logic\network_leaderboard.cpp" />
@@ -991,6 +992,7 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
991992
<ClInclude Include="source\multithreading\threads.hpp" />
992993
<ClInclude Include="source\networking\delivery\network_connection.hpp" />
993994
<ClInclude Include="source\networking\logic\life_cycle\life_cycle_state_handler.hpp" />
995+
<ClInclude Include="source\networking\logic\logic_managed_user.hpp" />
994996
<ClInclude Include="source\networking\logic\logic_matchmaking_seeker.hpp" />
995997
<ClInclude Include="source\networking\logic\logic_session_tracker.hpp" />
996998
<ClInclude Include="source\networking\logic\network_bandwidth.hpp" />

game/game.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,6 +1806,9 @@
18061806
<ClCompile Include="source\render\render_debug_commands.cpp">
18071807
<Filter>Source Files</Filter>
18081808
</ClCompile>
1809+
<ClCompile Include="source\networking\logic\logic_managed_user.cpp">
1810+
<Filter>Source Files</Filter>
1811+
</ClCompile>
18091812
</ItemGroup>
18101813
<ItemGroup>
18111814
<ClInclude Include="source\camera\camera.hpp">
@@ -4097,6 +4100,9 @@
40974100
<ClInclude Include="source\render\render_debug_commands.hpp">
40984101
<Filter>Header Files</Filter>
40994102
</ClInclude>
4103+
<ClInclude Include="source\networking\logic\logic_managed_user.hpp">
4104+
<Filter>Header Files</Filter>
4105+
</ClInclude>
41004106
</ItemGroup>
41014107
<ItemGroup>
41024108
<ResourceCompile Include="resource\resource.rc">

game/source/interface/c_controller.cpp

Lines changed: 67 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
#include "input/input_windows.hpp"
44
#include "interface/user_interface_controller.hpp"
55
#include "memory/module.hpp"
6+
#include "networking/logic/logic_managed_user.hpp"
67
#include "networking/logic/network_session_interface.hpp"
78
#include "networking/network_time.hpp"
89
#include "networking/online/online.hpp"
10+
#include "networking/online/online_achievements.hpp"
911

1012
HOOK_DECLARE_CLASS_MEMBER(0x00A7DE30, c_controller_interface, update_controller_properties);
1113

@@ -49,7 +51,6 @@ e_window_index __cdecl controller_get_game_render_window(e_controller_index cont
4951
return INVOKE(0x00A7CE80, controller_get_game_render_window, controller_index);
5052

5153
//ASSERT(VALID_CONTROLLER(controller_index));
52-
//
5354
//return controller_game_render_windows[controller_index];
5455
}
5556

@@ -90,7 +91,7 @@ e_controller_index c_controller_interface::get_controller_index() const
9091

9192
wchar_t const* c_controller_interface::get_display_name() const
9293
{
93-
return m_display_name.get_string();
94+
return m_display_name;
9495
}
9596

9697
//.text:00A7D430 ;
@@ -148,6 +149,7 @@ bool c_controller_interface::is_signed_in_to_machine() const
148149
//.text:00A7D970 ;
149150
//.text:00A7D990 ;
150151
//.text:00A7D9A0 ;
152+
//.text:00A7D9C0 ; private: void c_controller_interface::remove_controller_from_network_session()
151153
//.text:00A7D9E0 ; public: void c_controller_interface::render()
152154
//.text:00A7DA20 ; public: void c_controller_interface::reset_user_index()
153155
//.text:00A7DA30 ; public: void c_controller_interface::set_as_unsigned_in_user(bool)
@@ -175,32 +177,23 @@ void c_controller_interface::sign_out_controller(bool sign_out_for_sign_in_chang
175177

176178
void c_controller_interface::update_controller_properties()
177179
{
178-
HOOK_INVOKE_CLASS_MEMBER(, c_controller_interface, update_controller_properties);
179-
return;
180-
181-
// $TODO: implement me properly
180+
//HOOK_INVOKE_CLASS_MEMBER(, c_controller_interface, update_controller_properties);
182181

183182
e_controller_index controller_index = get_controller_index();
184183
bool is_signed_in = online_local_user_is_signed_in(controller_index);
185-
bool attached = m_state_flags.test(_attached_bit);
186-
bool has_gamepad = input_has_gamepad(controller_index);
184+
bool has_gamepad = true;// input_has_gamepad(controller_index);
185+
bool attached = is_attached();
186+
bool is_user_signed_in = false;
187187

188-
long is_user_signed_in = 0;
189-
if (m_user_index < 4)
188+
if (VALID_INDEX(m_user_index, 4))
190189
{
191-
if (is_user_signed_in = network_session_interface_get_is_user_signed_in(m_user_index))
192-
{
193-
m_user_index = NONE;
194-
}
190+
is_user_signed_in = network_session_interface_get_is_user_signed_in(m_user_index);
195191
}
196-
else
192+
else if (m_user_index != NONE && network_session_interface_get_local_user_state(m_user_index) == _network_session_interface_user_state_none)
197193
{
198-
if (m_user_index != NONE && network_session_interface_get_local_user_state(m_user_index) == _network_session_interface_user_state_none)
199-
{
200-
201-
}
194+
m_user_index = NONE;
202195
}
203-
dword time_controller_signed_out;
196+
204197
if (is_signed_in || m_state_flags.test(_temporary_bit))
205198
{
206199
qword old_player_identifier = 0;
@@ -209,92 +202,102 @@ void c_controller_interface::update_controller_properties()
209202
bool is_silver_or_gold_live = false;
210203
bool is_online_enabled = false;
211204
bool is_free_live_gold_account = false;
205+
212206
if (is_user_signed_in)
213207
{
214-
if (m_user_index >= 4 || !network_session_interface_get_local_user_identifier(m_user_index,(s_player_identifier*)&old_player_identifier, true))
208+
if (m_user_index < 4 && network_session_interface_get_local_user_identifier(m_user_index, (s_player_identifier*)&old_player_identifier, true))
209+
{
210+
network_session_interface_get_local_user_xuid(m_user_index);
211+
//network_session_interface_is_local_user_silver_or_gold_live(m_user_index);
212+
//network_session_interface_is_local_user_online_enabled(m_user_index);
213+
}
214+
else
215215
{
216216
old_player_identifier = 0;
217217
}
218-
network_session_interface_get_local_user_xuid(m_user_index);
219-
//network_session_interface_is_local_user_silver_or_gold_live(m_user_index);
220-
//network_session_interface_is_local_user_online_enabled(m_user_index);
221218
}
219+
222220
if (is_signed_in)
223221
{
224222
xuid = online_local_user_get_xuid(controller_index);
225223
is_silver_or_gold_live = online_local_user_is_silver_or_gold_live(controller_index);
226224
is_online_enabled = online_local_user_is_online_enabled(controller_index);
227225
is_free_live_gold_account = online_local_user_is_free_live_gold_account(controller_index);
228226
}
227+
229228
bool is_user_created_content_allowed = online_local_user_is_user_created_content_allowed(controller_index);
230229
bool is_friend_created_content_allowed = online_local_user_is_friend_created_content_allowed(controller_index);
231-
qword player_identifier = online_local_user_get_player_identifier(controller_index);
232-
new_player_identifier = player_identifier;
233-
if (!is_user_signed_in || old_player_identifier != player_identifier)
230+
new_player_identifier = online_local_user_get_player_identifier(controller_index);
231+
232+
if (!is_user_signed_in || old_player_identifier != new_player_identifier)
234233
{
235-
//content_catalogue_get_interface(controller_index)->dispose();
236-
m_state_flags.set(_storage_device_selection_performed_bit, false);
237-
//if (is_user_signed_in)
238-
// sign_out_controller(true);
239-
//managed_user_clear(controller_index);
234+
update_for_sign_in_change();
235+
236+
if (is_user_signed_in)
237+
sign_out_controller(true);
238+
239+
managed_user_clear(controller_index);
240+
240241
if (!m_state_flags.test(_temporary_bit))
241242
{
242-
m_player_profile.m_flags |= FLAG(6);
243-
//gamer_achievements_begin_retrieval(controller_index);
243+
//m_player_profile->mark_for_update_from_storage()?
244+
m_player_profile.m_flags |= 0x40;
245+
gamer_achievements_begin_retrieval(controller_index);
244246
}
247+
245248
sign_in_controller((s_player_identifier*)&new_player_identifier, m_state_flags.test(_temporary_bit));
246249
}
250+
247251
if (!m_state_flags.test(_temporary_bit))
248252
{
249-
m_display_name.clear();
250-
if (online_local_user_get_name(controller_index))
253+
memset(m_display_name, 0, sizeof(m_display_name));
254+
if (wchar_t const* name = online_local_user_get_name(controller_index))
251255
{
252-
wchar_t const* name = online_local_user_get_name(controller_index);
253-
m_display_name.set(name);
256+
ustrnzcpy(m_display_name, name, NUMBEROF(m_display_name));
254257
}
255258
}
259+
256260
network_session_interface_set_local_user_xuid(
257261
m_user_index,
258262
xuid/*,
259263
is_silver_or_gold_live,
260264
is_online_enabled,
261265
is_free_live_gold_account,
262266
is_user_created_content_allowed,
263-
is_friend_created_content_allowed*/
264-
);
265-
goto LABEL_39;
267+
is_friend_created_content_allowed*/);
266268
}
267-
268-
if (!is_user_signed_in)
269-
goto LABEL_40;
270-
271-
time_controller_signed_out = m_time_controller_signed_out;
272-
if (!time_controller_signed_out)
273-
m_time_controller_signed_out = network_time_get();
274-
if (network_time_get() - time_controller_signed_out > 1000)
269+
else if (is_user_signed_in)
275270
{
276-
sign_out_controller(false);
277-
m_state_flags.clear();
278-
m_display_name.clear();
279-
LABEL_39:;
280-
m_time_controller_signed_out = 0;
271+
if (!m_time_controller_signed_out)
272+
{
273+
m_time_controller_signed_out = network_time_get();
274+
}
275+
else if (long(network_time_get() - m_time_controller_signed_out) > 1000)
276+
{
277+
sign_out_controller(false);
278+
m_state_flags.clear();
279+
memset(m_display_name, 0, sizeof(m_display_name));
280+
m_time_controller_signed_out = 0;
281+
}
281282
}
282-
LABEL_40:;
283+
283284
m_state_flags.set(_attached_bit, has_gamepad);
285+
284286
if (has_gamepad != attached)
285287
{
286-
if (VALID_INDEX(m_user_index, 4)
287-
&& network_session_interface_local_user_exists(m_user_index)
288-
&& !m_state_flags.test(_temporary_bit)
289-
|| m_state_flags.test(_temporary_bit))
288+
if (has_gamepad && (m_user_index < 4 && network_session_interface_local_user_exists(m_user_index) && !m_state_flags.test(_temporary_bit)) || m_state_flags.test(_temporary_bit))
290289
{
291-
if (has_gamepad)
292-
user_interface_controller_attached(controller_index);
293-
else
294-
user_interface_controller_detached(controller_index);
290+
user_interface_controller_attached(controller_index);
291+
}
292+
else if (!has_gamepad && (m_user_index < 4 && network_session_interface_local_user_exists(m_user_index) && !m_state_flags.test(_temporary_bit)) || m_state_flags.test(_temporary_bit))
293+
{
294+
user_interface_controller_detached(controller_index);
295295
}
296296
}
297297
}
298298

299-
//.text:00A7E150 ; private: void c_controller_interface::update_for_sign_in_change()
299+
void c_controller_interface::update_for_sign_in_change()
300+
{
301+
INVOKE_CLASS_MEMBER(0x00A7E150, c_controller_interface, update_for_sign_in_change);
302+
}
300303

game/source/interface/c_controller.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct c_controller_interface
2424
void sign_in_controller(s_player_identifier const* player_identifier, bool is_temporary);
2525
void sign_out_controller(bool sign_out_for_sign_in_change);
2626
void update_controller_properties();
27+
void update_for_sign_in_change();
2728

2829
//protected:
2930
// 4066
@@ -56,7 +57,7 @@ struct c_controller_interface
5657
short m_user_index;
5758
dword __unknown4;
5859
c_player_profile_interface m_player_profile;
59-
c_static_wchar_string<16> m_display_name;
60+
wchar_t m_display_name[16];
6061
qword m_hash_bits;
6162
qword m_hash_bits_last_game_instance;
6263
c_static_flags<k_achievement_count> m_achievements;

game/source/interface/user_interface_session.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ e_session_game_start_status __cdecl user_interface_get_session_game_start_status
4444
//.text:00A81120 ; bool __cdecl user_interface_group_is_local_player(long player_index)
4545
//.text:00A81190 ; bool __cdecl user_interface_group_is_player_valid(long player_index)
4646
//.text:00A811F0 ; bool __cdecl user_interface_interactive_session_is_group()
47-
//.text:00A81230 ; bool __cdecl user_interface_interactive_session_is_squad()
47+
48+
bool __cdecl user_interface_interactive_session_is_squad()
49+
{
50+
return INVOKE(0x00A81230, user_interface_interactive_session_is_squad);
51+
}
52+
4853
//.text:00A81270 ; void __cdecl user_interface_leave_game()
4954

5055
void __cdecl user_interface_leave_sessions(e_user_interface_session_leave_type leave_type, e_user_interface_session_leave_reason leave_reason)

game/source/interface/user_interface_session.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ struct s_saved_film_description;
1212

1313
extern bool __cdecl user_interface_squad_set_session_advertisement(e_gui_network_session_advertisement_mode advertisement_mode);
1414
extern e_session_game_start_status __cdecl user_interface_get_session_game_start_status(e_session_game_start_error* error, dword* player_error_mask);
15+
extern bool __cdecl user_interface_interactive_session_is_squad();
1516
extern void __cdecl user_interface_leave_sessions(e_user_interface_session_leave_type leave_type, e_user_interface_session_leave_reason leave_reason);
1617
extern long __cdecl user_interface_local_player_count();
1718
extern e_controller_index user_interface_session_get_controller_index(long player_index);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "networking/logic/logic_managed_user.hpp"
2+
3+
#include "cseries/cseries.hpp"
4+
5+
void __cdecl managed_user_clear(e_controller_index controller_index)
6+
{
7+
INVOKE(0x004D25F0, managed_user_clear, controller_index);
8+
}
9+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#pragma once
2+
3+
enum e_controller_index;
4+
extern void __cdecl managed_user_clear(e_controller_index controller_index);
5+

game/source/networking/logic/network_session_interface.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ void __cdecl network_session_interface_dispose()
111111
INVOKE(0x00436210, network_life_cycle_squad_session_get_ui_game_mode);
112112
}
113113

114-
//.text:00436230 ;
114+
//.text:00436230 ; long __cdecl network_session_interface_find_unused_local_user()
115115
//.text:00436250 ; void __cdecl simulation_debug_globals_get_game_network_quality(s_network_game_quality*)
116116

117117
bool __cdecl network_session_interface_get_is_user_signed_in(long user_index)
@@ -131,11 +131,11 @@ bool __cdecl network_session_interface_get_live_connection_info(s_transport_qos_
131131
}
132132

133133
//.text:00436450 ; e_network_rough_quality __cdecl get_local_framerate_quality()
134-
//.text:004364A0 ;
134+
//.text:004364A0 ; long __cdecl network_session_interface_get_local_user_count()
135135

136-
bool __cdecl network_session_interface_get_local_user_identifier(long user_index, s_player_identifier* player_identifier, bool a3)
136+
bool __cdecl network_session_interface_get_local_user_identifier(long user_index, s_player_identifier* player_identifier, bool allow_users_in_erroneous_states)
137137
{
138-
return INVOKE(0x004364D0, network_session_interface_get_local_user_identifier, user_index, player_identifier, a3);
138+
return INVOKE(0x004364D0, network_session_interface_get_local_user_identifier, user_index, player_identifier, allow_users_in_erroneous_states);
139139
}
140140

141141
bool __cdecl network_session_interface_get_local_user_properties(long user_index, e_controller_index* controller_index, s_player_configuration* player_data, dword* player_voice_settings)
@@ -166,7 +166,7 @@ qword __cdecl network_session_interface_get_local_user_xuid(long user_index)
166166
return INVOKE(0x004365A0, network_session_interface_get_local_user_xuid, user_index);
167167
}
168168

169-
//.text:004365C0 ;
169+
//.text:004365C0 ; long __cdecl network_session_interface_get_team_index(long)
170170

171171
void __cdecl network_session_interface_handle_message(e_session_network_message message)
172172
{
@@ -178,7 +178,7 @@ bool __cdecl network_session_interface_initialize(c_network_session_manager* ses
178178
return INVOKE(0x00436710, network_session_interface_initialize, session_manager);
179179
}
180180

181-
//.text:00436790 ;
181+
//.text:00436790 ; bool __cdecl network_session_interface_invalidate_map_progress()
182182

183183
bool __cdecl network_session_interface_local_user_exists(long user_index)
184184
{
@@ -217,8 +217,8 @@ void __cdecl network_session_interface_reset(long session_index)
217217
//for (long user_index = 0; user_index < k_number_of_users; user_index++)
218218
//{
219219
// s_network_session_interface_user& user = session_interface_globals.users[user_index];
220-
// user.__times1680[session_index] = 0;
221-
// user.__times168C[session_index] = 0;
220+
// user.user_update_timestamp[session_index] = 0;
221+
// user.user_remove_timestamp[session_index] = 0;
222222
//}
223223
}
224224

@@ -379,7 +379,12 @@ bool __cdecl network_squad_session_controls_coop_game_options(bool* is_leader)
379379
//.text:00438F10 ; e_matchmaking_search_preference __cdecl network_squad_session_get_matchmaking_search_preference()
380380
//.text:00438F70 ; long __cdecl network_squad_session_get_matchmaking_tip()
381381
//.text:00438FF0 ; long __cdecl network_squad_session_get_maximum_player_count()
382-
//.text:00439020 ; bool __cdecl network_squad_session_get_membership(long*, long*, long*, long*, long*, dword*, s_network_session_peer const**, long*, dword*, s_network_session_player const**)
382+
383+
bool __cdecl network_squad_session_get_membership(long* update_number, long* local_peer_index, long* host_peer_index, long* leader_peer_index, long* peer_count, dword* peer_valid_flags, s_network_session_peer const** peers, long* player_count, dword* player_valid_flags, s_network_session_player const** players)
384+
{
385+
return INVOKE(0x00439020, network_squad_session_get_membership, update_number, local_peer_index, host_peer_index, leader_peer_index, peer_count, peer_valid_flags, peers, player_count, player_valid_flags, players);
386+
}
387+
383388
//.text:00439080 ;
384389
//.text:004390D0 ; e_network_session_class __cdecl network_squad_session_get_session_class()
385390
//.text:00439110 ; wchar_t const* __cdecl network_squad_session_get_session_name()

0 commit comments

Comments
 (0)