X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_remote.c;h=cfad5e9018d236280207831ffc020eeeaa03095f;hb=5388f705086600105358d9880e8895673ac0e247;hp=62eed5a3c62b9cd115c9486a6a5d88ad913e9f08;hpb=074fa69f479724f9800849430bad5caf730b01ef;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_remote.c b/player_remote.c index 62eed5a..cfad5e9 100644 --- a/player_remote.c +++ b/player_remote.c @@ -4,13 +4,10 @@ #include "network_common.h" #include "addon.h" -static void player_remote_unwatch( struct network_player *player ){ +static void player_remote_clear( 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; @@ -91,7 +88,7 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){ if( playerleave->index < vg_list_size(netplayers.list) ){ struct network_player *player = &netplayers.list[ playerleave->index ]; - player_remote_unwatch( player ); + player_remote_clear( player ); player->active = 0; vg_info( "player leave (%d)\n", playerleave->index ); } @@ -160,7 +157,25 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){ dest->boundary_hash = frame->boundary_hash; struct network_player *player = &netplayers.list[ frame->client ]; - memcpy( &dest->data, frame->animdata, datasize ); + + 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 ); + } + player->subsystem = frame->subsystem; player->down_bytes += msg->m_cbSize; } @@ -179,6 +194,14 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){ return; } + vg_info( "Client #%d equiped: [%s] %s\n", + item->client, + (const char *[]){[k_netmsg_playeritem_board]="board", + [k_netmsg_playeritem_player]="player", + [k_netmsg_playeritem_world0]="world0", + [k_netmsg_playeritem_world1]="world1" + }[item->type_index], item->uid ); + struct network_player *player = &netplayers.list[ item->client ]; char *uid = player->items[ item->type_index ]; @@ -222,7 +245,20 @@ static void remote_player_send_playerframe(void){ frame->boundary_hash = localplayer.boundary_hash; frame->instance_id = world_static.active_instance; - memcpy( frame->animdata, sys->animator_data, sys->animator_size ); + if( sys->network_animator_exchange ){ + bitpack_ctx ctx = { + .mode = k_bitpack_compress, + .buffer = frame->animdata, + .buffer_len = size, + .bytes = 0, + }; + + sys->network_animator_exchange( &ctx, sys->animator_data ); + size = ctx.bytes; + } + else{ + memcpy( frame->animdata, sys->animator_data, sys->animator_size ); + } netplayers.up_bytes += size;