1 #using scripts\codescripts\struct;
3 #using scripts\shared\ai\systems\gib;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\challenges_shared;
6 #using scripts\shared\clientfield_shared;
7 #using scripts\shared\killcam_shared;
8 #using scripts\shared\scoreevents_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\util_shared;
11 #using scripts\shared\visionset_mgr_shared;
12 #using scripts\shared\weapons\_weaponobjects;
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\shared\version.gsh;
17 #insert scripts\shared\weapons\_hive_gun.gsh;
21 #precache( "fx", "weapon/fx_hero_firefly_blood_os" );
22 #precache( "fx", "weapon/fx_hero_firefly_sparks_os" );
23 #precache( "fx", "weapon/fx_hero_chem_gun_blob_death" );
24 #precache( "fx", "weapon/fx_hero_firefly_start" );
29 level.firefly_pod_weapon = GetWeapon(
"hero_chemicalgelgun");
30 level.firefly_pod_secondary_explosion_weapon = GetWeapon(
"hive_gungun_secondary_explosion");
32 level.firefly_debug = GetDvarInt(
"scr_firefly_debug", 0 );
33 level.firefly_pod_detection_radius = GetDvarInt(
"scr_fireflyPodDetectionRadius", 150 );
34 level.firefly_pod_grace_period = GetDvarFloat(
"scr_fireflyPodGracePeriod", 0 );
35 level.firefly_pod_activation_time = GetDvarFloat(
"scr_fireflyPodActivationTime", 1 );
36 level.firefly_pod_partial_move_percent = GetDvarFloat(
"scr_fireflyPartialMovePercent", 0.8 );
38 if ( !IsDefined( level.vsmgr_prio_overlay_gel_splat ) )
40 level.vsmgr_prio_overlay_gel_splat = 21;
44 level.fireflies_spawn_height = getDvarInt(
"betty_jump_height_onground", 55 );
45 level.fireflies_spawn_height_wall = getDvarInt(
"betty_jump_height_wall", 20 );
46 level.fireflies_spawn_height_wall_angle = getDvarInt(
"betty_onground_angle_threshold", 30 );
47 level.fireflies_spawn_height_wall_angle_cos = cos( level.fireflies_spawn_height_wall_angle );
48 level.fireflies_emit_time = getDvarFloat(
"scr_firefly_emit_time", 0.2 );
49 level.fireflies_min_speed = getDvarInt(
"scr_firefly_min_speed", 400 );
50 level.fireflies_attack_speed_scale = getDvarFloat(
"scr_firefly_attack_attack_speed_scale", 1.75 );
51 level.fireflies_collision_check_interval = getDvarFloat(
"scr_firefly_collision_check_interval", 0.2 );
55 level thread
register();
68 level.fireflies_min_speed = getDvarInt(
"scr_firefly_speed", 250 );
69 level.fireflies_attack_speed_scale = getDvarFloat(
"scr_firefly_attack_attack_speed_scale", 1.15 );
70 level.firefly_debug = GetDvarInt(
"scr_firefly_debug", 0 );
85 watcher.watchForFire =
true;
86 watcher.hackable =
false;
87 watcher.headIcon =
false;
88 watcher.activateFx =
true;
89 watcher.ownerGetsAssist =
true;
90 watcher.ignoreDirection =
true;
91 watcher.immediateDetonation =
true;
92 watcher.detectionGracePeriod = level.firefly_pod_grace_period;
93 watcher.detonateRadius = level.firefly_pod_detection_radius;
97 watcher.activationDelay = level.firefly_pod_activation_time;
98 watcher.activateSound =
"wpn_gelgun_blob_burst";
100 watcher.deleteOnPlayerSpawn =
true;
101 watcher.timeOut = getDvarFloat(
"scr_firefly_pod_timeout", 0 );
102 watcher.ignoreVehicles =
false;
103 watcher.ignoreAI =
false;
115 self playloopsound(
"wpn_gelgun_blob_alert_lp", 1 );
118 self waittill(
"stationary");
120 self SetModel(
"wpn_t7_hero_chemgun_residue3_grn" );
121 self SetEnemyModel(
"wpn_t7_hero_chemgun_residue3_org" );
127 If ( IsGodMode(
self ) )
142 self endon(
"disconnect" );
144 self waittill(
"death" );
153 if (
"MOD_GRENADE" != meansOfDeath &&
"MOD_GRENADE_SPLASH" != meansOfDeath )
173 firefly_mover =
spawn(
"script_model",
self.origin );
174 firefly_mover.angles =
self.angles;
175 firefly_mover SetModel(
"tag_origin" );
177 firefly_mover.owner =
self.owner;
178 firefly_mover.killCamOffset = ( 0, 0, GetDvarFloat(
"scr_fireflies_start_height", 8.0 ) );
180 firefly_mover.weapon = GetWeapon(
"hero_firefly_swarm");
181 firefly_mover.takedamage =
true;
182 firefly_mover.soundMod =
"firefly";
183 firefly_mover.team =
self.team;
185 killcamEnt =
spawn(
"script_model", firefly_mover.origin + firefly_mover.killCamOffset );
186 killcamEnt.angles = ( 0,0,0 );
187 killcamEnt SetModel(
"tag_origin" );
188 killcamEnt SetWeapon( firefly_mover.weapon );
193 firefly_mover.killcamEnt = killcamEnt;
195 self.firefly_mover = firefly_mover;
197 firefly_mover.debug_time = 1;
207 self waittill (
"damage",
damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
219 if ( isdefined(
self.firefly_mover ))
221 if ( isdefined(
self.firefly_mover.killcamEnt ) )
223 self.firefly_mover.killcamEnt
delete();
225 self.firefly_mover
delete();
235 if ( !isdefined( target ) || !isdefined( target.team ) || !isdefined(
self.team ) ||
self.team == target.team )
237 if ( IsDefined( weapon ) && weapon.isValid )
239 if ( isdefined( attacker ) )
269 fx_ent = PlayFX(
"weapon/fx_hero_chem_gun_blob_death",
self.origin );
272 PlaySoundAtPosition (
"wpn_gelgun_blob_destroy",
self.origin );
274 if ( isdefined(
self.trigger ) )
276 self.trigger
delete();
290 if ( !IsDefined(
self.killcamEnt ) )
297 self.killCamEnt MoveTo( position, time, accel, decel );
306 self notify(
"stop_killcam");
307 if ( IsDefined(
self.killcamEnt ) )
309 self.killcamEnt MoveTo(
self.killcamEnt.origin, 0.1, 0, 0);
323 self MoveTo( position, time, accel, decel );
324 self waittill(
"movedone" );
334 self endon(
"stop_killcam");
338 self MoveTo( position, time, accel, decel );
340 wait( time * percent );
341 self notify(
"movedone");
352 self RotateTo( angles, time, 0, 0 );
353 self waittill(
"rotatedone" );
363 self endon(
"movedone");
365 original_position =
self.origin;
366 dir = VectorNormalize(move_to -
self.origin);
367 dist = Distance(
self.origin, move_to );
370 delta = dir * ( speed * level.fireflies_collision_check_interval );
378 self playsound(
"wpn_gelgun_hive_wall_impact" );
380 wait( level.fireflies_collision_check_interval );
390 angles = ( 0, degrees, 0 );
391 forward = ( radius, 0, 0);
393 point = RotatePoint( forward, angles );
395 return self.spawn_origin + point + ( 0, 0, height );
404 return firefly_pod_rotated_point( RandomInt(359), RandomInt( level.fireflies_radius ), RandomIntRange( -level.fireflies_height_variance, level.fireflies_height_variance ) );
414 self endon(
"attacking");
420 delta = point -
self.origin;
421 angles = VectorToAngles(delta);
424 dist = Length( delta );
430 time = dist / level.fireflies_min_speed;
434 wait( RandomFloatRange( 0.1, 0.7 ) );
445 self endon(
"attacking");
447 current_degrees = RandomInt(
int(360 / degrees) ) * degrees;
454 delta = point -
self.origin;
455 angles = ( 0, current_degrees, 0 );
458 dist = Length( delta );
464 time = dist / level.fireflies_min_speed;
468 wait( RandomFloatRange( 0.1, 0.3 ) );
470 current_degrees = ( current_degrees + ( degrees *
increment ) ) % 360;
480 level endon(
"game_ended");
483 target endon(
"disconnect");
484 target endon(
"death");
485 target endon (
"entering_last_stand" );
489 weapon =
self.weapon;
490 target playsound(
"wpn_gelgun_hive_attack" );
491 target notify(
"snd_burn_scream" );
496 if ( !isplayer(target) )
499 while( remaining_hits > 0 )
501 wait( damage_delay );
502 target DoDamage(
damage,
self.origin,
self.owner,
self,
"",
"MOD_IMPACT", 0, weapon );
506 if ( IsAlive( target ) && IsPlayer( target ) )
508 bodyType = target GetCharacterBodyType();
511 bodyTypeFields = GetCharacterFields( bodyType, CurrentSessionMode() );
512 if(
VAL( bodyTypeFields.digitalBlood,
false ) )
514 PlayFXOnTag(
"weapon/fx_hero_firefly_sparks_os", target,
"J_SpineLower");
518 PlayFXOnTag(
"weapon/fx_hero_firefly_blood_os", target,
"J_SpineLower");
523 PlayFXOnTag(
"weapon/fx_hero_firefly_blood_os", target,
"J_SpineLower");
526 else if ( !IsPlayer( target ) )
528 PlayFXOnTag(
"weapon/fx_hero_firefly_sparks_os", target,
"tag_origin");
541 if ( IsAlive( target ) )
546 if( IsPlayer( target ) )
563 level waittill(
"game_ended");
565 if ( IsAlive( target ) && IsPlayer( target ) )
581 println(
"firefly_death " +
self getentnum() );
584 self playsound(
"wpn_gelgun_hive_die" );
586 if ( IsDefined(
self.target_entity ) && isPlayer(
self.target_entity ) )
595 if ( isdefined(
self ) )
598 println(
"firefly_death deleting " +
self getentnum() );
608 if ( isdefined( killcamEnt ) )
616 velocity = target GetVelocity();
617 speed = Length( velocity ) * level.fireflies_attack_speed_scale;
619 if ( speed < level.fireflies_min_speed )
621 speed = level.fireflies_min_speed;
633 level endon(
"game_ended");
635 target endon (
"entering_last_stand" );
640 if( IsPlayer( target ) )
645 target_origin = target.origin + (0,0,50);
647 delta =
self.origin - target_origin;
648 dist = Length( delta );
659 self LinkTo( target );
663 if ( !IsAlive(target) )
673 if( IsPlayer( target ) )
675 stance = target GetStance();
676 if ( stance ==
"crouch" )
678 else if ( stance ==
"prone" )
682 return target.origin + (0,0,height);
689 self endon(
"attack");
694 previous_crumb =
self.origin;
696 for( i = 0; i <
self.target_breadcrumbs.size; i++ )
699 if ( (
self.target_breadcrumb_current_index + i) >
self.target_breadcrumb_last_added )
702 crumb_index = (
self.target_breadcrumb_current_index + i) %
self.target_breadcrumbs.size;
703 crumb =
self.target_breadcrumbs[crumb_index ];
705 sphere( crumb, 2, (0,1,0), 1,
true, 10,
self.debug_time );
708 line(previous_crumb, crumb, (0,1,0), 1.0,
true,
self.debug_time );
710 previous_crumb = crumb;
721 target endon(
"death");
723 self.target_breadcrumbs = [];
724 self.target_breadcrumb_current_index = 0;
725 self.target_breadcrumb_last_added = 0;
727 minimum_delta_sqr = 20 * 20;
728 self.max_crumbs = 20;
730 self.target_breadcrumbs[
self.target_breadcrumb_last_added] =
get_crumb_position( target );
733 if ( level.firefly_debug )
742 previous_crumb_index =
self.target_breadcrumb_last_added %
self.max_crumbs;
745 if ( DistanceSquared( potential_crumb_position,
self.target_breadcrumbs[previous_crumb_index] ) > minimum_delta_sqr )
747 self.target_breadcrumb_last_added++;
750 if (
self.target_breadcrumb_last_added >= (
self.target_breadcrumb_current_index +
self.max_crumbs) )
751 self.target_breadcrumb_current_index =
self.target_breadcrumb_last_added -
self.max_crumbs + 1 ;
753 self.target_breadcrumbs[
self.target_breadcrumb_last_added %
self.max_crumbs] = potential_crumb_position;
760 if (
self.target_breadcrumb_current_index >
self.target_breadcrumb_last_added )
763 current_index =
self.target_breadcrumb_current_index %
self.max_crumbs;
765 if ( !isDefined(
self.target_breadcrumbs[current_index] ) )
768 return self.target_breadcrumbs[current_index];
773 passed = bullettracepassed(
self.origin, position,
false,
self, target );
791 level endon(
"game_ended");
793 target endon(
"death");
794 target endon(
"entering_last_stand" );
797 if( IsPlayer( target ) )
803 attack_distance = 50;
809 target_origin = target.origin + (0,0,50);
810 delta = target_origin -
self.origin;
811 dist = Length( delta );
823 if ( level.firefly_debug )
824 sphere(
self.origin, 2, (1,0,0), 1,
true, 10,
self.debug_time );
835 delta = target_origin -
self.origin;
836 angles = VectorToAngles(delta);
840 dist = Length( delta );
850 self.target_breadcrumb_current_index++;
860 level endon(
"game_ended");
862 self notify(
"attack");
865 if ( level.firefly_debug )
866 sphere(
self.origin, 4, (1,0,0), 1,
true, 10,
self.debug_time );
869 level.fireflies_height_variance = 30;
870 level.fireflies_radius = 100;
872 self.target_origin_at_start = target.origin;
873 self.target_entity = target;
891 self MoveTo( start_pos, level.fireflies_emit_time, 0, level.fireflies_emit_time );
892 self waittill(
"movedone" );
894 if ( isdefined( target ) && isdefined( target.origin ) )
896 delta = target.origin -
self.origin;
897 angles = VectorToAngles(delta);
898 self.angles = angles;
907 if ( isdefined(
self.killcamEnt ) )
909 self.killcamEnt
delete();
920 jumpDir = VectorNormalize( AnglesToUp(
self.angles ) );
922 if ( jumpDir[2] > level.fireflies_spawn_height_wall_angle_cos )
924 jumpHeight = level.fireflies_spawn_height;
928 jumpHeight = level.fireflies_spawn_height_wall;
931 explodePos =
self.origin + jumpDir * jumpHeight;
933 self.firefly_mover.spawn_origin = explodePos;
935 linked_to =
self GetLinkedEnt();
936 linked = (linked_to === target);
940 fx_ent = PlayFX(
"weapon/fx_hero_firefly_start",
self.origin, AnglesToUp(
self.angles ) );
943 self.firefly_mover.killCamEnt MoveTo( explodePos +
self.firefly_mover.killCamOffset, level.fireflies_emit_time, 0, level.fireflies_emit_time );
959 if ( weapon == watcher.weapon )
962 if ( weapon.isEmp || weapon.destroysEquipment )
966 if (
self.damageTaken < 15 )