1 #include "player_remote.h"
3 static void player_remote_unwatch( struct network_player
*player
){
4 addon_cache_unwatch( k_addon_type_player
, player
->playermodel_view_slot
);
5 addon_cache_unwatch( k_addon_type_board
, player
->board_view_slot
);
8 static void player_remote_clear( struct network_player
*player
){
9 player_remote_unwatch( player
);
10 memset( player
, 0, sizeof(*player
) );
11 strcpy( player
->username
, "unknown" );
12 player
->subsystem
= k_player_subsystem_invalid
;
15 static void player_remote_rx_200_300( SteamNetworkingMessage_t
*msg
){
16 netmsg_blank
*tmp
= msg
->m_pData
;
18 if( tmp
->inetmsg_id
== k_inetmsg_playerjoin
){
19 netmsg_playerjoin
*playerjoin
= msg
->m_pData
;
20 if( !packet_minsize( msg
, sizeof(*playerjoin
) )) return;
22 if( playerjoin
->index
< vg_list_size(netplayers
.list
) ){
23 struct network_player
*player
= &netplayers
.list
[ playerjoin
->index
];
24 player_remote_clear( player
);
27 /* TODO: interpret the uids */
28 player
->board_view_slot
= 0;
29 player
->playermodel_view_slot
= 0;
32 vg_error( "inetmsg_playerjoin: player index out of range\n" );
35 else if( tmp
->inetmsg_id
== k_inetmsg_playerleave
){
36 netmsg_playerleave
*playerleave
= msg
->m_pData
;
37 if( !packet_minsize( msg
, sizeof(*playerleave
) )) return;
39 if( playerleave
->index
< vg_list_size(netplayers
.list
) ){
40 struct network_player
*player
= &netplayers
.list
[ playerleave
->index
];
41 player_remote_unwatch( player
);
45 vg_error( "inetmsg_playerleave: player index out of range\n" );
48 else if( tmp
->inetmsg_id
== k_inetmsg_playerusername
){
49 netmsg_playerusername
*update
= msg
->m_pData
;
50 if( !packet_minsize( msg
, sizeof(*update
) )) return;
52 if( update
->index
< vg_list_size(netplayers
.list
) ){
53 struct network_player
*player
= &netplayers
.list
[ update
->index
];
54 vg_strncpy( update
->username
, player
->username
,
55 sizeof(player
->username
), k_strncpy_always_add_null
);
57 vg_info( "#%u changed username: %s\n", player
->username
);
60 vg_error( "inetmsg_playerleave: player index out of range\n" );
65 static void remote_player_network_imgui(void){
66 if( !network_client
.network_info
)
69 ui_rect panel
= { (vg
.window_x
/ 2) - 200, 0, 400, 600 };
70 ui_fill( panel
, (ui_colour(k_ui_bg
)&0x00ffffff)|0x50000000 );
73 const char *netstatus
= "PROGRAMMING ERROR";
75 struct { enum ESteamNetworkingConnectionState state
; const char *str
; }
77 { k_ESteamNetworkingConnectionState_None
, "None" },
78 { k_ESteamNetworkingConnectionState_Connecting
, "Connecting" },
79 { k_ESteamNetworkingConnectionState_FindingRoute
, "Finding Route" },
80 { k_ESteamNetworkingConnectionState_Connected
, "Connected" },
81 { k_ESteamNetworkingConnectionState_ClosedByPeer
, "Closed by peer" },
82 { k_ESteamNetworkingConnectionState_ProblemDetectedLocally
,
83 "Problem Detected Locally" },
84 { k_ESteamNetworkingConnectionState_FinWait
, "Fin Wait" },
85 { k_ESteamNetworkingConnectionState_Linger
, "Linger" },
86 { k_ESteamNetworkingConnectionState_Dead
, "Dead" }
88 for( u32 i
=0; i
<vg_list_size(states
); i
++ ){
89 if( states
[i
].state
== network_client
.state
){
90 netstatus
= states
[i
].str
;
94 snprintf( buf
, 512, "Network: %s", netstatus
);
95 ui_info( panel
, buf
);
96 ui_info( panel
, "---------------------" );
97 ui_info( panel
, "#-1: localplayer" );
99 for( u32 i
=0; i
<vg_list_size(netplayers
.list
); i
++ ){
100 struct network_player
*player
= &netplayers
.list
[i
];
101 if( player
->active
){
102 const char *sysname
= "invalid";
104 if( (player
->subsystem
>= 0) &&
105 (player
->subsystem
< k_player_subsystem_max
) ){
106 sysname
= player_subsystems
[ player
->subsystem
]->name
;
108 snprintf( buf
, 512, "#%u: %s [%s]", i
, player
->username
, sysname
);
109 ui_info( panel
, buf
);