class ent_challenge(Structure):#{
_fields_ = [("transform",mdl_transform),
("submesh_start",c_uint32), ("submesh_count",c_uint32),
+ ("flags",c_uint32),
("id_next",c_uint32),
- ("filter",c_uint32),
+ ("filter",c_uint32),("filter2",c_uint32),
("id_win",c_uint32),
("win_event",c_uint32),
("time_limit",c_float)]
sr_functions = { 0: 'trigger',
- 1: 'start_challenge' }
+ 1: 'start_challenge',
+ 2: 'show',
+ 3: 'hide' }
#}
class ent_unlock(Structure):#{
challenge.id_next = sr_entity_id( obj_data.proxima )
challenge.id_win = sr_entity_id( obj_data.target )
challenge.win_event = obj_data.target_event
- challenge.filter = 0
+ challenge.filter = int(obj_data.filtrar)
+ challenge.filter2 = 0
challenge.time_limit = obj_data.time_limit
compile_obj_transform( obj, challenge.transform )
target: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Target", \
- poll=lambda self,obj: sr_filter_ent_type(obj,\
- ['ent_audio','ent_skateshop','ent_ccmd',\
- 'ent_challenge']))
+ poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE))
target_event: bpy.props.IntProperty( name="Event/Method" )
@staticmethod
poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE))
target_event: bpy.props.IntProperty( name="Event/Method" )
time_limit: bpy.props.FloatProperty( name="Time Limit", default=1.0 )
+ filtrar: bpy.props.EnumProperty( name='Filter',\
+ items=[('0','none',''),
+ (str(0x1),'trick_shuvit',''),
+ (str(0x2),'trick_kickflip',''),
+ (str(0x4),'trick_treflip',''),
+ (str(0x1|0x2|0x4),'trick_any',''),
+ (str(0x8),'flip_back',''),
+ (str(0x10),'flip_front',''),
+ (str(0x8|0x10),'flip_any',''),
+ (str(0x20),'grind_truck_any',''),
+ (str(0x40),'grind_board_any',''),
+ (str(0x20|0x40),'grind_any',''),
+ (str(0x80),'footplant','')
+ ])
@staticmethod
def sr_inspector( layout, data ):#{
layout.prop( data[0], 'proxima' )
layout.prop( data[0], 'time_limit' )
+ layout.prop( data[0], 'filtrar' )
SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' )
#}
#}
}
}
+VG_STATIC int ent_challenge_check_filter( ent_challenge *challenge ){
+ if( challenge->filter ){
+ struct player_skate_state *s = &localplayer._skate.state;
+ enum trick_type trick = s->trick_type;
+
+ u32 state = 0x00;
+
+ if( trick == k_trick_type_shuvit )
+ state |= k_ent_challenge_filter_trick_shuvit;
+ if( trick == k_trick_type_treflip )
+ state |= k_ent_challenge_filter_trick_treflip;
+ if( trick == k_trick_type_kickflip )
+ state |= k_ent_challenge_filter_trick_kickflip;
+
+ if( s->flip_rate < -0.0001f ) state |= k_ent_challenge_filter_flip_back;
+ if( s->flip_rate > 0.0001f ) state |= k_ent_challenge_filter_flip_front;
+
+ if( s->activity == k_skate_activity_grind_5050 ||
+ s->activity == k_skate_activity_grind_back50 ||
+ s->activity == k_skate_activity_grind_front50 )
+ state |= k_ent_challenge_filter_grind_truck_any;
+
+ if( s->activity == k_skate_activity_grind_boardslide )
+ state |= k_ent_challenge_filter_grind_board_any;
+
+ return ((challenge->filter & state) || !challenge->filter) &&
+ ((challenge->filter2 & state) || !challenge->filter2);
+ }
+ else {
+ return 1;
+ }
+}
+
VG_STATIC void ent_challenge_call( world_instance *world, ent_call *call ){
u32 index = mdl_entity_id_id( call->id );
ent_challenge *challenge = mdl_arritm( &world->ent_challenge, index );
if( call->function == 0 ){
+ if( challenge->flags & k_ent_challenge_hidden ) return;
+
if( world->challenge_target ){
- if( world->challenge_target == challenge ){
+ if( (world->challenge_target == challenge) &&
+ ent_challenge_check_filter( challenge )){
ent_challenge_pass( world, challenge );
}
else {
}
}
else if( call->function == 1 ){
+ if( challenge->flags & k_ent_challenge_hidden ) return;
+
vg_info( "begin the challenge\n" );
world->challenge_timer = 0.0f;
ent_challenge_pass( world, challenge );
}
+ else if( call->function == 2 ){
+ challenge->flags &= ~k_ent_challenge_hidden;
+ }
+ else if( call->function == 3 ){
+ challenge->flags |= k_ent_challenge_hidden;
+ }
else {
vg_print_backtrace();
vg_error( "Unhandled function id: %u\n", call->function );
u32 pstr_command;
};
+enum ent_challenge_filter{
+ k_ent_challenge_filter_none = 0x00000000,
+ k_ent_challenge_filter_trick_shuvit = 0x00000001,
+ k_ent_challenge_filter_trick_kickflip = 0x00000002,
+ k_ent_challenge_filter_trick_treflip = 0x00000004,
+ k_ent_challenge_filter_trick_any =
+ k_ent_challenge_filter_trick_shuvit|
+ k_ent_challenge_filter_trick_treflip|
+ k_ent_challenge_filter_trick_kickflip,
+ k_ent_challenge_filter_flip_back = 0x00000008,
+ k_ent_challenge_filter_flip_front = 0x00000010,
+ k_ent_challenge_filter_flip_any =
+ k_ent_challenge_filter_flip_back|
+ k_ent_challenge_filter_flip_front,
+ k_ent_challenge_filter_grind_truck_any = 0x00000020,
+ k_ent_challenge_filter_grind_board_any = 0x00000040,
+ k_ent_challenge_filter_grind_any =
+ k_ent_challenge_filter_grind_truck_any|
+ k_ent_challenge_filter_grind_board_any,
+ k_ent_challenge_filter_footplant = 0x00000080
+};
+
+enum ent_challenge_flag {
+ k_ent_challenge_hidden = 0x1
+};
+
struct ent_challenge{
mdl_transform transform;
u32 submesh_start,
submesh_count,
+ flags,
id_next,
- filter,
+ filter,filter2,
id_win,
win_event;
f32 time_limit;
return;
}
- enum trick_type trick = k_trick_type_none;
- if( (s->state.activity <= k_skate_activity_air_to_grind) &&
- (trick = player_skate_trick_input( player )) )
- {
- if( (vg.time - s->state.jump_time) < 0.1f ){
- v3_zero( s->state.trick_vel );
- s->state.trick_time = 0.0f;
-
- if( trick == k_trick_type_kickflip ){
- s->state.trick_vel[0] = 3.0f;
- }
- else if( trick == k_trick_type_shuvit ){
- s->state.trick_vel[2] = 3.0f;
- }
- else if( trick == k_trick_type_treflip ){
- s->state.trick_vel[0] = 2.0f;
- s->state.trick_vel[2] = 2.0f;
+ if( s->state.activity <= k_skate_activity_air_to_grind ){
+ enum trick_type trick = k_trick_type_none;
+ if( (trick = player_skate_trick_input( player )) ){
+ if( (vg.time - s->state.jump_time) < 0.1f ){
+ v3_zero( s->state.trick_vel );
+ s->state.trick_time = 0.0f;
+
+ if( trick == k_trick_type_kickflip ){
+ s->state.trick_vel[0] = 3.0f;
+ }
+ else if( trick == k_trick_type_shuvit ){
+ s->state.trick_vel[2] = 3.0f;
+ }
+ else if( trick == k_trick_type_treflip ){
+ s->state.trick_vel[0] = 2.0f;
+ s->state.trick_vel[2] = 2.0f;
+ }
+ s->state.trick_type = trick;
}
- s->state.trick_type = trick;
}
}
+ else
+ s->state.trick_type = k_trick_type_none;
}
VG_STATIC void player__skate_post_update( player_instance *player ){
addon_reg *reg = world_static.addon_client;
if( reg && (world_static.active_instance > 0) ){
skaterift_write_addon_alias( &sav, "alias", ®->alias );
- vg_msg_wkvu32( &sav, "index", world_static.active_instance );
- vg_msg_wkvnum( &sav, "position", k_vg_msg_float|k_vg_msg_32b, 3,
- localplayer.rb.co );
}
+ vg_msg_wkvu32( &sav, "index", world_static.active_instance );
+ vg_msg_wkvnum( &sav, "position", k_vg_msg_float|k_vg_msg_32b, 3,
+ localplayer.rb.co );
}
vg_msg_end_frame( &sav );
world_static.active_instance = vg_msg_seekkvu32( &world, "index", 0 );
world_static.active_trigger_volume_count = 0;
localplayer.viewable_world = world_current_instance();
+ }
+
+ vg_msg_cmd position = vg_msg_seekkv( &world, "position", 0 );
+ v3f pos;
+ vg_msg_convert_num( &position, k_vg_msg_float|k_vg_msg_32b, 3, pos );
- vg_msg_cmd position = vg_msg_seekkv( &world, "position", 0 );
- v3f pos;
- vg_msg_convert_num( &position, k_vg_msg_float|k_vg_msg_32b, 3, pos );
+ if( v3_length2(pos) > 1.0f )
player__setpos( &localplayer, pos );
- }
}
}
if( type != k_ent_challenge ) continue;
ent_challenge *challenge = mdl_arritm(&world->ent_challenge,index);
+ if( challenge->flags & k_ent_challenge_hidden ) continue;
f32 dist = v3_dist( challenge->transform.co, pos ) * (1.0f/radius),
scale = vg_smoothstepf( vg_clampf( 10.0f-dist*10.0f, 0.0f,1.0f ) );