+#include "player_remote.h"
+
+static void player_remote_unwatch( struct network_player *player ){
+ addon_cache_unwatch( k_addon_type_player, player->playermodel_view_slot );
+ addon_cache_unwatch( k_addon_type_board, player->board_view_slot );
+}
+
+static void player_remote_clear( struct network_player *player ){
+ player_remote_unwatch( player );
+ memset( player, 0, sizeof(*player) );
+ strcpy( player->username, "unknown" );
+ player->subsystem = k_player_subsystem_invalid;
+}
+
+static void player_remote_packet( SteamNetworkingMessage_t *msg ){
+ netmsg_blank *tmp = msg->m_pData;
+
+ if( tmp->inetmsg_id == k_inetmsg_playerjoin ){
+ netmsg_playerjoin *playerjoin = msg->m_pData;
+
+ if( playerjoin->index < vg_list_size(netplayers.list) ){
+ struct network_player *player = &netplayers.list[ playerjoin->index ];
+ player_remote_clear( player );
+ player->active = 1;
+
+ /* TODO: interpret the uids */
+ player->board_view_slot = 0;
+ player->playermodel_view_slot = 0;
+ }
+ else {
+ vg_error( "inetmsg_playerjoin: player index out of range\n" );
+ }
+ }
+ else if( tmp->inetmsg_id == k_inetmsg_playerleave ){
+ netmsg_playerleave *playerleave = msg->m_pData;
+
+ if( playerleave->index < vg_list_size(netplayers.list) ){
+ struct network_player *player = &netplayers.list[ playerleave->index ];
+ player_remote_unwatch( player );
+ player->active = 0;
+ }
+ else {
+ vg_error( "inetmsg_playerleave: player index out of range\n" );
+ }
+ }
+}
+
+static void remote_player_network_imgui(void){
+ if( !network_client.network_info )
+ return;
+
+ ui_rect panel = { (vg.window_x / 2) - 200, 0, 400, 600 };
+ ui_fill( panel, (ui_colour(k_ui_bg)&0x00ffffff)|0x50000000 );
+
+ char buf[512];
+ const char *netstatus = "PROGRAMMING ERROR";
+
+ struct { enum ESteamNetworkingConnectionState state; const char *str; }
+ states[] = {
+ { k_ESteamNetworkingConnectionState_None, "None" },
+ { k_ESteamNetworkingConnectionState_Connecting, "Connecting" },
+ { k_ESteamNetworkingConnectionState_FindingRoute, "Finding Route" },
+ { k_ESteamNetworkingConnectionState_Connected, "Connected" },
+ { k_ESteamNetworkingConnectionState_ClosedByPeer, "Closed by peer" },
+ { k_ESteamNetworkingConnectionState_ProblemDetectedLocally,
+ "Problem Detected Locally" },
+ { k_ESteamNetworkingConnectionState_FinWait, "Fin Wait" },
+ { k_ESteamNetworkingConnectionState_Linger, "Linger" },
+ { k_ESteamNetworkingConnectionState_Dead, "Dead" }
+ };
+ for( u32 i=0; i<vg_list_size(states); i ++ ){
+ if( states[i].state == network_client.state ){
+ netstatus = states[i].str;
+ break;
+ }
+ }
+ snprintf( buf, 512, "Network: %s", netstatus );
+ ui_info( panel, buf );
+ ui_info( panel, "---------------------" );
+
+ for( u32 i=0; i<vg_list_size(netplayers.list); i++ ){
+ struct network_player *player = &netplayers.list[i];
+ if( player->active ){
+ const char *sysname = "invalid";
+
+ if( (player->subsystem >= 0) &&
+ (player->subsystem < k_player_subsystem_max) ){
+ sysname = player_subsystems[ player->subsystem ]->name;
+ }
+ snprintf( buf, 512, "#%u: %s [%s]", i, player->username, sysname );
+ ui_info( panel, buf );
+ }
+ }
+}