}
dest->active = 1;
- dest->timestamp = frame->timestamp;
dest->subsystem = frame->subsystem;
dest->instance_id = frame->instance_id;
+
+ bitpack_ctx ctx = {
+ .mode = k_bitpack_decompress,
+ .buffer = frame->animdata,
+ .buffer_len = datasize,
+ .bytes = 0,
+ };
+
+
+ /* sfx
+ * -------------------------------------------------------------*/
+
+ for( u32 i=0; i<frame->sound_effects; i ++ ){
+ /* CHEATING for now */
+ struct net_sfx sfx;
+ net_sfx_exchange( &ctx, &sfx );
+ net_sfx_play( &sfx );
+ }
+
+ /* animation
+ * -------------------------------------------------------------*/
+
+ dest->timestamp = frame->timestamp;
dest->boundary_hash = frame->boundary_hash;
struct network_player *player = &netplayers.list[ frame->client ];
-
struct player_subsystem_interface *sys =
player_subsystems[ frame->subsystem ];
if( sys->network_animator_exchange ){
- bitpack_ctx ctx = {
- .mode = k_bitpack_decompress,
- .buffer = frame->animdata,
- .buffer_len = datasize,
- .bytes = 0,
- };
-
memset( &dest->data, 0, sys->animator_size );
sys->network_animator_exchange( &ctx, &dest->data );
}
else {
- memcpy( &dest->data, frame->animdata, datasize );
+ bitpack_bytes( &ctx, sys->animator_size, sys->animator_data );
}
player->subsystem = frame->subsystem;
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);
+ u32 max_buf_size = sys->animator_size + sizeof(localplayer.sfx_buffer),
+ base_size = sizeof(struct netmsg_playerframe),
+ max_packet = base_size + max_buf_size;
+
+ netmsg_playerframe *frame = alloca( max_packet );
frame->inetmsg_id = k_inetmsg_playerframe;
frame->client = 0xff;
frame->subsystem = localplayer.subsystem;
- frame->timestamp = vg.time_real;
- frame->boundary_hash = localplayer.boundary_hash;
frame->instance_id = world_static.active_instance;
- if( sys->network_animator_exchange ){
- bitpack_ctx ctx = {
- .mode = k_bitpack_compress,
- .buffer = frame->animdata,
- .buffer_len = sys->animator_size,
- .bytes = 0,
- };
-
+ bitpack_ctx ctx = {
+ .mode = k_bitpack_compress,
+ .buffer = frame->animdata,
+ .buffer_len = max_buf_size,
+ .bytes = 0
+ };
+
+ /* sfx
+ * ---------------------------------------------*/
+
+ frame->sound_effects = localplayer.sfx_buffer_count;
+ for( u32 i=0; i<localplayer.sfx_buffer_count; i ++ )
+ net_sfx_exchange( &ctx, &localplayer.sfx_buffer[i] );
+
+ /* animation
+ * -----------------------------------------------*/
+
+ frame->timestamp = vg.time_real;
+ frame->boundary_hash = localplayer.boundary_hash;
+ if( sys->network_animator_exchange )
sys->network_animator_exchange( &ctx, sys->animator_data );
- size = ctx.bytes;
- }
- else{
- memcpy( frame->animdata, sys->animator_data, sys->animator_size );
- }
+ else
+ bitpack_bytes( &ctx, sys->animator_size, sys->animator_data );
- netplayers.up_bytes += size;
+ u32 wire_size = base_size + ctx.bytes;
+ netplayers.up_bytes += wire_size;
SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
hSteamNetworkingSockets, network_client.remote,
- frame, size,
+ frame, wire_size,
k_nSteamNetworkingSend_Unreliable, NULL );
}
}
if( network_client.state == k_ESteamNetworkingConnectionState_Connected ){
ui_info( panel, "#-1: localplayer" );
- snprintf( buf, 512, "U%.1f/D%.1fkbs",
+ snprintf( buf, 512, "U%.3f/D%.3fkbs",
netplayers.up_kbs, netplayers.down_kbs );
ui_info( panel, buf );