#include "addon.h"
#include "save.h"
#include "vg/vg_msg.h"
+#include "network.h"
+#include "player_remote.h"
/*
* load the .mdl file located in path as a world instance
*/
-VG_STATIC void world_instance_load_mdl( u32 instance_id, const char *path ){
+static void world_instance_load_mdl( u32 instance_id, const char *path ){
vg_rand_seed( 9001 );
world_instance *world = &world_static.instances[ instance_id ];
world_gen_compute_light_indices( world );
mdl_close( meta );
+ /* allocate leaderboard buffers */
+ u32 bs = mdl_arrcount(&world->ent_route)*sizeof(struct leaderboard_cache);
+ world->leaderboard_cache = vg_linear_alloc( heap, bs );
+
+ for( u32 i=0; i<mdl_arrcount( &world->ent_route ); i ++ ){
+ struct leaderboard_cache *board = &world->leaderboard_cache[i];
+ board->data = vg_linear_alloc( heap, NETWORK_LEADERBOARD_MAX_SIZE );
+ board->status = k_request_status_client_error;
+ board->cache_time = 0.0;
+ board->data_len = 0;
+ }
+
vg_async_call( async_world_postprocess, world, 0 );
vg_async_stall();
}
static void skaterift_world_load_done( void *payload, u32 size ){
struct world_load_complete_data *data = payload;
- vg_msg sav = {0};
- sav.buf = data->save.buf;
- sav.len = data->save.len;
- sav.max = data->save.len;
+ vg_msg sav;
+ vg_msg_init( &sav, data->save.buf, data->save.len );
for( u32 i=0; i<data->instance_count; i++ ){
world_instance *world = &world_static.instances[ data->instance_start+i ];
*/
static void skaterift_world_load_thread( void *_args ){
struct world_load_args *args = _args;
- enum world_purpose purpose = args->purpose;
- addon_reg *reg = args->reg;
- if( purpose == k_world_purpose_hub ) world_static.addon_hub = reg;
- else world_static.addon_client = reg;
+ addon_reg *reg = args->reg;
+ world_static.instance_addons[ args->purpose ] = reg;
char path_buf[4096];
vg_str path;
return;
}
- char worlds[3][4096];
+ char worlds[k_world_max-1][4096];
u32 i=0;
vg_dir dir;
if( !ext ) continue;
if( strcmp(ext,".mdl") ) continue;
- if( i == 3 ){
+ if( i == k_world_max-1 ){
vg_warn( "There are too many .mdl files in the map folder!(3)\n" );
break;
}
}
u32 instance_start = 0, instance_count = 1;
- if( purpose == k_world_purpose_client ) instance_start = 1;
+ if( args->purpose == k_world_purpose_client ) instance_start = 1;
world_instance_load_mdl( instance_start, worlds[first_index] );
data->instance_start = instance_start;
data->instance_count = instance_count;
- skaterift_world_get_save_path( purpose, data->save.path );
+ skaterift_world_get_save_path( args->purpose, data->save.path );
savedata_file_read( &data->save );
vg_async_dispatch( final_call, skaterift_world_load_done );
/* holding pattern before we can start loading the new world, since we might be
* waiting for audio to stop */
static void skaterift_change_client_world_preupdate(void){
- for( u32 i=1; i<vg_list_size(world_static.instances); i++ ){
+ for( u32 i=1; i<k_world_max; i++ ){
world_instance *inst = &world_static.instances[i];
if( inst->status == k_world_status_unloading ){
struct world_load_args *args =
vg_linear_alloc( vg_async.buffer, sizeof(struct world_load_args) );
args->purpose = k_world_purpose_client;
- args->reg = world_static.addon_client;
+ args->reg = world_static.instance_addons[ k_world_purpose_client ];
/* this is replaces the already correct reg but we have to set it again
* TOO BAD */
if( world_static.active_instance != 0 )
vg_error( "Cannot change worlds while in non-root world\n" );
else{
- if( world_static.addon_client == reg ){
+ if( world_static.instance_addons[ k_world_purpose_client ] == reg ){
vg_warn( "World is already loaded\n" );
return;
}
}
}
- world_static.addon_client = reg;
+ world_static.instance_addons[ k_world_purpose_client ] = reg;
+ network_send_item( k_netmsg_playeritem_world1 );
+ relink_all_remote_player_worlds();
}
}
/*
* Free all resources for world instance
*/
-static void world_free( world_instance *world )
-{
+static void world_free( world_instance *world ){
vg_info( "Free world @%p\n", world );
/* free meshes */
* reset the world structure without deallocating persistent buffers
* TODO: Make this a memset(0), and have persistent items live in a static loc
*/
-VG_STATIC void world_init_blank( world_instance *world )
-{
+static void world_init_blank( world_instance *world ){
memset( &world->meta, 0, sizeof(mdl_context) );
world->textures = NULL;