1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\trigger_shared;
8 #insert scripts\shared\shared.gsh;
10 #using scripts\zm\_util;
11 #using scripts\zm\_zm_audio;
12 #using scripts\zm\_zm_utility;
14 #namespace zm_jump_pad;
40 level._jump_pad_override = [];
42 jump_pad_triggers = GetEntArray(
"trig_jump_pad",
"targetname" );
44 if( !isdefined( jump_pad_triggers ) )
49 for( i = 0; i < jump_pad_triggers.size; i++ )
51 jump_pad_triggers[i].start =
struct::get( jump_pad_triggers[i].target,
"targetname" );
52 jump_pad_triggers[i].destination =
struct::get_array( jump_pad_triggers[i].start.target,
"targetname" );
54 if( isdefined( jump_pad_triggers[i].script_string ) )
56 jump_pad_triggers[i].overrides = StrTok( jump_pad_triggers[i].script_string,
"," );
76 self endon(
"destroyed" );
78 end_point = undefined;
79 start_point = undefined;
80 z_velocity = undefined;
82 fling_this_way = undefined;
83 jump_time = undefined;
85 world_gravity = GetDvarInt(
"bg_gravity" );
86 gravity_pulls = 13.3 * -1;
87 top_velocity_sq = 900 * 900;
88 forward_scaling = 1.0;
92 if( !isdefined( level.flag[
self.script_flag_wait ] ) )
100 while( isdefined(
self ) )
102 self waittill(
"trigger", who );
104 if( IsPlayer( who ) )
114 if ( who IsTouching(
self ) )
123 self endon(
"endon_condition" );
125 ent_player endon(
"left_jump_pad" );
126 ent_player endon(
"death");
127 ent_player endon(
"disconnect");
131 end_point = undefined;
132 start_point = undefined;
133 z_velocity = undefined;
135 fling_this_way = undefined;
136 jump_time = undefined;
138 world_gravity = GetDvarInt(
"bg_gravity" );
140 gravity_pulls = 13.3 * -1;
141 top_velocity_sq = 900 * 900;
142 forward_scaling = 1.0;
144 start_point =
self.start;
147 if( isdefined(
self.
name ) )
149 self._action_overrides = StrTok(
self.
name,
"," );
151 if( isdefined(
self._action_overrides ) )
153 for( i = 0; i <
self._action_overrides.size; i++ )
164 self playsound(
"evt_jump_pad_charge_short" );
168 self playsound(
"evt_jump_pad_charge" );
174 self playsound(
"evt_jump_pad_charge" );
180 if( isdefined(
self.script_parameters ) && isdefined( level._jump_pad_override[
self.script_parameters ] ) )
182 end_point =
self [[ level._jump_pad_override[
self.script_parameters ] ]]( ent_player );
185 if( !isdefined( end_point ) )
188 end_point =
self.destination[ RandomInt(
self.destination.size ) ];
192 if( GetDvarInt(
"jump_pad_tweaks" ) )
194 line( start_point.origin, end_point.origin, ( 1, 1, 0 ), 1, 1, 500 );
195 sphere( start_point.origin, 12, (0,1,0), 1, 1, 12, 500 );
196 sphere( end_point.origin, 12, (1,0,0), 1, 1, 12, 500 );
202 if( isdefined(
self.script_string ) && isdefined( level._jump_pad_override[
self.script_string ] ) )
204 info_array =
self [[ level._jump_pad_override[
self.script_string ] ]]( start_point, end_point );
206 fling_this_way = info_array[0];
207 jump_time = info_array[1];
211 end_spot = end_point.origin;
214 if( !
IS_TRUE(
self.script_airspeed ) )
216 rand_end = ( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), 0 );
218 rand_scale = RandomInt( 100 );
220 rand_spot = VectorScale( rand_end, rand_scale );
222 end_spot = end_point.origin + rand_spot;
226 pad_dist = Distance( start_point.origin, end_spot );
228 z_dist = end_spot[2] - start_point.origin[2];
231 jump_velocity = end_spot - start_point.origin;
234 if( z_dist > 40 && z_dist < 135 )
237 forward_scaling = 1.1;
239 else if( z_dist >= 135 )
242 forward_scaling = 1.3;
244 else if( z_dist < 0 )
247 forward_scaling = 1.0;
252 N_REDUCTION = 0.0015;
254 if( GetDvarFloat(
"scr_jump_pad_reduction" ) > 0.0 )
256 N_REDUCTION = GetDvarFloat(
"scr_jump_pad_reduction" );
259 z_velocity = N_REDUCTION * 2 * z_dist * world_gravity;
274 jump_time = Sqrt( 2 * pad_dist / world_gravity );
275 jump_time_2 = Sqrt( 2 * z_dist / world_gravity );
276 jump_time = jump_time + jump_time_2;
283 x = jump_velocity[0] * forward_scaling / jump_time;
284 y = jump_velocity[1] * forward_scaling / jump_time;
285 z = z_velocity / jump_time;
288 fling_this_way = ( x, y, z );
292 if( isdefined( end_point.target ) )
294 poi_spot =
struct::get( end_point.target,
"targetname" );
298 poi_spot = end_point;
302 if( !isdefined(
self.script_index ) )
304 ent_player.script_index = undefined;
308 ent_player.script_index =
self.script_index;
312 if( isdefined(
self.script_start ) &&
self.script_start == 1 )
314 if( !
IS_TRUE( ent_player._padded ) && ent_player IsOnGround() )
316 self playsound(
"evt_jump_pad_launch" );
317 if( isdefined( level.func_jump_pad_pulse_override ) )
319 self [[ level.func_jump_pad_pulse_override ]]();
323 playfx(level._effect[
"jump_pad_jump"],
self.origin);
325 ent_player thread
jump_pad_move( fling_this_way, jump_time, poi_spot,
self );
327 if( isdefined(
self.script_label ) )
329 level notify(
self.script_label );
337 if( ent_player IsOnGround() && !
IS_TRUE( ent_player._padded ) )
339 self playsound(
"evt_jump_pad_launch" );
340 if( isdefined( level.func_jump_pad_pulse_override ) )
342 self [[ level.func_jump_pad_pulse_override ]]();
346 playfx(level._effect[
"jump_pad_jump"],
self.origin);
348 ent_player thread
jump_pad_move( fling_this_way, jump_time, poi_spot,
self );
350 if( isdefined(
self.script_label ) )
352 level notify(
self.script_label );
360 if ( ent_player IsTouching(
self ) )
363 if ( ent_player IsTouching(
self ) )
373 ent_player notify(
"left_jump_pad" );
375 if( isdefined( ent_player.poi_spot ) && !
IS_TRUE( ent_player._padded ) )
381 if( isdefined(
self.
name ) )
383 self._action_overrides = StrTok(
self.
name,
"," );
385 if( isdefined(
self._action_overrides ) )
388 for( i = 0; i <
self._action_overrides.size; i++ )
404 self endon(
"death" );
405 self endon(
"disconnect" );
407 start_time = GetTime();
408 jump_time = flt_time * 500;
410 attract_dist = undefined;
413 start_turned_on =
true;
415 poi_start_func = undefined;
426 self SetStance(
"stand" );
431 if ( isdefined( trigger.script_label ) )
433 if ( issubstr( trigger.script_label,
"low" ) )
435 self.jump_pad_current = undefined;
436 self.jump_pad_previous = undefined;
438 else if ( !isdefined(
self.jump_pad_current ) )
440 self.jump_pad_current = trigger;
444 self.jump_pad_previous =
self.jump_pad_current;
445 self.jump_pad_current = trigger;
449 if( isdefined(
self.poi_spot ) )
455 self.poi_spot Delete();
458 if( isdefined( struct_poi ) )
460 self.poi_spot =
spawn(
"script_origin", struct_poi.origin );
462 if( isdefined( level._pad_poi_ignore ) )
464 level [[level._pad_poi_ignore]](
self.poi_spot );
469 if( isdefined( level._jump_pad_poi_start_override ) && !
IS_TRUE(
self.script_index ) )
471 poi_start_func = level._jump_pad_poi_start_override;
474 if( isdefined( level._jump_pad_poi_end_override ) )
476 poi_end_func = level._jump_pad_poi_end_override;
484 self SetOrigin(
self.origin + ( 0, 0, 1 ) );
486 if( 20 >= randomintrange( 0, 101 ) )
491 while( GetTime() - start_time < jump_time )
493 self SetVelocity( vec_direction );
497 while( !
self IsOnGround() )
505 jump_pad_triggers = GetEntArray(
"trig_jump_pad",
"targetname" );
507 for( i = 0; i < jump_pad_triggers.size; i++ )
509 if(
self IsTouching( jump_pad_triggers[i] ) )
516 if( isdefined(
self.poi_spot ) )
519 self.poi_spot Delete();
528 self notify(
"kill_disconnect_failsafe_pad_poi_clean" );
529 self endon(
"kill_disconnect_failsafe_pad_poi_clean" );
530 self.poi_spot endon(
"death" );
532 self waittill(
"disconnect" );
534 if ( isdefined(
self.poi_spot ) )
540 self.poi_spot Delete();
547 if( isdefined( ent_trig.script_wait ) )
549 wait( ent_trig.script_wait );
556 if( isdefined( ent_poi ) )
570 self endon(
"death" );
571 self endon(
"disconnect" );
573 zombies = GetAiTeamArray( level.zombie_team );
575 players = GetPlayers();
577 for( p = 0; p < players.size; p++ )
585 for( i = 0; i < zombies.size; i++ )
589 if( !isdefined( zombies[i] ) )
594 enemy = zombies[i].favoriteenemy;
596 if( isdefined( enemy ) )
598 if ( players.size > 1 && valid_players > 1 )
600 if ( enemy !=
self || ( isdefined( enemy.jump_pad_previous ) && enemy.jump_pad_previous == enemy.jump_pad_current ) )
613 zombies[i].ignore_cleanup_mgr =
true;
614 zombies[i]._pad_follow = 1;
623 zombies = GetAiTeamArray( level.zombie_team );
625 for( i = 0; i < zombies.size; i++ )
627 if( isdefined( zombies[i] ) )
629 if(
IS_TRUE( zombies[i]._pad_follow ) )
631 zombies[i]._pad_follow = 0;
632 zombies[i] notify(
"stop_chasing_the_sky" );
633 zombies[i].ignore_cleanup_mgr =
false;
636 if( isdefined( ent_poi ) )
650 self endon(
"death" );
651 self endon(
"stop_chasing_the_sky" );
653 while(
IS_TRUE(
self._pad_follow ) )
655 if ( isdefined(
self.favoriteenemy ) )
657 players = getplayers();
658 for ( i = 0; i < players.size; i++ )
662 if ( Distance2DSquared( players[i].origin,
self.origin ) < 100 * 100 )
676 self._pad_follow = 0;
677 self.ignore_cleanup_mgr =
false;
678 self notify(
"stop_chasing_the_sky" );
685 if( !isdefined( st_behavior ) || !IsString( st_behavior ) )
690 if( !isdefined( int_clean ) )
695 switch( st_behavior )
711 if( isdefined( level._jump_pad_level_behavior ) )
713 self [[ level._jump_pad_level_behavior ]]( st_behavior, int_clean );