From: hgn Date: Thu, 6 Mar 2025 16:38:01 +0000 (+0000) Subject: spawn filtering X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=0e7235e427d15a31833ee0a7c612f2f45920d467;p=carveJwlIkooP6JGAAIwe30JlM.git spawn filtering --- diff --git a/content_skaterift/maps/dev_hub/main.mdl b/content_skaterift/maps/dev_hub/main.mdl index 7bf820a..8119612 100644 Binary files a/content_skaterift/maps/dev_hub/main.mdl and b/content_skaterift/maps/dev_hub/main.mdl differ diff --git a/skaterift_blender/sr_main.py b/skaterift_blender/sr_main.py index cabbc96..3370d20 100644 --- a/skaterift_blender/sr_main.py +++ b/skaterift_blender/sr_main.py @@ -179,7 +179,8 @@ class mdl_texture(Structure): class ent_spawn(Structure): #{ _fields_ = [("transform",mdl_transform), - ("pstr_name",c_uint32)] + ("pstr_name",c_uint32), + ("flags",c_uint32)] #} class ent_light(Structure): @@ -1162,6 +1163,7 @@ def sr_on_type_change( _, context ): class SR_OBJECT_ENT_SPAWN(bpy.types.PropertyGroup): #{ alias: bpy.props.StringProperty( name='alias' ) + flags: bpy.props.IntProperty() #} class SR_OBJECT_ENT_GATE(bpy.types.PropertyGroup): diff --git a/skaterift_blender/sr_mdl.py b/skaterift_blender/sr_mdl.py index 3dc6dee..c352c86 100644 --- a/skaterift_blender/sr_mdl.py +++ b/skaterift_blender/sr_mdl.py @@ -679,6 +679,7 @@ def _mdl_compiler_compile_entities(): compile_obj_transform( obj, spawn.transform ) obj_data = obj.SR_data.ent_spawn[0] spawn.pstr_name = _af_pack_string( obj_data.alias ) + spawn.flags = obj_data.flags sr_ent_push( spawn ) #} elif ent_type == 'ent_water':#{ diff --git a/src/entity.h b/src/entity.h index e340efe..dc1a81c 100644 --- a/src/entity.h +++ b/src/entity.h @@ -135,9 +135,19 @@ enum entity_function k_ent_function_trigger_leave }; +enum ent_spawn_flag +{ + k_ent_spawn_flag_locked = 0x1, + k_ent_spawn_flag_group_1 = 0x10, + k_ent_spawn_flag_group_2 = 0x20, + k_ent_spawn_flag_group_3 = 0x40, + k_ent_spawn_flag_group_4 = 0x80 +}; + struct ent_spawn{ mdl_transform transform; u32 pstr_name; + u32 flags; }; enum light_type{ diff --git a/src/skaterift_script.c b/src/skaterift_script.c index 9ba1abe..efa1b40 100644 --- a/src/skaterift_script.c +++ b/src/skaterift_script.c @@ -1793,6 +1793,25 @@ static bool _skaterift_script_hub_setup( enum escript_event ev, const char *inf if( unlock_valley ) prop->flags |= k_prop_flag_hidden; } + + u32 spawns_allowed = 0; + if( unlock_mtzero ) spawns_allowed |= k_ent_spawn_flag_group_1; + if( unlock_city ) spawns_allowed |= k_ent_spawn_flag_group_2; + if( unlock_valley ) spawns_allowed |= k_ent_spawn_flag_group_3; + + for( u32 i=0; ient_spawn); i++ ) + { + ent_spawn *spawn = af_arritm( &world->ent_spawn, i ); + + bool allow = 0; + + if( spawn->flags == 0 ) allow = 1; + if( spawn->flags & spawns_allowed ) allow = 1; + + if( allow ) spawn->flags &= ~(u32)k_ent_spawn_flag_locked; + else spawn->flags |= k_ent_spawn_flag_locked; + } + return 1; } diff --git a/src/world_entity.c b/src/world_entity.c index 0136023..5a59acf 100644 --- a/src/world_entity.c +++ b/src/world_entity.c @@ -340,8 +340,13 @@ ent_spawn *world_find_closest_spawn( world_instance *world, v3f position ) ent_spawn *rp = NULL, *r; float min_dist = INFINITY; - for( u32 i=0; ient_spawn); i++ ){ + for( u32 i=0; ient_spawn); i++ ) + { r = af_arritm( &world->ent_spawn, i ); + + if( r->flags & k_ent_spawn_flag_locked ) + continue; + float d = v3_dist2( r->transform.co, position ); if( d < min_dist ){ diff --git a/src/world_map.c b/src/world_map.c index 0a618ac..76bbe5b 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -162,6 +162,9 @@ void render_world_map(void) { ent_spawn *spawn = af_arritm(&world->ent_spawn,i); + if( spawn->flags & k_ent_spawn_flag_locked ) + continue; + if( world_map.sel_spawn ) { spawn->transform.s[0] = ( spawn == world_map.sel_spawn )? 0.0f: 10000.0f; @@ -246,6 +249,9 @@ void render_world_map(void) { ent_spawn *spawn = af_arritm( &world->ent_spawn, i ); + if( spawn->flags & k_ent_spawn_flag_locked ) + continue; + if( spawn->transform.s[0] > 0.3f ) continue;