X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_remote.c;h=3d674bcda2257d37a645b802818b39ee3006000b;hb=730f202673d6ceb2a5199cf244d5c0bddc064fcf;hp=b51c857e61ba16122f08af53dd23d71ef1af6d88;hpb=825c3bce18272c0f81659e0eac469709d0462836;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_remote.c b/player_remote.c index b51c857..3d674bc 100644 --- a/player_remote.c +++ b/player_remote.c @@ -2,6 +2,7 @@ #include "skeleton.h" #include "player_render.h" #include "network_common.h" +#include "addon.h" static void player_remote_unwatch( struct network_player *player ){ addon_cache_unwatch( k_addon_type_player, player->playermodel_view_slot ); @@ -126,6 +127,31 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){ player->subsystem = frame->subsystem; player->down_bytes += msg->m_cbSize; } + else if( tmp->inetmsg_id == k_inetmsg_playeritem ){ + netmsg_playeritem *item = msg->m_pData; + if( !packet_minsize( msg, sizeof(*item)+1 )) return; + + vg_info( "Client #%u equiped: [%u] %s\n", + item->client, item->type, item->uid ); + + struct network_player *player = &netplayers.list[ item->client ]; + + char uid[ ADDON_UID_MAX ]; + network_msgstring( item->uid, msg->m_cbSize, sizeof(*item), + uid, ADDON_UID_MAX ); + + if( item->type == k_addon_type_board ){ + addon_cache_unwatch( k_addon_type_board, player->board_view_slot ); + player->board_view_slot = + addon_cache_create_viewer_from_uid( k_addon_type_board, uid ); + } + else if( item->type == k_addon_type_player ){ + addon_cache_unwatch( k_addon_type_player, + player->playermodel_view_slot ); + player->playermodel_view_slot = + addon_cache_create_viewer_from_uid( k_addon_type_player, uid ); + } + } } /* @@ -366,14 +392,35 @@ static void animate_remote_players(void){ * Draw remote players */ static void render_remote_players( world_instance *world, camera *cam ){ + + SDL_AtomicLock( &addon_system.sl_cache_using_resources ); + for( u32 i=0; iactive ) continue; struct player_avatar *av = localplayer.playeravatar; + m4x3f *final_mtx = &netplayers.final_mtx[ av->sk.bone_count*i ]; + + struct player_model *model = + addon_cache_item_if_loaded( k_addon_type_player, + player->playermodel_view_slot ); + + if( !model ) model = &localplayer.fallback_model; + render_playermodel( cam, world, 0, model, &av->sk, final_mtx ); + + struct player_board *board = + addon_cache_item_if_loaded( k_addon_type_board, + player->board_view_slot ); - struct player_model *model = &localplayer.fallback_model; - render_playermodel( cam, world, 0, model, &av->sk, - &netplayers.final_mtx[ av->sk.bone_count*i ] ); + /* TODO: Board pose */ +#if 0 + render_board( cam, world, board, + final_mtx[localplayer.playeravatar->id_board], + &localplayer.pose.board, + k_board_shader_player ); +#endif } + + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); }