1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\filter_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\shared\vehicle_shared;
9 #using scripts\shared\archetype_shared\archetype_shared;
10 #using scripts\shared\beam_shared;
12 #using scripts\shared\postfx_shared;
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\shared\version.gsh;
16 #insert scripts\shared\vehicles\_sentinel_drone.gsh;
18 #namespace sentinel_drone;
20 #using_animtree( "generic" );
22 #define SENTINEL_DRONE_CLAW_RIGHT_FX_TAG "tag_fx1"
23 #define SENTINEL_DRONE_CLAW_LEFT_FX_TAG "tag_fx2"
24 #define SENTINEL_DRONE_CLAW_TOP_FX_TAG "tag_fx3"
25 #define SENTINEL_DRONE_CAMERA_FX_TAG "tag_flash"
27 #define SENTINEL_DRONE_ENGINE_FX_TAG "tag_fx_engine_left"
29 #define SENTINEL_DRONE_BEAM "electric_taser_beam_1"
30 #define SENTINEL_DRONE_BEAM_TARGET_FX "dlc3/stalingrad/fx_sentinel_drone_taser_fire_tgt"
32 #define SENTINEL_DRONE_CLAWS_AMBIENT_FX "dlc3/stalingrad/fx_sentinel_drone_taser_idle"
33 #define SENTINEL_DRONE_CLAWS_CHARGING_FX "dlc3/stalingrad/fx_sentinel_drone_taser_charging"
34 #define SENTINEL_DRONE_CAMERA_AMBIENT_FX "dlc3/stalingrad/fx_sentinel_drone_eye_camera_lens_glow"
35 #define SENTINEL_DRONE_CORE_GLOW_FX "dlc3/stalingrad/fx_sentinel_drone_energy_core_glow"
36 #define SENTINEL_DRONE_SCANNER_LIGHT_FX "dlc3/stalingrad/fx_sentinel_drone_scanner_light_glow"
38 #define SENTINEL_DRONE_FACE_BREAK_FX "dlc3/stalingrad/fx_sentinel_drone_dest_core"
39 #define SENTINEL_DRONE_ARM_BREAK_FX "dlc3/stalingrad/fx_sentinel_drone_dest_arm"
40 #define SENTINEL_DRONE_EYE_BREAK_FX "dlc3/stalingrad/fx_sentinel_drone_dest_camera_eye"
42 #define SENTINEL_DRONE_ENGINE_FX "dlc3/stalingrad/fx_sentinel_drone_engine_idle"
43 #define SENTINEL_DRONE_ENGINE_ROLL_FX "dlc3/stalingrad/fx_sentinel_drone_engine_smk_fast"
45 #define SENTINEL_DRONE_PLAYER_DAMAGE_FX "sentinel_pstfx_shock_charge"
48 #precache( "client_fx", SENTINEL_DRONE_BEAM );
49 #precache( "client_fx", SENTINEL_DRONE_BEAM_TARGET_FX );
51 #precache( "client_fx", SENTINEL_DRONE_CLAWS_AMBIENT_FX );
52 #precache( "client_fx", SENTINEL_DRONE_CLAWS_CHARGING_FX );
53 #precache( "client_fx", SENTINEL_DRONE_CAMERA_AMBIENT_FX );
54 #precache( "client_fx", SENTINEL_DRONE_CORE_GLOW_FX );
55 #precache( "client_fx", SENTINEL_DRONE_SCANNER_LIGHT_FX );
57 #precache( "client_fx", SENTINEL_DRONE_FACE_BREAK_FX );
58 #precache( "client_fx", SENTINEL_DRONE_ARM_BREAK_FX );
59 #precache( "client_fx", SENTINEL_DRONE_EYE_BREAK_FX );
61 #precache( "client_fx", SENTINEL_DRONE_ENGINE_FX );
62 #precache( "client_fx", SENTINEL_DRONE_ENGINE_ROLL_FX );
65 #precache( "client_fx", SENTINEL_DRONE_FACE_MODEL );
66 #precache( "client_fx", SENTINEL_DRONE_ARM_MODEL );
67 #precache( "client_fx", SENTINEL_DRONE_CLAW_MODEL );
98 level._sentinel_Enemy_Detected_Taunts = [];
99 ARRAY_ADD(level._sentinel_Enemy_Detected_Taunts,
"vox_valk_valkyrie_detected_0");
100 ARRAY_ADD(level._sentinel_Enemy_Detected_Taunts,
"vox_valk_valkyrie_detected_1");
101 ARRAY_ADD(level._sentinel_Enemy_Detected_Taunts,
"vox_valk_valkyrie_detected_2");
102 ARRAY_ADD(level._sentinel_Enemy_Detected_Taunts,
"vox_valk_valkyrie_detected_3");
103 ARRAY_ADD(level._sentinel_Enemy_Detected_Taunts,
"vox_valk_valkyrie_detected_4");
105 level._sentinel_Attack_Taunts = [];
106 ARRAY_ADD(level._sentinel_Attack_Taunts,
"vox_valk_valkyrie_attack_0");
107 ARRAY_ADD(level._sentinel_Attack_Taunts,
"vox_valk_valkyrie_attack_1");
108 ARRAY_ADD(level._sentinel_Attack_Taunts,
"vox_valk_valkyrie_attack_2");
109 ARRAY_ADD(level._sentinel_Attack_Taunts,
"vox_valk_valkyrie_attack_3");
110 ARRAY_ADD(level._sentinel_Attack_Taunts,
"vox_valk_valkyrie_attack_4");
115 if(!
IS_TRUE(b_check_for_target_existance_only) )
122 if( (!
self HasDObj( localClientNum )) )
131 source_num =
self GetEntityNumber();
133 if( isdefined(level.sentinel_drone_source_to_target) && isdefined(level.sentinel_drone_source_to_target[source_num]) && isdefined(level.sentinel_drone_target_id) && isdefined(level.sentinel_drone_target_id[level.sentinel_drone_source_to_target[source_num]]) )
144 localPlayer = GetLocalPlayer( localClientNum );
146 if(isdefined(localPlayer))
156 if( isdefined( settings ) )
160 handle = PlayFX( localClientNum, settings.drone_secondary_death_fx_1,
self.origin );
161 SetFXIgnorePause( localClientNum, handle,
true );
164 if(isdefined(
self.beam_target_fx) && isdefined(
self.beam_target_fx[localClientNum]))
166 StopFX(localClientNum,
self.beam_target_fx[localClientNum]);
167 self.beam_target_fx[localClientNum] = undefined;
182 if(!isdefined(
self.CameraScannerFX) && !
IS_TRUE(
self.CameraDestroyed) )
194 keep_scanner_on = GetDvarInt(
"sentinel_DebugFX_KeepScannerOn", 0);
197 if( isdefined(
self.CameraScannerFX) && !
IS_TRUE(keep_scanner_on))
199 StopFX(localClientNum,
self.CameraScannerFX);
200 self.CameraScannerFX = undefined;
210 self.CameraDestroyed =
true;
212 if( isdefined(
self.CameraScannerFX) )
214 StopFX(localClientNum,
self.CameraScannerFX);
215 self.CameraScannerFX = undefined;
218 if(isdefined(
self.CameraAmbientFX))
220 StopFX(localClientNum,
self.CameraAmbientFX);
221 self.CameraAmbientFX = undefined;
244 source_num =
self GetEntityNumber();
245 beam_target = level.sentinel_drone_target_id[level.sentinel_drone_source_to_target[source_num]];
256 self playsound(0,
"zmb_sentinel_attack_short" );
259 if(!isdefined(beam_target.beam_target_fx))
261 beam_target.beam_target_fx = [];
264 if(!isdefined(beam_target.beam_target_fx[localClientNum]))
271 keep_scanner_on = GetDvarInt(
"sentinel_DebugFX_KeepScannerOn", 0);
274 if( isdefined(
self.CameraScannerFX) && !
IS_TRUE(keep_scanner_on))
276 StopFX(localClientNum,
self.CameraScannerFX);
277 self.CameraScannerFX = undefined;
285 if(isdefined(beam_target.beam_target_fx) && isdefined(beam_target.beam_target_fx[localClientNum]))
287 StopFX(localClientNum, beam_target.beam_target_fx[localClientNum]);
288 beam_target.beam_target_fx[localClientNum] = undefined;
298 if(!isdefined(level.sentinel_drone_target_id))
300 level.sentinel_drone_target_id = [];
303 level.sentinel_drone_target_id[ newVal ] =
self;
308 if(!isdefined(level.sentinel_drone_source_to_target))
310 level.sentinel_drone_source_to_target = [];
313 source_num =
self GetEntityNumber();
314 level.sentinel_drone_source_to_target[source_num] = newVal;
331 self UseAnimTree( #animtree );
332 self SetAnim(
"ai_zm_dlc3_sentinel_antenna_twitch");
357 velocity =
self GetVelocity();
358 velocity_normal = VectorNormalize(velocity);
359 velocity_length = Length(velocity);
363 launch_dir = AnglesToForward(
self.angles) * -1;
364 launch_dir = launch_dir + ( 0, 0, 1);
365 launch_dir = VectorNormalize( launch_dir );
369 launch_dir = AnglesToRight(
self.angles);
373 launch_dir = AnglesToRight(
self.angles) * -1;
376 velocity_length = velocity_length * 0.1;
378 if(velocity_length < 10)
380 velocity_length = 10;
383 launch_dir = launch_dir * 0.5 + velocity_normal * 0.5;
384 launch_dir = launch_dir * velocity_length;
386 claw_pos =
self GetTagOrigin( claw_tag ) + launch_dir * 3;
387 claw_ang =
self GetTagAngles( claw_tag );
388 thread
sentinel_launch_piece( localClientNum, SENTINEL_DRONE_CLAW_MODEL, claw_pos, claw_ang,
self.origin, launch_dir * 1.3 );
390 arm_pos =
self GetTagOrigin( arm_tag ) + launch_dir * 2;
391 arm_ang =
self GetTagAngles( arm_tag );
406 self.rightArmLost =
true;
409 if(isdefined(
self.rightClawAmbientFX))
411 StopFX(localClientNum,
self.rightClawAmbientFX);
412 self.rightClawAmbientFX = undefined;
415 if(isdefined(
self.rightClawChargeFX))
417 StopFX(localClientNum,
self.rightClawChargeFX);
418 self.rightClawChargeFX = undefined;
427 self SetAnim(
"ai_zm_dlc3_sentinel_arms_broken_right");
440 self.leftArmLost =
true;
443 if(isdefined(
self.leftClawAmbientFX))
445 StopFX(localClientNum,
self.leftClawAmbientFX);
446 self.leftClawAmbientFX = undefined;
449 if(isdefined(
self.leftClawChargeFX))
451 StopFX(localClientNum,
self.leftClawChargeFX);
452 self.leftClawChargeFX = undefined;
461 self SetAnim(
"ai_zm_dlc3_sentinel_arms_broken_left");
474 self.topArmLost =
true;
477 if(isdefined(
self.topClawAmbientFX))
479 StopFX(localClientNum,
self.topClawAmbientFX);
480 self.topClawAmbientFX = undefined;
483 if(isdefined(
self.topClawChargeFX))
485 StopFX(localClientNum,
self.topClawChargeFX);
486 self.topClawChargeFX = undefined;
495 self SetAnim(
"ai_zm_dlc3_sentinel_arms_broken_top");
511 if(!isdefined(
self.CameraScannerFX))
534 if( isdefined(
self.enemy_already_spotted) )
536 if( RandomInt(100) < 30 )
543 self.enemy_already_spotted =
true;
549 if(isdefined(
self.rightClawChargeFX))
551 StopFX(localClientNum,
self.rightClawChargeFX);
552 self.rightClawChargeFX = undefined;
555 if(isdefined(
self.leftClawChargeFX))
557 StopFX(localClientNum,
self.leftClawChargeFX);
558 self.leftClawChargeFX = undefined;
561 if(isdefined(
self.topClawChargeFX))
563 StopFX(localClientNum,
self.topClawChargeFX);
564 self.topClawChargeFX = undefined;
578 velocity =
self GetVelocity();
580 velocity_normal = VectorNormalize(velocity);
581 velocity_length = Length(velocity);
583 launch_dir = AnglesToForward(
self.angles);
585 velocity_length = velocity_length * 0.1;
587 if(velocity_length < 10)
589 velocity_length = 10;
592 launch_dir = launch_dir * 0.5 + velocity_normal * 0.5;
593 launch_dir = launch_dir * velocity_length;
611 if(!
IS_TRUE(
self.rightArmLost) && !isdefined(
self.rightClawAmbientFX) )
616 if(!
IS_TRUE(
self.leftArmLost) && !isdefined(
self.leftClawAmbientFX) )
621 if(!
IS_TRUE(
self.topArmLost) && !isdefined(
self.topClawAmbientFX) )
628 if( isdefined(
self.rightClawAmbientFX) )
630 StopFX(localClientNum,
self.rightClawAmbientFX);
631 self.rightClawAmbientFX = undefined;
634 if( isdefined(
self.leftClawAmbientFX) )
636 StopFX(localClientNum,
self.leftClawAmbientFX);
637 self.leftClawAmbientFX = undefined;
640 if( isdefined(
self.topClawAmbientFX) )
642 StopFX(localClientNum,
self.topClawAmbientFX);
643 self.topClawAmbientFX = undefined;
660 else if( isdefined(
self.EngineFX) )
662 StopFX(localclientnum,
self.EngineFX);
671 else if( isdefined(
self.EngineRollFX) )
673 StopFX(localclientnum,
self.EngineRollFX);
679 if ( isdefined( level._lastplayed_drone_taunt ) && ( GetTime() - level._lastplayed_drone_taunt ) < 6000 )
684 if(
IS_TRUE( level.voxAIdeactivate ) )
689 taunt = RandomInt(taunt_Arr.size);
691 level._lastplayed_drone_taunt = GetTime();
692 self PlaySound( localClientNum, taunt_Arr[taunt]);
697 dynEnt = CreateDynEntAndLaunch( localClientNum, model, pos, angles,
hitPos, force );
699 if(!isdefined(dynEnt))
708 if( !isdefined(dynEnt) || !IsDynEntValid(dynEnt) )
713 if( dynEnt.origin == pos )
715 SetDynEntEnabled(dynEnt,
false);
723 if( !isdefined(dynEnt) || !IsDynEntValid(dynEnt) )
728 if( dynEnt.origin == pos )
730 SetDynEntEnabled(dynEnt,
false);
736 if( !isdefined(dynEnt) || !IsDynEntValid(dynEnt) )
742 old_pos = dynEnt.origin;
744 while( isdefined(dynEnt) && IsDynEntValid(dynEnt) )
746 if( old_pos == dynEnt.origin)
748 old_pos = dynEnt.origin;
753 if( posHeight - dynEnt.origin[2] < 15)
755 SetDynEntEnabled(dynEnt,
false);