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
1012HOOK_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
9192wchar_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
176178void 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
0 commit comments