‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_hive_gun.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
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;
13 
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\shared\version.gsh;
16 
17 #insert scripts\shared\weapons\_hive_gun.gsh;
18 
19 #namespace hive_gun;
20 
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" );
25 //#precache( "fx", "weapon/fx_hero_firefly_start_entity" );
26 
27 function ‪init_shared()
28 {
29  level.firefly_pod_weapon = GetWeapon("hero_chemicalgelgun");
30  level.firefly_pod_secondary_explosion_weapon = GetWeapon("hive_gungun_secondary_explosion");
31 
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 );
37 
38  if ( !IsDefined( level.vsmgr_prio_overlay_gel_splat ) )
39  {
40  level.vsmgr_prio_overlay_gel_splat = 21;
41  }
42  //visionset_mgr::register_info( "overlay", "hive_gungun_splat", VERSION_SHIP, level.vsmgr_prio_overlay_gel_splat, 7, true, &visionset_mgr::duration_lerp_thread_per_player, false );
43 
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 );
52 
53  ‪callback::add_weapon_damage( level.firefly_pod_weapon, &‪on_damage_firefly_pod );
54 
55  level thread register();
56 
57 /#
58  level thread ‪update_dvars();
59 #/
60 }
61 
62 /#
63 function ‪update_dvars()
64 {
65  while(1)
66  {
67  wait(1);
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 );
71  }
72 }
73 #/
74 function register()
75 {
76  ‪clientfield::register( "scriptmover", "firefly_state", ‪VERSION_SHIP, 3, "int" );
77  ‪clientfield::register( "toplayer", "fireflies_attacking", ‪VERSION_SHIP, 1, "int" );
78  ‪clientfield::register( "toplayer", "fireflies_chasing", ‪VERSION_SHIP, 1, "int" );
79 }
80 
81 function ‪createFireflyPodWatcher() // self == player
82 {
83  watcher = self ‪weaponobjects::createProximityWeaponObjectWatcher( "hero_chemicalgelgun", self.team );
84  watcher.onSpawn =&‪on_spawn_firefly_pod;
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;
94  watcher.onStun = &‪weaponobjects::weaponStun;
95  watcher.stunTime = 0;
96  watcher.onDetonateCallback =&‪firefly_pod_detonate;
97  watcher.activationDelay = level.firefly_pod_activation_time;
98  watcher.activateSound = "wpn_gelgun_blob_burst";
99  watcher.shouldDamage = &‪firefly_pod_should_damage;
100  watcher.deleteOnPlayerSpawn = true;
101  watcher.timeOut = getDvarFloat( "scr_firefly_pod_timeout", 0 );
102  watcher.ignoreVehicles = false; // which now means AI, but not clones
103  watcher.ignoreAI = false;
104  watcher.onSupplementalDetonateCallback = &‪firefly_death;
105 }
106 
107 
108 //******************************************************************
109 // *
110 // *
111 //******************************************************************
112 function ‪on_spawn_firefly_pod( watcher, owner ) // self == betty ent
113 {
115  self playloopsound( "wpn_gelgun_blob_alert_lp", 1 );
116 
117  self endon("death");
118  self waittill("stationary");
119 
120  self SetModel( "wpn_t7_hero_chemgun_residue3_grn" );
121  self SetEnemyModel( "wpn_t7_hero_chemgun_residue3_org" );
122 }
123 
125 {
126 /#
127  If ( IsGodMode( self ) )
128  {
129  return;
130  }
131 #/
132 
133 // visionset_mgr::activate( "overlay", "hive_gungun_splat", self, firefly_pod_SPLAT_DURATION_MAX, firefly_pod_SPLAT_DURATION_MAX );
134 
135  //self clientfield::set( "damaged_by_firefly_pod", 1 );
136 
137  self thread ‪end_damage_effects();
138 }
139 
141 {
142  self endon( "disconnect" );
143 
144  self waittill( "death" );
145 
146 // visionset_mgr::deactivate( "overlay", "hive_gungun_splat", self );
147 
148  //self clientfield::set( "damaged_by_firefly_pod", 0 );
149 }
150 
151 function ‪on_damage_firefly_pod( eAttacker, eInflictor, weapon, meansOfDeath, ‪damage )
152 {
153  if ( "MOD_GRENADE" != meansOfDeath && "MOD_GRENADE_SPLASH" != meansOfDeath )
154  {
155  return;
156  }
157 
158 // self thread start_damage_effects( );
159 }
160 
161 
162 //******************************************************************
163 // *
164 // *
165 //******************************************************************
166 function ‪spawn_firefly_mover() // self == betty ent
167 {
168 // self util::waitTillNotMoving();
169 
170 // self UseAnimTree( #animtree );
171 // self SetAnim( %o_spider_mine_deploy, 1.0, 0.0, 1.0 );
172 
173  firefly_mover = ‪spawn( "script_model", self.origin );
174  firefly_mover.angles = self.angles;
175  firefly_mover SetModel( "tag_origin" );
176 // firefly_mover SetModel( "fx_axis_createfx" ); // temp
177  firefly_mover.owner = self.owner;
178  firefly_mover.killCamOffset = ( 0, 0, GetDvarFloat( "scr_fireflies_start_height", 8.0 ) );
179 // firefly_mover.weapon = self.weapon;
180  firefly_mover.weapon = GetWeapon("hero_firefly_swarm");
181  firefly_mover.takedamage = true;
182  firefly_mover.soundMod = "firefly";
183  firefly_mover.team = self.team;
184 
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 );
189 
190  // store the blob entity on the killcam entity so we can chain them together
192 
193  firefly_mover.killcamEnt = killcamEnt;
194 
195  self.firefly_mover = firefly_mover;
196 
197  firefly_mover.debug_time = 1;
198 
199  firefly_mover thread ‪firefly_mover_damage();
201 }
202 
204 {
205  while(1)
206  {
207  self waittill ( "damage", ‪damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
208 
209  self thread ‪firefly_death();
210  }
211 }
212 
213 //******************************************************************
214 // *
215 // *
216 //******************************************************************
217 function ‪kill_firefly_mover() // self == betty ent
218 {
219  if ( isdefined( self.firefly_mover ))
220  {
221  if ( isdefined( self.firefly_mover.killcamEnt ) )
222  {
223  self.firefly_mover.killcamEnt delete();
224  }
225  self.firefly_mover delete();
226  }
227 }
228 
229 //******************************************************************
230 // *
231 // *
232 //******************************************************************
233 function ‪firefly_pod_detonate( attacker, weapon, target ) // self == betty
234 {
235  if ( !isdefined( target ) || !isdefined( target.team ) || !isdefined( self.team ) || self.team == target.team )
236  {
237  if ( IsDefined( weapon ) && weapon.isValid )
238  {
239  if ( isdefined( attacker ) )
240  {
241  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
242  {
243  attacker ‪challenges::destroyedExplosive( weapon );
244  ‪scoreevents::processScoreEvent( "destroyed_fireflyhive", attacker, self.owner, weapon );
245  }
246  }
247  }
249  return;
250  }
251  else
252  {
253 // self.firefly_mover SetModel( self.model );
254  self ‪spawn_firefly_mover();
255 
256  self.firefly_mover thread ‪firefly_watch_for_target_death( target );
257  self.firefly_mover thread ‪firefly_watch_for_game_ended( target );
258 
259  self thread ‪firefly_pod_release_fireflies( attacker, target );
260  }
261 }
262 
263 //******************************************************************
264 // *
265 // *
266 //******************************************************************
267 function ‪firefly_pod_destroyed( ) // self == betty
268 {
269  ‪fx_ent = PlayFX( "weapon/fx_hero_chem_gun_blob_death", self.origin );
270  ‪fx_ent.team = self.team;
271 
272  PlaySoundAtPosition ( "wpn_gelgun_blob_destroy", self.origin );
273 
274  if ( isdefined( self.trigger ) )
275  {
276  self.trigger delete();
277  }
278 
279  self ‪kill_firefly_mover();
280 
281  self delete();
282 }
283 
284 //******************************************************************
285 // *
286 // *
287 //******************************************************************
288 function ‪firefly_killcam_move( position, time ) // self == script mover spawned at weaponobject location
289 {
290  if ( !IsDefined( self.killcamEnt ) )
291  return;
292 
293  self endon("death");
294  wait( 0.5 );
295  accel = 0;
296  decel = 0;
297  self.killCamEnt MoveTo( position, time, accel, decel );
298 }
299 
300 //******************************************************************
301 // *
302 // *
303 //******************************************************************
305 {
306  self notify("stop_killcam");
307  if ( IsDefined( self.killcamEnt ) )
308  {
309  self.killcamEnt MoveTo( self.killcamEnt.origin, 0.1, 0, 0);
310  }
311 }
312 
313 //******************************************************************
314 // *
315 // *
316 //******************************************************************
317 function ‪firefly_move( position, time ) // self == script mover spawned at weaponobject location
318 {
319  self endon("death");
320  accel = 0; //time * 0.1;
321  decel = 0; //time * 0.1;
322  self thread ‪firefly_killcam_move( position, time );
323  self MoveTo( position, time, accel, decel );
324  self waittill( "movedone" );
325 }
326 
327 //******************************************************************
328 // *
329 // *
330 //******************************************************************
331 function ‪firefly_partial_move( target, position, time, percent ) // self == script mover spawned at weaponobject location
332 {
333  self endon("death");
334  self endon("stop_killcam");
335  accel = 0; //time * 0.1;
336  decel = 0; //time * 0.1;z
337  self thread ‪firefly_killcam_move( position, time );
338  self MoveTo( position, time, accel, decel );
339  self thread ‪firefly_check_for_collisions( target, position, time );
340  wait( time * percent );
341  self notify("movedone");
342 }
343 
344 //******************************************************************
345 // *
346 // *
347 //******************************************************************
348 function ‪firefly_rotate( angles, time ) // self == script mover spawned at weaponobject location
349 {
350  self endon("death");
351 
352  self RotateTo( angles, time, 0, 0 );
353  self waittill( "rotatedone" );
354 }
355 
356 //******************************************************************
357 // *
358 // *
359 //******************************************************************
360 function ‪firefly_check_for_collisions( target, move_to, time ) // self == script mover spawned at weaponobject location
361 {
362  self endon("death");
363  self endon("movedone");
364 
365  original_position = self.origin;
366  dir = VectorNormalize(move_to - self.origin);
367  dist = Distance( self.origin, move_to );
368  speed = dist / time;
369 
370  delta = dir * ( speed * level.fireflies_collision_check_interval );
371 
372  while( 1 )
373  {
374  if ( !‪firefly_check_move( self.origin + delta, target ) )
375  {
376  // hit something
377  self thread ‪firefly_death();
378  self playsound( "wpn_gelgun_hive_wall_impact" );
379  }
380  wait( level.fireflies_collision_check_interval );
381  }
382 }
383 
384 //******************************************************************
385 // *
386 // *
387 //******************************************************************
388 function ‪firefly_pod_rotated_point( degrees, radius, height )
389 {
390  angles = ( 0, degrees, 0 );
391  forward = ( radius, 0, 0);
392 
393  point = RotatePoint( forward, angles );
394 
395  return self.spawn_origin + point + ( 0, 0, height );
396 }
397 
398 //******************************************************************
399 // *
400 // *
401 //******************************************************************
403 {
404  return ‪firefly_pod_rotated_point( RandomInt(359), RandomInt( level.fireflies_radius ), RandomIntRange( -level.fireflies_height_variance, level.fireflies_height_variance ) );
405 }
406 
407 //******************************************************************
408 // *
409 // *
410 //******************************************************************
411 function ‪firefly_pod_random_movement( ) // self == script mover spawned at weaponobject location
412 {
413  self endon("death");
414  self endon("attacking");
415 
416  while (1)
417  {
418  point = ‪firefly_pod_random_point();
419 
420  delta = point - self.origin;
421  angles = VectorToAngles(delta);
422  ‪firefly_rotate( angles, 0.15 );
423 
424  dist = Length( delta );
425 
426  time = 0.01;
427 
428  if ( dist > 0 )
429  {
430  time = dist / level.fireflies_min_speed;
431  }
432  ‪firefly_move( point, time );
433 
434  wait( RandomFloatRange( 0.1, 0.7 ) );
435  }
436 }
437 
438 //******************************************************************
439 // *
440 // *
441 //******************************************************************
442 function ‪firefly_spyrograph_patrol( degrees, ‪increment, radius ) // self == script mover spawned at weaponobject location
443 {
444  self endon("death");
445  self endon("attacking");
446 
447  current_degrees = RandomInt( int(360 / degrees) ) * degrees;
448  height_offset = 0;
449 
450  while (1)
451  {
452  point = ‪firefly_pod_rotated_point( current_degrees, radius, height_offset );
453 
454  delta = point - self.origin;
455  angles = ( 0, current_degrees, 0 );
456  thread ‪firefly_rotate( angles, 0.15 );
457 
458  dist = Length( delta );
459 
460  time = 0.01;
461 
462  if ( dist > 0 )
463  {
464  time = dist / level.fireflies_min_speed;
465  }
466  ‪firefly_move( point, time );
467 
468  wait( RandomFloatRange( 0.1, 0.3 ) );
469 
470  current_degrees = ( current_degrees + ( degrees * ‪increment ) ) % 360;
471  }
472 }
473 
474 //******************************************************************
475 // *
476 // *
477 //******************************************************************
478 function ‪firefly_damage_target( target ) // self == script mover spawned at weaponobject location
479 {
480  level endon("game_ended");
481  self endon("death");
482 
483  target endon("disconnect");
484  target endon("death");
485  target endon ( "entering_last_stand" );
486 
487  ‪damage = 25;
488  damage_delay = 0.1;
489  weapon = self.weapon;
490  target playsound( "wpn_gelgun_hive_attack" );
491  target notify( "snd_burn_scream" );
492 
493  remaining_hits = 10; // big number, not too big
494 
495  //if( IS_EQUAL( target.type, "robot" ) )
496  if ( !isplayer(target) )
498 
499  while( remaining_hits > 0 )
500  {
501  wait( damage_delay );
502  target DoDamage( ‪damage, self.origin, self.owner, self, "", "MOD_IMPACT", 0, weapon );
503 
504  remaining_hits -= 1;
505 
506  if ( IsAlive( target ) && IsPlayer( target ) )
507  {
508  bodyType = target GetCharacterBodyType();
509  if ( bodyType >= 0 )
510  {
511  bodyTypeFields = GetCharacterFields( bodyType, CurrentSessionMode() );
512  if( ‪VAL( bodyTypeFields.digitalBlood, false ) )
513  {
514  PlayFXOnTag( "weapon/fx_hero_firefly_sparks_os", target, "J_SpineLower");
515  }
516  else
517  {
518  PlayFXOnTag( "weapon/fx_hero_firefly_blood_os", target, "J_SpineLower");
519  }
520  }
521  else
522  {
523  PlayFXOnTag( "weapon/fx_hero_firefly_blood_os", target, "J_SpineLower");
524  }
525  }
526  else if ( !IsPlayer( target ) )
527  {
528  PlayFXOnTag( "weapon/fx_hero_firefly_sparks_os", target, "tag_origin");
529  }
530  }
531 }
532 
533 
534 //******************************************************************
535 // *
536 // *
537 //******************************************************************
539 {
540  self endon("death");
541  if ( IsAlive( target ) )
542  {
543  target ‪util::waittill_any("death", "flashback", "game_ended");
544  }
545 
546  if( IsPlayer( target ) )
547  {
548  target ‪clientfield::set_to_player( "fireflies_attacking", 0 );
549  target ‪clientfield::set_to_player( "fireflies_chasing", 0 );
550  }
551 
552  self thread ‪firefly_death();
553 }
554 
555 
556 //******************************************************************
557 // *
558 // *
559 //******************************************************************
561 {
562  self endon("death");
563  level waittill( "game_ended");
564 
565  if ( IsAlive( target ) && IsPlayer( target ) )
566  {
567  target ‪clientfield::set_to_player( "fireflies_attacking", 0 );
568  target ‪clientfield::set_to_player( "fireflies_chasing", 0 );
569  }
570 
571  self thread ‪firefly_death();
572 }
573 
574 //******************************************************************
575 // *
576 // *
577 //******************************************************************
578 function ‪firefly_death()
579 {
580  /#
581  println("firefly_death " + self getentnum() );
582  #/
583  self ‪clientfield::set( "firefly_state", ‪FIREFLY_DIEING );
584  self playsound( "wpn_gelgun_hive_die" );
585 
586  if ( IsDefined( self.target_entity ) && isPlayer( self.target_entity ) )
587  {
588  self.target_entity ‪clientfield::set_to_player( "fireflies_attacking", 0 );
589  self.target_entity ‪clientfield::set_to_player( "fireflies_chasing", 0 );
590  }
591 
592  waittillframeend;
593 
594  thread ‪cleanup_killcam_entity(self.killcamEnt);
595  if ( isdefined( self ) )
596  {
597  /#
598  println("firefly_death deleting " + self getentnum() );
599  #/
600 
601  self delete();
602  }
603 }
604 
605 function ‪cleanup_killcam_entity(killcamEnt)
606 {
607  wait(5);
608  if ( isdefined( killcamEnt ) )
609  {
610  killcamEnt delete();
611  }
612 }
613 
614 function ‪get_attack_speed( target )
615 {
616  velocity = target GetVelocity();
617  speed = Length( velocity ) * level.fireflies_attack_speed_scale;
618 
619  if ( speed < level.fireflies_min_speed )
620  {
621  speed = level.fireflies_min_speed;
622  }
623 
624  return speed;
625 }
626 
627 //******************************************************************
628 // *
629 // *
630 //******************************************************************
631 function ‪firefly_attack( target, state )
632 {
633  level endon("game_ended");
634  self endon("death");
635  target endon ( "entering_last_stand" );
636 
637  self thread ‪firefly_killcam_stop();
638 
639  self ‪clientfield::set( "firefly_state", state );
640  if( IsPlayer( target ) )
641  {
642  target ‪clientfield::set_to_player( "fireflies_attacking", 1 );
643  }
644 
645  target_origin = target.origin + (0,0,50);
646 
647  delta = self.origin - target_origin;
648  dist = Length( delta );
649  time = 0.01;
650  if ( dist > 0 )
651  {
652  speed = ‪get_attack_speed( target );
653  time = dist / speed;
654  }
655 
656  self.enemy = target;
657 
658  ‪firefly_move( target_origin, time );
659  self LinkTo( target );
660 
661  wait(time);
662 
663  if ( !IsAlive(target) )
664  return;
665 
666  self thread ‪firefly_damage_target( target );
667 }
668 
669 function ‪get_crumb_position( target )
670 {
671  height = 50;
672 
673  if( IsPlayer( target ) )
674  {
675  stance = target GetStance();
676  if ( stance == "crouch" )
677  height = 30;
678  else if ( stance == "prone" )
679  height = 15;
680  }
681 
682  return target.origin + (0,0,height);
683 }
684 
685 /#
687 {
688  self endon("death");
689  self endon("attack");
690 
691 
692  while(1)
693  {
694  previous_crumb = self.origin;
695 
696  for( i = 0; i < self.target_breadcrumbs.size; i++ )
697  {
698 
699  if ( (self.target_breadcrumb_current_index + i) > self.target_breadcrumb_last_added )
700  break;
701 
702  crumb_index = (self.target_breadcrumb_current_index + i) % self.target_breadcrumbs.size;
703  crumb = self.target_breadcrumbs[crumb_index ];
704 
705  sphere( crumb, 2, (0,1,0), 1, true, 10, self.debug_time );
706 
707  if ( i > 0 )
708  line(previous_crumb, crumb, (0,1,0), 1.0, true, self.debug_time );
709 
710  previous_crumb = crumb;
711  }
712 
714  }
715 }
716 #/
717 
718 function ‪target_bread_crumbs( target )
719 {
720  self endon("death");
721  target endon("death");
722 
723  self.target_breadcrumbs = [];
724  self.target_breadcrumb_current_index = 0;
725  self.target_breadcrumb_last_added = 0;
726 
727  minimum_delta_sqr = 20 * 20;
728  self.max_crumbs = 20;
729 
730  self.target_breadcrumbs[self.target_breadcrumb_last_added] = ‪get_crumb_position( target );
731 
732 /#
733  if ( level.firefly_debug )
734  {
735  self thread ‪target_bread_crumbs_render( target );
736  }
737 #/
738 
739  while( 1 )
740  {
741  wait( 0.25 );
742  previous_crumb_index = self.target_breadcrumb_last_added % self.max_crumbs;
743  potential_crumb_position = ‪get_crumb_position( target );
744 
745  if ( DistanceSquared( potential_crumb_position, self.target_breadcrumbs[previous_crumb_index] ) > minimum_delta_sqr )
746  {
747  self.target_breadcrumb_last_added++;
748 
749  // if the newly added point will pass the currently targeted point in the buffer make sure to set the current point
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 ;
752 
753  self.target_breadcrumbs[self.target_breadcrumb_last_added % self.max_crumbs] = potential_crumb_position;
754  }
755  }
756 }
757 
758 function ‪get_target_bread_crumb( target )
759 {
760  if ( self.target_breadcrumb_current_index > self.target_breadcrumb_last_added )
761  return ‪get_crumb_position( target );
762 
763  current_index = self.target_breadcrumb_current_index % self.max_crumbs;
764 
765  if ( !isDefined( self.target_breadcrumbs[current_index] ) )
766  return ‪get_crumb_position( target );
767 
768  return self.target_breadcrumbs[current_index];
769 }
770 
771 function ‪firefly_check_move( position, target )
772 {
773  passed = bullettracepassed(self.origin, position, false, self, target );
774 
775  return passed;
776 
777  //results = PhysicsTraceEx( self.origin, position, (-5,-5,-5), (5,5,5), self );
778  //if( results["fraction"] == 1 )
779  //{
780  // return true;
781  //}
782  //return false;
783 }
784 
785 //******************************************************************
786 // *
787 // *
788 //******************************************************************
789 function ‪firefly_chase( target ) // self == script mover spawned at weaponobject location
790 {
791  level endon("game_ended");
792  self endon("death");
793  target endon("death");
794  target endon( "entering_last_stand" );
795 
796  self ‪clientfield::set( "firefly_state", ‪FIREFLY_HUNTING );
797  if( IsPlayer( target ) )
798  {
799  target ‪clientfield::set_to_player( "fireflies_chasing", 1 );
800  }
801 
802  max_distance = 500;
803  attack_distance = 50;
804  max_offset = 10;
805  up = (0,0,1);
806 
807  while(1)
808  {
809  target_origin = target.origin + (0,0,50);
810  delta = target_origin - self.origin;
811  dist = Length( delta );
812 
813  if ( dist <= attack_distance && ‪firefly_check_move(target_origin, target ) )
814  {
815  thread ‪firefly_attack( target, ‪FIREFLY_ATTACKING );
816  return;
817  }
818  else
819  {
820  target_origin = ‪get_target_bread_crumb( target );
821 
822 /#
823  if ( level.firefly_debug )
824  sphere( self.origin, 2, (1,0,0), 1, true, 10, self.debug_time );
825 #/
826 
827  // this code will give some randomness to the target point.
828 // delta = target_origin - self.origin;
829 // normal = VectorNormalize( delta );
830 // right = VectorCross( normal, up );
831 // offset = RotatePointAroundAxis( (right * max_offset), normal, RandomInt(359) );
832 //
833 // target_origin = target_origin + offset;
834  }
835  delta = target_origin - self.origin;
836  angles = VectorToAngles(delta);
837 
838  thread ‪firefly_rotate( angles, 0.15 );
839 
840  dist = Length( delta );
841  time = 0.01;
842  if ( dist > 0 )
843  {
844  speed = ‪get_attack_speed( target );
845  time = dist / speed;
846  }
847 
848  ‪firefly_partial_move( target, target_origin, time, level.firefly_pod_partial_move_percent );
849 
850  self.target_breadcrumb_current_index++;
851  }
852 }
853 
854 //******************************************************************
855 // *
856 // *
857 //******************************************************************
858 function ‪firefly_pod_start( start_pos, target, linked ) // self == script mover spawned at weaponobject location
859 {
860  level endon("game_ended");
861  self endon("death");
862  self notify("attack");
863 
864 /#
865  if ( level.firefly_debug )
866  sphere( self.origin, 4, (1,0,0), 1, true, 10, self.debug_time );
867 #/
868 
869  level.fireflies_height_variance = 30;
870  level.fireflies_radius = 100;
871 
872  self.target_origin_at_start = target.origin;
873  self.target_entity = target;
874 
875  if ( linked )
876  {
877 // fx_ent = PlayFX( "weapon/fx_hero_firefly_start_entity", self.origin );
878 // fx_ent.team = self.team;
880  return;
881  }
882  else
883  {
884  // start bread crumbing immediatly
885  thread ‪target_bread_crumbs( target );
886 
887  //delta = target.origin - self.origin;
888  //angles = VectorToAngles(delta);
889  //self.angles = angles;
890 
891  self MoveTo( start_pos, level.fireflies_emit_time, 0, level.fireflies_emit_time );
892  self waittill( "movedone" );
893 
894  if ( isdefined( target ) && isdefined( target.origin ) )
895  {
896  delta = target.origin - self.origin;
897  angles = VectorToAngles(delta);
898  self.angles = angles;
899 
900  // self thread firefly_spyrograph_patrol( 60, 1, level.fireflies_radius );
901  self thread ‪firefly_chase( target );
902  }
903  }
904 
905  wait( 30 );
906 
907  if ( isdefined( self.killcamEnt ) )
908  {
909  self.killcamEnt delete();
910  }
911  self delete();
912 }
913 
914 //******************************************************************
915 // *
916 // *
917 //******************************************************************
918 function ‪firefly_pod_release_fireflies( attacker, target ) // self == script mover spawned at weaponobject location
919 {
920  jumpDir = VectorNormalize( AnglesToUp( self.angles ) );
921 
922  if ( jumpDir[2] > level.fireflies_spawn_height_wall_angle_cos )
923  {
924  jumpHeight = level.fireflies_spawn_height;
925  }
926  else
927  {
928  jumpHeight = level.fireflies_spawn_height_wall;
929  }
930 
931  explodePos = self.origin + jumpDir * jumpHeight;
932 
933  self.firefly_mover.spawn_origin = explodePos;
934 
935  linked_to = self GetLinkedEnt();
936  linked = (linked_to === target);
937 
938  if ( !linked )
939  {
940  ‪fx_ent = PlayFX( "weapon/fx_hero_firefly_start", self.origin, AnglesToUp( self.angles ) );
941  ‪fx_ent.team = self.team;
942  self.firefly_mover ‪clientfield::set( "firefly_state", ‪FIREFLY_DEPLOYING );
943  self.firefly_mover.killCamEnt MoveTo( explodePos + self.firefly_mover.killCamOffset, level.fireflies_emit_time, 0, level.fireflies_emit_time );
944  }
945  else
946  {
947 // self.firefly_mover.killCamEnt delete();
948 // self.firefly_mover.killCamEnt = undefined;
949  }
950 
951  self.firefly_mover thread ‪firefly_pod_start( explodePos, target, linked );
952 
953  self delete();
954 }
955 
956 function ‪firefly_pod_should_damage( watcher, attacker, weapon, ‪damage )
957 {
958  // gel blobs do not damage eachother
959  if ( weapon == watcher.weapon )
960  return false;
961 
962  if ( weapon.isEmp || weapon.destroysEquipment )
963  return true;
964 
965  // anything will kill it over 15 damage
966  if ( self.damageTaken < 15 )
967  return false;
968 
969  return true;
970 }
971 
972 //function firefly_spawn_vehicle( targetEnt )
973 //{
974 // swarm = SpawnVehicle( "spawner_bo3_cybercom_firefly", origin, angles);
975 // if(isDefined(swarm))
976 // {
977 // swarm.threatbias = -300;
978 //
979 // swarm.owner = self;
980 // swarm.team = self.team;
981 // swarm.lifetime = 45;
982 // swarm.targetEnt = targetEnt; //set this if you want an initial target
983 //
984 // swarm.state_machine = statemachine::create( "brain", swarm, "swarm_change_state" );
985 // swarm.state_machine statemachine::add_state( "init", &swarm_state_enter, &swarm_init, &swarm_state_cleanup );
986 // swarm.state_machine statemachine::add_state( "attack", &swarm_state_enter, &swarm_attack_think,&swarm_state_cleanup );
987 // swarm.state_machine statemachine::set_state( "init" );
988 // targetEnt = undefined;
989 // }
990 //}
991 //
993 //function swarm_state_cleanup( params )
994 //{
995 // if(isDefined(self.badplace))
996 // {
997 // badplace_delete("swarmBP_"+self.swarm_ID);
998 // self.badplace = undefined;
999 // }
1000 //}
1002 //function swarm_state_enter( params )
1003 //{
1004 // WAIT_SERVER_FRAME;
1005 //}
1006 //
1007 //function drawOriginForever()
1008 //{
1009 // for( ;; )
1010 // {
1011 // drawArrow( self.origin, self.angles );
1012 // WAIT_SERVER_FRAME;
1013 // }
1014 //}
1015 //
1017 //function swarm_init( params )
1018 //{
1019 // self setmodel("tag_origin");
1020 // self notsolid();
1021 // self.ignoreall = true;
1022 // self.takedamage = false;
1023 // self.goalradius = 36;
1024 // self.goalheight = 36;
1025 // self.good_melee_target = true;
1026 // self SetNearGoalNotifyDist( 48 );
1027 //
1028 // if(SWARM_SHOW_DEBUG)
1029 // {
1030 // self thread drawOriginForever();
1031 // }
1032 //
1037 // self clearforcedgoal();
1038 // self SetGoal( self.origin, true, self.goalradius ); //set the goal for swarm
1039 //
1040 // if(!IS_TRUE(self.isOffspring))
1041 // {
1042 // enemies = self _get_valid_targets();
1043 // closeTargets = ArraySortClosest(enemies, self.origin,enemies.size,0,512); //if no nearby targets, lets move out from our current position in the direction player was looking
1044 // if(closeTargets.size == 0 )
1045 // {
1046 // //Move the swarm out and away frmo FXAnim ending spot
1047 // //this will cause the swarm to move out towards locatoin player was observing
1048 // //We do this to get the swarm closer to targets that the player was looking at.
1049 // angles = (self.angles[0],self.angles[1],0);
1050 // frontGoal = self.origin + (anglestoforward( angles)*240); //max 512 units out
1051 // a_trace = BulletTrace( self.origin,frontGoal, false, undefined, true );
1052 // hitp = a_trace[ "position" ]; //but lets check that we can go that far, if not, take the trace point
1053 //
1054 // queryResult = PositionQuery_Source_Navigation(hitp, 0, 72, 72, 20, self ); //can swarm find node around where it wants to go?
1055 // if( queryResult.data.size > 0 )
1056 // {
1057 // pathSuccess = self FindPath( self.origin, queryResult.data[0].origin, true, false ); //can swarm path to that location?
1058 // if ( pathSuccess )
1059 // {
1060 // if(SWARM_SHOW_DEBUG)
1061 // {
1062 // level thread cybercom::debug_Circle( queryResult.data[0].origin, 16, 10, (1,0,0) );
1063 // }
1064 // self clearforcedgoal();
1065 // self SetGoal( queryResult.data[0].origin, true, self.goalradius ); //set the goal for swarm
1066 //
1067 // if(!self.fireBugCount)
1068 // self clientfield::set("firefly_state",FIREFLY_STATE_HUNT_TRANS_TO_MOVE);
1069 // else
1070 // self clientfield::set("firefly_state",FIREBUG_STATE_HUNT_TRANS_TO_MOVE);
1071 //
1072 // self util::waittill_any_timeout( 5, "near_goal" );
1073 // }
1074 // }
1075 // }
1076 // }
1077 //}
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪firefly_pod_detonate
‪function firefly_pod_detonate(attacker, weapon, target)
Definition: _hive_gun.gsc:233
‪target_bread_crumbs
‪function target_bread_crumbs(target)
Definition: _hive_gun.gsc:718
‪firefly_pod_destroyed
‪function firefly_pod_destroyed()
Definition: _hive_gun.gsc:267
‪weaponStun
‪function weaponStun()
Definition: _weaponobjects.gsc:1128
‪end_damage_effects
‪function end_damage_effects()
Definition: _hive_gun.gsc:140
‪firefly_rotate
‪function firefly_rotate(angles, time)
Definition: _hive_gun.gsc:348
‪firefly_pod_rotated_point
‪function firefly_pod_rotated_point(degrees, radius, height)
Definition: _hive_gun.gsc:388
‪get_crumb_position
‪function get_crumb_position(target)
Definition: _hive_gun.gsc:669
‪firefly_move
‪function firefly_move(position, time)
Definition: _hive_gun.gsc:317
‪firefly_death
‪function firefly_death()
Definition: _hive_gun.gsc:578
‪on_damage_firefly_pod
‪function on_damage_firefly_pod(eAttacker, eInflictor, weapon, meansOfDeath, damage)
Definition: _hive_gun.gsc:151
‪firefly_check_for_collisions
‪function firefly_check_for_collisions(target, move_to, time)
Definition: _hive_gun.gsc:360
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪fx_ent
‪var fx_ent
Definition: traps_shared.gsc:2008
‪on_spawn_firefly_pod
‪function on_spawn_firefly_pod(watcher, owner)
Definition: _hive_gun.gsc:112
‪register
‪function register()
Definition: _hive_gun.gsc:74
‪destroyedExplosive
‪function destroyedExplosive(weapon)
Definition: challenges_shared.gsc:951
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪firefly_killcam_stop
‪function firefly_killcam_stop()
Definition: _hive_gun.gsc:304
‪firefly_mover_damage
‪function firefly_mover_damage()
Definition: _hive_gun.gsc:203
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪firefly_attack
‪function firefly_attack(target, state)
Definition: _hive_gun.gsc:631
‪get_target_bread_crumb
‪function get_target_bread_crumb(target)
Definition: _hive_gun.gsc:758
‪firefly_damage_target
‪function firefly_damage_target(target)
Definition: _hive_gun.gsc:478
‪FIREFLY_DEPLOYING
‪#define FIREFLY_DEPLOYING
Definition: _hive_gun.gsh:7
‪start_damage_effects
‪function start_damage_effects()
Definition: _hive_gun.gsc:124
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪createFireflyPodWatcher
‪function createFireflyPodWatcher()
Definition: _hive_gun.gsc:81
‪update_dvars
‪function update_dvars()
Definition: _hive_gun.gsc:63
‪firefly_pod_should_damage
‪function firefly_pod_should_damage(watcher, attacker, weapon, damage)
Definition: _hive_gun.gsc:956
‪firefly_partial_move
‪function firefly_partial_move(target, position, time, percent)
Definition: _hive_gun.gsc:331
‪FIREFLY_HUNTING
‪#define FIREFLY_HUNTING
Definition: _hive_gun.gsh:8
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪FIREFLY_ATTACKING
‪#define FIREFLY_ATTACKING
Definition: _hive_gun.gsh:9
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪firefly_pod_random_point
‪function firefly_pod_random_point()
Definition: _hive_gun.gsc:402
‪firefly_pod_start
‪function firefly_pod_start(start_pos, target, linked)
Definition: _hive_gun.gsc:858
‪firefly_chase
‪function firefly_chase(target)
Definition: _hive_gun.gsc:789
‪firefly_killcam_move
‪function firefly_killcam_move(position, time)
Definition: _hive_gun.gsc:288
‪firefly_watch_for_game_ended
‪function firefly_watch_for_game_ended(target)
Definition: _hive_gun.gsc:560
‪add_supplemental_object
‪function add_supplemental_object(object)
Definition: _weaponobjects.gsc:3571
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪FIREFLY_LINK_ATTACKING
‪#define FIREFLY_LINK_ATTACKING
Definition: _hive_gun.gsh:10
‪increment
‪function increment(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:110
‪firefly_watch_for_target_death
‪function firefly_watch_for_target_death(target)
Definition: _hive_gun.gsc:538
‪firefly_pod_random_movement
‪function firefly_pod_random_movement()
Definition: _hive_gun.gsc:411
‪add_weapon_damage
‪function add_weapon_damage(weapontype, callback)
Definition: callbacks_shared.gsc:580
‪kill_firefly_mover
‪function kill_firefly_mover()
Definition: _hive_gun.gsc:217
‪createProximityWeaponObjectWatcher
‪function createProximityWeaponObjectWatcher(weaponname, ownerTeam)
Definition: _weaponobjects.gsc:1307
‪firefly_pod_release_fireflies
‪function firefly_pod_release_fireflies(attacker, target)
Definition: _hive_gun.gsc:918
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪cleanup_killcam_entity
‪function cleanup_killcam_entity(killcamEnt)
Definition: _hive_gun.gsc:605
‪store_killcam_entity_on_entity
‪function store_killcam_entity_on_entity(killcam_entity)
Definition: killcam_shared.gsc:27
‪spawn_firefly_mover
‪function spawn_firefly_mover()
Definition: _hive_gun.gsc:166
‪onSpawnProximityWeaponObject
‪function onSpawnProximityWeaponObject(watcher, owner)
Definition: _weaponobjects.gsc:1603
‪init_shared
‪function init_shared()
Definition: _hive_gun.gsc:27
‪FIREFLY_DIEING
‪#define FIREFLY_DIEING
Definition: _hive_gun.gsh:11
‪HIVE_POD_HITS_VS_KILLSTREAKS_AND_ROBOTS
‪#define HIVE_POD_HITS_VS_KILLSTREAKS_AND_ROBOTS
Definition: _hive_gun.gsh:3
‪firefly_check_move
‪function firefly_check_move(position, target)
Definition: _hive_gun.gsc:771
‪get_attack_speed
‪function get_attack_speed(target)
Definition: _hive_gun.gsc:614
‪firefly_spyrograph_patrol
‪function firefly_spyrograph_patrol(degrees, increment, radius)
Definition: _hive_gun.gsc:442
‪target_bread_crumbs_render
‪function target_bread_crumbs_render(target)
Definition: _hive_gun.gsc:686
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265