#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;
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 );
}
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;
}
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 ];
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 = sys->animator_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;