1 #using scripts\codescripts\struct;
3 #using scripts\shared\math_shared;
4 #using scripts\shared\statemachine_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\array_shared;
7 #using scripts\shared\util_shared;
9 #using scripts\shared\vehicle_shared;
10 #using scripts\shared\vehicle_death_shared;
11 #using scripts\shared\vehicle_ai_shared;
12 #using scripts\shared\audio_shared;
13 #using scripts\shared\clientfield_shared;
15 #insert scripts\shared\version.gsh;
16 #insert scripts\shared\shared.gsh;
17 #insert scripts\shared\statemachine.gsh;
18 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
20 #insert scripts\shared\ai\utility.gsh;
23 #define RAPS_FAR_DISTANCE 400
25 #define RAPS_JUMP_HEIGHT 20
29 #using_animtree( "generic" );
39 slow_triggers = GetEntArray(
"raps_slow",
"targetname" );
46 self.fovcosinebusy = 0;
47 self.delete_on_death =
true;
48 self.health =
self.healthdefault;
49 self.last_jump_chance_time = 0;
51 self UseAnimTree( #animtree );
55 assert( isdefined(
self.scriptbundlesettings ) );
58 if(
self.settings.aim_assist )
60 self EnableAimAssist();
63 self SetNearGoalNotifyDist(
self.settings.near_goal_notify_dist );
64 self.goalRadius = 999999;
65 self.goalHeight = 999999;
66 self SetGoal(
self.origin,
false,
self.goalRadius,
self.goalHeight );
79 if( IsDefined( level.vehicle_initializer_cb ) )
81 [[level.vehicle_initializer_cb]]( self );
106 self endon(
"change_state" );
109 driver =
self GetSeatOccupant( 0 );
111 if( isPlayer( driver ) )
113 driver endon(
"disconnect" );
117 self Kill(
self.origin, driver );
126 self endon (
"death" );
128 attacker = params.inflictor;
129 if( !isdefined( attacker ) )
131 attacker = params.attacker;
134 if( attacker !==
self && ( !isdefined(
self.owner ) || (
self.owner !== attacker ) ) && ( IsAI( attacker) || IsPlayer( attacker ) ) )
136 self.damage_on_death =
false;
140 attacker = params.inflictor;
141 if( !isdefined( attacker ) )
143 attacker = params.attacker;
145 if ( isdefined( attacker ) && !isdefined(
self.detonate_sides_disabled ) )
151 self.damage_on_death =
true;
163 self endon (
"death" );
164 self endon (
"change_state" );
166 if (
self.serverShortout ===
true )
168 forward = VectorNormalize(
FLAT_ORIGIN( (
self GetVelocity() ) ) );
169 side = VectorCross( forward, (0,0,1) ) * math::randomsign();
170 self SetVehGoalPos(
self.origin + side * 500 + forward * randomFloat(400),
false,
false );
172 self ClearVehGoalPos();
174 self Kill(
self.origin,
self.abnormal_status.attacker,
self.abnormal_status.inflictor, GetWeapon(
"emp" ) );
187 self endon(
"change_state" );
188 self endon(
"death" );
203 else if ( !IsDefined(
self.enemy ) ||
IS_TRUE(
self.raps_force_patrol_behavior ) )
205 if( isdefined(
self.settings.all_knowing ) )
211 self SetSpeed(
self.settings.defaultMoveSpeed * 0.35 );
213 PixBeginEvent(
"_raps::state_combat_update 1" );
214 queryResult = PositionQuery_Source_Navigation(
self.origin, 0,
self.settings.max_move_dist * 3,
self.settings.max_move_dist * 3,
self.radius * 2,
self,
self.radius * 4 );
217 PositionQuery_Filter_InClaimedLocation( queryResult,
self );
218 PositionQuery_Filter_DistanceToGoal( queryResult,
self );
221 best_point = undefined;
222 best_score = -999999;
224 foreach ( point
in queryResult.data )
227 ADD_POINT_SCORE( point,
"distToOrigin", MapFloat( 0, 200, 0, 100, point.distToOrigin2D ) );
229 if( point.inClaimedLocation )
231 ADD_POINT_SCORE( point,
"inClaimedLocation", -500 );
234 ADD_POINT_SCORE( point,
"random", randomFloatRange( 0, 50 ) );
237 if( isdefined(
self.prevMoveDir ) )
239 moveDir = VectorNormalize( point.origin -
self.origin );
240 if( VectorDot( moveDir,
self.prevMoveDir ) > 0.64 )
242 ADD_POINT_SCORE( point,
"currentMoveDir", randomFloatRange( 50, 150 ) );
246 if ( point.score > best_score )
248 best_score = point.score;
257 if( isdefined( best_point ) )
259 foundpath =
self SetVehGoalPos( best_point.origin,
false,
true );
268 self.prevMoveDir = VectorNormalize( best_point.origin -
self.origin );
269 self.current_pathto_pos = undefined;
282 else if ( !
self.enemy.allowdeath &&
self GetPersonalThreatBias(
self.enemy ) == 0 )
284 self SetPersonalThreatBias(
self.enemy, -2000, 30.0 );
292 if ( isdefined( targetPos ) )
295 if( DistanceSquared(
self.origin, targetPos ) >
SQR(
RAPS_FAR_DISTANCE ) &&
self IsPosInClaimedLocation( targetPos ) )
297 PixBeginEvent(
"_raps::state_combat_update 2" );
298 queryResult = PositionQuery_Source_Navigation( targetPos, 0,
self.settings.max_move_dist,
self.settings.max_move_dist,
self.radius,
self );
301 PositionQuery_Filter_InClaimedLocation( queryResult,
self.enemy );
303 best_point = undefined;
304 best_score = -999999;
305 foreach ( point
in queryResult.data )
307 ADD_POINT_SCORE( point,
"distToOrigin", MapFloat( 0, 200, 0, -200, Distance( point.origin, queryResult.origin ) ) );
308 ADD_POINT_SCORE( point,
"heightToOrigin", MapFloat( 50, 200, 0, -200, Abs( point.origin[2] - queryResult.origin[2] ) ) );
310 if( point.inClaimedLocation ===
true )
312 ADD_POINT_SCORE( point,
"inClaimedLocation", -500 );
315 if ( point.score > best_score )
317 best_score = point.score;
324 if( isdefined( best_point ) )
326 targetPos = best_point.origin;
330 foundpath =
self SetVehGoalPos( targetPos,
false,
true );
332 if (
self.test_failed_path ===
true )
339 self.current_pathto_pos = targetPos;
356 if ( pathfailcount > 2 )
364 if( IsDefined(
self.enemy ) )
366 self SetPersonalThreatBias(
self.enemy, -2000, 5.0 );
369 if ( pathfailcount >
self.settings.max_path_fail_count )
378 PixBeginEvent(
"_raps::state_combat_update 3" );
379 queryResult = PositionQuery_Source_Navigation(
self.origin, 0,
self.settings.max_move_dist,
self.settings.max_move_dist,
self.radius,
self );
380 PixBeginEvent(
"_raps::state_combat_update 3" );
382 if( queryResult.data.size )
384 point = queryResult.data[ randomint( queryResult.data.size ) ];
386 self SetVehGoalPos( point.origin,
false,
false );
387 self.current_pathto_pos = undefined;
390 self notify(
"near_goal" );
401 self endon(
"change_state" );
402 self endon(
"death" );
403 self notify(
"end_prevent_stuck" );
404 self endon(
"end_prevent_stuck" );
409 previous_origin = undefined;
414 if ( isdefined( previous_origin ) && DistanceSquared( previous_origin,
self.origin ) <
SQR( 0.1 ) && !
IS_TRUE( level.bzm_worldPaused ) )
420 previous_origin =
self.origin;
435 if ( isdefined( enemy ) && IsAlive( enemy ) )
438 enemy_look_dir_offst = AnglesToForward( enemy.angles ) * 30;
439 targetPoint = enemy.origin + enemy_look_dir_offst;
441 if( distance2DSquared( targetPoint, origin ) <
SQR(
self.settings.detonation_distance ) && (
442 Abs( targetPoint[2] - origin[2] ) <
self.settings.detonation_distance ||
443 Abs( targetPoint[2] -
RAPS_JUMP_HEIGHT - origin[2] ) <
self.settings.detonation_distance ) )
454 if( isdefined(
self.sndAlias[
"jump_up"] ) )
455 self PlaySound(
self.sndAlias[
"jump_up"] );
457 self LaunchVehicle( (0,0,1) *
self.jumpforce, (0,0,0),
true );
459 self.is_jumping =
true;
476 while( time_to_land > 0 )
483 time_to_land -= 0.05;
486 if( IsAlive(
self ) )
488 self.is_jumping =
false;
490 trace = PhysicsTrace(
self.origin + ( 0, 0,
self.radius * 2 ),
self.origin - ( 0, 0, 1000 ), ( -10, -10, -10 ), ( 10, 10, 10 ),
self,
PHYSICS_TRACE_MASK_VEHICLE );
493 if (
trace[
"fraction" ] < 1 )
495 pos =
trace[
"position" ];
497 if ( isdefined( pos_on_navmesh ) )
515 if( !isdefined( attacker ) )
520 self DoDamage(
self.health + 1000,
self.origin, attacker,
self,
"none",
"MOD_EXPLOSIVE", 0,
self.turretWeapon );
525 self.selfDestruct =
true;
526 self DoDamage( 1000,
self.origin, enemy,
self,
"none",
"MOD_EXPLOSIVE", 0,
self.turretWeapon );
531 self endon(
"death" );
532 self endon(
"change_state" );
534 lastEnemy = undefined;
543 if( isdefined(
self.enemy ) && IsPlayer(
self.enemy ) )
546 if( lastEnemy !==
self.enemy )
548 lastDistToEnemySquared = 10000.0 * 10000.0;
549 lastEnemy =
self.enemy;
552 if( !IsDefined(
self.looping_targeting_sound ) )
554 if( isdefined(
self.sndAlias[
"vehRapsAlarm"] ) )
556 self.looping_targeting_sound =
spawn(
"script_origin",
self.origin );
557 self.looping_targeting_sound linkto(
self);
560 self.looping_targeting_sound SetInvisibleToAll();
561 self.looping_targeting_sound SetVisibleToPlayer(
self.enemy );
562 self.looping_targeting_sound playloopsound (
self.sndAlias[
"vehRapsAlarm"]);
568 distToEnemySquared = distanceSquared(
self.origin,
self.enemy.origin );
570 if( distToEnemySquared <
SQR(250) )
572 if( lastDistToEnemySquared >
SQR(250) && !
IS_TRUE(
self.serverShortout ) && isdefined(
self.sndAlias[
"vehRapsClose250"] ) )
573 self PlaySoundToPlayer(
self.sndAlias[
"vehRapsClose250"],
self.enemy );
575 else if( distToEnemySquared <
SQR(750) )
577 if( lastDistToEnemySquared >
SQR(750) && !
IS_TRUE(
self.serverShortout ) && isdefined(
self.sndAlias[
"vehRapsTargeting"] ) )
578 self PlaySoundToPlayer(
self.sndAlias[
"vehRapsTargeting"],
self.enemy );
580 else if( distToEnemySquared <
SQR(1500) )
582 if( lastDistToEnemySquared >
SQR(1500) && !
IS_TRUE(
self.serverShortout ) && isdefined(
self.sndAlias[
"vehRapsClose1500"] ) )
583 self PlaySoundToPlayer(
self.sndAlias[
"vehRapsClose1500"],
self.enemy );
586 if( distToEnemySquared < lastDistToEnemySquared )
588 lastDistToEnemySquared = distToEnemySquared;
591 lastDistToEnemySquared +=
SQR( 50 * 0.2 );
598 owner waittill(
"death" );
600 if ( isdefined( owner ) )
605 if ( isdefined(
self ) )
607 self StopLoopSound();
614 if(
IS_TRUE(
self.disableAutoDetonation ) )
619 cur_time = GetTime();
621 can_jump = (cur_time -
self.last_jump_chance_time > 1500);
625 predicted_origin =
self.origin +
self GetVelocity() * jump_time;
630 trace = BulletTrace( predicted_origin + (0,0,
self.radius),
self.enemy.origin + (0,0,
self.radius),
true,
self );
631 if (
trace[
"fraction"] === 1.0 || isdefined(
trace[
"entity"] ) )
633 self.last_jump_chance_time = cur_time;
634 jump_chance =
self.settings.jump_chance;
637 jump_chance =
self.settings.jump_chance * 2;
640 if( RandomFloat( 1 ) < jump_chance )
648 trace = BulletTrace(
self.origin + (0,0,
self.radius),
self.enemy.origin + (0,0,
self.radius),
true,
self );
649 if (
trace[
"fraction"] === 1.0 || isdefined(
trace[
"entity"] ) )
656 if( isdefined(
self.owner ) )
658 foreach( player
in level.players )
660 if(
self.owner
util::IsEnemyPlayer( player ) && ( !isdefined(
self.enemy ) || player !=
self.enemy ) )
662 if( player IsNoTarget() || !IsAlive( player ) )
667 if ( player.ignoreme ===
true )
672 if( !SessionModeIsCampaignGame() && !SessionModeIsZombiesGame() && player hasPerk(
"specialty_nottargetedbyraps" ) )
677 if( distanceSquared( player.origin,
self.origin ) <
SQR(
self.settings.detonation_distance ) )
679 trace = BulletTrace(
self.origin + (0,0,
self.radius), player.origin + (0,0,
self.radius),
true,
self );
680 if (
trace[
"fraction"] === 1.0 || isdefined(
trace[
"entity"] ) )
692 if( isdefined(
self.settings.all_knowing ) )
694 if( isdefined(
self.enemy ) )
696 target_pos =
self.enemy.origin;
706 if( isdefined( target_pos ) )
708 target_pos_onnavmesh = GetClosestPointOnNavMesh( target_pos,
self.settings.detonation_distance * 1.5,
self.radius,
NMMF_ALL & ~
NMMF_NOVEHICLE );
712 if( !isdefined( target_pos_onnavmesh ) )
714 if( isdefined(
self.enemy ) )
716 self SetPersonalThreatBias(
self.enemy, -2000, 5.0 );
719 if ( isdefined(
self.current_pathto_pos ) )
721 target_pos_onnavmesh = GetClosestPointOnNavMesh(
self.current_pathto_pos,
self.settings.detonation_distance * 2,
self.settings.detonation_distance * 1.5,
NMMF_ALL & ~
NMMF_NOVEHICLE );
724 if ( isdefined( target_pos_onnavmesh ) )
726 return target_pos_onnavmesh;
730 return self.current_pathto_pos;
733 else if ( isdefined(
self.enemy ) )
735 if ( DistanceSquared( target_pos, target_pos_onnavmesh ) >
SQR(
self.settings.detonation_distance * 0.9 ) )
737 self SetPersonalThreatBias(
self.enemy, -2000, 5.0 );
741 if( isdefined( enemy ) && IsPlayer( enemy ) )
743 enemy_vel_offset = enemy GetVelocity() * 0.5;
745 enemy_look_dir_offset = AnglesToForward( enemy.angles );
746 if( distance2dSquared(
self.origin, enemy.origin ) >
SQR( 500 ) )
748 enemy_look_dir_offset *= 110;
752 enemy_look_dir_offset *= 35;
755 offset = enemy_vel_offset + enemy_look_dir_offset;
758 if( TracePassedOnNavMesh( target_pos_onnavmesh, target_pos + offset ) )
760 target_pos += offset;
764 target_pos = target_pos_onnavmesh;
769 target_pos = target_pos_onnavmesh;
777 self endon(
"death" );
778 self endon(
"change_state" );
779 self endon(
"near_goal" );
780 self endon(
"reached_end_node" );
783 self notify(
"clear_interrupt_threads" );
784 self endon(
"clear_interrupt_threads" );
790 if( isdefined(
self.current_pathto_pos ) )
792 if( distance2dSquared(
self.current_pathto_pos,
self.goalpos ) >
SQR(
self.goalRadius ) )
796 self notify(
"near_goal" );
800 if ( isdefined( targetPos ) )
805 repath_range =
self.settings.repath_range * 2;
810 repath_range =
self.settings.repath_range;
813 if( distance2dSquared(
self.current_pathto_pos, targetPos ) >
SQR( repath_range ) )
815 if( isdefined(
self.sndAlias ) && isdefined(
self.sndAlias[
"direction"] ) )
817 self playsound(
self.sndAlias[
"direction"] );
820 self notify(
"near_goal" );
824 if( isdefined(
self.enemy ) && IsPlayer(
self.enemy ) && !isdefined(
self.slow_trigger) )
826 forward = AnglesToForward(
self.enemy GetPlayerAngles() );
827 dir_to_raps =
self.origin -
self.enemy.origin;
829 speedToUse =
self.settings.defaultMoveSpeed;
830 if( IsDefined(
self._override_raps_combat_speed ) )
832 speedToUse =
self._override_raps_combat_speed;
835 if( VectorDot( forward, dir_to_raps ) > 0 )
837 self SetSpeed( speedToUse );
841 self SetSpeed( speedToUse * 0.75 );
846 speedToUse =
self.settings.defaultMoveSpeed;
847 if( IsDefined(
self._override_raps_combat_speed ) )
849 speedToUse =
self._override_raps_combat_speed;
851 self SetSpeed( speedToUse );
865 tilted = ( normal[2] < 0.6 );
866 fx_origin =
self.origin - normal * ( tilted ? 28 : 10 );
868 if( isdefined(
self.sndAlias[
"vehRapsCollision"] ) )
869 self PlaySound(
self.sndAlias[
"vehRapsCollision"] );
876 self endon(
"death" );
877 self endon(
"change_state" );
878 self notify(
"end_nudge_collision" );
879 self endon(
"end_nudge_collision" );
883 self waittill(
"veh_collision", velocity, normal );
884 ang_vel =
self GetAngularVelocity() * 0.8;
885 self SetAngularVelocity( ang_vel );
888 if ( IsAlive(
self ) && VectorDot( normal, (0,0,1) ) < 0.5 )
890 self SetVehVelocity(
self.velocity + normal * 400 );
898 if( isdefined(
self.owner ) && ( eAttacker ==
self.owner ) && isdefined(
self.settings.friendly_fire ) &&
int(
self.settings.friendly_fire ) && !weapon.isEmp )
903 if ( isdefined( eAttacker ) && isdefined( eAttacker.archetype ) && isdefined( sMeansOfDeath )
904 && eAttacker.archetype ==
ARCHETYPE_RAPS && sMeansOfDeath ==
"MOD_EXPLOSIVE" )
914 forward_direction = AnglesToForward(
self.angles );
915 up_direction = AnglesToUp(
self.angles );
917 origin =
self.origin + VectorScale(up_direction, 15);
919 right_direction = VectorCross(forward_direction, up_direction);
920 right_direction = VectorNormalize(right_direction);
922 left_direction = VectorScale(right_direction, -1);
924 eInflictor CylinderDamage(VectorScale(right_direction, 140), origin, 15, 50,
self.radiusdamagemax,
self.radiusdamagemax / 5,
self,
"MOD_EXPLOSIVE",
self.turretWeapon);
925 eInflictor CylinderDamage(VectorScale(left_direction, 140), origin, 15, 50,
self.radiusdamagemax,
self.radiusdamagemax / 5,
self,
"MOD_EXPLOSIVE",
self.turretWeapon);
927 self.bSideDetonation =
true;
930 function raps_callback_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
932 if (
self.drop_deploying ===
true && sMeansOfDeath ==
"MOD_TRIGGER_HURT" && ( !isdefined(
self.hurt_trigger_immune_end_time ) || ( GetTime() <
self.hurt_trigger_immune_end_time ) ) )
935 if ( isdefined( eAttacker ) && isdefined( eAttacker.archetype ) && isdefined( sMeansOfDeath )
936 && eAttacker.archetype ==
ARCHETYPE_RAPS && sMeansOfDeath ==
"MOD_EXPLOSIVE" )
938 if ( eAttacker !=
self && isdefined( vDir ) && lengthSquared( vDir ) > 0.1 && ( !isdefined( eAttacker ) || eAttacker.team ===
self.team ) && ( !isdefined( eInflictor ) || eInflictor.team ===
self.team ) )
940 self SetVehVelocity(
self.velocity + VectorNormalize( vDir ) * 300 );
947 minEmpDownTime = 0.8 *
self.settings.empdowntime;
948 maxEmpDownTime = 1.2 *
self.settings.empdowntime;
949 self notify (
"emped", RandomFloatRange( minEmpDownTime, maxEmpDownTime ), eAttacker, eInflictor );
962 self endon(
"death" );
966 self waittill(
"trigger", other );
968 if( IsVehicle( other ) && IsDefined( other.archetype ) && other.archetype ==
"raps" )
979 self notify(
"slow_raps" );
980 self endon(
"slow_raps" );
981 self endon(
"death" );
983 self.slow_trigger =
true;
984 if( IsDefined( trigger.script_int ) )
986 if( IsDefined(
self._override_raps_combat_speed ) &&
self._override_raps_combat_speed < trigger.script_int )
988 self SetSpeedImmediate(
self._override_raps_combat_speed );
992 self SetSpeedImmediate( trigger.script_int, 200, 200 );
997 if( IsDefined(
self._override_raps_combat_speed ) &&
self._override_raps_combat_speed < 0.5 *
self.settings.defaultMoveSpeed )
999 self SetSpeed(
self._override_raps_combat_speed );
1003 self SetSpeed( 0.5 *
self.settings.defaultMoveSpeed );
1010 self.slow_trigger = undefined;
1015 if( isdefined( level.raps_force_get_enemies ) )
1017 return self [[level.raps_force_get_enemies]]();
1020 foreach( player
in level.players )
1024 self GetPerfectInfo( player );
1033 self.sndAlias[
"inAir"] =
"veh_raps_in_air";
1034 self.sndAlias[
"land"] =
"veh_raps_land";
1035 self.sndAlias[
"spawn"] =
"veh_raps_spawn";
1036 self.sndAlias[
"direction"] =
"veh_raps_direction";
1037 self.sndAlias[
"jump_up"] =
"veh_raps_jump_up";
1038 self.sndAlias[
"vehRapsClose250"] =
"veh_raps_close_250";
1039 self.sndAlias[
"vehRapsClose1500"] =
"veh_raps_close_1500";
1040 self.sndAlias[
"vehRapsTargeting"] =
"veh_raps_targeting";
1041 self.sndAlias[
"vehRapsAlarm"] =
"evt_raps_alarm";
1042 self.sndAlias[
"vehRapsCollision"] =
"veh_wasp_wall_imp";
1044 if( isdefined(
self.vehicletype ) && (
self.vehicletype ==
"spawner_enemy_zombie_vehicle_raps_suicide" ||
self.vehicletype ==
"spawner_zombietron_veh_meatball" ||
self.vehicletype ==
"spawner_zombietron_veh_meatball_med" ||
self.vehicletype ==
"spawner_zombietron_veh_meatball_small") )
1046 self.sndAlias[
"inAir"] =
"zmb_meatball_in_air";
1047 self.sndAlias[
"land"] =
"zmb_meatball_land";
1048 self.sndAlias[
"spawn"] = undefined;
1049 self.sndAlias[
"direction"] = undefined;
1050 self.sndAlias[
"jump_up"] =
"zmb_meatball_jump_up";
1051 self.sndAlias[
"vehRapsClose250"] =
"zmb_meatball_close_250";
1052 self.sndAlias[
"vehRapsClose1500"] = undefined;
1053 self.sndAlias[
"vehRapsTargeting"] =
"zmb_meatball_targeting";
1054 self.sndAlias[
"vehRapsAlarm"] = undefined;
1055 self.sndAlias[
"vehRapsCollision"] =
"zmb_meatball_collision";
1066 if( SessionModeIsCampaignGame() || SessionModeIsZombiesGame() )
1072 self endon (
"death");
1076 self waittill (
"veh_landed");
1077 if( isdefined(
self.sndAlias[
"land"] ) )
1078 self playsound (
self.sndAlias[
"land"]);
1083 self endon (
"death");
1085 if( !SessionModeIsCampaignGame() && !SessionModeIsZombiesGame() )
1086 self waittill(
"veh_landed" );
1090 self waittill (
"veh_inair");
1092 if( isdefined(
self.sndAlias[
"inAir"] ) )
1093 self playsound (
self.sndAlias[
"inAir"]);
1095 self waittill (
"veh_landed");
1097 if( isdefined(
self.sndAlias[
"land"] ) )
1098 self playsound (
self.sndAlias[
"land"]);
1104 self endon(
"death" );
1105 wait randomfloatrange (0.25, 1.5);
1107 if( isdefined(
self.sndAlias[
"spawn"] ) )
1108 self playsound (
self.sndAlias[
"spawn"]);
1112 str_vehicletype =
self.vehicletype;
1113 if (isdefined( str_vehicletype ) && StrEndsWith( str_vehicletype,
"_player" ) )
1124 if(isdefined(
self.bSideDetonation ))