1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\fx_shared;
7 #using scripts\shared\math_shared;
8 #using scripts\shared\statemachine_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\turret_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\vehicle_death_shared;
13 #using scripts\shared\vehicle_shared;
14 #using scripts\shared\vehicle_ai_shared;
16 #insert scripts\shared\shared.gsh;
17 #insert scripts\shared\statemachine.gsh;
19 #namespace auto_turret;
30 self.health =
self.healthdefault;
32 if ( isdefined(
self.scriptbundlesettings ) )
41 sightfov =
self.settings.sightfov;
42 if ( !isdefined( sightfov ) )
46 self.fovcosine = Cos( sightfov - 0.1 );
47 self.fovcosinebusy = Cos( sightfov - 0.1 );
49 if (
self.settings.disconnectpaths ===
true )
51 self DisconnectPaths();
54 if (
self.settings.ignoreme ===
true )
59 if (
self.settings.laseron ===
true )
65 if (
self.settings.disablefiring !==
true )
67 self EnableAimAssist();
71 self.noCybercom =
true;
80 if( IsDefined( level.vehicle_initializer_cb ) )
82 [[level.vehicle_initializer_cb]]( self );
85 self.ignoreFireFly =
true;
86 self.ignoreDecoy =
true;
127 self endon(
"death" );
129 owner =
self GetVehicleOwner();
130 if ( isdefined( owner ) )
132 self waittill(
"exit_vehicle" );
135 self SetTurretSpinning(
false );
138 params.death_type =
"default";
141 self playsound(
"veh_sentry_turret_dmg_hit");
142 self.turretRotScale = 2;
154 if ( !isdefined(
self.enemy ) || !
self VehSeenRecently(
self.enemy, 1.5 ) )
164 self endon(
"death" );
165 self endon(
"change_state" );
171 self playsound (
"mpl_turret_startup");
172 self ClearTargetEntity();
176 rotScale =
self.settings.scanning_speedscale;
177 if ( !isdefined( rotScale ) )
181 self.turretRotScale = rotScale;
183 scanning_arc =
self.settings.scanning_arc;
184 if ( !isdefined( scanning_arc ) )
188 limits =
self GetTurretLimitsYaw();
189 scanning_arc = min( scanning_arc, limits[0] - 0.1 );
190 scanning_arc = min( scanning_arc, limits[1] - 0.1 );
192 if ( scanning_arc > 179 )
194 if (
self.turretontarget )
197 if ( relativeAngle > 180 )
199 relativeAngle -= 360;
202 scanning_arc = relativeAngle;
206 if (
self.turretontarget )
208 turret_left = !turret_left;
217 scanning_pitch =
self.settings.scanning_pitch;
218 if ( !isdefined( scanning_pitch ) )
222 self SetTurretTargetRelativeAngles( ( scanning_pitch, scanning_arc, 0 ) );
235 if ( isdefined(
self.enemy ) && isAlive(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
245 self endon(
"death" );
246 self endon(
"change_state" );
248 if( isdefined(
self.enemy ) )
256 if( isdefined(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
258 self.turretRotScale = 1;
260 if ( isdefined(
self.enemy ) &&
self HasPart(
"tag_minigun_spin" ) )
262 self SetTurretTargetEnt(
self.enemy );
263 self SetTurretSpinning(
true );
267 for( i = 0; i < 3; i++ )
269 if( isdefined(
self.enemy ) && IsAlive(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
271 self SetTurretTargetEnt(
self.enemy );
273 waitTime = RandomFloatRange( 0.4, 1.5 );
274 if (
self.settings.disablefiring !==
true )
284 if( isdefined(
self.enemy ) && IsPlayer(
self.enemy ) )
285 wait RandomFloatRange( 0.3, 0.6 );
287 wait RandomFloatRange( 0.3, 0.6 ) * 2;
290 self SetTurretSpinning(
false );
292 if( isdefined(
self.enemy ) && IsAlive(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
294 if( IsPlayer(
self.enemy ) )
295 wait RandomFloatRange( 0.5, 1.3 );
297 wait RandomFloatRange( 0.5, 1.3 ) * 2;
308 self SetTurretSpinning(
false );
313 self endon(
"death" );
314 self endon(
"change_state" );
319 weapon =
self SeatGetWeapon( 0 );
320 fireTime = weapon.fireTime;
324 if ( IsSubStr( weapon.name,
"minigun" ) )
327 self SetTurretSpinning(
true );
331 while( time < totalFireTime )
333 self FireWeapon(0, enemy);
341 self SetTurretSpinning(
false );
353 self.turretRotScale = 0.5;
361 self.turretRotScale = 1.0;
362 self playsound (
"mpl_turret_startup");
367 if ( !isdefined( resting_pitch ) )
369 resting_pitch =
self.settings.resting_pitch;
372 if ( !isdefined( resting_pitch ) )
377 angles =
self GetTagAngles(
"tag_turret" ) -
self.angles;
379 self SetTurretTargetRelativeAngles( ( resting_pitch, angles[1], 0 ) );
389 PlaySoundAtPosition(
"veh_sentry_turret_emp_down",
self.origin );
390 self.turretRotScale = 0.5;
393 params.laserOn = IsLaserOn(
self );
398 if ( !isdefined(
self.abnormal_status ) )
400 self.abnormal_status = spawnStruct();
403 self.abnormal_status.emped =
true;
404 self.abnormal_status.attacker = params.notify_param[1];
405 self.abnormal_status.inflictor = params.notify_param[2];
412 self endon (
"death");
413 self endon (
"change_state");
415 time = params.notify_param[0];
416 assert( isdefined( time ) );
425 self.abnormal_status.emped =
false;
438 self.turretRotScale = 1.0;
439 self playsound (
"mpl_turret_startup");
448 self.turretRotScale = 1;
454 if ( isdefined( eAttacker ) && isdefined( sMeansOfDeath ) && sMeansOfDeath ==
"MOD_EXPLOSIVE" )
462 function turretCallback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
464 iDamage =
vehicle_ai::shared_callback_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
472 self playsound (
"veh_turret_alert");
477 if ( !isdefined(
self.sndloop_ent ) )
479 self.sndloop_ent =
Spawn(
"script_origin",
self.origin);
480 self.sndloop_ent linkto (
self);
481 self.sndloop_ent PlayLoopSound (
"veh_turret_idle");
487 self endon(
"death" );
489 if ( isdefined(
self.sndloop_ent ) )
491 self.sndloop_ent stoploopsound( .5 );
493 self.sndloop_ent
delete();