From: hgn Date: Wed, 22 Nov 2023 07:13:57 +0000 (+0000) Subject: workshop selecter X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=d3021395f97b2ae244835c6656008386c8874343;p=carveJwlIkooP6JGAAIwe30JlM.git workshop selecter --- diff --git a/addon.c b/addon.c index 4d1e903..0b342ce 100644 --- a/addon.c +++ b/addon.c @@ -7,16 +7,40 @@ #include "steam.h" #include "workshop.h" -static u32 addon_count( enum addon_type type ){ - return addon_system.registry_type_counts[ type ]; +static u32 addon_count( enum addon_type type, u32 ignoreflags ){ + if( ignoreflags ){ + u32 typecount = 0, count = 0; + for( u32 i=0; typecountalias.type == type ){ + typecount ++; + + if( reg->flags & ignoreflags ) + continue; + + count ++; + } + } + + return count; + } + else + return addon_system.registry_type_counts[ type ]; } + /* these kind of suck, oh well. */ -static addon_reg *get_addon_from_index(enum addon_type type, u32 index){ - u32 count = 0; - for( u32 i=0; countalias.type == type ){ + typecount ++; + + if( reg->flags & ignoreflags ) + continue; + if( index == count ) return reg; @@ -230,6 +254,7 @@ static addon_reg *addon_alloc_reg( PublishedFileId_t workshop_id, } addon_reg *reg = &addon_system.registry[ addon_system.registry_count ]; + reg->flags = 0; reg->metadata_len = 0; reg->cache_id = 0; reg->state = k_addon_state_indexed; @@ -535,8 +560,8 @@ static int addon_get_content_folder( addon_reg *reg, vg_str *folder ){ static u16 addon_cache_fetch( enum addon_type type, u32 reg_index ){ addon_reg *reg = NULL; - if( reg_index < addon_count( type ) ){ - reg = get_addon_from_index( type, reg_index ); + if( reg_index < addon_count( type, 0 ) ){ + reg = get_addon_from_index( type, reg_index, 0 ); if( reg->cache_id ) return reg->cache_id; } @@ -554,8 +579,8 @@ static u16 addon_cache_alloc( enum addon_type type, u32 reg_index ){ struct addon_cache_entry *new_entry = vg_pool_item( &cache->pool, new_id ); addon_reg *reg = NULL; - if( reg_index < addon_count( type ) ) - reg = get_addon_from_index( type, reg_index ); + if( reg_index < addon_count( type, 0 ) ) + reg = get_addon_from_index( type, reg_index, 0 ); if( new_entry ){ if( new_entry->reg_ptr ) @@ -683,7 +708,7 @@ static void addon_cache_load_loop(void){ vg_info( "process cache load request (%u#%u, reg:%u)\n", type, id, entry->reg_index ); - if( entry->reg_index >= addon_count(type) ){ + if( entry->reg_index >= addon_count(type,0) ){ /* should maybe have a different value for this case */ entry->state = k_addon_cache_state_none; SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); @@ -693,7 +718,7 @@ static void addon_cache_load_loop(void){ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); /* continue with the request */ - addon_reg *reg = get_addon_from_index( type, entry->reg_index ); + addon_reg *reg = get_addon_from_index( type, entry->reg_index, 0 ); entry->reg_ptr = reg; vg_str folder; diff --git a/addon.h b/addon.h index 8d2409a..cae83f6 100644 --- a/addon.h +++ b/addon.h @@ -19,12 +19,15 @@ struct addon_alias { char foldername[ ADDON_FOLDERNAME_MAX ]; }; +#define ADDON_REG_HIDDEN 0x1 + struct { struct addon_reg{ addon_alias alias; u32 foldername_hash; u8 metadata[512]; /* vg_msg buffer */ u32 metadata_len; + u32 flags; u16 cache_id; @@ -67,8 +70,9 @@ struct { static addon_system; static void addon_system_init( void ); -static u32 addon_count( enum addon_type type ); -static addon_reg *get_addon_from_index( enum addon_type type, u32 index ); +static u32 addon_count( enum addon_type type, u32 ignoreflags ); +static addon_reg *get_addon_from_index( enum addon_type type, u32 index, + u32 ignoreflags ); static u32 get_index_from_addon( enum addon_type type, addon_reg *a ); static int addon_get_content_folder( addon_reg *reg, vg_str *folder ); diff --git a/ent_skateshop.c b/ent_skateshop.c index 427347d..962edf4 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -113,9 +113,10 @@ static void skateshop_init(void){ } static u16 skateshop_selected_cache_id(void){ - if( addon_count(k_addon_type_board) ){ - addon_reg *reg = get_addon_from_index(k_addon_type_board, - global_skateshop.selected_board_id); + if( addon_count(k_addon_type_board, ADDON_REG_HIDDEN) ){ + addon_reg *reg = get_addon_from_index( + k_addon_type_board, global_skateshop.selected_board_id, + ADDON_REG_HIDDEN ); return reg->cache_id; } else return 0; @@ -176,10 +177,9 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ } } + u32 valid_count = addon_count( k_addon_type_board, 0 ); if( button_down( k_srbind_mright ) ){ - if( global_skateshop.selected_board_id+1 < - addon_count(k_addon_type_board) ) - { + if( global_skateshop.selected_board_id+1 < valid_count ){ global_skateshop.selected_board_id ++; } } @@ -188,7 +188,6 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ if( opage != npage ){ skateshop_update_viewpage(); - //skateshop_op_processview(); } else if( cache_id && button_down( k_srbind_maccept )){ vg_info( "chose board from skateshop (%u)\n", @@ -209,22 +208,21 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ if( !vg_loader_availible() ) return; int changed = 0; + u32 valid_count = addon_count( k_addon_type_player, ADDON_REG_HIDDEN ); if( button_down( k_srbind_mleft ) ){ if( global_skateshop.selected_player_id > 0 ){ global_skateshop.selected_player_id --; } else{ - global_skateshop.selected_player_id = - addon_count(k_addon_type_player) -1; + global_skateshop.selected_player_id = valid_count-1; } changed = 1; } if( button_down( k_srbind_mright ) ){ - if( global_skateshop.selected_player_id+1 < - addon_count(k_addon_type_player) ){ + if( global_skateshop.selected_player_id+1 < valid_count ){ global_skateshop.selected_player_id ++; } else{ @@ -235,8 +233,14 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ } if( changed ){ - player__use_model( global_skateshop.selected_player_id ); - //skateshop_op_processview(); + addon_reg *addon = get_addon_from_index( + k_addon_type_player, global_skateshop.selected_player_id, + ADDON_REG_HIDDEN ); + + u32 real_id = get_index_from_addon( + k_addon_type_player, addon ); + + player__use_model( real_id ); } if( button_down( k_srbind_maccept ) ){ @@ -249,10 +253,12 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ int browseable = 0, loadable = 0; - if( addon_count(k_addon_type_world) && vg_loader_availible() ) + u32 valid_count = addon_count( k_addon_type_world, ADDON_REG_HIDDEN ); + + if( valid_count && vg_loader_availible() ) browseable = 1; - if( vg_loader_availible() && global_skateshop.selected_world_id > 0 ) + if( vg_loader_availible() ) loadable = 1; global_skateshop.helper_browse->greyed = !browseable; @@ -269,54 +275,21 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ } if( button_down( k_srbind_mright ) ){ - if( global_skateshop.selected_world_id+1 < - addon_count(k_addon_type_world) ) - { + if( global_skateshop.selected_world_id+1 < valid_count ){ global_skateshop.selected_world_id ++; change = 1; } } } - -#if 0 - if( change && pointcloud_idle() ){ - pointcloud_animate( k_pointcloud_anim_hiding ); - } - if( vg_loader_availible() ){ - addon_reg *reg = get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id ); - - /* automatically load in clouds */ - if( loadable && button_down( k_srbind_maccept ) ){ - vg_info( "Select rift (%u)\n", - global_skateshop.selected_world_id ); - skaterift_change_world_start( reg ); - return; - } - else{ - if( pointcloud.anim == k_pointcloud_anim_idle_closed ){ - if( global_skateshop.pointcloud_world_id != - global_skateshop.selected_world_id ) - { - global_skateshop.pointcloud_world_id = - global_skateshop.selected_world_id; - skateshop_load_world_preview( reg ); - } - else{ - pointcloud_animate( k_pointcloud_anim_opening ); - } - } - else if( pointcloud.anim == k_pointcloud_anim_idle_open ){ - if( global_skateshop.pointcloud_world_id != - global_skateshop.selected_world_id ) - { - pointcloud_animate( k_pointcloud_anim_hiding ); - } - } + if( loadable ){ + if( button_down( k_srbind_maccept ) ){ + skaterift_change_world_start( + get_addon_from_index( k_addon_type_world, + global_skateshop.selected_world_id, + ADDON_REG_HIDDEN )); } } -#endif } else{ vg_fatal_error( "Unknown store (%u)\n", shop->type ); @@ -417,14 +390,14 @@ fade_out:; mlocal[3][2] = -0.7f; m4x3_mul( mrack, mlocal, mmdl ); - if( addon_count(k_addon_type_board) ){ + u32 valid_count = addon_count(k_addon_type_board,0); + if( valid_count ){ char buf[16]; - int i=0; - i+=highscore_intl( buf+i, global_skateshop.selected_board_id+1, 3 ); - buf[i++] = '/'; - i+=highscore_intl( buf+i, addon_count(k_addon_type_board), 3 ); - buf[i++] = '\0'; - + vg_str str; + vg_strnull( &str, buf, sizeof(buf) ); + vg_strcati32( &str, global_skateshop.selected_board_id+1 ); + vg_strcatch( &str, '/' ); + vg_strcati32( &str, valid_count ); font3d_simple_draw( 0, buf, &skaterift.cam, mmdl ); } else{ @@ -501,12 +474,13 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){ mdl_entity_id_id(shop->boards.id_info)); if( global_skateshop.render.world_reg != global_skateshop.selected_world_id){ - global_skateshop.render.world_title = ""; + global_skateshop.render.world_title = "missing: workshop.title"; addon_reg *reg = get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id ); + global_skateshop.selected_world_id, ADDON_REG_HIDDEN ); vg_msg msg; vg_msg_init( &msg, reg->metadata, reg->metadata_len ); + global_skateshop.render.world_loc = vg_msg_getkvstr( &msg, "location" ); global_skateshop.render.world_reg = global_skateshop.selected_world_id; @@ -514,6 +488,9 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){ global_skateshop.render.world_title = vg_msg_getkvstr( &msg, "title"); vg_msg_skip_frame( &msg ); } + else { + vg_warn( "No workshop body\n" ); + } } /* Text */ @@ -522,25 +499,20 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){ vg_strnull( &info, buftext, 128 ); vg_strnull( &subtext, bufsubtext, 128 ); - if( addon_count(k_addon_type_world) ){ - addon_reg *reg = get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id ); - - info.i+=highscore_intl( info.buffer+info.i, - global_skateshop.selected_world_id+1, 3 ); - info.buffer[info.i++] = '/'; - info.i+=highscore_intl( info.buffer+info.i, - addon_count(k_addon_type_world), 3 ); - info.buffer[info.i++] = ' '; - info.buffer[info.i] = '\0'; - + u32 valid_count = addon_count(k_addon_type_world,ADDON_REG_HIDDEN); + if( valid_count ){ + vg_strcati32( &info, global_skateshop.selected_world_id+1 ); + vg_strcatch( &info, '/' ); + vg_strcati32( &info, valid_count ); + vg_strcatch( &info, ' ' ); vg_strcat( &info, global_skateshop.render.world_title ); + if( !vg_loader_availible() ){ vg_strcat( &subtext, "Loading..." ); } else{ addon_reg *reg = get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id ); + global_skateshop.selected_world_id, ADDON_REG_HIDDEN ); if( reg->alias.workshop_id ) vg_strcat( &subtext, "(Workshop) " ); @@ -549,10 +521,9 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){ } } else{ - vg_strcat( &info, "No worlds installed" ); + vg_strcat( &info, "No workshop worlds installed" ); } - m4x3f mtext,mlocal,mtextmdl; mdl_transform_m4x3( &mark_info->transform, mtext ); diff --git a/maps_src/dev_hub/main.mdl b/maps_src/dev_hub/main.mdl index e573635..6c42290 100644 Binary files a/maps_src/dev_hub/main.mdl and b/maps_src/dev_hub/main.mdl differ diff --git a/maps_src/mp_mtzero/main.mdl b/maps_src/mp_mtzero/main.mdl index 2f15986..fd22f64 100644 Binary files a/maps_src/mp_mtzero/main.mdl and b/maps_src/mp_mtzero/main.mdl differ diff --git a/maps_src/mp_spawn/main.mdl b/maps_src/mp_spawn/main.mdl index b5614cf..e195aa6 100644 Binary files a/maps_src/mp_spawn/main.mdl and b/maps_src/mp_spawn/main.mdl differ diff --git a/skaterift.c b/skaterift.c index 326e02c..c23d022 100644 --- a/skaterift.c +++ b/skaterift.c @@ -153,6 +153,12 @@ static void skaterift_restore_state(void){ kvsav.cur = orig; } +static addon_reg *skaterift_mount_world_unloadable( const char *path ){ + addon_reg *reg = addon_mount_local_addon( path, k_addon_type_world, ".mdl" ); + reg->flags |= ADDON_REG_HIDDEN; + return reg; +} + static void vg_load(void){ if( k_tools_mode ){ vg_async_call( async_call_ready, NULL, 0 ); @@ -204,37 +210,9 @@ static void vg_load(void){ */ /* hub world */ - addon_reg *hub = - addon_mount_local_addon( "maps/dev_hub", k_addon_type_world, ".mdl" ); - hub->metadata_len = 0; - - /* understate diy. */ - addon_reg *spawn = addon_mount_local_addon( "maps/mp_spawn", - k_addon_type_world, - ".mdl" ); - { - vg_msg msg; - vg_msg_init( &msg, spawn->metadata, sizeof(spawn->metadata) ); - vg_msg_frame( &msg, "workshop" ); - vg_msg_wkvstr( &msg, "title", "Understate DIY" ); - vg_msg_end_frame( &msg ); - vg_msg_wkvstr( &msg, "location", "USA" ); - spawn->metadata_len = msg.cur.co; - } - - /* mtzero island */ - addon_reg *mtzero = addon_mount_local_addon( "maps/mp_mtzero", - k_addon_type_world, - ".mdl" ); - { - vg_msg msg; - vg_msg_init( &msg, spawn->metadata, sizeof(mtzero->metadata) ); - vg_msg_frame( &msg, "workshop" ); - vg_msg_wkvstr( &msg, "title", "Mt.Zero Island" ); - vg_msg_end_frame( &msg ); - vg_msg_wkvstr( &msg, "location", "Australia" ); - mtzero->metadata_len = msg.cur.co; - } + addon_reg *hub = skaterift_mount_world_unloadable( "maps/dev_hub" ); + skaterift_mount_world_unloadable( "maps/mp_spawn" ); + skaterift_mount_world_unloadable( "maps/mp_mtzero" ); /* load home/permanent world manually */ world_static.load_state = k_world_loader_load; diff --git a/world_load.c b/world_load.c index 78bd332..1b256a2 100644 --- a/world_load.c +++ b/world_load.c @@ -326,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 { @@ -336,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 ); } } diff --git a/world_render.c b/world_render.c index 281a6e7..0584415 100644 --- a/world_render.c +++ b/world_render.c @@ -762,6 +762,8 @@ static void render_world_gates( world_instance *world, camera *cam ){ for( u32 i=0; ient_gate); i++ ){ ent_gate *gi = mdl_arritm( &world->ent_gate, i ); + if( !(gi->flags & k_ent_gate_linked) ) + continue; float dist = v3_dist2( gi->co[0], cam->transform[3] );