X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_load.c;h=d7f4afb8a3b3fd3088f129760fa22df40cacbbd9;hb=15c0b8cb57ed5d10814103eaa0b5c06e8ae117e4;hp=50a882c2fab5dc1f8907a87c051d189eb55fed62;hpb=d171c9ad5de05c9ac8563fcf9f23760b93fb50f8;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_load.c b/world_load.c index 50a882c..d7f4afb 100644 --- a/world_load.c +++ b/world_load.c @@ -137,12 +137,18 @@ struct world_load_complete_data{ static void skaterift_world_load_done( void *payload, u32 size ){ struct world_load_complete_data *data = payload; + world_instance *world = &world_static.instances[ data->purpose ]; - /* TODO(W2): Load player position from this save file */ vg_msg sav; vg_msg_init( &sav, data->save.buf, data->save.len ); - world_instance *world = &world_static.instances[ data->purpose ]; + if( data->purpose != k_world_purpose_hub ){ + vg_msg player_frame = sav; + if( vg_msg_seekframe( &player_frame, "player" ) ){ + vg_msg_getkvv3f( &player_frame, "position", world->player_co, NULL ); + } + } + world_entity_start( world, &sav ); world->status = k_world_status_loaded; world_static.load_state = k_world_loader_none; @@ -157,7 +163,6 @@ struct world_load_args { * Does a complete world switch using the remaining free slots */ static void skaterift_world_load_thread( void *_args ){ - /* FIXME: we need to check all threads that take args. args can dissapear! */ struct world_load_args args = *((struct world_load_args *)_args); addon_reg *reg = args.reg; @@ -172,7 +177,7 @@ static void skaterift_world_load_thread( void *_args ){ vg_strnull( &path, path_buf, 4096 ); assert( reg ); - addon_get_content_folder( reg, &path ); + addon_get_content_folder( reg, &path, 1 ); vg_str folder = path; if( !vg_strgood( &folder ) ) { @@ -295,19 +300,19 @@ static void skaterift_change_world_start( addon_reg *reg ){ vg_linear_clear( vg_mem.scratch ); /* ?? */ vg_info( "unloading old worlds\n" ); - - for( u32 i=1; istatus == k_world_status_loaded ){ - inst->status = k_world_status_unloading; - world_fadeout_audio( inst ); - } + world_instance *client_world = + &world_static.instances[ k_world_purpose_client ]; + + if( client_world->status == k_world_status_loaded ){ + client_world->status = k_world_status_unloading; + world_fadeout_audio( client_world ); } world_static.instance_addons[ k_world_purpose_client ] = reg; network_send_item( k_netmsg_playeritem_world1 ); relink_all_remote_player_worlds(); + world_unlink_nonlocal( &world_static.instances[k_world_purpose_hub] ); } } @@ -321,7 +326,7 @@ static int skaterift_load_world_command( int argc, const char *argv[] ){ u32 reg_id = addon_match( &q ); if( reg_id != 0xffffffff ){ - addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id ); + addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id, 0 ); skaterift_change_world_start( reg ); } else { @@ -331,12 +336,16 @@ static int skaterift_load_world_command( int argc, const char *argv[] ){ else { vg_info( "worlds availible to load:\n" ); - for( int i=0; ialias, buf ); - vg_info( " %s\n", buf ); + + if( w->flags & ADDON_REG_HIDDEN ) + vg_info( " %s [hidden]\n", buf ); + else + vg_info( " %s\n", buf ); } }