2023-04-13 17:30:38 +02:00

1082 lines
40 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\ai\systems\gib;
#using scripts\shared\callbacks_shared;
#using scripts\shared\challenges_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\killcam_shared;
#using scripts\shared\scoreevents_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\visionset_mgr_shared;
#using scripts\shared\weapons\_weaponobjects;
#namespace hive_gun;
#precache( "fx", "weapon/fx_hero_firefly_blood_os" );
#precache( "fx", "weapon/fx_hero_firefly_sparks_os" );
#precache( "fx", "weapon/fx_hero_chem_gun_blob_death" );
#precache( "fx", "weapon/fx_hero_firefly_start" );
//#precache( "fx", "weapon/fx_hero_firefly_start_entity" );
function init_shared()
{
level.firefly_pod_weapon = GetWeapon("hero_chemicalgelgun");
level.firefly_pod_secondary_explosion_weapon = GetWeapon("hive_gungun_secondary_explosion");
level.firefly_debug = GetDvarInt( "scr_firefly_debug", 0 );
level.firefly_pod_detection_radius = GetDvarInt( "scr_fireflyPodDetectionRadius", 150 );
level.firefly_pod_grace_period = GetDvarFloat( "scr_fireflyPodGracePeriod", 0 );
level.firefly_pod_activation_time = GetDvarFloat( "scr_fireflyPodActivationTime", 1 );
level.firefly_pod_partial_move_percent = GetDvarFloat( "scr_fireflyPartialMovePercent", 0.8 );
if ( !IsDefined( level.vsmgr_prio_overlay_gel_splat ) )
{
level.vsmgr_prio_overlay_gel_splat = 21;
}
//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 );
level.fireflies_spawn_height = getDvarInt( "betty_jump_height_onground", 55 );
level.fireflies_spawn_height_wall = getDvarInt( "betty_jump_height_wall", 20 );
level.fireflies_spawn_height_wall_angle = getDvarInt( "betty_onground_angle_threshold", 30 );
level.fireflies_spawn_height_wall_angle_cos = cos( level.fireflies_spawn_height_wall_angle );
level.fireflies_emit_time = getDvarFloat( "scr_firefly_emit_time", 0.2 );
level.fireflies_min_speed = getDvarInt( "scr_firefly_min_speed", 400 );
level.fireflies_attack_speed_scale = getDvarFloat( "scr_firefly_attack_attack_speed_scale", 1.75 );
level.fireflies_collision_check_interval = getDvarFloat( "scr_firefly_collision_check_interval", 0.2 );
callback::add_weapon_damage( level.firefly_pod_weapon, &on_damage_firefly_pod );
level thread register();
/#
level thread update_dvars();
#/
}
/#
function update_dvars()
{
while(1)
{
wait(1);
level.fireflies_min_speed = getDvarInt( "scr_firefly_speed", 250 );
level.fireflies_attack_speed_scale = getDvarFloat( "scr_firefly_attack_attack_speed_scale", 1.15 );
level.firefly_debug = GetDvarInt( "scr_firefly_debug", 0 );
}
}
#/
function register()
{
clientfield::register( "scriptmover", "firefly_state", 1, 3, "int" );
clientfield::register( "toplayer", "fireflies_attacking", 1, 1, "int" );
clientfield::register( "toplayer", "fireflies_chasing", 1, 1, "int" );
}
function createFireflyPodWatcher() // self == player
{
watcher = self weaponobjects::createProximityWeaponObjectWatcher( "hero_chemicalgelgun", self.team );
watcher.onSpawn =&on_spawn_firefly_pod;
watcher.watchForFire = true;
watcher.hackable = false;
watcher.headIcon = false;
watcher.activateFx = true;
watcher.ownerGetsAssist = true;
watcher.ignoreDirection = true;
watcher.immediateDetonation = true;
watcher.detectionGracePeriod = level.firefly_pod_grace_period;
watcher.detonateRadius = level.firefly_pod_detection_radius;
watcher.onStun = &weaponobjects::weaponStun;
watcher.stunTime = 0;
watcher.onDetonateCallback =&firefly_pod_detonate;
watcher.activationDelay = level.firefly_pod_activation_time;
watcher.activateSound = "wpn_gelgun_blob_burst";
watcher.shouldDamage = &firefly_pod_should_damage;
watcher.deleteOnPlayerSpawn = true;
watcher.timeOut = getDvarFloat( "scr_firefly_pod_timeout", 0 );
watcher.ignoreVehicles = false; // which now means AI, but not clones
watcher.ignoreAI = false;
watcher.onSupplementalDetonateCallback = &firefly_death;
}
//******************************************************************
// *
// *
//******************************************************************
function on_spawn_firefly_pod( watcher, owner ) // self == betty ent
{
weaponobjects::onSpawnProximityWeaponObject( watcher, owner );
self playloopsound( "wpn_gelgun_blob_alert_lp", 1 );
self endon("death");
self waittill("stationary");
self SetModel( "wpn_t7_hero_chemgun_residue3_grn" );
self SetEnemyModel( "wpn_t7_hero_chemgun_residue3_org" );
}
function start_damage_effects()
{
/#
If ( IsGodMode( self ) )
{
return;
}
#/
// visionset_mgr::activate( "overlay", "hive_gungun_splat", self, firefly_pod_SPLAT_DURATION_MAX, firefly_pod_SPLAT_DURATION_MAX );
//self clientfield::set( "damaged_by_firefly_pod", 1 );
self thread end_damage_effects();
}
function end_damage_effects()
{
self endon( "disconnect" );
self waittill( "death" );
// visionset_mgr::deactivate( "overlay", "hive_gungun_splat", self );
//self clientfield::set( "damaged_by_firefly_pod", 0 );
}
function on_damage_firefly_pod( eAttacker, eInflictor, weapon, meansOfDeath, damage )
{
if ( "MOD_GRENADE" != meansOfDeath && "MOD_GRENADE_SPLASH" != meansOfDeath )
{
return;
}
// self thread start_damage_effects( );
}
//******************************************************************
// *
// *
//******************************************************************
function spawn_firefly_mover() // self == betty ent
{
// self util::waitTillNotMoving();
// self UseAnimTree( #animtree );
// self SetAnim( %o_spider_mine_deploy, 1.0, 0.0, 1.0 );
firefly_mover = spawn( "script_model", self.origin );
firefly_mover.angles = self.angles;
firefly_mover SetModel( "tag_origin" );
// firefly_mover SetModel( "fx_axis_createfx" ); // temp
firefly_mover.owner = self.owner;
firefly_mover.killCamOffset = ( 0, 0, GetDvarFloat( "scr_fireflies_start_height", 8.0 ) );
// firefly_mover.weapon = self.weapon;
firefly_mover.weapon = GetWeapon("hero_firefly_swarm");
firefly_mover.takedamage = true;
firefly_mover.soundMod = "firefly";
firefly_mover.team = self.team;
killcamEnt = spawn( "script_model", firefly_mover.origin + firefly_mover.killCamOffset );
killcamEnt.angles = ( 0,0,0 );
killcamEnt SetModel( "tag_origin" );
killcamEnt SetWeapon( firefly_mover.weapon );
// store the blob entity on the killcam entity so we can chain them together
killcamEnt killcam::store_killcam_entity_on_entity(self);
firefly_mover.killcamEnt = killcamEnt;
self.firefly_mover = firefly_mover;
firefly_mover.debug_time = 1;
firefly_mover thread firefly_mover_damage();
weaponobjects::add_supplemental_object( firefly_mover );
}
function firefly_mover_damage()
{
while(1)
{
self waittill ( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
self thread firefly_death();
}
}
//******************************************************************
// *
// *
//******************************************************************
function kill_firefly_mover() // self == betty ent
{
if ( isdefined( self.firefly_mover ))
{
if ( isdefined( self.firefly_mover.killcamEnt ) )
{
self.firefly_mover.killcamEnt delete();
}
self.firefly_mover delete();
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_detonate( attacker, weapon, target ) // self == betty
{
if ( !isdefined( target ) || !isdefined( target.team ) || !isdefined( self.team ) || self.team == target.team )
{
if ( IsDefined( weapon ) && weapon.isValid )
{
if ( isdefined( attacker ) )
{
if ( self.owner util::IsEnemyPlayer( attacker ) )
{
attacker challenges::destroyedExplosive( weapon );
scoreevents::processScoreEvent( "destroyed_fireflyhive", attacker, self.owner, weapon );
}
}
}
self firefly_pod_destroyed();
return;
}
else
{
// self.firefly_mover SetModel( self.model );
self spawn_firefly_mover();
self.firefly_mover thread firefly_watch_for_target_death( target );
self.firefly_mover thread firefly_watch_for_game_ended( target );
self thread firefly_pod_release_fireflies( attacker, target );
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_destroyed( ) // self == betty
{
fx_ent = PlayFX( "weapon/fx_hero_chem_gun_blob_death", self.origin );
fx_ent.team = self.team;
PlaySoundAtPosition ( "wpn_gelgun_blob_destroy", self.origin );
if ( isdefined( self.trigger ) )
{
self.trigger delete();
}
self kill_firefly_mover();
self delete();
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_killcam_move( position, time ) // self == script mover spawned at weaponobject location
{
if ( !IsDefined( self.killcamEnt ) )
return;
self endon("death");
wait( 0.5 );
accel = 0;
decel = 0;
self.killCamEnt MoveTo( position, time, accel, decel );
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_killcam_stop()
{
self notify("stop_killcam");
if ( IsDefined( self.killcamEnt ) )
{
self.killcamEnt MoveTo( self.killcamEnt.origin, 0.1, 0, 0);
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_move( position, time ) // self == script mover spawned at weaponobject location
{
self endon("death");
accel = 0; //time * 0.1;
decel = 0; //time * 0.1;
self thread firefly_killcam_move( position, time );
self MoveTo( position, time, accel, decel );
self waittill( "movedone" );
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_partial_move( target, position, time, percent ) // self == script mover spawned at weaponobject location
{
self endon("death");
self endon("stop_killcam");
accel = 0; //time * 0.1;
decel = 0; //time * 0.1;z
self thread firefly_killcam_move( position, time );
self MoveTo( position, time, accel, decel );
self thread firefly_check_for_collisions( target, position, time );
wait( time * percent );
self notify("movedone");
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_rotate( angles, time ) // self == script mover spawned at weaponobject location
{
self endon("death");
self RotateTo( angles, time, 0, 0 );
self waittill( "rotatedone" );
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_check_for_collisions( target, move_to, time ) // self == script mover spawned at weaponobject location
{
self endon("death");
self endon("movedone");
original_position = self.origin;
dir = VectorNormalize(move_to - self.origin);
dist = Distance( self.origin, move_to );
speed = dist / time;
delta = dir * ( speed * level.fireflies_collision_check_interval );
while( 1 )
{
if ( !firefly_check_move( self.origin + delta, target ) )
{
// hit something
self thread firefly_death();
self playsound( "wpn_gelgun_hive_wall_impact" );
}
wait( level.fireflies_collision_check_interval );
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_rotated_point( degrees, radius, height )
{
angles = ( 0, degrees, 0 );
forward = ( radius, 0, 0);
point = RotatePoint( forward, angles );
return self.spawn_origin + point + ( 0, 0, height );
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_random_point()
{
return firefly_pod_rotated_point( RandomInt(359), RandomInt( level.fireflies_radius ), RandomIntRange( -level.fireflies_height_variance, level.fireflies_height_variance ) );
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_random_movement( ) // self == script mover spawned at weaponobject location
{
self endon("death");
self endon("attacking");
while (1)
{
point = firefly_pod_random_point();
delta = point - self.origin;
angles = VectorToAngles(delta);
firefly_rotate( angles, 0.15 );
dist = Length( delta );
time = 0.01;
if ( dist > 0 )
{
time = dist / level.fireflies_min_speed;
}
firefly_move( point, time );
wait( RandomFloatRange( 0.1, 0.7 ) );
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_spyrograph_patrol( degrees, increment, radius ) // self == script mover spawned at weaponobject location
{
self endon("death");
self endon("attacking");
current_degrees = RandomInt( int(360 / degrees) ) * degrees;
height_offset = 0;
while (1)
{
point = firefly_pod_rotated_point( current_degrees, radius, height_offset );
delta = point - self.origin;
angles = ( 0, current_degrees, 0 );
thread firefly_rotate( angles, 0.15 );
dist = Length( delta );
time = 0.01;
if ( dist > 0 )
{
time = dist / level.fireflies_min_speed;
}
firefly_move( point, time );
wait( RandomFloatRange( 0.1, 0.3 ) );
current_degrees = ( current_degrees + ( degrees * increment ) ) % 360;
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_damage_target( target ) // self == script mover spawned at weaponobject location
{
level endon("game_ended");
self endon("death");
target endon("disconnect");
target endon("death");
target endon ( "entering_last_stand" );
damage = 25;
damage_delay = 0.1;
weapon = self.weapon;
target playsound( "wpn_gelgun_hive_attack" );
target notify( "snd_burn_scream" );
remaining_hits = 10; // big number, not too big
//if( IS_EQUAL( target.type, "robot" ) )
if ( !isplayer(target) )
remaining_hits = 4;
while( remaining_hits > 0 )
{
wait( damage_delay );
target DoDamage( damage, self.origin, self.owner, self, "", "MOD_IMPACT", 0, weapon );
remaining_hits -= 1;
if ( IsAlive( target ) && IsPlayer( target ) )
{
bodyType = target GetCharacterBodyType();
if ( bodyType >= 0 )
{
bodyTypeFields = GetCharacterFields( bodyType, CurrentSessionMode() );
if( (isdefined(bodyTypeFields.digitalBlood)?bodyTypeFields.digitalBlood:false) )
{
PlayFXOnTag( "weapon/fx_hero_firefly_sparks_os", target, "J_SpineLower");
}
else
{
PlayFXOnTag( "weapon/fx_hero_firefly_blood_os", target, "J_SpineLower");
}
}
else
{
PlayFXOnTag( "weapon/fx_hero_firefly_blood_os", target, "J_SpineLower");
}
}
else if ( !IsPlayer( target ) )
{
PlayFXOnTag( "weapon/fx_hero_firefly_sparks_os", target, "tag_origin");
}
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_watch_for_target_death( target )
{
self endon("death");
if ( IsAlive( target ) )
{
target util::waittill_any("death", "flashback", "game_ended");
}
if( IsPlayer( target ) )
{
target clientfield::set_to_player( "fireflies_attacking", 0 );
target clientfield::set_to_player( "fireflies_chasing", 0 );
}
self thread firefly_death();
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_watch_for_game_ended( target )
{
self endon("death");
level waittill( "game_ended");
if ( IsAlive( target ) && IsPlayer( target ) )
{
target clientfield::set_to_player( "fireflies_attacking", 0 );
target clientfield::set_to_player( "fireflies_chasing", 0 );
}
self thread firefly_death();
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_death()
{
/#
println("firefly_death " + self getentnum() );
#/
self clientfield::set( "firefly_state", 5 );
self playsound( "wpn_gelgun_hive_die" );
if ( IsDefined( self.target_entity ) && isPlayer( self.target_entity ) )
{
self.target_entity clientfield::set_to_player( "fireflies_attacking", 0 );
self.target_entity clientfield::set_to_player( "fireflies_chasing", 0 );
}
waittillframeend;
thread cleanup_killcam_entity(self.killcamEnt);
if ( isdefined( self ) )
{
/#
println("firefly_death deleting " + self getentnum() );
#/
self delete();
}
}
function cleanup_killcam_entity(killcamEnt)
{
wait(5);
if ( isdefined( killcamEnt ) )
{
killcamEnt delete();
}
}
function get_attack_speed( target )
{
velocity = target GetVelocity();
speed = Length( velocity ) * level.fireflies_attack_speed_scale;
if ( speed < level.fireflies_min_speed )
{
speed = level.fireflies_min_speed;
}
return speed;
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_attack( target, state )
{
level endon("game_ended");
self endon("death");
target endon ( "entering_last_stand" );
self thread firefly_killcam_stop();
self clientfield::set( "firefly_state", state );
if( IsPlayer( target ) )
{
target clientfield::set_to_player( "fireflies_attacking", 1 );
}
target_origin = target.origin + (0,0,50);
delta = self.origin - target_origin;
dist = Length( delta );
time = 0.01;
if ( dist > 0 )
{
speed = get_attack_speed( target );
time = dist / speed;
}
self.enemy = target;
firefly_move( target_origin, time );
if ( !isdefined( target ) || !IsAlive( target ) )
return;
self LinkTo( target );
wait(time);
if ( !IsAlive(target) )
return;
self thread firefly_damage_target( target );
}
function get_crumb_position( target )
{
height = 50;
if( IsPlayer( target ) )
{
stance = target GetStance();
if ( stance == "crouch" )
height = 30;
else if ( stance == "prone" )
height = 15;
}
return target.origin + (0,0,height);
}
/#
function target_bread_crumbs_render( target )
{
self endon("death");
self endon("attack");
while(1)
{
previous_crumb = self.origin;
for( i = 0; i < self.target_breadcrumbs.size; i++ )
{
if ( (self.target_breadcrumb_current_index + i) > self.target_breadcrumb_last_added )
break;
crumb_index = (self.target_breadcrumb_current_index + i) % self.target_breadcrumbs.size;
crumb = self.target_breadcrumbs[crumb_index ];
sphere( crumb, 2, (0,1,0), 1, true, 10, self.debug_time );
if ( i > 0 )
line(previous_crumb, crumb, (0,1,0), 1.0, true, self.debug_time );
previous_crumb = crumb;
}
{wait(.05);};
}
}
#/
function target_bread_crumbs( target )
{
self endon("death");
target endon("death");
self.target_breadcrumbs = [];
self.target_breadcrumb_current_index = 0;
self.target_breadcrumb_last_added = 0;
minimum_delta_sqr = 20 * 20;
self.max_crumbs = 20;
self.target_breadcrumbs[self.target_breadcrumb_last_added] = get_crumb_position( target );
/#
if ( level.firefly_debug )
{
self thread target_bread_crumbs_render( target );
}
#/
while( 1 )
{
wait( 0.25 );
previous_crumb_index = self.target_breadcrumb_last_added % self.max_crumbs;
potential_crumb_position = get_crumb_position( target );
if ( DistanceSquared( potential_crumb_position, self.target_breadcrumbs[previous_crumb_index] ) > minimum_delta_sqr )
{
self.target_breadcrumb_last_added++;
// if the newly added point will pass the currently targeted point in the buffer make sure to set the current point
if ( self.target_breadcrumb_last_added >= (self.target_breadcrumb_current_index + self.max_crumbs) )
self.target_breadcrumb_current_index = self.target_breadcrumb_last_added - self.max_crumbs + 1 ;
self.target_breadcrumbs[self.target_breadcrumb_last_added % self.max_crumbs] = potential_crumb_position;
}
}
}
function get_target_bread_crumb( target )
{
if ( self.target_breadcrumb_current_index > self.target_breadcrumb_last_added )
return get_crumb_position( target );
current_index = self.target_breadcrumb_current_index % self.max_crumbs;
if ( !isDefined( self.target_breadcrumbs[current_index] ) )
return get_crumb_position( target );
return self.target_breadcrumbs[current_index];
}
function firefly_check_move( position, target )
{
passed = bullettracepassed(self.origin, position, false, self, target );
return passed;
//results = PhysicsTraceEx( self.origin, position, (-5,-5,-5), (5,5,5), self );
//if( results["fraction"] == 1 )
//{
// return true;
//}
//return false;
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_chase( target ) // self == script mover spawned at weaponobject location
{
level endon("game_ended");
self endon("death");
target endon("death");
target endon( "entering_last_stand" );
self clientfield::set( "firefly_state", 2 );
if( IsPlayer( target ) )
{
target clientfield::set_to_player( "fireflies_chasing", 1 );
}
max_distance = 500;
attack_distance = 50;
max_offset = 10;
up = (0,0,1);
while(1)
{
target_origin = target.origin + (0,0,50);
delta = target_origin - self.origin;
dist = Length( delta );
if ( dist <= attack_distance && firefly_check_move(target_origin, target ) )
{
thread firefly_attack( target, 3 );
return;
}
else
{
target_origin = get_target_bread_crumb( target );
/#
if ( level.firefly_debug )
sphere( self.origin, 2, (1,0,0), 1, true, 10, self.debug_time );
#/
// this code will give some randomness to the target point.
// delta = target_origin - self.origin;
// normal = VectorNormalize( delta );
// right = VectorCross( normal, up );
// offset = RotatePointAroundAxis( (right * max_offset), normal, RandomInt(359) );
//
// target_origin = target_origin + offset;
}
delta = target_origin - self.origin;
angles = VectorToAngles(delta);
thread firefly_rotate( angles, 0.15 );
dist = Length( delta );
time = 0.01;
if ( dist > 0 )
{
speed = get_attack_speed( target );
time = dist / speed;
}
firefly_partial_move( target, target_origin, time, level.firefly_pod_partial_move_percent );
self.target_breadcrumb_current_index++;
}
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_start( start_pos, target, linked ) // self == script mover spawned at weaponobject location
{
level endon("game_ended");
self endon("death");
self notify("attack");
/#
if ( level.firefly_debug )
sphere( self.origin, 4, (1,0,0), 1, true, 10, self.debug_time );
#/
level.fireflies_height_variance = 30;
level.fireflies_radius = 100;
self.target_origin_at_start = target.origin;
self.target_entity = target;
if ( linked )
{
// fx_ent = PlayFX( "weapon/fx_hero_firefly_start_entity", self.origin );
// fx_ent.team = self.team;
thread firefly_attack( target, 4 );
return;
}
else
{
// start bread crumbing immediatly
thread target_bread_crumbs( target );
//delta = target.origin - self.origin;
//angles = VectorToAngles(delta);
//self.angles = angles;
self MoveTo( start_pos, level.fireflies_emit_time, 0, level.fireflies_emit_time );
self waittill( "movedone" );
if ( isdefined( target ) && isdefined( target.origin ) )
{
delta = target.origin - self.origin;
angles = VectorToAngles(delta);
self.angles = angles;
// self thread firefly_spyrograph_patrol( 60, 1, level.fireflies_radius );
self thread firefly_chase( target );
}
}
wait( 30 );
if ( isdefined( self.killcamEnt ) )
{
self.killcamEnt delete();
}
self delete();
}
//******************************************************************
// *
// *
//******************************************************************
function firefly_pod_release_fireflies( attacker, target ) // self == script mover spawned at weaponobject location
{
jumpDir = VectorNormalize( AnglesToUp( self.angles ) );
if ( jumpDir[2] > level.fireflies_spawn_height_wall_angle_cos )
{
jumpHeight = level.fireflies_spawn_height;
}
else
{
jumpHeight = level.fireflies_spawn_height_wall;
}
explodePos = self.origin + jumpDir * jumpHeight;
self.firefly_mover.spawn_origin = explodePos;
linked_to = self GetLinkedEnt();
linked = (linked_to === target);
if ( !linked )
{
fx_ent = PlayFX( "weapon/fx_hero_firefly_start", self.origin, AnglesToUp( self.angles ) );
fx_ent.team = self.team;
self.firefly_mover clientfield::set( "firefly_state", 1 );
self.firefly_mover.killCamEnt MoveTo( explodePos + self.firefly_mover.killCamOffset, level.fireflies_emit_time, 0, level.fireflies_emit_time );
}
else
{
// self.firefly_mover.killCamEnt delete();
// self.firefly_mover.killCamEnt = undefined;
}
self.firefly_mover thread firefly_pod_start( explodePos, target, linked );
self delete();
}
function firefly_pod_should_damage( watcher, attacker, weapon, damage )
{
// gel blobs do not damage eachother
if ( weapon == watcher.weapon )
return false;
if ( weapon.isEmp || weapon.destroysEquipment )
return true;
// anything will kill it over 15 damage
if ( self.damageTaken < 15 )
return false;
return true;
}
//function firefly_spawn_vehicle( targetEnt )
//{
// swarm = SpawnVehicle( "spawner_bo3_cybercom_firefly", origin, angles);
// if(isDefined(swarm))
// {
// swarm.threatbias = -300;
//
// swarm.owner = self;
// swarm.team = self.team;
// swarm.lifetime = 45;
// swarm.targetEnt = targetEnt; //set this if you want an initial target
//
// swarm.state_machine = statemachine::create( "brain", swarm, "swarm_change_state" );
// swarm.state_machine statemachine::add_state( "init", &swarm_state_enter, &swarm_init, &swarm_state_cleanup );
// swarm.state_machine statemachine::add_state( "attack", &swarm_state_enter, &swarm_attack_think,&swarm_state_cleanup );
// swarm.state_machine statemachine::set_state( "init" );
// targetEnt = undefined;
// }
//}
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//function swarm_state_cleanup( params )
//{
// if(isDefined(self.badplace))
// {
// badplace_delete("swarmBP_"+self.swarm_ID);
// self.badplace = undefined;
// }
//}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//function swarm_state_enter( params )
//{
// WAIT_SERVER_FRAME;
//}
//
//function drawOriginForever()
//{
// for( ;; )
// {
// drawArrow( self.origin, self.angles );
// WAIT_SERVER_FRAME;
// }
//}
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//function swarm_init( params )
//{
// self setmodel("tag_origin");
// self notsolid();
// self.ignoreall = true;
// self.takedamage = false;
// self.goalradius = 36;
// self.goalheight = 36;
// self.good_melee_target = true;
// self SetNearGoalNotifyDist( 48 );
//
// if(SWARM_SHOW_DEBUG)
// {
// self thread drawOriginForever();
// }
//
//// self thread swarm_death_wait();
//// self thread swarm_split_monitor();
//// self.sndEnt = spawn( "script_origin", self.origin );
//// self.sndEnt linkto( self );
// self clearforcedgoal();
// self SetGoal( self.origin, true, self.goalradius ); //set the goal for swarm
//
// if(!IS_TRUE(self.isOffspring))
// {
// enemies = self _get_valid_targets();
// 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
// if(closeTargets.size == 0 )
// {
// //Move the swarm out and away frmo FXAnim ending spot
// //this will cause the swarm to move out towards locatoin player was observing
// //We do this to get the swarm closer to targets that the player was looking at.
// angles = (self.angles[0],self.angles[1],0);
// frontGoal = self.origin + (anglestoforward( angles)*240); //max 512 units out
// a_trace = BulletTrace( self.origin,frontGoal, false, undefined, true );
// hitp = a_trace[ "position" ]; //but lets check that we can go that far, if not, take the trace point
//
// queryResult = PositionQuery_Source_Navigation(hitp, 0, 72, 72, 20, self ); //can swarm find node around where it wants to go?
// if( queryResult.data.size > 0 )
// {
// pathSuccess = self FindPath( self.origin, queryResult.data[0].origin, true, false ); //can swarm path to that location?
// if ( pathSuccess )
// {
// if(SWARM_SHOW_DEBUG)
// {
// level thread cybercom::debug_Circle( queryResult.data[0].origin, 16, 10, (1,0,0) );
// }
// self clearforcedgoal();
// self SetGoal( queryResult.data[0].origin, true, self.goalradius ); //set the goal for swarm
//
// if(!self.fireBugCount)
// self clientfield::set("firefly_state",FIREFLY_STATE_HUNT_TRANS_TO_MOVE);
// else
// self clientfield::set("firefly_state",FIREBUG_STATE_HUNT_TRANS_TO_MOVE);
//
// self util::waittill_any_timeout( 5, "near_goal" );
// }
// }
// }
// }
//}