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\util_shared;
7 #using scripts\shared\vehicle_shared;
8 #using scripts\shared\vehicle_ai_shared;
9 #using scripts\shared\flag_shared;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\statemachine.gsh;
14 #insert scripts\shared\ai\utility.gsh;
16 #define TURRET_HUD_MARKED_TARGET "hud_proto_rts_secure_target"
17 #define TURRET_HUD_ELEM_CONSTANT_SIZE true
19 #precache( "material", TURRET_HUD_MARKED_TARGET );
21 #namespace turret_gadget_deploy;
32 self.power_callback = power_callback;
33 self.cutoff_power = cutoff_power;
34 self.resume_power = resume_power;
36 self DisableAimAssist();
51 if ( isdefined(
self.script_startstate ) )
53 if(
self.script_startstate ==
"off" )
74 self.goalpos =
self.origin;
82 self DisableAimAssist();
95 if(!isdefined(angles))
96 angles =
self GetTagAngles(
"tag_flash" );
98 target_vec =
self.origin + AnglesToForward( ( 0, angles[1], 0 ) ) * 1000;
99 target_vec = target_vec + ( 0, 0, -1700 );
100 self SetTargetOrigin( target_vec );
102 if( !isdefined(
self.
emped ) )
104 self DisableAimAssist();
111 self EnableAimAssist();
115 self.off = undefined;
122 self endon(
"death" );
123 self endon(
"change_state" );
127 no_target_delay = 0.05;
129 self.n_burstCountMin = 1;
130 self.n_burstCountMax = 2;
131 self.n_burstWaitTime = 1.5;
137 if ( IsDefined(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
139 if ( IsDefined(
self.enemy ) && DistanceSquared(
self.enemy.origin,
self.origin ) < max_range * max_range )
141 self SetTurretTargetEnt(
self.enemy );
142 self SetLookAtEnt(
self.enemy);
144 self ClearLookAtEnt();
147 wait (
self.n_burstWaitTime );
151 wait no_target_delay;
160 if ( IsDefined(
self.power_callback ) )
162 if ( IsDefined(
self.owner) )
163 power =
self.owner [[
self.power_callback]](
self,0);
167 if ( power > min_power )
175 self playsound (
"veh_cic_turret_boot");
180 self playsound (
"veh_turret_alert");
185 self playloopsound(
"veh_turret_servo" , .05 );
190 if( isdefined(
self.enemy ) && IsAlive(
self.enemy) &&
self VehCanSee(
self.enemy ) && !
IS_TRUE(
self.enemy.ignoreme) )
196 #define TURRET_BOOT_TIME GetDvarFloat("scr_turret_boot_timer")
197 #define TURRET_LOCK_TIME GetDvarFloat("scr_turret_lock_timer")
198 #define TURRET_BURST_MIN_DURATION GetDvarFloat("scr_turret_burst_min_duration")
199 #define TURRET_BURST_MAX_DURATION GetDvarFloat("scr_turret_burst_max_duration")
200 #define TURRET_BURST_MIN_DELAY GetDvarFloat("scr_turret_burst_min_delay")
201 #define TURRET_BURST_MAX_DELAY GetDvarFloat("scr_turret_burst_max_delay")
202 #define TURRET_BURST_MIN_DELAY_LONG GetDvarFloat("scr_turret_burst_min_delay_long")
203 #define TURRET_BURST_MAX_DELAY_LONG GetDvarFloat("scr_turret_burst_max_delay_long")
204 #define TURRET_ROT_SCALE_IDLE GetDvarFloat("scr_turret_rot_scale_idle")
205 #define TURRET_ROT_SCALE_COMBAT GetDvarFloat("scr_turret_rot_scale_combat")
209 self endon(
"death" );
210 self endon(
"change_state" );
212 cant_see_enemy_count = 0;
221 origin =
self GetTagOrigin(
"tag_barrel" );
223 if (!IsDefined(origin))
224 origin =
self.origin;
226 left_look_at_pt = origin + AnglesToForward(
self.angles + (
self.default_pitch,
self.scanning_arc, 0) ) * 1000;
227 right_look_at_pt = origin + AnglesToForward(
self.angles + (
self.default_pitch, -
self.scanning_arc, 0) ) * 1000;
228 powerless_look_at_pt = origin + AnglesToForward(
self.angles + (15.0, 0, 0) ) * 1000;
230 self.min_power =
self.cutoff_power;
236 self.min_power =
self.resume_power;
237 self SetTurretTargetVec( powerless_look_at_pt );
242 self.min_power =
self.cutoff_power;
246 if( ( cant_see_enemy_count > 0 || !
IS_EQUAL(
self.last_enemy,
self.enemy) ) && IsPlayer(
self.enemy ) )
251 self.last_enemy =
self.enemy;
254 cant_see_enemy_count = 0;
256 for( i = 0; i < 3; i++ )
260 self SetTurretTargetEnt(
self.enemy );
275 self ClearTargetEntity();
279 if( isdefined(
self.enemy ) && IsPlayer(
self.enemy ) )
287 if( IsPlayer(
self.enemy ) )
295 self.min_power =
self.cutoff_power;
298 cant_see_enemy_count++;
302 if( cant_see_enemy_count > 1 )
304 self.turret_state = 0;
305 while( !isdefined(
self.enemy ) || !(
self VehCanSee(
self.enemy )) )
307 if(
self.turretontarget )
310 if(
self.turret_state > 1 )
311 self.turret_state = 0;
313 if(
self.turret_state == 0 )
314 self SetTurretTargetVec( left_look_at_pt );
316 self SetTurretTargetVec( right_look_at_pt );
323 self ClearTargetEntity();
335 hud_marked_target = NewHudElem();
337 hud_marked_target.horzAlign =
"right";
338 hud_marked_target.vertAlign =
"middle";
340 hud_marked_target.sort = 2;
342 hud_marked_target.hidewheninmenu =
true;
343 hud_marked_target.immunetodemogamehudsettings =
true;
347 while ( isdefined(
self ) )
349 if ( isdefined(
self.enemy ) )
351 hud_marked_target.alpha = 1;
353 hud_marked_target.x =
self.enemy.origin[0];
354 hud_marked_target.y =
self.enemy.origin[1];
355 hud_marked_target.z =
self.enemy.origin[2] + Z_OFFSET;
363 hud_marked_target.alpha = 0;
369 hud_marked_target Destroy();
375 driver =
self GetSeatOccupant( 0 );
376 if( isdefined(driver) )
378 self.turretRotScale = 1;
379 self DisableAimAssist();
382 self ClearTargetEntity();
387 self endon(
"crash_done" );
388 self endon(
"death" );
390 if( isdefined(
self.
emped ) )
393 weapon =
self SeatGetWeapon( 0 );
394 fireTime = weapon.fireTime;
401 if ( IsDefined(
self.power_callback ) )
403 power =
self.owner [[
self.power_callback]](
self,0.0);
406 while( time < totalFireTime && !isdefined(
self.
emped ) && power > 0)
408 if ( IsDefined(
self.power_callback ) )
410 power =
self.owner [[
self.power_callback]](
self,fireTime/totalFireTime);
412 if( !
IS_EQUAL(
self.last_enemy,
self.enemy) && IsPlayer(
self.enemy ) )
416 self.last_enemy =
self.enemy;
427 self endon(
"death" );
428 self notify(
"emped" );
429 self endon(
"emped" );
432 PlaySoundAtPosition(
"veh_cic_turret_emp_down",
self.origin );
433 self.turretRotScale = 0.2;
435 if( !isdefined(
self.stun_fx) )
437 self.stun_fx =
Spawn(
"script_model",
self.origin );
438 self.stun_fx SetModel(
"tag_origin" );
439 self.stun_fx LinkTo(
self,
"tag_fx", (0,0,0), (0,0,0) );
440 if( isSubStr(
self.vehicletype,
"turret_sentry") )
441 PlayFXOnTag( level._effect[
"sentry_turret_stun" ],
self.stun_fx,
"tag_origin" );
443 PlayFXOnTag( level._effect[
"cic_turret_stun" ],
self.stun_fx,
"tag_origin" );
446 wait RandomFloatRange( 6, 10 );
448 self.stun_fx
delete();
450 self.emped = undefined;
454 function TurretCallback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName )
456 driver =
self GetSeatOccupant( 0 );
458 if( weapon.isEmp && sMeansOfDeath !=
"MOD_IMPACT" )
460 if( !isdefined( driver ) )
462 if( !isdefined(
self.off ) )
468 if ( IsDefined(
self.dt_damage_callback) )
470 self thread [[
self.dt_damage_callback]]();