1005 lines
32 KiB
Plaintext
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;
|
|
}
|