iw6-scripts/maps/mp/killstreaks/_ball_drone.gsc
2024-02-13 13:20:49 +01:00

1005 lines
32 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["ball_drone_radar"] = ::tryuseballdrone;
level.killstreakfuncs["ball_drone_backup"] = ::tryuseballdrone;
level.balldronesettings = [];
level.balldronesettings["ball_drone_radar"] = spawnstruct();
level.balldronesettings["ball_drone_radar"].timeout = 60.0;
level.balldronesettings["ball_drone_radar"].health = 999999;
level.balldronesettings["ball_drone_radar"].maxhealth = 500;
level.balldronesettings["ball_drone_radar"].streakname = "ball_drone_radar";
level.balldronesettings["ball_drone_radar"].vehicleinfo = "ball_drone_mp";
level.balldronesettings["ball_drone_radar"].modelbase = "vehicle_ball_drone_iw6";
level.balldronesettings["ball_drone_radar"].teamsplash = "used_ball_drone_radar";
level.balldronesettings["ball_drone_radar"].fxid_sparks = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ims_sparks" );
level.balldronesettings["ball_drone_radar"].fxid_explode = loadfx( "vfx/gameplay/explosions/vehicle/ball/vfx_exp_ball_drone" );
level.balldronesettings["ball_drone_radar"].sound_explode = "ball_drone_explode";
level.balldronesettings["ball_drone_radar"].vodestroyed = "nowl_destroyed";
level.balldronesettings["ball_drone_radar"].votimedout = "nowl_gone";
level.balldronesettings["ball_drone_radar"].xppopup = "destroyed_ball_drone_radar";
level.balldronesettings["ball_drone_radar"].playfxcallback = ::radarbuddyplayfx;
level.balldronesettings["ball_drone_radar"].fxid_light1 = [];
level.balldronesettings["ball_drone_radar"].fxid_light2 = [];
level.balldronesettings["ball_drone_radar"].fxid_light3 = [];
level.balldronesettings["ball_drone_radar"].fxid_light4 = [];
level.balldronesettings["ball_drone_radar"].fxid_light1["enemy"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_light_detonator_blink" );
level.balldronesettings["ball_drone_radar"].fxid_light2["enemy"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_light_detonator_blink" );
level.balldronesettings["ball_drone_radar"].fxid_light3["enemy"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_light_detonator_blink" );
level.balldronesettings["ball_drone_radar"].fxid_light4["enemy"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_light_detonator_blink" );
level.balldronesettings["ball_drone_radar"].fxid_light1["friendly"] = loadfx( "fx/misc/light_mine_blink_friendly" );
level.balldronesettings["ball_drone_radar"].fxid_light2["friendly"] = loadfx( "fx/misc/light_mine_blink_friendly" );
level.balldronesettings["ball_drone_radar"].fxid_light3["friendly"] = loadfx( "fx/misc/light_mine_blink_friendly" );
level.balldronesettings["ball_drone_radar"].fxid_light4["friendly"] = loadfx( "fx/misc/light_mine_blink_friendly" );
level.balldronesettings["ball_drone_backup"] = spawnstruct();
level.balldronesettings["ball_drone_backup"].timeout = 90.0;
level.balldronesettings["ball_drone_backup"].health = 999999;
level.balldronesettings["ball_drone_backup"].maxhealth = 500;
level.balldronesettings["ball_drone_backup"].streakname = "ball_drone_backup";
level.balldronesettings["ball_drone_backup"].vehicleinfo = "backup_drone_mp";
level.balldronesettings["ball_drone_backup"].modelbase = "vehicle_drone_backup_buddy";
level.balldronesettings["ball_drone_backup"].teamsplash = "used_ball_drone_radar";
level.balldronesettings["ball_drone_backup"].fxid_sparks = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ims_sparks" );
level.balldronesettings["ball_drone_backup"].fxid_explode = loadfx( "fx/explosions/bouncing_betty_explosion" );
level.balldronesettings["ball_drone_backup"].sound_explode = "ball_drone_explode";
level.balldronesettings["ball_drone_backup"].vodestroyed = "vulture_destroyed";
level.balldronesettings["ball_drone_backup"].votimedout = "vulture_gone";
level.balldronesettings["ball_drone_backup"].xppopup = "destroyed_ball_drone";
level.balldronesettings["ball_drone_backup"].weaponinfo = "ball_drone_gun_mp";
level.balldronesettings["ball_drone_backup"].weaponmodel = "vehicle_drone_backup_buddy_gun";
level.balldronesettings["ball_drone_backup"].weapontag = "tag_turret_attach";
level.balldronesettings["ball_drone_backup"].sound_weapon = "weap_p99_fire_npc";
level.balldronesettings["ball_drone_backup"].sound_targeting = "ball_drone_targeting";
level.balldronesettings["ball_drone_backup"].sound_lockon = "ball_drone_lockon";
level.balldronesettings["ball_drone_backup"].sentrymode = "sentry";
level.balldronesettings["ball_drone_backup"].visual_range_sq = 1440000;
level.balldronesettings["ball_drone_backup"].burstmin = 10;
level.balldronesettings["ball_drone_backup"].burstmax = 20;
level.balldronesettings["ball_drone_backup"].pausemin = 0.15;
level.balldronesettings["ball_drone_backup"].pausemax = 0.35;
level.balldronesettings["ball_drone_backup"].lockontime = 0.25;
level.balldronesettings["ball_drone_backup"].playfxcallback = ::backupbuddyplayfx;
level.balldronesettings["ball_drone_backup"].fxid_light1 = [];
level.balldronesettings["ball_drone_backup"].fxid_light1["enemy"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_light_detonator_blink" );
level.balldronesettings["ball_drone_backup"].fxid_light1["friendly"] = loadfx( "fx/misc/light_mine_blink_friendly" );
level.balldrones = [];
}
tryuseballdrone( var_0, var_1 )
{
return useballdrone( var_1 );
}
useballdrone( var_0 )
{
var_1 = 1;
if ( maps\mp\_utility::isusingremote() )
return 0;
else if ( exceededmaxballdrones() )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_1 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
else if ( isdefined( self.balldrone ) )
{
self iprintlnbold( &"KILLSTREAKS_COMPANION_ALREADY_EXISTS" );
return 0;
}
else if ( isdefined( self.drones_disabled ) )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE" );
return 0;
}
maps\mp\_utility::incrementfauxvehiclecount();
var_2 = createballdrone( var_0 );
if ( !isdefined( var_2 ) )
{
if ( maps\mp\_utility::is_aliens() )
self.drone_failed = 1;
else
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE" );
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
self.balldrone = var_2;
thread startballdrone( var_2 );
if ( var_0 == "ball_drone_backup" && maps\mp\agents\_agent_utility::getnumownedactiveagentsbytype( self, "dog" ) > 0 )
maps\mp\gametypes\_missions::processchallenge( "ch_twiceasdeadly" );
return 1;
}
createballdrone( var_0 )
{
var_1 = self.angles;
var_2 = anglestoforward( self.angles );
var_3 = self.origin + var_2 * 100 + ( 0, 0, 90 );
var_4 = self.origin + ( 0, 0, 90 );
var_5 = bullettrace( var_4, var_3, 0 );
var_6 = 3;
while ( var_5["surfacetype"] != "none" && var_6 > 0 )
{
var_3 = self.origin + vectornormalize( var_4 - var_5["position"] ) * 5;
var_5 = bullettrace( var_4, var_3, 0 );
var_6--;
wait 0.05;
}
if ( var_6 <= 0 )
return;
var_7 = anglestoright( self.angles );
var_8 = self.origin + var_7 * 20 + ( 0, 0, 90 );
var_5 = bullettrace( var_3, var_8, 0 );
var_6 = 3;
while ( var_5["surfacetype"] != "none" && var_6 > 0 )
{
var_8 = var_3 + vectornormalize( var_3 - var_5["position"] ) * 5;
var_5 = bullettrace( var_3, var_8, 0 );
var_6--;
wait 0.05;
}
if ( var_6 <= 0 )
return;
var_9 = spawnhelicopter( self, var_3, var_1, level.balldronesettings[var_0].vehicleinfo, level.balldronesettings[var_0].modelbase );
if ( !isdefined( var_9 ) )
return;
var_9 enableaimassist();
var_9 makevehiclenotcollidewithplayers( 1 );
var_9 addtoballdronelist();
var_9 thread removefromballdronelistondeath();
var_9.health = level.balldronesettings[var_0].health;
var_9.maxhealth = level.balldronesettings[var_0].maxhealth;
var_9.damagetaken = 0;
var_9.speed = 140;
var_9.followspeed = 140;
var_9.owner = self;
var_9.team = self.team;
var_9 vehicle_setspeed( var_9.speed, 16, 16 );
var_9 setyawspeed( 120, 90 );
var_9 setneargoalnotifydist( 16 );
var_9.balldronetype = var_0;
var_9 sethoverparams( 30, 10, 5 );
var_9 setotherent( self );
var_9 common_scripts\utility::make_entity_sentient_mp( self.team, var_0 != "ball_drone_backup" );
if ( issentient( var_9 ) )
var_9 setthreatbiasgroup( "DogsDontAttack" );
if ( !maps\mp\_utility::is_aliens() )
{
if ( level.teambased )
var_9 maps\mp\_entityheadicons::setteamheadicon( var_9.team, ( 0, 0, 25 ) );
else
var_9 maps\mp\_entityheadicons::setplayerheadicon( var_9.owner, ( 0, 0, 25 ) );
}
var_10 = 45;
var_11 = 45;
switch ( var_0 )
{
case "ball_drone_radar":
var_10 = 90;
var_11 = 90;
var_12 = spawn( "script_model", self.origin );
var_12.team = self.team;
var_12 makeportableradar( self );
var_9.radar = var_12;
var_9 thread radarmover();
var_9.ammo = 99999;
var_9.cameraoffset = distance( var_9.origin, var_9 gettagorigin( "camera_jnt" ) );
var_9 thread maps\mp\gametypes\_trophy_system::trophyactive( self );
var_9 thread balldrone_handledamage();
break;
case "alien_ball_drone_4":
case "alien_ball_drone_3":
case "alien_ball_drone_2":
case "alien_ball_drone_1":
case "alien_ball_drone":
case "ball_drone_backup":
var_13 = spawnturret( "misc_turret", var_9 gettagorigin( level.balldronesettings[var_0].weapontag ), level.balldronesettings[var_0].weaponinfo );
var_13 linkto( var_9, level.balldronesettings[var_0].weapontag );
var_13 setmodel( level.balldronesettings[var_0].weaponmodel );
var_13.angles = var_9.angles;
var_13.owner = var_9.owner;
var_13.team = self.team;
var_13 maketurretinoperable();
var_13 makeunusable();
var_13.vehicle = var_9;
var_13.health = level.balldronesettings[var_0].health;
var_13.maxhealth = level.balldronesettings[var_0].maxhealth;
var_13.damagetaken = 0;
var_14 = self.origin + var_2 * -100 + ( 0, 0, 40 );
var_13.idletarget = spawn( "script_origin", var_14 );
var_13.idletarget.targetname = "test";
thread idletargetmover( var_13.idletarget );
if ( level.teambased )
var_13 setturretteam( self.team );
var_13 setmode( level.balldronesettings[var_0].sentrymode );
var_13 setsentryowner( self );
var_13 setleftarc( 180 );
var_13 setrightarc( 180 );
var_13 setbottomarc( 50 );
var_13 thread balldrone_attacktargets();
var_13 setturretminimapvisible( 1, "buddy_turret" );
var_15 = var_9.origin + ( anglestoforward( var_9.angles ) * -10 + anglestoright( var_9.angles ) * -10 ) + ( 0, 0, 10 );
var_13.killcament = spawn( "script_model", var_15 );
var_13.killcament setscriptmoverkillcam( "explosive" );
var_13.killcament linkto( var_9 );
var_9.turret = var_13;
var_13.parent = var_9;
var_9 thread balldrone_backup_handledamage();
var_9.turret thread balldrone_backup_turret_handledamage();
break;
default:
break;
}
var_9 setmaxpitchroll( var_10, var_11 );
var_9.targetpos = var_8;
var_9.attract_strength = 10000;
var_9.attract_range = 150;
if ( !( maps\mp\_utility::is_aliens() && isdefined( level.script ) && level.script == "mp_alien_last" ) )
var_9.attractor = missile_createattractorent( var_9, var_9.attract_strength, var_9.attract_range );
var_9.hasdodged = 0;
var_9.stunned = 0;
var_9.inactive = 0;
var_9 thread watchempdamage();
var_9 thread balldrone_watchdeath();
var_9 thread balldrone_watchtimeout();
var_9 thread balldrone_watchownerloss();
var_9 thread balldrone_watchownerdeath();
var_9 thread balldrone_watchroundend();
var_9 thread balldrone_enemy_lightfx();
var_9 thread balldrone_friendly_lightfx();
var_16 = spawnstruct();
var_16.validateaccuratetouching = 1;
var_16.deathoverridecallback = ::balldrone_moving_platform_death;
var_9 thread maps\mp\_movers::handle_moving_platforms( var_16 );
var_9.owner maps\mp\_matchdata::logkillstreakevent( level.balldronesettings[var_9.balldronetype].streakname, var_9.targetpos );
return var_9;
}
balldrone_moving_platform_death( var_0 )
{
if ( !isdefined( var_0.lasttouchedplatform.destroydroneoncollision ) || var_0.lasttouchedplatform.destroydroneoncollision )
self notify( "death" );
}
idletargetmover( var_0 )
{
self endon( "disconnect" );
level endon( "game_ended" );
var_0 endon( "death" );
var_1 = anglestoforward( self.angles );
for (;;)
{
if ( maps\mp\_utility::isreallyalive( self ) && !maps\mp\_utility::isusingremote() && anglestoforward( self.angles ) != var_1 )
{
var_1 = anglestoforward( self.angles );
var_2 = self.origin + var_1 * -100 + ( 0, 0, 40 );
var_0 moveto( var_2, 0.5 );
}
wait 0.5;
}
}
balldrone_enemy_lightfx()
{
self endon( "death" );
var_0 = level.balldronesettings[self.balldronetype];
for (;;)
{
foreach ( var_2 in level.players )
{
if ( isdefined( var_2 ) )
{
if ( level.teambased )
{
if ( var_2.team != self.team )
self [[ var_0.playfxcallback ]]( "enemy", var_2 );
continue;
}
if ( var_2 != self.owner )
self [[ var_0.playfxcallback ]]( "enemy", var_2 );
}
}
wait 1.0;
}
}
balldrone_friendly_lightfx()
{
self endon( "death" );
var_0 = level.balldronesettings[self.balldronetype];
foreach ( var_2 in level.players )
{
if ( isdefined( var_2 ) )
{
if ( level.teambased )
{
if ( var_2.team == self.team )
self [[ var_0.playfxcallback ]]( "friendly", var_2 );
continue;
}
if ( var_2 == self.owner )
self [[ var_0.playfxcallback ]]( "friendly", var_2 );
}
}
thread watchconnectedplayfx();
thread watchjoinedteamplayfx();
}
backupbuddyplayfx( var_0, var_1 )
{
var_2 = level.balldronesettings[self.balldronetype];
playfxontagforclients( var_2.fxid_light1[var_0], self.turret, "tag_fx", var_1 );
playfxontagforclients( var_2.fxid_light1[var_0], self, "tag_fx", var_1 );
}
radarbuddyplayfx( var_0, var_1 )
{
var_2 = level.balldronesettings[self.balldronetype];
playfxontagforclients( var_2.fxid_light1[var_0], self, "tag_fx", var_1 );
playfxontagforclients( var_2.fxid_light2[var_0], self, "tag_fx1", var_1 );
playfxontagforclients( var_2.fxid_light3[var_0], self, "tag_fx2", var_1 );
playfxontagforclients( var_2.fxid_light4[var_0], self, "tag_fx3", var_1 );
}
watchconnectedplayfx()
{
self endon( "death" );
for (;;)
{
level waittill( "connected", var_0 );
var_0 waittill( "spawned_player" );
var_1 = level.balldronesettings[self.balldronetype];
if ( isdefined( var_0 ) )
{
if ( level.teambased )
{
if ( var_0.team == self.team )
self [[ var_1.playfxcallback ]]( "friendly", var_0 );
else
self [[ var_1.playfxcallback ]]( "enemy", var_0 );
continue;
}
if ( var_0 == self.owner )
{
self [[ var_1.playfxcallback ]]( "friendly", var_0 );
continue;
}
self [[ var_1.playfxcallback ]]( "enemy", var_0 );
}
}
}
watchjoinedteamplayfx()
{
self endon( "death" );
for (;;)
{
level waittill( "joined_team", var_0 );
var_0 waittill( "spawned_player" );
var_1 = level.balldronesettings[self.balldronetype];
if ( isdefined( var_0 ) )
{
if ( level.teambased )
{
if ( var_0.team == self.team )
self [[ var_1.playfxcallback ]]( "friendly", var_0 );
else
self [[ var_1.playfxcallback ]]( "enemy", var_0 );
continue;
}
if ( var_0 == self.owner )
{
self [[ var_1.playfxcallback ]]( "friendly", var_0 );
continue;
}
self [[ var_1.playfxcallback ]]( "enemy", var_0 );
}
}
}
startballdrone( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
switch ( var_0.balldronetype )
{
case "alien_ball_drone_4":
case "alien_ball_drone_3":
case "alien_ball_drone_2":
case "alien_ball_drone_1":
case "alien_ball_drone":
case "ball_drone_backup":
if ( isdefined( var_0.turret ) && isdefined( var_0.turret.idletarget ) )
var_0 setlookatent( var_0.turret.idletarget );
else
var_0 setlookatent( self );
break;
default:
var_0 setlookatent( self );
break;
}
var_1 = ( 0, 0, 118 );
var_0 setdronegoalpos( self, var_1 );
var_0 waittill( "near_goal" );
var_0 vehicle_setspeed( var_0.speed, 10, 10 );
var_0 waittill( "goal" );
var_0 thread balldrone_followplayer();
}
balldrone_followplayer()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
if ( !isdefined( self.owner ) )
{
thread balldrone_leave();
return;
}
self.owner endon( "disconnect" );
self endon( "owner_gone" );
self vehicle_setspeed( self.followspeed, 10, 10 );
var_0 = ( 0, 0, 0 );
var_1 = 4096;
thread low_entries_watcher();
for (;;)
{
if ( isdefined( self.owner ) && isalive( self.owner ) )
{
if ( self.owner.origin != var_0 && distancesquared( self.owner.origin, var_0 ) > var_1 )
{
if ( self.balldronetype == "ball_drone_backup" || self.balldronetype == "alien_ball_drone" || self.balldronetype == "alien_ball_drone_1" || self.balldronetype == "alien_ball_drone_2" || self.balldronetype == "alien_ball_drone_3" || self.balldronetype == "alien_ball_drone_4" )
{
if ( !isdefined( self.turret getturrettarget( 0 ) ) )
{
var_0 = self.owner.origin;
balldrone_movetoplayer();
continue;
}
}
else
{
var_0 = self.owner.origin;
balldrone_movetoplayer();
continue;
}
}
}
wait 1;
}
}
balldrone_movetoplayer()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
self notify( "ballDrone_moveToPlayer" );
self endon( "ballDrone_moveToPlayer" );
var_0 = 40;
var_1 = 40;
var_2 = 118;
switch ( self.owner getstance() )
{
case "stand":
var_2 = 118;
break;
case "crouch":
var_2 = 70;
break;
case "prone":
var_2 = 36;
break;
}
if ( isdefined( self.low_entry ) )
var_2 = var_2 * self.low_entry;
var_3 = ( var_1, var_0, var_2 );
self setdronegoalpos( self.owner, var_3 );
self.intransit = 1;
thread balldrone_watchforgoal();
}
balldrone_watchforgoal()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
self notify( "ballDrone_watchForGoal" );
self endon( "ballDrone_watchForGoal" );
var_0 = common_scripts\utility::waittill_any_return( "goal", "near_goal", "hit_goal" );
self.intransit = 0;
self.inactive = 0;
self notify( "hit_goal" );
}
radarmover()
{
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
if ( isdefined( self.stunned ) && self.stunned )
{
wait 0.5;
continue;
}
if ( isdefined( self.inactive ) && self.inactive )
{
wait 0.5;
continue;
}
if ( isdefined( self.radar ) )
self.radar moveto( self.origin, 0.5 );
wait 0.5;
}
}
low_entries_watcher()
{
level endon( "game_ended" );
self endon( "gone" );
self endon( "death" );
var_0 = getentarray( "low_entry", "targetname" );
while ( var_0.size > 0 )
{
foreach ( var_2 in var_0 )
{
while ( self istouching( var_2 ) || self.owner istouching( var_2 ) )
{
if ( isdefined( var_2.script_parameters ) )
self.low_entry = float( var_2.script_parameters );
else
self.low_entry = 0.5;
wait 0.1;
}
self.low_entry = undefined;
}
wait 0.1;
}
}
balldrone_watchdeath()
{
level endon( "game_ended" );
self endon( "gone" );
self waittill( "death" );
thread balldronedestroyed();
}
balldrone_watchtimeout()
{
level endon( "game_ended" );
self endon( "death" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
var_0 = level.balldronesettings[self.balldronetype];
var_1 = var_0.timeout;
if ( maps\mp\_utility::is_aliens() && isdefined( level.ball_drone_alien_timeout_func ) && isdefined( self.owner ) )
var_1 = self [[ level.ball_drone_alien_timeout_func ]]( var_1, self.owner );
if ( !maps\mp\_utility::is_aliens() )
{
}
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_1 );
if ( isdefined( self.owner ) && !maps\mp\_utility::is_aliens() )
self.owner maps\mp\_utility::leaderdialogonplayer( var_0.votimedout );
thread balldrone_leave();
}
balldrone_watchownerloss()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner waittill( "killstreak_disowned" );
self notify( "owner_gone" );
thread balldrone_leave();
}
balldrone_watchownerdeath()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
for (;;)
{
self.owner waittill( "death" );
if ( maps\mp\_utility::getgametypenumlives() && self.owner.pers["deaths"] == maps\mp\_utility::getgametypenumlives() )
thread balldrone_leave();
}
}
balldrone_watchroundend()
{
self endon( "death" );
self endon( "leaving" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
level common_scripts\utility::waittill_any( "round_end_finished", "game_ended" );
thread balldrone_leave();
}
balldrone_leave()
{
self endon( "death" );
self notify( "leaving" );
balldroneexplode();
}
balldrone_handledamage()
{
maps\mp\gametypes\_damage::monitordamage( self.maxhealth, "ball_drone", ::handledeathdamage, ::modifydamage, 1 );
}
balldrone_backup_handledamage()
{
self endon( "death" );
level endon( "game_ended" );
self setcandamage( 1 );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
maps\mp\gametypes\_damage::monitordamageoneshot( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, "ball_drone", ::handledeathdamage, ::modifydamage, 1 );
}
}
balldrone_backup_turret_handledamage()
{
self endon( "death" );
level endon( "game_ended" );
self maketurretsolid();
self setcandamage( 1 );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( isdefined( self.parent ) )
self.parent maps\mp\gametypes\_damage::monitordamageoneshot( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, "ball_drone", ::handledeathdamage, ::modifydamage, 1 );
}
}
modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_4 = maps\mp\gametypes\_damage::handlemissiledamage( var_1, var_2, var_4 );
var_4 = maps\mp\gametypes\_damage::handlegrenadedamage( var_1, var_2, var_4 );
var_4 = maps\mp\gametypes\_damage::handleapdamage( var_1, var_2, var_4, var_0 );
return var_4;
}
handledeathdamage( var_0, var_1, var_2, var_3 )
{
var_4 = level.balldronesettings[self.balldronetype];
maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, var_4.xppopup, var_4.vodestroyed );
if ( self.balldronetype == "ball_drone_backup" )
var_0 maps\mp\gametypes\_missions::processchallenge( "ch_vulturekiller" );
}
watchempdamage()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "emp_damage", var_0, var_1 );
balldrone_stunned( var_1 );
}
}
balldrone_stunned( var_0 )
{
self notify( "ballDrone_stunned" );
self endon( "ballDrone_stunned" );
self endon( "death" );
self.owner endon( "disconnect" );
level endon( "game_ended" );
self.stunned = 1;
if ( isdefined( level.balldronesettings[self.balldronetype].fxid_sparks ) )
playfxontag( level.balldronesettings[self.balldronetype].fxid_sparks, self, "tag_origin" );
if ( self.balldronetype == "ball_drone_radar" )
{
if ( isdefined( self.radar ) )
self.radar delete();
}
if ( isdefined( self.turret ) )
self.turret notify( "turretstatechange" );
wait( var_0 );
self.stunned = 0;
if ( self.balldronetype == "ball_drone_radar" )
{
var_1 = spawn( "script_model", self.origin );
var_1.team = self.team;
var_1 makeportableradar( self.owner );
self.radar = var_1;
}
if ( isdefined( self.turret ) )
self.turret notify( "turretstatechange" );
}
balldronedestroyed()
{
if ( !isdefined( self ) )
return;
balldroneexplode();
}
balldroneexplode()
{
if ( isdefined( level.balldronesettings[self.balldronetype].fxid_explode ) )
playfx( level.balldronesettings[self.balldronetype].fxid_explode, self.origin );
if ( isdefined( level.balldronesettings[self.balldronetype].sound_explode ) )
self playsound( level.balldronesettings[self.balldronetype].sound_explode );
self notify( "explode" );
removeballdrone();
}
removeballdrone()
{
maps\mp\_utility::decrementfauxvehiclecount();
if ( isdefined( self.radar ) )
self.radar delete();
if ( isdefined( self.turret ) )
{
self.turret setturretminimapvisible( 0 );
if ( isdefined( self.turret.idletarget ) )
self.turret.idletarget delete();
if ( isdefined( self.turret.killcament ) )
self.turret.killcament delete();
self.turret delete();
}
if ( isdefined( self.owner ) && isdefined( self.owner.balldrone ) )
self.owner.balldrone = undefined;
self delete();
}
addtoballdronelist()
{
level.balldrones[self getentitynumber()] = self;
}
removefromballdronelistondeath()
{
var_0 = self getentitynumber();
self waittill( "death" );
level.balldrones[var_0] = undefined;
}
exceededmaxballdrones()
{
if ( level.balldrones.size >= maps\mp\_utility::maxvehiclesallowed() )
return 1;
else
return 0;
}
balldrone_attacktargets()
{
self.vehicle endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "turretstatechange" );
if ( self isfiringturret() && ( isdefined( self.vehicle.stunned ) && !self.vehicle.stunned ) && ( isdefined( self.vehicle.inactive ) && !self.vehicle.inactive ) )
{
self laseron();
dolockon( level.balldronesettings[self.vehicle.balldronetype].lockontime );
thread balldrone_burstfirestart();
continue;
}
self laseroff();
thread balldrone_burstfirestop();
}
}
balldrone_burstfirestart()
{
self.vehicle endon( "death" );
self endon( "stop_shooting" );
level endon( "game_ended" );
var_0 = self.vehicle;
var_1 = weaponfiretime( level.balldronesettings[var_0.balldronetype].weaponinfo );
var_2 = level.balldronesettings[var_0.balldronetype].burstmin;
var_3 = level.balldronesettings[var_0.balldronetype].burstmax;
var_4 = level.balldronesettings[var_0.balldronetype].pausemin;
var_5 = level.balldronesettings[var_0.balldronetype].pausemax;
if ( maps\mp\_utility::is_aliens() && level.balldronesettings[var_0.balldronetype].weaponinfo == "alien_ball_drone_gun4_mp" )
childthread fire_rocket();
for (;;)
{
var_6 = randomintrange( var_2, var_3 + 1 );
for ( var_7 = 0; var_7 < var_6; var_7++ )
{
if ( isdefined( var_0.inactive ) && var_0.inactive )
break;
var_8 = self getturrettarget( 0 );
if ( isdefined( var_8 ) && canbetargeted( var_8 ) )
{
var_0 setlookatent( var_8 );
self shootturret();
}
wait( var_1 );
}
wait( randomfloatrange( var_4, var_5 ) );
}
}
fire_rocket()
{
for (;;)
{
var_0 = self getturrettarget( 0 );
if ( isdefined( var_0 ) && canbetargeted( var_0 ) )
magicbullet( "alienvulture_mp", self gettagorigin( "tag_flash" ), var_0.origin, self.owner );
var_1 = weaponfiretime( "alienvulture_mp" );
if ( isdefined( level.ball_drone_faster_rocket_func ) && isdefined( self.owner ) )
var_1 = self [[ level.ball_drone_faster_rocket_func ]]( var_1, self.owner );
wait( weaponfiretime( "alienvulture_mp" ) );
}
}
dolockon( var_0 )
{
while ( var_0 > 0 )
{
self playsound( level.balldronesettings[self.vehicle.balldronetype].sound_targeting );
wait 0.5;
var_0 = var_0 - 0.5;
}
self playsound( level.balldronesettings[self.vehicle.balldronetype].sound_lockon );
}
balldrone_burstfirestop()
{
self notify( "stop_shooting" );
if ( isdefined( self.idletarget ) )
self.vehicle setlookatent( self.idletarget );
}
canbetargeted( var_0 )
{
var_1 = 1;
if ( isplayer( var_0 ) )
{
if ( !maps\mp\_utility::isreallyalive( var_0 ) || var_0.sessionstate != "playing" )
return 0;
}
if ( level.teambased && isdefined( var_0.team ) && var_0.team == self.team )
return 0;
if ( isdefined( var_0.team ) && var_0.team == "spectator" )
return 0;
if ( isplayer( var_0 ) && var_0 == self.owner )
return 0;
if ( isplayer( var_0 ) && isdefined( var_0.spawntime ) && ( gettime() - var_0.spawntime ) / 1000 <= 5 )
return 0;
if ( isplayer( var_0 ) && var_0 maps\mp\_utility::_hasperk( "specialty_blindeye" ) )
return 0;
if ( distancesquared( var_0.origin, self.origin ) > level.balldronesettings[self.vehicle.balldronetype].visual_range_sq )
return 0;
var_2 = self gettagorigin( "tag_flash" );
return var_1;
}