From bf13ef74cc454e1e820928484204ac67eb98a308 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 28 Mar 2024 21:20:55 +0000 Subject: [PATCH] option between water plane / water trigger --- entity.c | 12 ++++++++--- maps_src/mp_line1/main.mdl | Bin 3457248 -> 3457584 bytes player_glide.c | 6 +++++- player_skate.c | 14 ++---------- player_walk.c | 12 +---------- skaterift_blender/sr_main.py | 13 ++++++++++-- world_render.c | 9 -------- world_water.c | 40 +++++++++++++++++++++++++++++++---- world_water.h | 2 ++ 9 files changed, 66 insertions(+), 42 deletions(-) diff --git a/entity.c b/entity.c index ae506bd..ffb5dee 100644 --- a/entity.c +++ b/entity.c @@ -11,6 +11,9 @@ #include "ent_region.h" #include "ent_glider.h" #include "ent_npc.h" +#include "world_water.h" + +#include void entity_call( world_instance *world, ent_call *call ) { @@ -30,7 +33,8 @@ void entity_call( world_instance *world, ent_call *call ) [k_ent_miniworld] = ent_miniworld_call, [k_ent_region] = ent_region_call, [k_ent_glider] = ent_glider_call, - [k_ent_npc] = ent_npc_call + [k_ent_npc] = ent_npc_call, + [k_ent_water] = ent_water_call, }; if( type >= vg_list_size(table) ){ @@ -58,10 +62,12 @@ void entity_call( world_instance *world, ent_call *call ) ent_marker *ent_find_marker( mdl_context *mdl, mdl_array_ptr *arr, const char *alias ) { - for( u32 i=0; ipstr_alias ), alias ) ){ + if( !strcmp( mdl_pstr( mdl, marker->pstr_alias ), alias ) ) + { return marker; } } diff --git a/maps_src/mp_line1/main.mdl b/maps_src/mp_line1/main.mdl index bd56b3c43ebb8f81b18f572d4cedbb7b38b35df6..21dc6eed471718ae673e7b728ee5cf367d419a42 100644 GIT binary patch delta 2783 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 asSfL%j@GFcj-8orojf)*-x|q1%l3aX6B(EQ diff --git a/player_glide.c b/player_glide.c index 4a5958e..6b5930b 100644 --- a/player_glide.c +++ b/player_glide.c @@ -273,11 +273,15 @@ void player_glide_update(void) v2f steer; joystick_state( k_srjoystick_steer, steer ); - if( glider_physics( steer ) ){ + if( glider_physics( steer ) ) + { vg_info( "player fell off due to glider hitting ground\n" ); player__dead_transition( k_player_die_type_generic ); localplayer.glider_orphan = 1; } + + if( !world_water_player_safe( world_current_instance(), 1.0f ) ) + return; } void player_glide_post_update(void) diff --git a/player_skate.c b/player_skate.c index 2dedefd..eb12d64 100644 --- a/player_skate.c +++ b/player_skate.c @@ -2230,20 +2230,10 @@ void player__skate_update(void){ struct player_skate_state *state = &player_skate.state; world_instance *world = world_current_instance(); - if( state->activity == k_skate_activity_handplant ){ + if( state->activity == k_skate_activity_handplant ) return; - } - if( world->water.enabled ){ - if( localplayer.rb.co[1]+0.25f < world->water.height ){ - vg_info( "player fell off due to being in water\n" ); - player__networked_sfx( k_player_subsystem_walk, 32, - k_player_walk_soundeffect_splash, - localplayer.rb.co, 1.0f ); - player__dead_transition( k_player_die_type_generic ); - return; - } - } + if( !world_water_player_safe( world, 0.25f ) ) return; v3_copy( localplayer.rb.co, state->prev_pos ); state->activity_prev = state->activity; diff --git a/player_walk.c b/player_walk.c index b892634..843a50e 100644 --- a/player_walk.c +++ b/player_walk.c @@ -468,17 +468,7 @@ static void player_walk_update_generic(void){ v3_zero( localplayer.rb.w ); world_instance *world = world_current_instance(); - - if( world->water.enabled ){ - if( localplayer.rb.co[1]+0.4f < world->water.height ){ - player__networked_sfx( k_player_subsystem_walk, 32, - k_player_walk_soundeffect_splash, - localplayer.rb.co, 1.0f ); - vg_info( "player fell of due to walking into walker\n" ); - player__dead_transition( k_player_die_type_generic ); - return; - } - } + if( !world_water_player_safe( world, 0.4f ) ) return; enum walk_activity prev_state = w->state.activity; diff --git a/skaterift_blender/sr_main.py b/skaterift_blender/sr_main.py index 1f4910b..b715493 100644 --- a/skaterift_blender/sr_main.py +++ b/skaterift_blender/sr_main.py @@ -55,7 +55,7 @@ MDL_VERSION_NR = 106 SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_challenge', \ 'ent_relay', 'ent_skateshop', 'ent_objective', 'ent_route',\ 'ent_miniworld', 'ent_region', 'ent_glider', 'ent_list',\ - 'ent_npc' ] + 'ent_npc', 'ent_water' ] def get_entity_enum_id( alias ): #{ @@ -338,6 +338,7 @@ class ent_water(Structure): ("max_dist",c_float), ("reserved0",c_uint32), ("reserved1",c_uint32)] + sr_functions = { 0: "drown" } #} class volume_trigger(Structure): @@ -1781,6 +1782,9 @@ def sr_compile( collection ): else: worldinfo.timezone = obj_data.timezone + if obj_data.water_safe: + flags |= 0x2 + worldinfo.flags = flags worldinfo.pstr_skybox = sr_compile_string( obj_data.skybox ) sr_ent_push( worldinfo ) @@ -3316,8 +3320,11 @@ class SR_OBJECT_ENT_WORLD_INFO(bpy.types.PropertyGroup): timezone: bpy.props.FloatProperty(name="Timezone(hrs) (UTC0 +hrs)") fixed_time: bpy.props.FloatProperty(name="Fixed Time (0-1)") + water_safe: bpy.props.BoolProperty(name="Water is Safe") + @staticmethod - def sr_inspector( layout, data ):#{ + def sr_inspector( layout, data ): + #{ layout.prop( data[0], 'name' ) layout.prop( data[0], 'desc' ) layout.prop( data[0], 'author' ) @@ -3327,6 +3334,8 @@ class SR_OBJECT_ENT_WORLD_INFO(bpy.types.PropertyGroup): layout.prop( data[0], 'fixed_time' ) else: layout.prop( data[0], 'timezone' ) + + layout.prop( data[0], 'water_safe' ) #} #} diff --git a/world_render.c b/world_render.c index e1a3088..4b6568b 100644 --- a/world_render.c +++ b/world_render.c @@ -145,15 +145,6 @@ static GLuint world_get_texture( world_instance *world, u32 id ){ else return world->textures[ id ]; } -#if 0 -static void bindpoint_diffuse_texture1( world_instance *world, - struct world_surface *mat ){ - glActiveTexture( GL_TEXTURE1 ); - glBindTexture( GL_TEXTURE_2D, - world_get_texture(world,mat->info.tex_diffuse) ); -} -#endif - /* * Passes Rendering * ---------------------------------------------------------------------------- diff --git a/world_water.c b/world_water.c index 970ea22..dc8206b 100644 --- a/world_water.c +++ b/world_water.c @@ -2,15 +2,15 @@ * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved */ -#ifndef WATER_C -#define WATER_C - #include "world_water.h" #include "world_render.h" #include "render.h" #include "shaders/scene_water.h" #include "shaders/scene_water_fast.h" #include "scene.h" +#include "player.h" +#include "player_walk.h" +#include "player_dead.h" struct world_water world_water; @@ -225,4 +225,36 @@ void render_water_surface( world_instance *world, vg_camera *cam ) } } -#endif /* WATER_C */ +static void world_water_drown(void) +{ + player__networked_sfx( k_player_subsystem_walk, 32, + k_player_walk_soundeffect_splash, + localplayer.rb.co, 1.0f ); + vg_info( "player fell of due to walking into walker\n" ); + player__dead_transition( k_player_die_type_generic ); +} + +bool world_water_player_safe( world_instance *world, f32 allowance ) +{ + if( !world->water.enabled ) return 1; + if( world->info.flags & 0x2 ) return 1; + + if( localplayer.rb.co[1]+allowance < world->water.height ) + { + world_water_drown(); + return 0; + } + + return 1; +} + +entity_call_result ent_water_call( world_instance *world, ent_call *call ) +{ + if( call->function == 0 ) + { + world_water_drown(); + return k_entity_call_result_OK; + } + + return k_entity_call_result_unhandled; +} diff --git a/world_water.h b/world_water.h index 47855b2..7ff9af5 100644 --- a/world_water.h +++ b/world_water.h @@ -14,3 +14,5 @@ void world_water_init(void); void water_set_surface( world_instance *world, f32 height ); void render_water_texture( world_instance *world, vg_camera *cam ); void render_water_surface( world_instance *world, vg_camera *cam ); +entity_call_result ent_water_call( world_instance *world, ent_call *call ); +bool world_water_player_safe( world_instance *world, f32 allowance ); -- 2.25.1