vg_strncpy( playerjoin->username, player->username,
sizeof(player->username), k_strncpy_always_add_null );
- vg_info( "#%u joined with name: %s\n", player->username );
+ vg_info( "#%u joined with name: %s\n",
+ playerjoin->index, player->username );
}
else {
vg_error( "inetmsg_playerjoin: player index out of range\n" );
vg_error( "inetmsg_playerleave: player index out of range\n" );
}
}
+ else if( tmp->inetmsg_id == k_inetmsg_playerframe ){
+ u32 datasize = msg->m_cbSize - sizeof(netmsg_playerframe);
+
+ if( datasize > sizeof(netplayers.list[0].animdata) ){
+ vg_error( "Player frame data exceeds animdata size\n" );
+ return;
+ }
+
+ netmsg_playerframe *frame = msg->m_pData;
+ if( frame->client >= vg_list_size(netplayers.list) ){
+ vg_error( "inetmsg_playerframe: player index out of range\n" );
+ return;
+ }
+
+ if( frame->subsystem >= k_player_subsystem_max ){
+ vg_error( "inetmsg_playerframe: subsystem out of range\n" );
+ return;
+ }
+
+ struct network_player *player = &netplayers.list[ frame->client ];
+ memcpy( &player->animdata, frame->animdata, datasize );
+ player->subsystem = frame->subsystem;
+ player->down_bytes += msg->m_cbSize;
+ }
+}
+
+static void remote_player_send_playerframe(void){
+ u8 sysid = localplayer.subsystem;
+ if( sysid >= k_player_subsystem_max ) return;
+
+ struct player_subsystem_interface *sys = player_subsystems[sysid];
+
+ if( sys->animator_size ){
+ u32 size = sizeof(netmsg_playerframe)+sys->animator_size;
+ netmsg_playerframe *frame = alloca(size);
+ frame->inetmsg_id = k_inetmsg_playerframe;
+ frame->client = 0;
+ frame->subsystem = localplayer.subsystem;
+ memcpy( frame->animdata, sys->animator_data, sys->animator_size );
+
+ netplayers.up_bytes += size;
+
+ SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+ hSteamNetworkingSockets, network_client.remote,
+ frame, size,
+ k_nSteamNetworkingSend_Unreliable, NULL );
+ }
+}
+
+static void remote_player_debug_update(void){
+ if( (vg.time_real - netplayers.last_data_measurement) > 1.0 ){
+ netplayers.last_data_measurement = vg.time_real;
+ u32 total_down = 0;
+
+ for( u32 i=0; i<vg_list_size(netplayers.list); i++ ){
+ struct network_player *player = &netplayers.list[i];
+ if( player->active ){
+ total_down += player->down_bytes;
+ player->down_kbs = ((f32)player->down_bytes)/1024.0f;
+ player->down_bytes = 0;
+ }
+ }
+
+ netplayers.down_kbs = ((f32)total_down)/1024.0f;
+ netplayers.up_kbs = ((f32)netplayers.up_bytes)/1024.0f;
+ netplayers.up_bytes = 0;
+ }
}
-static void remote_player_network_imgui(void){
+static void remote_player_network_imgui( m4x4f pv ){
if( !network_client.network_info )
return;
struct { enum ESteamNetworkingConnectionState state; const char *str; }
states[] = {
{ k_ESteamNetworkingConnectionState_None, "None" },
- { k_ESteamNetworkingConnectionState_Connecting, "Connecting" },
+ { k_ESteamNetworkingConnectionState_Connecting,
+ (const char *[]){"Connecting -",
+ "Connecting /",
+ "Connecting |",
+ "Connecting \\",
+ }[(u32)(vg.time_real/0.25) & 0x3 ] },
{ k_ESteamNetworkingConnectionState_FindingRoute, "Finding Route" },
{ k_ESteamNetworkingConnectionState_Connected, "Connected" },
{ k_ESteamNetworkingConnectionState_ClosedByPeer, "Closed by peer" },
snprintf( buf, 512, "Network: %s", netstatus );
ui_info( panel, buf );
ui_info( panel, "---------------------" );
- ui_info( panel, "#-1: localplayer" );
- 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;
+ if( network_client.state == k_ESteamNetworkingConnectionState_Connected ){
+ ui_info( panel, "#-1: localplayer" );
+
+ snprintf( buf, 512, "U%.1f/D%.1fkbs",
+ netplayers.up_kbs, netplayers.down_kbs );
+ ui_info( panel, buf );
+
+ 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 < k_player_subsystem_max ){
+ sysname = player_subsystems[ player->subsystem ]->name;
+ }
+ snprintf( buf, 512, "#%u: %s [%s] D%.1fkbs",
+ i, player->username, sysname, player->down_kbs );
+ ui_info( panel, buf );
+
+ v4f wpos = { 0.0f, 2.0f, 0.0f, 1.0f };
+ m4x3_mulv( netplayers.final_mtx[0], wpos, wpos );
+ m4x4_mulv( pv, wpos, wpos );
+
+ if( wpos[3] > 0.0f ){
+ v2_muls( wpos, (1.0f/wpos[3]) * 0.5f, wpos );
+ v2_add( wpos, (v2f){ 0.5f, 0.5f }, wpos );
+
+ ui_rect wr;
+ wr[0] = vg_clampf(wpos[0] * vg.window_x, -32000.0f,32000.0f);
+ wr[1] = vg_clampf((1.0f-wpos[1]) * vg.window_y,
+ -32000.0f,32000.0f);
+ wr[2] = 300;
+ wr[3] = 17;
+ ui_fill( wr, (ui_colour(k_ui_bg)&0x00ffffff)|0x50000000 );
+ ui_text( wr, buf, 1, k_ui_align_middle_center, 0 );
+ }
}
- snprintf( buf, 512, "#%u: %s [%s]", i, player->username, sysname );
- ui_info( panel, buf );
}
}
+ else {
+ ui_info( panel, "offline" );
+ }
}