X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_remote.c;h=da0ee296e7e431d20a33dc578ed63c5895f6e5ac;hb=333430b27b5f9f73cbe9ad7921a4735aaff444f1;hp=d9ee7b8243a8f95e190add9c2075dc802ec160d9;hpb=46f4e9ee87dc67402166e4c6b05efbe922cd7574;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_remote.c b/player_remote.c index d9ee7b8..da0ee29 100644 --- a/player_remote.c +++ b/player_remote.c @@ -12,11 +12,12 @@ static void player_remote_clear( struct network_player *player ){ player->subsystem = k_player_subsystem_invalid; } -static void player_remote_packet( SteamNetworkingMessage_t *msg ){ +static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){ netmsg_blank *tmp = msg->m_pData; if( tmp->inetmsg_id == k_inetmsg_playerjoin ){ netmsg_playerjoin *playerjoin = msg->m_pData; + if( !packet_minsize( msg, sizeof(*playerjoin) )) return; if( playerjoin->index < vg_list_size(netplayers.list) ){ struct network_player *player = &netplayers.list[ playerjoin->index ]; @@ -26,6 +27,11 @@ static void player_remote_packet( SteamNetworkingMessage_t *msg ){ /* TODO: interpret the uids */ player->board_view_slot = 0; player->playermodel_view_slot = 0; + + vg_strncpy( playerjoin->username, player->username, + sizeof(player->username), k_strncpy_always_add_null ); + + vg_info( "#%u joined with name: %s\n", player->username ); } else { vg_error( "inetmsg_playerjoin: player index out of range\n" ); @@ -33,16 +39,100 @@ static void player_remote_packet( SteamNetworkingMessage_t *msg ){ } else if( tmp->inetmsg_id == k_inetmsg_playerleave ){ netmsg_playerleave *playerleave = msg->m_pData; + if( !packet_minsize( msg, sizeof(*playerleave) )) return; if( playerleave->index < vg_list_size(netplayers.list) ){ struct network_player *player = &netplayers.list[ playerleave->index ]; player_remote_unwatch( player ); player->active = 0; + vg_info( "player leave (%d)\n", playerleave->index ); + } + else { + vg_error( "inetmsg_playerleave: player index out of range\n" ); + } + } + else if( tmp->inetmsg_id == k_inetmsg_playerusername ){ + netmsg_playerusername *update = msg->m_pData; + if( !packet_minsize( msg, sizeof(*update) )) return; + + if( update->index < vg_list_size(netplayers.list) ){ + struct network_player *player = &netplayers.list[ update->index ]; + vg_strncpy( update->username, player->username, + sizeof(player->username), k_strncpy_always_add_null ); + + vg_info( "#%u changed username: %s\n", player->username ); } else { 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; iactive ){ + 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){ @@ -58,7 +148,12 @@ static void remote_player_network_imgui(void){ 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" }, @@ -78,17 +173,28 @@ static void remote_player_network_imgui(void){ ui_info( panel, buf ); ui_info( panel, "---------------------" ); - for( u32 i=0; iactive ){ - const char *sysname = "invalid"; + 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; iactive ){ + const char *sysname = "invalid"; - if( (player->subsystem >= 0) && - (player->subsystem < k_player_subsystem_max) ){ - sysname = player_subsystems[ player->subsystem ]->name; + 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 ); } - snprintf( buf, 512, "#%u: %s [%s]", i, player->username, sysname ); - ui_info( panel, buf ); } } + else { + ui_info( panel, "offline" ); + } }