init
This commit is contained in:
39
maps/mp/_animatedmodels.gsc
Normal file
39
maps/mp/_animatedmodels.gsc
Normal file
@ -0,0 +1,39 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
if ( !isdefined( level.anim_prop_models ) )
|
||||
level.anim_prop_models = [];
|
||||
|
||||
var_0 = getarraykeys( level.anim_prop_models );
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
var_3 = getarraykeys( level.anim_prop_models[var_2] );
|
||||
|
||||
foreach ( var_5 in var_3 )
|
||||
precachempanim( level.anim_prop_models[var_2][var_5] );
|
||||
}
|
||||
|
||||
waittillframeend;
|
||||
level.init_animatedmodels = [];
|
||||
var_8 = getentarray( "animated_model", "targetname" );
|
||||
common_scripts\utility::array_thread_amortized( var_8, ::animatemodel, 0.05 );
|
||||
level.init_animatedmodels = undefined;
|
||||
}
|
||||
|
||||
animatemodel()
|
||||
{
|
||||
if ( isdefined( self.animation ) )
|
||||
var_0 = self.animation;
|
||||
else
|
||||
{
|
||||
var_1 = getarraykeys( level.anim_prop_models[self.model] );
|
||||
var_2 = var_1[randomint( var_1.size )];
|
||||
var_0 = level.anim_prop_models[self.model][var_2];
|
||||
}
|
||||
|
||||
self scriptmodelplayanim( var_0 );
|
||||
self willneverchange();
|
||||
}
|
57
maps/mp/_areas.gsc
Normal file
57
maps/mp/_areas.gsc
Normal file
@ -0,0 +1,57 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
level.softlandingtriggers = getentarray( "trigger_multiple_softlanding", "classname" );
|
||||
var_0 = getentarray( "destructible_vehicle", "targetname" );
|
||||
|
||||
foreach ( var_2 in level.softlandingtriggers )
|
||||
{
|
||||
if ( var_2.script_type != "car" )
|
||||
continue;
|
||||
|
||||
foreach ( var_4 in var_0 )
|
||||
{
|
||||
if ( distance( var_2.origin, var_4.origin ) > 64.0 )
|
||||
continue;
|
||||
|
||||
var_2.destructible = var_4;
|
||||
}
|
||||
}
|
||||
|
||||
thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
var_0.softlanding = undefined;
|
||||
var_0 thread softlandingwaiter();
|
||||
}
|
||||
}
|
||||
|
||||
playerentersoftlanding( var_0 )
|
||||
{
|
||||
self.softlanding = var_0;
|
||||
}
|
||||
|
||||
playerleavesoftlanding( var_0 )
|
||||
{
|
||||
self.softlanding = undefined;
|
||||
}
|
||||
|
||||
softlandingwaiter()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "soft_landing", var_0, var_1 );
|
||||
|
||||
if ( !isdefined( var_0.destructible ) )
|
||||
continue;
|
||||
}
|
||||
}
|
12
maps/mp/_art.gsc
Normal file
12
maps/mp/_art.gsc
Normal file
@ -0,0 +1,12 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
create_vision_set_fog( var_0 )
|
||||
{
|
||||
|
||||
}
|
74
maps/mp/_audio.gsc
Normal file
74
maps/mp/_audio.gsc
Normal file
@ -0,0 +1,74 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init_audio()
|
||||
{
|
||||
if ( !isdefined( level.audio ) )
|
||||
level.audio = spawnstruct();
|
||||
|
||||
init_reverb();
|
||||
init_whizby();
|
||||
level.onplayerconnectaudioinit = ::onplayerconnectaudioinit;
|
||||
}
|
||||
|
||||
onplayerconnectaudioinit()
|
||||
{
|
||||
apply_reverb( "default" );
|
||||
}
|
||||
|
||||
init_reverb()
|
||||
{
|
||||
add_reverb( "default", "generic", 0.15, 0.9, 2 );
|
||||
}
|
||||
|
||||
add_reverb( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = [];
|
||||
is_roomtype_valid( var_1 );
|
||||
var_5["roomtype"] = var_1;
|
||||
var_5["wetlevel"] = var_2;
|
||||
var_5["drylevel"] = var_3;
|
||||
var_5["fadetime"] = var_4;
|
||||
level.audio.reverb_settings[var_0] = var_5;
|
||||
}
|
||||
|
||||
is_roomtype_valid( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
apply_reverb( var_0 )
|
||||
{
|
||||
if ( !isdefined( level.audio.reverb_settings[var_0] ) )
|
||||
var_1 = level.audio.reverb_settings["default"];
|
||||
else
|
||||
var_1 = level.audio.reverb_settings[var_0];
|
||||
|
||||
self setreverb( "snd_enveffectsprio_level", var_1["roomtype"], var_1["drylevel"], var_1["wetlevel"], var_1["fadetime"] );
|
||||
}
|
||||
|
||||
init_whizby()
|
||||
{
|
||||
level.audio.whizby_settings = [];
|
||||
set_whizby_radius( 15.0, 30.0, 50.0 );
|
||||
set_whizby_spread( 150.0, 250.0, 350.0 );
|
||||
}
|
||||
|
||||
set_whizby_radius( var_0, var_1, var_2 )
|
||||
{
|
||||
level.audio.whizby_settings["radius"] = [ var_0, var_1, var_2 ];
|
||||
}
|
||||
|
||||
set_whizby_spread( var_0, var_1, var_2 )
|
||||
{
|
||||
level.audio.whizby_settings["spread"] = [ var_0, var_1, var_2 ];
|
||||
}
|
||||
|
||||
apply_whizby()
|
||||
{
|
||||
var_0 = level.audio.whizby_settings;
|
||||
var_1 = var_0["spread"];
|
||||
var_2 = var_0["radius"];
|
||||
self setwhizbyspreads( var_1[0], var_1[1], var_1[2] );
|
||||
self setwhizbyradii( var_2[0], var_2[1], var_2[2] );
|
||||
}
|
1006
maps/mp/_awards.gsc
Normal file
1006
maps/mp/_awards.gsc
Normal file
File diff suppressed because it is too large
Load Diff
296
maps/mp/_barrels_leak.gsc
Normal file
296
maps/mp/_barrels_leak.gsc
Normal file
@ -0,0 +1,296 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
if ( isdefined( level.barrels_init ) )
|
||||
return;
|
||||
|
||||
level.barrels_init = 1;
|
||||
var_0 = getentarray( "barrel_shootable", "targetname" );
|
||||
|
||||
if ( !var_0.size )
|
||||
return;
|
||||
|
||||
level._barrels = spawnstruct();
|
||||
level._barrels.num_barrel_fx = 0;
|
||||
var_0 thread precachefx();
|
||||
var_0 thread methodsinit();
|
||||
thread post_load( var_0 );
|
||||
}
|
||||
|
||||
post_load( var_0 )
|
||||
{
|
||||
waittillframeend;
|
||||
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
|
||||
common_scripts\utility::array_thread( var_0, ::barrelsetup );
|
||||
}
|
||||
|
||||
barrelsetup()
|
||||
{
|
||||
self setcandamage( 1 );
|
||||
self setcanradiusdamage( 0 );
|
||||
self.barrel_fx_array = [];
|
||||
var_0 = undefined;
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
var_0 = common_scripts\utility::getstruct( self.target, "targetname" );
|
||||
self.a = var_0.origin;
|
||||
var_1 = anglestoforward( var_0.angles );
|
||||
var_1 = var_1 * 128;
|
||||
self.b = self.a + var_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1 = anglestoforward( self.angles );
|
||||
var_2 = var_1 * 64;
|
||||
self.a = self.origin + var_2;
|
||||
var_2 = var_1 * -64;
|
||||
self.b = self.origin + var_2;
|
||||
}
|
||||
|
||||
thread barrel_wait_loop();
|
||||
}
|
||||
|
||||
barrel_wait_loop()
|
||||
{
|
||||
var_0 = ( 0, 0, 0 );
|
||||
var_1 = 0;
|
||||
var_2 = 4;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", var_3, var_4, var_5, var_0, var_6 );
|
||||
|
||||
if ( var_1 )
|
||||
{
|
||||
if ( randomint( 100 ) <= 33 )
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 = 1;
|
||||
var_7 = barrel_logic( var_5, var_0, var_6, var_4 );
|
||||
|
||||
if ( var_7 )
|
||||
var_2--;
|
||||
|
||||
if ( var_2 <= 0 )
|
||||
break;
|
||||
}
|
||||
|
||||
self setcandamage( 0 );
|
||||
}
|
||||
|
||||
barrel_logic( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( level._barrels.num_barrel_fx > 8 )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( level._barrels._barrel_methods[var_2] ) )
|
||||
var_1 = barrel_calc_nofx( var_1, var_2 );
|
||||
else
|
||||
var_1 = self [[ level._barrels._barrel_methods[var_2] ]]( var_1, var_2 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( var_3.classname ) && var_3.classname == "worldspawn" )
|
||||
return 0;
|
||||
|
||||
foreach ( var_5 in self.barrel_fx_array )
|
||||
{
|
||||
if ( distancesquared( var_1, var_5.origin ) < 25 )
|
||||
return 0;
|
||||
}
|
||||
|
||||
var_7 = undefined;
|
||||
|
||||
if ( isai( var_3 ) )
|
||||
var_7 = var_3 geteye();
|
||||
else
|
||||
var_7 = var_3.origin;
|
||||
|
||||
var_8 = var_1 - var_7;
|
||||
var_9 = bullettrace( var_7, var_7 + 1.5 * var_8, 0, var_3, 0 );
|
||||
|
||||
if ( isdefined( var_9["normal"] ) && isdefined( var_9["entity"] ) && var_9["entity"] == self )
|
||||
{
|
||||
var_10 = var_9["normal"];
|
||||
thread barrelfx( var_1, var_10, var_3 );
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
barrelfx( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = level._barrels.fx_time[self.script_noteworthy];
|
||||
var_4 = level._barrels._barrel_fx_time[self.script_noteworthy];
|
||||
var_5 = int( var_4 / var_3 );
|
||||
var_6 = 30;
|
||||
var_7 = level._barrels._sound[self.script_noteworthy + "_hit"];
|
||||
var_8 = level._barrels._sound[self.script_noteworthy + "_loop"];
|
||||
var_9 = level._barrels._sound[self.script_noteworthy + "_end"];
|
||||
var_10 = spawn( "script_origin", var_0 );
|
||||
var_10 playsound( var_7 );
|
||||
var_10 playloopsound( var_8 );
|
||||
self.barrel_fx_array[self.barrel_fx_array.size] = var_10;
|
||||
|
||||
if ( common_scripts\utility::issp() )
|
||||
thread barrel_damage( var_0, var_1, var_2, var_10 );
|
||||
|
||||
var_11 = spawn( "script_model", var_0 );
|
||||
var_11 setmodel( "tag_origin" );
|
||||
var_11.angles = vectortoangles( var_1 );
|
||||
wait 0.05;
|
||||
playfxontag( level._barrels._effect[self.script_noteworthy], var_11, "tag_origin" );
|
||||
level._barrels.num_barrel_fx++;
|
||||
var_11 rotatepitch( 90, var_3, 1, 1 );
|
||||
wait( var_3 );
|
||||
stopfxontag( level._barrels._effect[self.script_noteworthy], var_11, "tag_origin" );
|
||||
var_5--;
|
||||
|
||||
while ( level._barrels.num_barrel_fx <= 8 && var_5 > 0 )
|
||||
{
|
||||
var_11 = spawn( "script_model", var_0 );
|
||||
var_11 setmodel( "tag_origin" );
|
||||
var_11.angles = vectortoangles( var_1 );
|
||||
wait 0.05;
|
||||
playfxontag( level._barrels._effect[self.script_noteworthy], var_11, "tag_origin" );
|
||||
level._barrels.num_barrel_fx++;
|
||||
var_11 rotatepitch( 90, var_3, 1, 1 );
|
||||
wait( var_3 );
|
||||
stopfxontag( level._barrels._effect[self.script_noteworthy], var_11, "tag_origin" );
|
||||
}
|
||||
|
||||
wait 0.5;
|
||||
var_10 delete();
|
||||
self.barrel_fx_array = common_scripts\utility::array_removeundefined( self.barrel_fx_array );
|
||||
level._barrels.num_barrel_fx--;
|
||||
}
|
||||
|
||||
barrel_damage( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( !allow_barrel_damage() )
|
||||
return;
|
||||
|
||||
var_3 endon( "death" );
|
||||
var_4 = var_3.origin + vectornormalize( var_1 ) * 40;
|
||||
var_5 = level._barrels._dmg[self.script_noteworthy];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.damageowner ) )
|
||||
self radiusdamage( var_4, 36, var_5, var_5 * 0.75, undefined, "MOD_TRIGGER_HURT" );
|
||||
else
|
||||
self radiusdamage( var_4, 36, var_5, var_5 * 0.75, var_2, "MOD_TRIGGER_HURT" );
|
||||
|
||||
wait 0.4;
|
||||
}
|
||||
}
|
||||
|
||||
allow_barrel_damage()
|
||||
{
|
||||
if ( !common_scripts\utility::issp() )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( level.barrelsdamage ) )
|
||||
return 0;
|
||||
|
||||
return level.barrelsdamage;
|
||||
}
|
||||
|
||||
methodsinit()
|
||||
{
|
||||
level._barrels._barrel_methods = [];
|
||||
level._barrels._barrel_methods["MOD_UNKNOWN"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_PISTOL_BULLET"] = ::barrel_calc_ballistic;
|
||||
level._barrels._barrel_methods["MOD_RIFLE_BULLET"] = ::barrel_calc_ballistic;
|
||||
level._barrels._barrel_methods["MOD_GRENADE"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_GRENADE_SPLASH"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_PROJECTILE"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_PROJECTILE_SPLASH"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_TRIGGER_HURT"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_EXPLOSIVE"] = ::barrel_calc_splash;
|
||||
level._barrels._barrel_methods["MOD_EXPLOSIVE_BULLET"] = ::barrel_calc_splash;
|
||||
}
|
||||
|
||||
barrel_calc_ballistic( var_0, var_1 )
|
||||
{
|
||||
return var_0;
|
||||
}
|
||||
|
||||
barrel_calc_splash( var_0, var_1 )
|
||||
{
|
||||
var_2 = vectornormalize( vectorfromlinetopoint( self.a, self.b, var_0 ) );
|
||||
var_0 = pointonsegmentnearesttopoint( self.a, self.b, var_0 );
|
||||
return var_0 + var_2 * 4;
|
||||
}
|
||||
|
||||
barrel_calc_nofx( var_0, var_1 )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
|
||||
precachefx()
|
||||
{
|
||||
var_0 = 0;
|
||||
var_1 = 0;
|
||||
var_2 = 0;
|
||||
|
||||
foreach ( var_4 in self )
|
||||
{
|
||||
if ( var_4.script_noteworthy == "oil_leak" )
|
||||
{
|
||||
var_4 willneverchange();
|
||||
var_0 = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( var_4.script_noteworthy == "oil_cap" )
|
||||
{
|
||||
var_4 willneverchange();
|
||||
var_1 = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( var_4.script_noteworthy == "beer_leak" )
|
||||
{
|
||||
var_4 willneverchange();
|
||||
var_2 = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
level._barrels._effect["oil_leak"] = loadfx( "fx/impacts/pipe_oil_barrel_spill" );
|
||||
level._barrels.fx_time["oil_leak"] = 6;
|
||||
level._barrels._barrel_fx_time["oil_leak"] = 6;
|
||||
level._barrels._dmg["oil_leak"] = 5;
|
||||
}
|
||||
|
||||
if ( var_1 )
|
||||
{
|
||||
level._barrels._effect["oil_cap"] = loadfx( "fx/impacts/pipe_oil_barrel_squirt" );
|
||||
level._barrels.fx_time["oil_cap"] = 3;
|
||||
level._barrels._dmg["oil_cap"] = 5;
|
||||
level._barrels._barrel_fx_time["oil_cap"] = 5;
|
||||
}
|
||||
|
||||
if ( var_2 )
|
||||
{
|
||||
level._barrels._effect["beer_leak"] = loadfx( "fx/impacts/beer_barrel_spill" );
|
||||
level._barrels._sound["beer_leak_hit"] = "mtl_beer_keg_hit";
|
||||
level._barrels._sound["beer_leak_loop"] = "mtl_beer_keg_hiss_loop";
|
||||
level._barrels._sound["beer_leak_end"] = "mtl_beer_keg_hiss_loop_end";
|
||||
level._barrels.fx_time["beer_leak"] = 6;
|
||||
level._barrels._barrel_fx_time["beer_leak"] = 6;
|
||||
level._barrels._dmg["beer_leak"] = 5;
|
||||
}
|
||||
}
|
717
maps/mp/_breach.gsc
Normal file
717
maps/mp/_breach.gsc
Normal file
@ -0,0 +1,717 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
thread main_thread();
|
||||
}
|
||||
|
||||
main_thread()
|
||||
{
|
||||
breach_precache();
|
||||
common_scripts\utility::waitframe();
|
||||
var_0 = common_scripts\utility::getstructarray( "breach", "targetname" );
|
||||
common_scripts\utility::array_thread( var_0, ::breach_init );
|
||||
}
|
||||
|
||||
breach_precache()
|
||||
{
|
||||
level.breach_icon_count = -1;
|
||||
level._effect["default"] = loadfx( "fx/explosions/breach_room_cheap" );
|
||||
}
|
||||
|
||||
breach_init()
|
||||
{
|
||||
if ( getdvar( "r_reflectionProbeGenerate" ) == "1" )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.target ) )
|
||||
return;
|
||||
|
||||
self.breach_targets = [];
|
||||
self.auto_breach_gametypes = [];
|
||||
|
||||
if ( isdefined( self.script_noteworthy ) )
|
||||
{
|
||||
var_0 = strtok( self.script_noteworthy, "," );
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
if ( getsubstr( var_2, 0, 7 ) == "not_in_" )
|
||||
self.auto_breach_gametypes[self.auto_breach_gametypes.size] = getsubstr( var_2, 7, var_2.size );
|
||||
|
||||
if ( var_2 == "only_if_allowClassChoice" )
|
||||
{
|
||||
if ( !maps\mp\_utility::allowclasschoice() )
|
||||
self.auto_breach_gametypes[self.auto_breach_gametypes.size] = level.gametype;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var_4 = getentarray( self.target, "targetname" );
|
||||
var_5 = common_scripts\utility::getstructarray( self.target, "targetname" );
|
||||
var_6 = common_scripts\utility::array_combine( var_4, var_5 );
|
||||
var_7 = maps\mp\_utility::getlinknamenodes();
|
||||
|
||||
foreach ( var_9 in var_7 )
|
||||
var_9.ispathnode = 1;
|
||||
|
||||
var_6 = common_scripts\utility::array_combine( var_6, var_7 );
|
||||
|
||||
foreach ( var_12 in var_6 )
|
||||
{
|
||||
if ( !isdefined( var_12.script_noteworthy ) )
|
||||
var_12.script_noteworthy = var_12.classname;
|
||||
|
||||
if ( var_12.script_noteworthy == "trigger_use_touch" )
|
||||
{
|
||||
var_12 usetriggerrequirelookat();
|
||||
var_12.script_noteworthy = "trigger_use";
|
||||
}
|
||||
|
||||
if ( !isdefined( var_12.ispathnode ) || var_12.ispathnode == 0 )
|
||||
var_12.script_noteworthy = tolower( var_12.script_noteworthy );
|
||||
|
||||
var_13 = strtok( var_12.script_noteworthy, ", " );
|
||||
|
||||
foreach ( var_15 in var_13 )
|
||||
{
|
||||
var_16 = undefined;
|
||||
var_0 = strtok( var_15, "_" );
|
||||
|
||||
if ( var_0.size >= 3 && var_0[var_0.size - 2] == "on" )
|
||||
{
|
||||
var_16 = var_0[var_0.size - 1];
|
||||
var_15 = var_0[0];
|
||||
|
||||
for ( var_17 = 1; var_17 < var_0.size - 2; var_17++ )
|
||||
var_15 = var_15 + "_" + var_0[var_17];
|
||||
}
|
||||
|
||||
var_18 = 0;
|
||||
var_0 = strtok( var_15, "_" );
|
||||
|
||||
if ( var_0.size >= 2 && var_0[var_0.size - 1] == "useside" )
|
||||
{
|
||||
var_18 = 1;
|
||||
var_15 = var_0[0];
|
||||
|
||||
for ( var_17 = 1; var_17 < var_0.size - 2; var_17++ )
|
||||
var_15 = var_15 + "_" + var_0[var_17];
|
||||
}
|
||||
|
||||
add_breach_target( var_12, var_15, var_16, var_18 );
|
||||
|
||||
switch ( var_15 )
|
||||
{
|
||||
case "animated":
|
||||
case "show":
|
||||
var_12 hide();
|
||||
break;
|
||||
case "solid":
|
||||
if ( isdefined( var_12.spawnflags ) && var_12.spawnflags & 2 )
|
||||
var_12 setaisightlinevisible( 0 );
|
||||
|
||||
var_12 notsolid();
|
||||
break;
|
||||
case "teleport_show":
|
||||
var_12 common_scripts\utility::trigger_off();
|
||||
break;
|
||||
case "use_icon":
|
||||
break;
|
||||
case "trigger_damage":
|
||||
thread breach_damage_watch( var_12 );
|
||||
break;
|
||||
case "fx":
|
||||
if ( !isdefined( var_12.angles ) )
|
||||
var_12.angles = ( 0, 0, 0 );
|
||||
|
||||
break;
|
||||
case "connect_node":
|
||||
var_12 disconnectnode();
|
||||
break;
|
||||
case "disconnect_node":
|
||||
var_12 connectnode();
|
||||
break;
|
||||
case "delete":
|
||||
if ( isdefined( var_12.spawnflags ) && var_12.spawnflags & 2 )
|
||||
var_12 setaisightlinevisible( 1 );
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
|
||||
var_21 = get_breach_target( "trigger_use" );
|
||||
|
||||
if ( isdefined( var_21 ) )
|
||||
{
|
||||
if ( !isdefined( get_breach_target( "sound" ) ) )
|
||||
{
|
||||
var_22 = spawn( "script_origin", var_21.origin );
|
||||
add_breach_target( var_22, "sound" );
|
||||
}
|
||||
|
||||
if ( !isdefined( get_breach_target( "damage" ) ) )
|
||||
{
|
||||
var_23 = spawnstruct();
|
||||
var_23.origin = var_21.origin;
|
||||
add_breach_target( var_23, "damage" );
|
||||
}
|
||||
|
||||
var_24 = get_breach_targets( "damage" );
|
||||
|
||||
foreach ( var_23 in var_24 )
|
||||
{
|
||||
if ( !isdefined( var_23.radius ) )
|
||||
var_23.radius = 128;
|
||||
|
||||
if ( !isdefined( var_23.max_damage ) )
|
||||
var_23.max_damage = 100;
|
||||
|
||||
if ( !isdefined( var_23.min_damage ) )
|
||||
var_23.min_damage = 1;
|
||||
}
|
||||
|
||||
thread breach_use_watch();
|
||||
}
|
||||
|
||||
thread breach_on_activate();
|
||||
breach_on_event( "init" );
|
||||
|
||||
foreach ( var_15 in self.auto_breach_gametypes )
|
||||
{
|
||||
if ( level.gametype == var_15 )
|
||||
{
|
||||
self notify( "breach_activated", undefined, 1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
add_breach_target( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = "activate";
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
var_3 = 0;
|
||||
|
||||
if ( !isdefined( self.breach_targets[var_2] ) )
|
||||
self.breach_targets[var_2] = [];
|
||||
|
||||
if ( !isdefined( self.breach_targets[var_2][var_1] ) )
|
||||
self.breach_targets[var_2][var_1] = [];
|
||||
|
||||
var_4 = spawnstruct();
|
||||
var_4.target = var_0;
|
||||
|
||||
if ( var_3 )
|
||||
{
|
||||
var_4.facing_dot = 0;
|
||||
var_4.facing_angles3d = 0;
|
||||
var_4.facing_dir = anglestoforward( var_0.angles );
|
||||
|
||||
if ( isdefined( var_0.target ) )
|
||||
{
|
||||
var_5 = common_scripts\utility::getstructarray( var_0.target, "targetname" );
|
||||
|
||||
foreach ( var_7 in var_5 )
|
||||
{
|
||||
if ( !isdefined( var_7.script_noteworthy ) )
|
||||
continue;
|
||||
|
||||
switch ( var_7.script_noteworthy )
|
||||
{
|
||||
case "angles_3d":
|
||||
case "angles":
|
||||
var_4.facing_angles3d = 1;
|
||||
case "angles_2d":
|
||||
if ( !isdefined( var_4.angles3d ) )
|
||||
var_4.facing_angles3d = 0;
|
||||
|
||||
var_4.facing_dir = anglestoforward( var_7.angles );
|
||||
|
||||
if ( isdefined( var_7.script_dot ) )
|
||||
var_4.facing_dot = var_7.script_dot;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var_9 = self.breach_targets[var_2][var_1].size;
|
||||
self.breach_targets[var_2][var_1][var_9] = var_4;
|
||||
}
|
||||
|
||||
get_breach_target( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = get_breach_targets( var_0, var_1, var_2 );
|
||||
|
||||
if ( var_3.size > 0 )
|
||||
return var_3[0];
|
||||
else
|
||||
return undefined;
|
||||
}
|
||||
|
||||
get_breach_targets( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = [];
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = "activate";
|
||||
|
||||
if ( !isdefined( self.breach_targets[var_1] ) )
|
||||
return var_3;
|
||||
|
||||
if ( !isdefined( self.breach_targets[var_1][var_0] ) )
|
||||
return var_3;
|
||||
|
||||
foreach ( var_5 in self.breach_targets[var_1][var_0] )
|
||||
{
|
||||
if ( isdefined( var_5.facing_dir ) && isdefined( var_2 ) )
|
||||
{
|
||||
var_6 = var_2.origin - var_5.target.origin;
|
||||
|
||||
if ( !var_5.facing_angles3d )
|
||||
var_6 = ( var_6[0], var_6[1], 0 );
|
||||
|
||||
var_6 = vectornormalize( var_6 );
|
||||
var_7 = vectordot( var_6, var_5.facing_dir );
|
||||
|
||||
if ( var_7 < var_5.facing_dot )
|
||||
continue;
|
||||
}
|
||||
|
||||
var_3[var_3.size] = var_5.target;
|
||||
}
|
||||
|
||||
return var_3;
|
||||
}
|
||||
|
||||
breach_damage_watch( var_0 )
|
||||
{
|
||||
self endon( "breach_activated" );
|
||||
var_0 waittill( "trigger", var_1 );
|
||||
self notify( "breach_activated", var_1, 0 );
|
||||
}
|
||||
|
||||
breach_on_activate()
|
||||
{
|
||||
self waittill( "breach_activated", var_0, var_1 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = 0;
|
||||
|
||||
if ( isdefined( self.useobject ) && !var_1 )
|
||||
{
|
||||
self.useobject breach_set_2dicon( "hud_grenadeicon_back_red" );
|
||||
self.useobject maps\mp\_utility::delaythread( 3, ::breach_set_2dicon, undefined );
|
||||
}
|
||||
|
||||
breach_on_event( "activate", var_0, var_1 );
|
||||
|
||||
if ( isdefined( self.useobject ) )
|
||||
self.useobject.visuals = [];
|
||||
|
||||
breach_set_can_use( 0 );
|
||||
}
|
||||
|
||||
breach_on_event( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = 0;
|
||||
|
||||
if ( var_0 == "use" )
|
||||
{
|
||||
var_3 = get_breach_targets( "damage", "activate", var_1 );
|
||||
|
||||
foreach ( var_5 in var_3 )
|
||||
var_5.planted = 1;
|
||||
}
|
||||
|
||||
common_scripts\utility::array_call( get_breach_targets( "solid", var_0, var_1 ), ::solid );
|
||||
common_scripts\utility::array_call( get_breach_targets( "notsolid", var_0, var_1 ), ::notsolid );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "hide", var_0, var_1 ), ::breach_hide );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "show", var_0, var_1 ), ::breach_show );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "teleport_show", var_0, var_1 ), common_scripts\utility::trigger_on );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "delete", var_0, var_1 ), ::breach_delete );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "teleport_hide", var_0, var_1 ), common_scripts\utility::trigger_off );
|
||||
common_scripts\utility::array_call( get_breach_targets( "connect_node", var_0, var_1 ), ::connectnode );
|
||||
common_scripts\utility::array_call( get_breach_targets( "disconnect_node", var_0, var_1 ), ::disconnectnode );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "break_glass", var_0, var_1 ), ::breach_break_glass );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "animated", var_0, var_1 ), ::breach_animate_model );
|
||||
|
||||
if ( !var_2 )
|
||||
{
|
||||
common_scripts\utility::array_thread( get_breach_targets( "fx", var_0, var_1 ), ::breach_play_fx, self );
|
||||
common_scripts\utility::array_thread( get_breach_targets( "damage", var_0, var_1 ), ::breach_damage_radius, var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
breach_delete()
|
||||
{
|
||||
if ( isdefined( self.script_index ) )
|
||||
common_scripts\utility::exploder( self.script_index );
|
||||
|
||||
self setaisightlinevisible( 0 );
|
||||
self delete();
|
||||
}
|
||||
|
||||
breach_hide()
|
||||
{
|
||||
self setaisightlinevisible( 0 );
|
||||
self hide();
|
||||
}
|
||||
|
||||
breach_show()
|
||||
{
|
||||
self setaisightlinevisible( 1 );
|
||||
self show();
|
||||
}
|
||||
|
||||
breach_play_fx( var_0 )
|
||||
{
|
||||
var_1 = undefined;
|
||||
|
||||
if ( isdefined( self.script_fxid ) )
|
||||
var_1 = self.script_fxid;
|
||||
else if ( isdefined( var_0.script_fxid ) )
|
||||
var_1 = var_0.script_fxid;
|
||||
|
||||
if ( !isdefined( var_1 ) || !isdefined( level._effect[var_1] ) )
|
||||
var_1 = "default";
|
||||
|
||||
playfx( level._effect[var_1], self.origin, anglestoforward( self.angles ), anglestoup( self.angles ) );
|
||||
}
|
||||
|
||||
breach_damage_radius( var_0 )
|
||||
{
|
||||
var_1 = 2.0;
|
||||
|
||||
if ( isdefined( self.planted ) && self.planted == 1 )
|
||||
{
|
||||
foreach ( var_3 in level.participants )
|
||||
{
|
||||
var_4 = distancesquared( self.origin, var_3.origin );
|
||||
|
||||
if ( var_4 < self.radius * self.radius )
|
||||
var_3 shellshock( "mp_radiation_high", var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
playrumbleonposition( "artillery_rumble", self.origin );
|
||||
}
|
||||
|
||||
breach_break_glass()
|
||||
{
|
||||
glassradiusdamage( self.origin, 128, 500, 500 );
|
||||
}
|
||||
|
||||
breach_animate_model()
|
||||
{
|
||||
self setaisightlinevisible( 1 );
|
||||
self show();
|
||||
|
||||
if ( isdefined( self.animation ) )
|
||||
self scriptmodelplayanim( self.animation );
|
||||
}
|
||||
|
||||
breach_use_watch()
|
||||
{
|
||||
self endon( "breach_activated" );
|
||||
wait 0.05;
|
||||
self.useobject = maps\mp\gametypes\_gameobjects::createuseobject( "neutral", get_breach_target( "trigger_use" ), get_breach_targets( "use_model" ), ( 0, 0, 0 ) );
|
||||
self.useobject.parent = self;
|
||||
self.useobject.useweapon = "breach_plant_mp";
|
||||
self.useobject.id = "breach";
|
||||
breach_set_can_use( 1 );
|
||||
self.useobject maps\mp\gametypes\_gameobjects::setusetime( 0.5 );
|
||||
self.useobject maps\mp\gametypes\_gameobjects::setusetext( &"MP_BREACHING" );
|
||||
self.useobject maps\mp\gametypes\_gameobjects::setusehinttext( &"MP_BREACH" );
|
||||
self.useobject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" );
|
||||
self.useobject.onuse = ::breach_onuse;
|
||||
self.useobject.onenduse = ::breach_onenduse;
|
||||
}
|
||||
|
||||
breach_set_can_use( var_0 )
|
||||
{
|
||||
if ( !isdefined( self.useobject ) )
|
||||
return;
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
foreach ( var_2 in self.useobject.visuals )
|
||||
{
|
||||
if ( var_2.model == "mil_semtex_belt" )
|
||||
var_2 setmodel( "mil_semtex_belt_obj" );
|
||||
}
|
||||
|
||||
self.useobject maps\mp\gametypes\_gameobjects::allowuse( "any" );
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ( var_2 in self.useobject.visuals )
|
||||
{
|
||||
if ( var_2.model == "mil_semtex_belt" )
|
||||
var_2 setmodel( "mil_semtex_belt" );
|
||||
}
|
||||
|
||||
self.useobject notify( "disabled" );
|
||||
self.useobject maps\mp\gametypes\_gameobjects::allowuse( "none" );
|
||||
}
|
||||
}
|
||||
|
||||
breach_onuse( var_0 )
|
||||
{
|
||||
self.parent endon( "breach_activated" );
|
||||
self.parent notify( "breach_used" );
|
||||
self.parent breach_set_can_use( 0 );
|
||||
self.parent breach_on_event( "use", var_0 );
|
||||
self.parent thread breach_warning_icon( self );
|
||||
var_1 = undefined;
|
||||
var_2 = self.parent get_breach_targets( "sound" );
|
||||
|
||||
if ( var_2.size > 1 )
|
||||
{
|
||||
var_2 = sortbydistance( var_2, var_0.origin );
|
||||
var_1 = var_2[0];
|
||||
}
|
||||
else if ( var_2.size > 0 )
|
||||
var_1 = var_2[0];
|
||||
|
||||
var_3 = var_0.team;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
for ( var_4 = 0; var_4 < 3; var_4++ )
|
||||
{
|
||||
var_1 playsound( "breach_beep" );
|
||||
wait 0.75;
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.script_parameters ) )
|
||||
{
|
||||
var_5 = strtok( var_1.script_parameters, ";" );
|
||||
|
||||
foreach ( var_7 in var_5 )
|
||||
{
|
||||
var_8 = strtok( var_7, "=" );
|
||||
|
||||
if ( var_8.size < 2 )
|
||||
continue;
|
||||
|
||||
switch ( var_8[0] )
|
||||
{
|
||||
case "play_sound":
|
||||
switch ( var_8[1] )
|
||||
{
|
||||
case "concrete":
|
||||
var_1 playsound( "detpack_explo_concrete" );
|
||||
break;
|
||||
case "wood":
|
||||
var_1 playsound( "detpack_explo_wood" );
|
||||
break;
|
||||
case "custom":
|
||||
if ( var_8.size == 3 )
|
||||
var_1 playsound( var_8[2] );
|
||||
|
||||
break;
|
||||
case "undefined":
|
||||
case "metal":
|
||||
default:
|
||||
var_1 playsound( "detpack_explo_metal" );
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
var_1 playsound( "detpack_explo_metal" );
|
||||
}
|
||||
|
||||
self.parent notify( "breach_activated", var_0, undefined, var_3 );
|
||||
}
|
||||
|
||||
breach_onenduse( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isplayer( var_1 ) )
|
||||
var_1 maps\mp\gametypes\_gameobjects::updateuiprogress( self, 0 );
|
||||
}
|
||||
|
||||
breach_set_2dicon( var_0 )
|
||||
{
|
||||
maps\mp\gametypes\_gameobjects::set2dicon( "enemy", var_0 );
|
||||
maps\mp\gametypes\_gameobjects::set2dicon( "friendly", var_0 );
|
||||
}
|
||||
|
||||
breach_warning_icon( var_0 )
|
||||
{
|
||||
var_1 = var_0.curorigin + ( 0, 0, 5 );
|
||||
|
||||
if ( var_0.parent get_breach_targets( "use_icon" ).size )
|
||||
var_1 = var_0.parent get_breach_targets( "use_icon" )[0].origin;
|
||||
|
||||
var_0.parent thread breach_icon( "warning", var_1, undefined, "breach_activated" );
|
||||
}
|
||||
|
||||
breach_icon( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
|
||||
level.breach_icon_count++;
|
||||
var_4 = "breach_icon_" + level.breach_icon_count;
|
||||
breach_icon_update( var_0, var_1, var_2, var_4, var_3 );
|
||||
|
||||
foreach ( var_6 in level.players )
|
||||
{
|
||||
if ( isdefined( var_6.breach_icons ) && isdefined( var_6.breach_icons[var_4] ) )
|
||||
var_6.breach_icons[var_4] thread breach_icon_fade_out();
|
||||
}
|
||||
}
|
||||
|
||||
breach_icon_update( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
if ( isdefined( var_4 ) )
|
||||
{
|
||||
if ( isstring( var_4 ) )
|
||||
var_4 = [ var_4 ];
|
||||
|
||||
foreach ( var_6 in var_4 )
|
||||
self endon( var_6 );
|
||||
}
|
||||
|
||||
var_8 = 100;
|
||||
var_9 = 70;
|
||||
var_10 = "hud_grenadeicon";
|
||||
var_11 = 1;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "use":
|
||||
var_8 = 300;
|
||||
var_10 = "breach_icon";
|
||||
var_11 = 0;
|
||||
break;
|
||||
case "warning":
|
||||
var_8 = 400;
|
||||
var_12 = get_breach_target( "damage" );
|
||||
|
||||
if ( isdefined( var_12 ) )
|
||||
var_8 = var_12.radius;
|
||||
|
||||
var_10 = "hud_grenadeicon";
|
||||
var_11 = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
var_13 = undefined;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_13 = anglestoforward( var_2 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
foreach ( var_15 in level.players )
|
||||
{
|
||||
if ( !isdefined( var_15.breach_icons ) )
|
||||
var_15.breach_icons = [];
|
||||
|
||||
if ( breach_icon_update_is_player_in_range( var_15, var_1, var_8, var_13, var_9 ) )
|
||||
{
|
||||
if ( !isdefined( var_15.breach_icons[var_3] ) )
|
||||
{
|
||||
var_15.breach_icons[var_3] = breach_icon_create( var_15, var_10, var_1, var_11 );
|
||||
var_15.breach_icons[var_3].alpha = 0;
|
||||
}
|
||||
|
||||
var_15.breach_icons[var_3] notify( "stop_fade" );
|
||||
var_15.breach_icons[var_3] thread breach_icon_fade_in();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( var_15.breach_icons[var_3] ) )
|
||||
var_15.breach_icons[var_3] thread breach_icon_fade_out();
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
breach_icon_update_is_player_in_range( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = var_0.origin + ( 0, 0, 30 );
|
||||
|
||||
if ( isdefined( var_4 ) && abs( var_5[2] - var_1[2] ) > var_4 )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
{
|
||||
var_6 = var_2 * var_2;
|
||||
var_7 = distancesquared( var_5, var_1 );
|
||||
|
||||
if ( var_7 > var_6 )
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_8 = var_5 - var_1;
|
||||
|
||||
if ( vectordot( var_3, var_8 ) < 0 )
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
breach_icon_create( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_1 = var_0 maps\mp\gametypes\_hud_util::createicon( var_1, 16, 16 );
|
||||
var_1 setwaypoint( 1, var_3 );
|
||||
var_1.x = var_2[0];
|
||||
var_1.y = var_2[1];
|
||||
var_1.z = var_2[2];
|
||||
return var_1;
|
||||
}
|
||||
|
||||
breach_icon_fade_in()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
if ( self.alpha == 1 )
|
||||
return;
|
||||
|
||||
self fadeovertime( 0.5 );
|
||||
self.alpha = 1;
|
||||
}
|
||||
|
||||
breach_icon_fade_out()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_fade" );
|
||||
|
||||
if ( self.alpha == 0 )
|
||||
return;
|
||||
|
||||
var_0 = 0.5;
|
||||
self fadeovertime( var_0 );
|
||||
self.alpha = 0;
|
||||
wait( var_0 );
|
||||
self destroy();
|
||||
}
|
78
maps/mp/_compass.gsc
Normal file
78
maps/mp/_compass.gsc
Normal file
@ -0,0 +1,78 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
setupminimap( var_0 )
|
||||
{
|
||||
var_1 = level.requiredmapaspectratio;
|
||||
var_2 = getentarray( "minimap_corner", "targetname" );
|
||||
|
||||
if ( var_2.size != 2 )
|
||||
return;
|
||||
|
||||
var_3 = ( var_2[0].origin[0], var_2[0].origin[1], 0 );
|
||||
var_4 = ( var_2[1].origin[0], var_2[1].origin[1], 0 );
|
||||
var_5 = var_4 - var_3;
|
||||
var_6 = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
|
||||
var_7 = ( 0 - var_6[1], var_6[0], 0 );
|
||||
|
||||
if ( vectordot( var_5, var_7 ) > 0 )
|
||||
{
|
||||
if ( vectordot( var_5, var_6 ) > 0 )
|
||||
{
|
||||
var_8 = var_4;
|
||||
var_9 = var_3;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_10 = vecscale( var_6, vectordot( var_5, var_6 ) );
|
||||
var_8 = var_4 - var_10;
|
||||
var_9 = var_3 + var_10;
|
||||
}
|
||||
}
|
||||
else if ( vectordot( var_5, var_6 ) > 0 )
|
||||
{
|
||||
var_10 = vecscale( var_6, vectordot( var_5, var_6 ) );
|
||||
var_8 = var_3 + var_10;
|
||||
var_9 = var_4 - var_10;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_8 = var_3;
|
||||
var_9 = var_4;
|
||||
}
|
||||
|
||||
if ( getdvar( "mapname" ) == "mp_boneyard_ns" )
|
||||
{
|
||||
var_9 = var_9 - ( 220, 220, 0 );
|
||||
var_8 = var_8 + ( 220, 220, 0 );
|
||||
}
|
||||
|
||||
if ( var_1 > 0 )
|
||||
{
|
||||
var_11 = vectordot( var_8 - var_9, var_6 );
|
||||
var_12 = vectordot( var_8 - var_9, var_7 );
|
||||
var_13 = var_12 / var_11;
|
||||
|
||||
if ( var_13 < var_1 )
|
||||
{
|
||||
var_14 = var_1 / var_13;
|
||||
var_15 = vecscale( var_7, var_12 * ( var_14 - 1 ) * 0.5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_14 = var_13 / var_1;
|
||||
var_15 = vecscale( var_6, var_11 * ( var_14 - 1 ) * 0.5 );
|
||||
}
|
||||
|
||||
var_8 = var_8 + var_15;
|
||||
var_9 = var_9 - var_15;
|
||||
}
|
||||
|
||||
level.mapsize = vectordot( var_8 - var_9, var_6 );
|
||||
setminimap( var_0, var_8[0], var_8[1], var_9[0], var_9[1] );
|
||||
}
|
||||
|
||||
vecscale( var_0, var_1 )
|
||||
{
|
||||
return ( var_0[0] * var_1, var_0[1] * var_1, var_0[2] * var_1 );
|
||||
}
|
56
maps/mp/_createfx.gsc
Normal file
56
maps/mp/_createfx.gsc
Normal file
@ -0,0 +1,56 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
createfx()
|
||||
{
|
||||
level.func_position_player = common_scripts\utility::void;
|
||||
level.func_position_player_get = ::func_position_player_get;
|
||||
level.func_loopfxthread = common_scripts\_fx::loopfxthread;
|
||||
level.func_oneshotfxthread = common_scripts\_fx::oneshotfxthread;
|
||||
level.func_create_loopsound = common_scripts\_fx::create_loopsound;
|
||||
level.func_updatefx = common_scripts\_createfx::restart_fx_looper;
|
||||
level.func_process_fx_rotater = common_scripts\_createfx::process_fx_rotater;
|
||||
level.func_player_speed = ::func_player_speed;
|
||||
level.mp_createfx = 1;
|
||||
level.callbackstartgametype = common_scripts\utility::void;
|
||||
level.callbackplayerconnect = common_scripts\utility::void;
|
||||
level.callbackplayerdisconnect = common_scripts\utility::void;
|
||||
level.callbackplayerdamage = common_scripts\utility::void;
|
||||
level.callbackplayerkilled = common_scripts\utility::void;
|
||||
level.callbackcodeendgame = common_scripts\utility::void;
|
||||
level.callbackplayerlaststand = common_scripts\utility::void;
|
||||
level.callbackplayerconnect = ::callback_playerconnect;
|
||||
level.callbackplayermigrated = common_scripts\utility::void;
|
||||
thread common_scripts\_createfx::func_get_level_fx();
|
||||
common_scripts\_createfx::createfx_common();
|
||||
level waittill( "eternity" );
|
||||
}
|
||||
|
||||
func_position_player_get( var_0 )
|
||||
{
|
||||
return level.player.origin;
|
||||
}
|
||||
|
||||
callback_playerconnect()
|
||||
{
|
||||
self waittill( "begin" );
|
||||
|
||||
if ( !isdefined( level.player ) )
|
||||
{
|
||||
var_0 = getentarray( "mp_global_intermission", "classname" );
|
||||
self spawn( var_0[0].origin, var_0[0].angles );
|
||||
maps\mp\_utility::updatesessionstate( "playing", "" );
|
||||
self.maxhealth = 10000000;
|
||||
self.health = 10000000;
|
||||
level.player = self;
|
||||
thread common_scripts\_createfx::createfxlogic();
|
||||
}
|
||||
else
|
||||
kick( self getentitynumber() );
|
||||
}
|
||||
|
||||
func_player_speed()
|
||||
{
|
||||
var_0 = level._createfx.player_speed / 190;
|
||||
level.player setmovespeedscale( var_0 );
|
||||
}
|
586
maps/mp/_crib.gsc
Normal file
586
maps/mp/_crib.gsc
Normal file
@ -0,0 +1,586 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
precacheshellshock( "frag_grenade_mp" );
|
||||
radial_button_definitions();
|
||||
radial_init();
|
||||
view_path_setup();
|
||||
player_init();
|
||||
}
|
||||
|
||||
radial_button_definitions()
|
||||
{
|
||||
newradialbuttongroup( "main", "player_view1_start", "player_view1_end" );
|
||||
var_0 = newradialbutton( "main", "Primary Weapon", "radial_weapons_primary", ::action_weapons_primary );
|
||||
var_1 = newradialbutton( "main", "Secondary Weapon", "radial_weapons_secondary", ::action_weapons_secondary );
|
||||
var_2 = newradialbutton( "main", "Gears", "radial_gears", ::action_gears );
|
||||
var_3 = newradialbutton( "main", "Kill Streaks", "radial_killstreaks", ::action_killstreak );
|
||||
var_4 = newradialbutton( "main", "Leaderboards", "radial_leaderboards", ::action_leaderboards );
|
||||
newradialbuttongroup( "gears", "player_view2_start", "player_view2_end" );
|
||||
newradialbuttongroup( "weapons_primary", "player_view3_start", "player_view3_end" );
|
||||
newradialbuttongroup( "weapons_secondary", "player_view3_start", "player_view3_end" );
|
||||
newradialbuttongroup( "killstreak", "player_view4_start", "player_view4_end" );
|
||||
newradialbuttongroup( "leaderboards", "player_view5_start", "player_view5_end" );
|
||||
}
|
||||
|
||||
radial_init()
|
||||
{
|
||||
foreach ( var_1 in level.radial_button_group )
|
||||
{
|
||||
sort_buttons_by_angle( var_1 );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
{
|
||||
if ( isdefined( var_1[var_2 + 1] ) )
|
||||
{
|
||||
var_3 = getmidangle( var_1[var_2].pos_angle, var_1[var_2 + 1].pos_angle );
|
||||
var_1[var_2].end_angle = var_3;
|
||||
var_1[var_2 + 1].start_angle = var_3;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_3 = getmidangle( var_1[var_2].pos_angle, var_1[0].pos_angle ) + 180;
|
||||
|
||||
if ( var_3 > 360 )
|
||||
var_3 = var_3 - 360;
|
||||
|
||||
var_1[var_2].end_angle = var_3;
|
||||
var_1[0].start_angle = var_3;
|
||||
}
|
||||
}
|
||||
|
||||
thread updateselectedbutton();
|
||||
thread watchselectbuttonpress();
|
||||
thread watchbackbuttonpress();
|
||||
thread debug_toggle();
|
||||
}
|
||||
|
||||
debug_toggle()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
level.crib_debug = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( level.observer ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_0 = 1;
|
||||
|
||||
while ( !level.observer buttonpressed( "BUTTON_Y" ) )
|
||||
wait 0.05;
|
||||
|
||||
level.observer playsound( "mouse_click" );
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
level.crib_debug = level.crib_debug * -1;
|
||||
var_0 = 0;
|
||||
}
|
||||
|
||||
while ( level.observer buttonpressed( "BUTTON_Y" ) )
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
player_init()
|
||||
{
|
||||
level thread onplayerconnect();
|
||||
level thread return_hud();
|
||||
}
|
||||
|
||||
return_hud()
|
||||
{
|
||||
level waittill( "game_ended" );
|
||||
setdvar( "cg_draw2d", 1 );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
var_0 thread readyplayer();
|
||||
var_0 waittill( "spawned_player" );
|
||||
wait 1;
|
||||
var_0 takeallweapons();
|
||||
setdvar( "cg_draw2d", 0 );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return;
|
||||
else
|
||||
level.observer = var_0;
|
||||
|
||||
var_0 thread get_right_stick_angle();
|
||||
zoom_to_radial_menu( "main" );
|
||||
}
|
||||
|
||||
readyplayer()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
var_0 = "autoassign";
|
||||
|
||||
while ( !isdefined( self.pers["team"] ) )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "menuresponse", game["menu_team"], var_0 );
|
||||
wait 0.5;
|
||||
var_1 = getarraykeys( level.classmap );
|
||||
var_2 = [];
|
||||
|
||||
for ( var_3 = 0; var_3 < var_1.size; var_3++ )
|
||||
{
|
||||
if ( !issubstr( var_1[var_3], "custom" ) )
|
||||
var_2[var_2.size] = var_1[var_3];
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = var_2[0];
|
||||
self notify( "menuresponse", "changeclass", var_4 );
|
||||
self waittill( "spawned_player" );
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
get_right_stick_angle()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 = self getnormalizedmovement();
|
||||
var_1 = vectortoangles( var_0 );
|
||||
level.rs_angle = int( var_1[1] );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
newradialbuttongroup( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isdefined( level.radial_button_group ) && level.radial_button_group.size )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
var_3 = getent( var_2, "targetname" );
|
||||
var_4 = vectornormalize( anglestoforward( var_3.angles ) ) * 40;
|
||||
level.radial_button_group[var_0] = [];
|
||||
level.radial_button_group_info[var_0]["view_start"] = var_1;
|
||||
level.radial_button_group_info[var_0]["view_pos"] = var_3.origin + var_4;
|
||||
level.radial_button_group_info[var_0]["player_view_pos"] = var_3.origin;
|
||||
level.radial_button_group_info[var_0]["view_angles"] = var_3.angles;
|
||||
}
|
||||
|
||||
newradialbutton( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = getent( var_2, "targetname" );
|
||||
var_5 = getradialanglefroment( var_0, var_4 );
|
||||
var_6 = spawnstruct();
|
||||
var_6.pos = var_4.origin;
|
||||
var_6.label = var_1;
|
||||
var_6.font_size = 1;
|
||||
var_6.font_color = ( 0.5, 0.5, 1 );
|
||||
var_6.pos_angle = var_5;
|
||||
var_6.action_func = var_3;
|
||||
var_6.radius_pos = 8;
|
||||
level.radial_button_group[var_0][level.radial_button_group[var_0].size] = var_6;
|
||||
return var_6;
|
||||
}
|
||||
|
||||
updateselectedbutton()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( level.radial_button_current_group ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_0 = level.active_button;
|
||||
|
||||
foreach ( var_2 in level.radial_button_group[level.radial_button_current_group] )
|
||||
{
|
||||
if ( isinrange( var_2.start_angle, var_2.end_angle ) )
|
||||
{
|
||||
level.active_button = var_2;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_2.font_color = ( 0.5, 0.5, 1 );
|
||||
}
|
||||
|
||||
if ( isdefined( level.active_button ) )
|
||||
{
|
||||
level.active_button.font_color = ( 1, 1, 0.5 );
|
||||
|
||||
if ( isdefined( var_0 ) && var_0 != level.active_button )
|
||||
level.observer playsound( "mouse_over" );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
watchselectbuttonpress()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( level.observer ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_0 = 1;
|
||||
|
||||
while ( !level.observer buttonpressed( "BUTTON_A" ) )
|
||||
wait 0.05;
|
||||
|
||||
level.observer playsound( "mouse_click" );
|
||||
|
||||
if ( isdefined( level.active_button ) && var_0 )
|
||||
{
|
||||
level.active_button notify( "select_button_pressed" );
|
||||
[[ level.active_button.action_func ]]();
|
||||
var_0 = 0;
|
||||
}
|
||||
|
||||
while ( level.observer buttonpressed( "BUTTON_A" ) )
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
watchbackbuttonpress()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( level.observer ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_0 = 1;
|
||||
|
||||
while ( !level.observer buttonpressed( "BUTTON_X" ) )
|
||||
wait 0.05;
|
||||
|
||||
level.observer playsound( "mouse_click" );
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
action_back();
|
||||
var_0 = 0;
|
||||
}
|
||||
|
||||
while ( level.observer buttonpressed( "BUTTON_X" ) )
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
sort_buttons_by_angle( var_0 )
|
||||
{
|
||||
for ( var_1 = 0; var_1 < var_0.size - 1; var_1++ )
|
||||
{
|
||||
for ( var_2 = 0; var_2 < var_0.size - 1 - var_1; var_2++ )
|
||||
{
|
||||
if ( var_0[var_2 + 1].pos_angle < var_0[var_2].pos_angle )
|
||||
button_switch( var_0[var_2], var_0[var_2 + 1] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
button_switch( var_0, var_1 )
|
||||
{
|
||||
var_2 = var_0.pos;
|
||||
var_3 = var_0.label;
|
||||
var_4 = var_0.pos_angle;
|
||||
var_5 = var_0.action_func;
|
||||
var_6 = var_0.radius_pos;
|
||||
var_0.pos = var_1.pos;
|
||||
var_0.label = var_1.label;
|
||||
var_0.pos_angle = var_1.pos_angle;
|
||||
var_0.action_func = var_1.action_func;
|
||||
var_0.radius_pos = var_1.radius_pos;
|
||||
var_1.pos = var_2;
|
||||
var_1.label = var_3;
|
||||
var_1.pos_angle = var_4;
|
||||
var_1.action_func = var_5;
|
||||
var_1.radius_pos = var_6;
|
||||
}
|
||||
|
||||
draw_radial_buttons( var_0 )
|
||||
{
|
||||
foreach ( var_2 in level.radial_button_group[var_0] )
|
||||
var_2 thread draw_radial_button( var_0 );
|
||||
}
|
||||
|
||||
draw_radial_button( var_0 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "remove_button" );
|
||||
var_1 = level.radial_button_group_info[var_0]["view_pos"];
|
||||
var_2 = var_1 + radial_angle_to_vector( self.pos_angle, 4 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_3 = ( 1, 0, 0 );
|
||||
|
||||
if ( isinrange( self.start_angle, self.end_angle ) )
|
||||
var_3 = ( 1, 1, 0 );
|
||||
|
||||
if ( isdefined( level.crib_debug ) && level.crib_debug > 0 )
|
||||
var_4 = var_1 + radial_angle_to_vector( level.rs_angle, 2 );
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
zoom_to_radial_menu( var_0, var_1 )
|
||||
{
|
||||
level.active_button = undefined;
|
||||
|
||||
if ( isdefined( level.radial_button_current_group ) && level.radial_button_current_group != "" )
|
||||
level.radial_button_previous_group = level.radial_button_current_group;
|
||||
else
|
||||
{
|
||||
level.radial_button_previous_group = "main";
|
||||
level.radial_button_current_group = "main";
|
||||
}
|
||||
|
||||
foreach ( var_3 in level.radial_button_group[level.radial_button_previous_group] )
|
||||
var_3 notify( "remove_button" );
|
||||
|
||||
if ( isdefined( var_1 ) && var_1 )
|
||||
level.observer go_path_by_targetname_reverse( level.radial_button_group_info[level.radial_button_previous_group]["view_start"], var_0 );
|
||||
else
|
||||
level.observer go_path_by_targetname( level.radial_button_group_info[var_0]["view_start"] );
|
||||
|
||||
level thread draw_radial_buttons( var_0 );
|
||||
level.radial_button_current_group = var_0;
|
||||
}
|
||||
|
||||
getradialanglefroment( var_0, var_1 )
|
||||
{
|
||||
var_2 = level.radial_button_group_info[var_0]["view_angles"];
|
||||
var_3 = level.radial_button_group_info[var_0]["view_pos"];
|
||||
var_3 = var_3 + vectornormalize( anglestoforward( var_2 ) ) * 40;
|
||||
var_4 = anglestoforward( var_2 );
|
||||
var_5 = vectornormalize( anglestoup( var_2 ) );
|
||||
var_6 = var_1.angles;
|
||||
var_7 = var_1.origin;
|
||||
var_8 = vectornormalize( vectorfromlinetopoint( var_3, var_3 + var_4, var_7 ) );
|
||||
var_9 = acos( vectordot( var_8, var_5 ) );
|
||||
|
||||
if ( vectordot( anglestoright( var_2 ), var_8 ) < 0 )
|
||||
var_9 = 360 - var_9;
|
||||
|
||||
return var_9;
|
||||
}
|
||||
|
||||
radial_angle_to_vector( var_0, var_1 )
|
||||
{
|
||||
var_2 = ( 270 - var_0, 0, 0 );
|
||||
var_3 = anglestoforward( var_2 );
|
||||
var_4 = vectornormalize( var_3 );
|
||||
var_5 = var_4 * var_1;
|
||||
return var_5;
|
||||
}
|
||||
|
||||
getmidangle( var_0, var_1 )
|
||||
{
|
||||
var_2 = ( var_0 + var_1 + 720 ) / 2 - 360;
|
||||
return var_2;
|
||||
}
|
||||
|
||||
isinrange( var_0, var_1 )
|
||||
{
|
||||
var_2 = level.rs_angle > var_0 && level.rs_angle < 360;
|
||||
var_3 = level.rs_angle > 0 && level.rs_angle < var_1;
|
||||
|
||||
if ( var_0 > var_1 )
|
||||
var_4 = var_2 || var_3;
|
||||
else
|
||||
var_4 = level.rs_angle > var_0 && level.rs_angle < var_1;
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
action_back()
|
||||
{
|
||||
if ( isdefined( level.radial_button_current_group ) && level.radial_button_current_group != "main" )
|
||||
zoom_to_radial_menu( "main", 1 );
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
action_weapons_primary()
|
||||
{
|
||||
iprintlnbold( "action_weapons_primary" );
|
||||
zoom_to_radial_menu( "weapons_primary" );
|
||||
}
|
||||
|
||||
action_weapons_secondary()
|
||||
{
|
||||
iprintlnbold( "action_weapons_secondary" );
|
||||
zoom_to_radial_menu( "weapons_secondary" );
|
||||
}
|
||||
|
||||
action_gears()
|
||||
{
|
||||
iprintlnbold( "action_gears" );
|
||||
zoom_to_radial_menu( "gears" );
|
||||
}
|
||||
|
||||
action_killstreak()
|
||||
{
|
||||
iprintlnbold( "action_killstreak" );
|
||||
zoom_to_radial_menu( "killstreak" );
|
||||
}
|
||||
|
||||
action_leaderboards()
|
||||
{
|
||||
iprintlnbold( "action_leaderboards" );
|
||||
zoom_to_radial_menu( "leaderboards" );
|
||||
}
|
||||
|
||||
view_path_setup()
|
||||
{
|
||||
level.view_paths = [];
|
||||
build_path_by_targetname( "player_view1_start" );
|
||||
build_path_by_targetname( "player_view2_start" );
|
||||
build_path_by_targetname( "player_view3_start" );
|
||||
build_path_by_targetname( "player_view4_start" );
|
||||
build_path_by_targetname( "player_view5_start" );
|
||||
}
|
||||
|
||||
build_path_by_targetname( var_0 )
|
||||
{
|
||||
level.view_paths[var_0] = [];
|
||||
var_1 = getent( var_0, "targetname" );
|
||||
|
||||
for ( level.view_paths[var_0][level.view_paths[var_0].size] = var_1; isdefined( var_1 ) && isdefined( var_1.target ); var_1 = var_2 )
|
||||
{
|
||||
var_2 = getent( var_1.target, "targetname" );
|
||||
level.view_paths[var_0][level.view_paths[var_0].size] = var_2;
|
||||
}
|
||||
}
|
||||
|
||||
go_path_by_targetname( var_0 )
|
||||
{
|
||||
if ( !isdefined( level.dummy_mover ) )
|
||||
{
|
||||
var_1 = level.view_paths[var_0][0];
|
||||
level.dummy_mover = spawn( "script_model", var_1.origin );
|
||||
level.dummy_mover.angles = var_1.angles;
|
||||
self setorigin( level.dummy_mover.origin - ( 0, 0, 65 ) );
|
||||
self linkto( level.dummy_mover );
|
||||
wait 0.05;
|
||||
self setplayerangles( level.dummy_mover.angles );
|
||||
thread force_player_angles();
|
||||
}
|
||||
|
||||
var_2 = 1;
|
||||
var_3 = abs( distance( level.dummy_mover.origin, level.view_paths[var_0][level.view_paths[var_0].size - 1].origin ) );
|
||||
var_2 = var_2 * ( var_3 / 1200 );
|
||||
var_2 = max( var_2, 0.1 );
|
||||
var_4 = var_2;
|
||||
|
||||
if ( !1 )
|
||||
var_4 = var_4 * ( var_2 * ( level.view_paths[var_0].size + 1 ) );
|
||||
|
||||
thread blur_sine( 3, var_4 );
|
||||
|
||||
foreach ( var_7, var_6 in level.view_paths[var_0] )
|
||||
{
|
||||
if ( 1 )
|
||||
{
|
||||
if ( var_7 != level.view_paths[var_0].size - 1 )
|
||||
continue;
|
||||
}
|
||||
|
||||
level.dummy_mover moveto( var_6.origin, var_2, var_2 * 0.5, 0 );
|
||||
level.dummy_mover rotateto( var_6.angles, var_2, var_2 * 0.5, 0 );
|
||||
wait( var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
go_path_by_targetname_reverse( var_0, var_1 )
|
||||
{
|
||||
var_2 = 1;
|
||||
var_3 = abs( distance( level.dummy_mover.origin, level.radial_button_group_info[var_1]["player_view_pos"] ) );
|
||||
var_2 = var_2 * ( var_3 / 1200 );
|
||||
var_2 = max( var_2, 0.1 );
|
||||
var_4 = var_2;
|
||||
|
||||
if ( !1 )
|
||||
var_4 = var_4 * ( var_2 * ( level.view_paths[var_0].size + 1 ) );
|
||||
|
||||
thread blur_sine( 3, var_4 );
|
||||
|
||||
if ( !1 )
|
||||
{
|
||||
for ( var_5 = level.view_paths[var_0].size - 1; var_5 >= 0; var_5-- )
|
||||
{
|
||||
var_6 = level.view_paths[var_0][var_5];
|
||||
level.dummy_mover moveto( var_6.origin, var_2 );
|
||||
level.dummy_mover rotateto( var_6.angles, var_2 );
|
||||
wait( var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
thread blur_sine( 3, var_2 );
|
||||
var_7 = level.radial_button_group_info[var_1]["player_view_pos"];
|
||||
var_8 = level.radial_button_group_info[var_1]["view_angles"];
|
||||
level.dummy_mover moveto( var_7, var_2, var_2 * 0.5, 0 );
|
||||
level.dummy_mover rotateto( var_8, var_2, var_2 * 0.5, 0 );
|
||||
wait( var_2 );
|
||||
}
|
||||
|
||||
travel_view_fx( var_0 )
|
||||
{
|
||||
self setblurforplayer( 20, ( var_0 + 0.2 ) / 2 );
|
||||
self setblurforplayer( 0, ( var_0 + 0.2 ) / 2 );
|
||||
self shellshock( "frag_grenade_mp", var_0 + 0.2 );
|
||||
}
|
||||
|
||||
blur_sine( var_0, var_1 )
|
||||
{
|
||||
var_2 = int( var_1 / 0.05 );
|
||||
|
||||
for ( var_3 = 0; var_3 < var_2; var_3++ )
|
||||
{
|
||||
var_4 = var_3 / var_2;
|
||||
var_5 = sin( 180 * var_4 );
|
||||
var_6 = var_0 * var_5;
|
||||
setdvar( "r_blur", var_6 );
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
setdvar( "r_blur", 0 );
|
||||
}
|
||||
|
||||
force_player_angles()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "disconnect" );
|
||||
level.dummy_mover endon( "remove_dummy" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self setplayerangles( level.dummy_mover.angles );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
117
maps/mp/_defcon.gsc
Normal file
117
maps/mp/_defcon.gsc
Normal file
@ -0,0 +1,117 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isdefined( level.defconmode ) || level.defconmode == 0 )
|
||||
return;
|
||||
|
||||
if ( !isdefined( game["defcon"] ) )
|
||||
game["defcon"] = 4;
|
||||
|
||||
setdvar( "scr_defcon", game["defcon"] );
|
||||
level.defconstreakadd[5] = 0;
|
||||
level.defconstreakadd[4] = 0;
|
||||
level.defconstreakadd[3] = -1;
|
||||
level.defconstreakadd[2] = -1;
|
||||
level.defconstreakadd[1] = -1;
|
||||
level.defconpointmod[5] = 1;
|
||||
level.defconpointmod[4] = 1;
|
||||
level.defconpointmod[3] = 1;
|
||||
level.defconpointmod[2] = 1;
|
||||
level.defconpointmod[1] = 2;
|
||||
updatedefcon( game["defcon"] );
|
||||
thread defconkillstreakthread();
|
||||
}
|
||||
|
||||
defconkillstreakwait( var_0 )
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "player_got_killstreak_" + var_0, var_1 );
|
||||
level notify( "defcon_killstreak", var_0, var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
defconkillstreakthread()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
var_0 = 10;
|
||||
level thread defconkillstreakwait( var_0 );
|
||||
level thread defconkillstreakwait( var_0 - 1 );
|
||||
level thread defconkillstreakwait( var_0 - 2 );
|
||||
level thread defconkillstreakwait( var_0 * 2 );
|
||||
level thread defconkillstreakwait( var_0 * 2 - 1 );
|
||||
level thread defconkillstreakwait( var_0 * 2 - 2 );
|
||||
level thread defconkillstreakwait( var_0 * 3 );
|
||||
level thread defconkillstreakwait( var_0 * 3 - 1 );
|
||||
level thread defconkillstreakwait( var_0 * 3 - 2 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "defcon_killstreak", var_1, var_2 );
|
||||
|
||||
if ( game["defcon"] <= 1 )
|
||||
continue;
|
||||
|
||||
if ( var_1 % var_0 == var_0 - 2 )
|
||||
{
|
||||
foreach ( var_4 in level.players )
|
||||
{
|
||||
if ( !isalive( var_4 ) )
|
||||
continue;
|
||||
|
||||
var_4 thread maps\mp\gametypes\_hud_message::playercardsplashnotify( "two_from_defcon", var_2 );
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( var_1 % var_0 == var_0 - 1 )
|
||||
{
|
||||
foreach ( var_4 in level.players )
|
||||
{
|
||||
if ( !isalive( var_4 ) )
|
||||
continue;
|
||||
|
||||
var_4 thread maps\mp\gametypes\_hud_message::playercardsplashnotify( "one_from_defcon", var_2 );
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
updatedefcon( game["defcon"] - 1, var_2, var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
updatedefcon( var_0, var_1, var_2 )
|
||||
{
|
||||
var_0 = int( var_0 );
|
||||
var_3 = game["defcon"];
|
||||
game["defcon"] = var_0;
|
||||
level.objectivepointsmod = level.defconpointmod[var_0];
|
||||
setdvar( "scr_defcon", game["defcon"] );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_1 notify( "changed_defcon" );
|
||||
|
||||
if ( var_0 == var_3 )
|
||||
return;
|
||||
|
||||
if ( game["defcon"] == 3 && isdefined( var_1 ) )
|
||||
{
|
||||
var_1 maps\mp\killstreaks\_killstreaks::givekillstreak( "airdrop_mega" );
|
||||
var_1 thread maps\mp\gametypes\_hud_message::splashnotify( "caused_defcon", var_2 );
|
||||
}
|
||||
|
||||
foreach ( var_5 in level.players )
|
||||
{
|
||||
if ( isalive( var_5 ) )
|
||||
{
|
||||
var_5 thread maps\mp\gametypes\_hud_message::defconsplashnotify( game["defcon"], var_0 < var_3 );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_5 thread maps\mp\gametypes\_hud_message::playercardsplashnotify( "changed_defcon", var_1 );
|
||||
}
|
||||
}
|
||||
}
|
98
maps/mp/_destructables.gsc
Normal file
98
maps/mp/_destructables.gsc
Normal file
@ -0,0 +1,98 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
var_0 = getentarray( "destructable", "targetname" );
|
||||
|
||||
if ( getdvar( "scr_destructables" ) == "0" )
|
||||
{
|
||||
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
|
||||
var_0[var_1] delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
|
||||
var_0[var_1] thread destructable_think();
|
||||
}
|
||||
}
|
||||
|
||||
destructable_think()
|
||||
{
|
||||
var_0 = 40;
|
||||
var_1 = 0;
|
||||
|
||||
if ( isdefined( self.script_accumulate ) )
|
||||
var_0 = self.script_accumulate;
|
||||
|
||||
if ( isdefined( self.script_threshold ) )
|
||||
var_1 = self.script_threshold;
|
||||
|
||||
if ( isdefined( self.script_destructable_area ) )
|
||||
{
|
||||
var_2 = strtok( self.script_destructable_area, " " );
|
||||
|
||||
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
|
||||
blockarea( var_2[var_3] );
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_fxid ) )
|
||||
self.fx = loadfx( self.script_fxid );
|
||||
|
||||
var_4 = 0;
|
||||
self setcandamage( 1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", var_5, var_6 );
|
||||
|
||||
if ( var_5 >= var_1 )
|
||||
{
|
||||
var_4 = var_4 + var_5;
|
||||
|
||||
if ( var_4 >= var_0 )
|
||||
{
|
||||
thread destructable_destruct();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
destructable_destruct()
|
||||
{
|
||||
var_0 = self;
|
||||
|
||||
if ( isdefined( self.script_destructable_area ) )
|
||||
{
|
||||
var_1 = strtok( self.script_destructable_area, " " );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
unblockarea( var_1[var_2] );
|
||||
}
|
||||
|
||||
if ( isdefined( var_0.fx ) )
|
||||
playfx( var_0.fx, var_0.origin + ( 0, 0, 6 ) );
|
||||
|
||||
var_0 delete();
|
||||
}
|
||||
|
||||
blockarea( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
blockentsinarea( var_0, var_1 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
unblockarea( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
unblockentsinarea( var_0, var_1 )
|
||||
{
|
||||
|
||||
}
|
158
maps/mp/_dlcalienegg.gsc
Normal file
158
maps/mp/_dlcalienegg.gsc
Normal file
@ -0,0 +1,158 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
level.dlcalieneggs = [];
|
||||
level.dlcalieneggs["mp_boneyard_ns"] = 1;
|
||||
level.dlcalieneggs["mp_swamp"] = 2;
|
||||
level.dlcalieneggs["mp_ca_red_river"] = 4;
|
||||
level.dlcalieneggs["mp_ca_rumble"] = 8;
|
||||
level.dlcalieneggs["mp_dome_ns"] = 16;
|
||||
level.dlcalieneggs["mp_battery3"] = 32;
|
||||
level.dlcalieneggs["mp_ca_impact"] = 64;
|
||||
level.dlcalieneggs["mp_ca_behemoth"] = 128;
|
||||
level.dlcalieneggs["mp_dig"] = 256;
|
||||
level.dlcalieneggs["mp_favela_iw6"] = 512;
|
||||
level.dlcalieneggs["mp_pirate"] = 1024;
|
||||
level.dlcalieneggs["mp_zulu"] = 2048;
|
||||
level.dlcalieneggs["mp_conflict"] = 4096;
|
||||
level.dlcalieneggs["mp_mine"] = 8192;
|
||||
level.dlcalieneggs["mp_zerosub"] = 16384;
|
||||
level.dlcalieneggs["mp_shipment_ns"] = 32768;
|
||||
level.dlcaliengeggmaptopack["mp_boneyard_ns"] = 0;
|
||||
level.dlcaliengeggmaptopack["mp_swamp"] = 0;
|
||||
level.dlcaliengeggmaptopack["mp_ca_red_river"] = 0;
|
||||
level.dlcaliengeggmaptopack["mp_ca_rumble"] = 0;
|
||||
level.dlcaliengeggmaptopack["mp_dome_ns"] = 1;
|
||||
level.dlcaliengeggmaptopack["mp_battery3"] = 1;
|
||||
level.dlcaliengeggmaptopack["mp_ca_impact"] = 1;
|
||||
level.dlcaliengeggmaptopack["mp_ca_behemoth"] = 1;
|
||||
level.dlcaliengeggmaptopack["mp_dig"] = 2;
|
||||
level.dlcaliengeggmaptopack["mp_favela_iw6"] = 2;
|
||||
level.dlcaliengeggmaptopack["mp_pirate"] = 2;
|
||||
level.dlcaliengeggmaptopack["mp_zulu"] = 2;
|
||||
level.dlcaliengeggmaptopack["mp_conflict"] = 3;
|
||||
level.dlcaliengeggmaptopack["mp_mine"] = 3;
|
||||
level.dlcaliengeggmaptopack["mp_zerosub"] = 3;
|
||||
level.dlcaliengeggmaptopack["mp_shipment_ns"] = 3;
|
||||
level.bitcounts = [ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 ];
|
||||
level._effect["vfx_alien_easter_egg_hit"] = loadfx( "vfx/gameplay/alien/vfx_alien_easter_egg_hit" );
|
||||
}
|
||||
|
||||
setupeggformap( var_0 )
|
||||
{
|
||||
if ( level.rankedmatch )
|
||||
{
|
||||
init();
|
||||
var_1 = level.dlcalieneggs[maps\mp\_utility::getmapname()];
|
||||
var_2 = getent( var_0, "targetname" );
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
{
|
||||
if ( var_2.classname == "script_model" )
|
||||
var_2 setcandamage( 1 );
|
||||
|
||||
var_2 thread eggtrackhits();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eggtrackhits()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self.health = 99999;
|
||||
level.egghits = [];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
|
||||
playfx( common_scripts\utility::getfx( "vfx_alien_easter_egg_hit" ), var_3, anglestoforward( var_2 ), anglestoup( var_2 ) );
|
||||
|
||||
if ( isplayer( var_1 ) && !isai( var_1 ) )
|
||||
{
|
||||
var_5 = var_1 maps\mp\_utility::getuniqueid();
|
||||
|
||||
if ( !isdefined( level.egghits[var_5] ) )
|
||||
{
|
||||
level.egghits[var_5] = 1;
|
||||
eggregisterhit( var_0, var_1, var_2, var_3, var_4 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eggregisterhit( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
self.health = self.health + var_0;
|
||||
|
||||
if ( !var_1 egghascompletedformap( maps\mp\_utility::getmapname() ) )
|
||||
var_1 eggsetcompletedformap( maps\mp\_utility::getmapname() );
|
||||
else if ( var_1 eggallfound() && var_1 maps\mp\gametypes\_hud_util::ch_getstate( "ch_weekly_1" ) < 2 )
|
||||
var_1 eggawardpatch();
|
||||
}
|
||||
|
||||
egghascompletedformap( var_0 )
|
||||
{
|
||||
var_1 = self getrankedplayerdatareservedint( "dlcEggStatus" );
|
||||
var_2 = level.dlcalieneggs[var_0];
|
||||
|
||||
if ( isdefined( var_2 ) && ( var_1 & var_2 ) != 0 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
eggsetcompletedformap( var_0 )
|
||||
{
|
||||
var_1 = level.dlcalieneggs[var_0];
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_2 = self getrankedplayerdatareservedint( "dlcEggStatus" );
|
||||
var_2 = var_2 | var_1;
|
||||
self setrankedplayerdatareservedint( "dlcEggStatus", var_2 );
|
||||
var_3 = level.dlcaliengeggmaptopack[var_0];
|
||||
var_4 = eggcountcompletedeggsforpack( var_3, var_2 );
|
||||
var_3++;
|
||||
|
||||
if ( var_4 < 4 )
|
||||
maps\mp\gametypes\_hud_message::playercardsplashnotify( "dlc_eggFound_" + var_3, self, var_4 );
|
||||
else if ( eggallfound() && maps\mp\gametypes\_hud_util::ch_getstate( "ch_weekly_1" ) < 2 )
|
||||
eggawardpatch();
|
||||
else
|
||||
{
|
||||
maps\mp\gametypes\_hud_message::playercardsplashnotify( "dlc_eggAllFound_" + var_3, self );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "dlc_egg_hunt" );
|
||||
}
|
||||
|
||||
self playlocalsound( "ui_extinction_egg_splash" );
|
||||
}
|
||||
}
|
||||
|
||||
eggawardpatch()
|
||||
{
|
||||
maps\mp\gametypes\_hud_message::playercardsplashnotify( "dlc_eggAllFound", self );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "dlc_egg_hunt_all" );
|
||||
maps\mp\gametypes\_hud_util::ch_setstate( "ch_weekly_1", 2 );
|
||||
}
|
||||
|
||||
eggcountcompletedeggsforpack( var_0, var_1 )
|
||||
{
|
||||
var_2 = var_1 >> var_0 * 4;
|
||||
var_2 = var_2 & 15;
|
||||
return level.bitcounts[var_2];
|
||||
}
|
||||
|
||||
eggallfoundforpack( var_0 )
|
||||
{
|
||||
var_1 = self getrankedplayerdatareservedint( "dlcEggStatus" );
|
||||
var_2 = var_1 >> var_0 * 4 & 15;
|
||||
return var_2 != 0;
|
||||
}
|
||||
|
||||
eggallfound()
|
||||
{
|
||||
var_0 = self getrankedplayerdatareservedint( "dlcEggStatus" );
|
||||
return var_0 == 65535;
|
||||
}
|
303
maps/mp/_elevator.gsc
Normal file
303
maps/mp/_elevator.gsc
Normal file
@ -0,0 +1,303 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init_elevator( var_0 )
|
||||
{
|
||||
var_1 = getent( var_0.name, "targetname" );
|
||||
var_1.unresolved_collision_func = ::handleunreslovedcollision;
|
||||
var_1.doors = [];
|
||||
|
||||
foreach ( var_8, var_3 in var_0.doors )
|
||||
{
|
||||
var_4 = [];
|
||||
|
||||
foreach ( var_6 in var_3 )
|
||||
{
|
||||
var_4[var_4.size] = setupdoor( var_6 + "left", 0, var_0.doormovedist );
|
||||
var_4[var_4.size] = setupdoor( var_6 + "right", 1, var_0.doormovedist );
|
||||
}
|
||||
|
||||
var_1.doors[var_8] = var_4;
|
||||
}
|
||||
|
||||
var_1.trigblock = getent( var_0.trigblockname, "targetname" );
|
||||
var_1.curfloor = "floor1";
|
||||
var_1.requestedfloor = var_1.curfloor;
|
||||
var_1.doorstate = 0;
|
||||
var_1.dooropentime = 2.0;
|
||||
var_1.doorspeed = var_0.doormovedist / var_1.dooropentime;
|
||||
var_1.movetime = 5.0;
|
||||
var_1.autoclosetimeout = 10.0;
|
||||
var_1.destinations = [];
|
||||
var_1.pathblockers = [];
|
||||
var_1.buttons = getentarray( var_0.buttons, "targetname" );
|
||||
|
||||
foreach ( var_10 in var_1.buttons )
|
||||
var_10 setupbutton( var_1 );
|
||||
|
||||
var_12 = getentarray( "elevator_models", "targetname" );
|
||||
|
||||
foreach ( var_14 in var_12 )
|
||||
var_14 linkto( var_1 );
|
||||
|
||||
var_1 thread elevatorthink();
|
||||
var_1 thread openelevatordoors( var_1.curfloor, 0 );
|
||||
}
|
||||
|
||||
setupdoor( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = getent( var_0, "targetname" );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_3.closepos = var_3.origin;
|
||||
|
||||
if ( isdefined( var_3.target ) )
|
||||
{
|
||||
var_4 = common_scripts\utility::getstruct( var_3.target, "targetname" );
|
||||
var_3.openpos = var_4.origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_5 = anglestoforward( var_3.angles ) * var_2;
|
||||
var_3.openpos = var_3.origin + var_5;
|
||||
}
|
||||
|
||||
return var_3;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
setupbutton( var_0 )
|
||||
{
|
||||
self.owner = var_0;
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
var_1 = common_scripts\utility::getstruct( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_0.destinations[self.script_label] = var_1.origin;
|
||||
|
||||
if ( isdefined( var_1.target ) )
|
||||
{
|
||||
var_2 = getent( var_1.target, "targetname" );
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_0.pathblockers[self.script_label] = var_2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enablebutton();
|
||||
}
|
||||
|
||||
enablebutton()
|
||||
{
|
||||
self sethintstring( &"MP_ELEVATOR_USE" );
|
||||
self makeusable();
|
||||
thread buttonthink();
|
||||
}
|
||||
|
||||
disablebutton()
|
||||
{
|
||||
self makeunusable();
|
||||
}
|
||||
|
||||
buttonthink()
|
||||
{
|
||||
var_0 = self.owner;
|
||||
var_0 endon( "elevator_busy" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "trigger" );
|
||||
|
||||
if ( self.script_label == "elevator" )
|
||||
{
|
||||
if ( var_0.curfloor == "floor1" )
|
||||
var_0.requestedfloor = "floor2";
|
||||
else
|
||||
var_0.requestedfloor = "floor1";
|
||||
}
|
||||
else
|
||||
var_0.requestedfloor = self.script_label;
|
||||
|
||||
var_0 notify( "elevator_called" );
|
||||
}
|
||||
}
|
||||
|
||||
elevatorthink()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "elevator_called" );
|
||||
|
||||
foreach ( var_1 in self.buttons )
|
||||
var_1 disablebutton();
|
||||
|
||||
if ( self.curfloor != self.requestedfloor )
|
||||
{
|
||||
if ( self.doorstate != 0 )
|
||||
{
|
||||
self notify( "elevator_stop_autoclose" );
|
||||
thread closeelevatordoors( self.curfloor );
|
||||
self waittill( "elevator_doors_closed" );
|
||||
}
|
||||
|
||||
elevatormovetofloor( self.requestedfloor );
|
||||
wait 0.25;
|
||||
}
|
||||
|
||||
thread openelevatordoors( self.curfloor, 0 );
|
||||
self waittill( "elevator_doors_open" );
|
||||
|
||||
foreach ( var_1 in self.buttons )
|
||||
var_1 enablebutton();
|
||||
}
|
||||
}
|
||||
|
||||
elevatormovetofloor( var_0 )
|
||||
{
|
||||
self playsound( "scn_elevator_startup" );
|
||||
self playloopsound( "scn_elevator_moving_lp" );
|
||||
var_1 = self.destinations[var_0];
|
||||
var_2 = var_1[2] - self.origin[2];
|
||||
|
||||
foreach ( var_4 in self.doors["elevator"] )
|
||||
var_4 movez( var_2, self.movetime );
|
||||
|
||||
self movez( var_2, self.movetime );
|
||||
wait( self.movetime );
|
||||
self stoploopsound( "scn_elevator_moving_lp" );
|
||||
self playsound( "scn_elevator_stopping" );
|
||||
self playsound( "scn_elevator_beep" );
|
||||
self.curfloor = self.requestedfloor;
|
||||
}
|
||||
|
||||
openelevatordoors( var_0, var_1 )
|
||||
{
|
||||
var_2 = self.doors[var_0];
|
||||
self.doorstate = 1;
|
||||
var_3 = var_2[0];
|
||||
var_4 = ( var_3.openpos[0], var_3.openpos[1], var_3.origin[2] );
|
||||
var_5 = var_4 - var_3.origin;
|
||||
var_6 = length( var_5 );
|
||||
var_7 = var_6 / self.doorspeed;
|
||||
var_8 = 0.25;
|
||||
|
||||
if ( var_7 == 0.0 )
|
||||
{
|
||||
var_7 = 0.05;
|
||||
var_8 = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self playsound( "scn_elevator_doors_opening" );
|
||||
var_8 = min( var_8, var_7 );
|
||||
}
|
||||
|
||||
foreach ( var_3 in var_2 )
|
||||
var_3 moveto( ( var_3.openpos[0], var_3.openpos[1], var_3.origin[2] ), var_7, 0.0, var_8 );
|
||||
|
||||
wait( var_7 );
|
||||
self.doorstate = 2;
|
||||
self notify( "elevator_doors_open" );
|
||||
elevatorclearpath( var_0 );
|
||||
|
||||
if ( var_1 )
|
||||
thread elevatordoorsautoclose();
|
||||
}
|
||||
|
||||
closeelevatordoors( var_0 )
|
||||
{
|
||||
self endon( "elevator_close_interrupted" );
|
||||
thread watchcloseinterrupted( var_0 );
|
||||
var_1 = self.doors[var_0];
|
||||
self.doorstate = 3;
|
||||
var_2 = var_1[0];
|
||||
var_3 = ( var_2.closepos[0], var_2.closepos[1], var_2.origin[2] );
|
||||
var_4 = var_3 - var_2.origin;
|
||||
var_5 = length( var_4 );
|
||||
|
||||
if ( var_5 != 0.0 )
|
||||
{
|
||||
var_6 = var_5 / self.doorspeed;
|
||||
|
||||
foreach ( var_2 in var_1 )
|
||||
var_2 moveto( ( var_2.closepos[0], var_2.closepos[1], var_2.origin[2] ), var_6, 0.0, 0.25 );
|
||||
|
||||
self playsound( "scn_elevator_doors_closing" );
|
||||
wait( var_6 );
|
||||
}
|
||||
|
||||
self.doorstate = 0;
|
||||
elevatorblockpath( var_0 );
|
||||
self notify( "elevator_doors_closed" );
|
||||
}
|
||||
|
||||
watchcloseinterrupted( var_0 )
|
||||
{
|
||||
self endon( "elevator_doors_closed" );
|
||||
var_1 = 1;
|
||||
|
||||
foreach ( var_3 in level.characters )
|
||||
{
|
||||
if ( var_3 istouchingtrigger( self.trigblock ) )
|
||||
{
|
||||
var_1 = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_1 )
|
||||
self.trigblock waittill( "trigger" );
|
||||
|
||||
self notify( "elevator_close_interrupted" );
|
||||
openelevatordoors( var_0, 1 );
|
||||
}
|
||||
|
||||
istouchingtrigger( var_0 )
|
||||
{
|
||||
return isalive( self ) && self istouching( var_0 );
|
||||
}
|
||||
|
||||
elevatordoorsautoclose()
|
||||
{
|
||||
self endon( "elevator_doors_closed" );
|
||||
self endon( "elevator_stop_autoclose" );
|
||||
wait( self.autoclosetimeout );
|
||||
closeelevatordoors( self.curfloor );
|
||||
}
|
||||
|
||||
handleunreslovedcollision( var_0 )
|
||||
{
|
||||
if ( !isplayer( var_0 ) )
|
||||
var_0 dodamage( 1000, var_0.origin, self, self, "MOD_CRUSH" );
|
||||
}
|
||||
|
||||
elevatorclearpath( var_0 )
|
||||
{
|
||||
var_1 = self.pathblockers[var_0];
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_1 connectpaths();
|
||||
var_1 hide();
|
||||
var_1 notsolid();
|
||||
}
|
||||
}
|
||||
|
||||
elevatorblockpath( var_0 )
|
||||
{
|
||||
var_1 = self.pathblockers[var_0];
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_1 show();
|
||||
var_1 solid();
|
||||
var_1 disconnectpaths();
|
||||
}
|
||||
}
|
373
maps/mp/_elevator_v2.gsc
Normal file
373
maps/mp/_elevator_v2.gsc
Normal file
@ -0,0 +1,373 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init_elevator( var_0 )
|
||||
{
|
||||
var_1 = getent( var_0.name, "targetname" );
|
||||
var_1.unresolved_collision_func = ::handleunreslovedcollision;
|
||||
var_1.doors = [];
|
||||
|
||||
if ( isdefined( var_0.doors ) )
|
||||
{
|
||||
foreach ( var_8, var_3 in var_0.doors )
|
||||
{
|
||||
var_4 = [];
|
||||
|
||||
foreach ( var_6 in var_3 )
|
||||
{
|
||||
var_4[var_4.size] = setupdoor( var_6 + "left", 0, var_0.doormovedist );
|
||||
var_4[var_4.size] = setupdoor( var_6 + "right", 1, var_0.doormovedist );
|
||||
}
|
||||
|
||||
var_1.doors[var_8] = var_4;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0.dooropentime ) )
|
||||
var_1.dooropentime = var_0.dooropentime;
|
||||
else
|
||||
var_1.dooropentime = 2;
|
||||
|
||||
var_1.doorspeed = var_0.doormovedist / var_1.dooropentime;
|
||||
|
||||
if ( isdefined( var_0.autoclosetimeout ) )
|
||||
var_1.autoclosetimeout = var_0.autoclosetimeout;
|
||||
else
|
||||
var_1.autoclosetimeout = 10;
|
||||
|
||||
var_1.trigblock = getent( var_0.trigblockname, "targetname" );
|
||||
|
||||
if ( isdefined( var_0.autoclosetimeout ) )
|
||||
var_1.autoclosetimeout = var_0.autoclosetimeout;
|
||||
else
|
||||
var_1.autoclosetimeout = 10;
|
||||
|
||||
var_1.dooropensfx = var_0.dooropensfx;
|
||||
var_1.doorclosesfx = var_0.doorclosesfx;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0.movetime ) )
|
||||
var_1.movetime = var_0.movetime;
|
||||
else
|
||||
var_1.movetime = 5;
|
||||
|
||||
var_1.destinations = [];
|
||||
var_1.pathblockers = [];
|
||||
var_1.buttons = getentarray( var_0.buttons, "targetname" );
|
||||
|
||||
foreach ( var_10 in var_1.buttons )
|
||||
var_10 setupbutton( var_1 );
|
||||
|
||||
var_12 = common_scripts\utility::getstructarray( var_0.destinations, "targetname" );
|
||||
|
||||
foreach ( var_14 in var_12 )
|
||||
var_1 setupdestination( var_14 );
|
||||
|
||||
var_1.destinationnames = var_0.destinationnames;
|
||||
var_1.curfloor = var_0.destinationnames[0];
|
||||
var_1.requestedfloor = var_1.curfloor;
|
||||
var_1.doorstate = 0;
|
||||
|
||||
if ( isdefined( var_0.models ) )
|
||||
{
|
||||
var_16 = getentarray( var_0.models, "targetname" );
|
||||
|
||||
if ( isdefined( var_16 ) )
|
||||
{
|
||||
foreach ( var_18 in var_16 )
|
||||
var_18 linkto( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
var_1 thread elevatorthink();
|
||||
|
||||
if ( var_1.doors.size > 0 )
|
||||
var_1 thread openelevatordoors( var_1.curfloor, 0 );
|
||||
|
||||
var_1.startsfx = var_0.startsfx;
|
||||
var_1.stopsfx = var_0.stopsfx;
|
||||
var_1.loopsfx = var_0.loopsfx;
|
||||
var_1.beepsfx = var_0.beepsfx;
|
||||
var_1.onmovecallback = var_0.onmovecallback;
|
||||
var_1.onarrivedcallback = var_0.onarrivedcallback;
|
||||
return var_1;
|
||||
}
|
||||
|
||||
setupdoor( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = getent( var_0, "targetname" );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_3.closepos = var_3.origin;
|
||||
|
||||
if ( isdefined( var_3.target ) )
|
||||
{
|
||||
var_4 = common_scripts\utility::getstruct( var_3.target, "targetname" );
|
||||
var_3.openpos = var_4.origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_5 = anglestoforward( var_3.angles ) * var_2;
|
||||
var_3.openpos = var_3.origin + var_5;
|
||||
}
|
||||
|
||||
return var_3;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
setupbutton( var_0 )
|
||||
{
|
||||
self.owner = var_0;
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
var_1 = common_scripts\utility::getstruct( self.target, "targetname" );
|
||||
setupdestination( var_1 );
|
||||
}
|
||||
|
||||
enablebutton();
|
||||
}
|
||||
|
||||
setupdestination( var_0 )
|
||||
{
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
self.destinations[var_0.script_label] = var_0.origin;
|
||||
|
||||
if ( isdefined( var_0.target ) )
|
||||
{
|
||||
var_1 = getent( var_0.target, "targetname" );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
self.pathblockers[var_0.script_label] = var_1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enablebutton()
|
||||
{
|
||||
self sethintstring( &"MP_ELEVATOR_USE" );
|
||||
self makeusable();
|
||||
thread buttonthink();
|
||||
}
|
||||
|
||||
disablebutton()
|
||||
{
|
||||
self makeunusable();
|
||||
}
|
||||
|
||||
buttonthink()
|
||||
{
|
||||
var_0 = self.owner;
|
||||
var_0 endon( "elevator_busy" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "trigger" );
|
||||
|
||||
if ( !isdefined( self.script_label ) || self.script_label == "elevator" )
|
||||
{
|
||||
if ( var_0.curfloor == var_0.destinationnames[0] )
|
||||
var_0.requestedfloor = var_0.destinationnames[1];
|
||||
else
|
||||
var_0.requestedfloor = var_0.destinationnames[0];
|
||||
}
|
||||
else
|
||||
var_0.requestedfloor = self.script_label;
|
||||
|
||||
var_0 notify( "elevator_called" );
|
||||
}
|
||||
}
|
||||
|
||||
elevatorthink()
|
||||
{
|
||||
var_0 = self.doors.size > 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "elevator_called" );
|
||||
|
||||
foreach ( var_2 in self.buttons )
|
||||
var_2 disablebutton();
|
||||
|
||||
if ( self.curfloor != self.requestedfloor )
|
||||
{
|
||||
if ( self.doorstate != 0 )
|
||||
{
|
||||
self notify( "elevator_stop_autoclose" );
|
||||
thread closeelevatordoors( self.curfloor );
|
||||
self waittill( "elevator_doors_closed" );
|
||||
}
|
||||
else if ( !var_0 )
|
||||
elevatorblockpath( self.curfloor );
|
||||
|
||||
elevatormovetofloor( self.requestedfloor );
|
||||
wait 0.25;
|
||||
}
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
thread openelevatordoors( self.curfloor, 0 );
|
||||
self waittill( "elevator_doors_open" );
|
||||
}
|
||||
else
|
||||
elevatorclearpath( self.curfloor );
|
||||
|
||||
foreach ( var_2 in self.buttons )
|
||||
var_2 enablebutton();
|
||||
}
|
||||
}
|
||||
|
||||
elevatormovetofloor( var_0 )
|
||||
{
|
||||
var_1 = self.destinations[var_0];
|
||||
var_2 = var_1[2] - self.origin[2];
|
||||
|
||||
if ( isdefined( self.doors["elevator"] ) )
|
||||
{
|
||||
foreach ( var_4 in self.doors["elevator"] )
|
||||
var_4 movez( var_2, self.movetime );
|
||||
}
|
||||
|
||||
self movez( var_2, self.movetime );
|
||||
|
||||
if ( isdefined( self.onmovecallback ) )
|
||||
self thread [[ self.onmovecallback ]]( var_0 );
|
||||
|
||||
wait( self.movetime );
|
||||
|
||||
if ( isdefined( self.beepsfx ) )
|
||||
self playsound( self.beepsfx );
|
||||
|
||||
self.curfloor = self.requestedfloor;
|
||||
|
||||
if ( isdefined( self.onarrivedcallback ) )
|
||||
self thread [[ self.onarrivedcallback ]]( self.curfloor );
|
||||
}
|
||||
|
||||
openelevatordoors( var_0, var_1 )
|
||||
{
|
||||
var_2 = self.doors[var_0];
|
||||
self.doorstate = 1;
|
||||
var_3 = var_2[0];
|
||||
var_4 = ( var_3.openpos[0], var_3.openpos[1], var_3.origin[2] );
|
||||
var_5 = var_4 - var_3.origin;
|
||||
var_6 = length( var_5 );
|
||||
var_7 = var_6 / self.doorspeed;
|
||||
var_8 = 0.25;
|
||||
|
||||
if ( var_7 == 0.0 )
|
||||
{
|
||||
var_7 = 0.05;
|
||||
var_8 = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self playsound( self.dooropensfx );
|
||||
var_8 = min( var_8, var_7 );
|
||||
}
|
||||
|
||||
foreach ( var_3 in var_2 )
|
||||
var_3 moveto( ( var_3.openpos[0], var_3.openpos[1], var_3.origin[2] ), var_7, 0.0, var_8 );
|
||||
|
||||
wait( var_7 );
|
||||
self.doorstate = 2;
|
||||
self notify( "elevator_doors_open" );
|
||||
elevatorclearpath( var_0 );
|
||||
|
||||
if ( var_1 )
|
||||
thread elevatordoorsautoclose();
|
||||
}
|
||||
|
||||
closeelevatordoors( var_0 )
|
||||
{
|
||||
self endon( "elevator_close_interrupted" );
|
||||
thread watchcloseinterrupted( var_0 );
|
||||
var_1 = self.doors[var_0];
|
||||
self.doorstate = 3;
|
||||
var_2 = var_1[0];
|
||||
var_3 = ( var_2.closepos[0], var_2.closepos[1], var_2.origin[2] );
|
||||
var_4 = var_3 - var_2.origin;
|
||||
var_5 = length( var_4 );
|
||||
|
||||
if ( var_5 != 0.0 )
|
||||
{
|
||||
var_6 = var_5 / self.doorspeed;
|
||||
|
||||
foreach ( var_2 in var_1 )
|
||||
var_2 moveto( ( var_2.closepos[0], var_2.closepos[1], var_2.origin[2] ), var_6, 0.0, 0.25 );
|
||||
|
||||
self playsound( self.doorclosesfx );
|
||||
wait( var_6 );
|
||||
}
|
||||
|
||||
self.doorstate = 0;
|
||||
elevatorblockpath( var_0 );
|
||||
self notify( "elevator_doors_closed" );
|
||||
}
|
||||
|
||||
watchcloseinterrupted( var_0 )
|
||||
{
|
||||
self endon( "elevator_doors_closed" );
|
||||
var_1 = 1;
|
||||
|
||||
foreach ( var_3 in level.characters )
|
||||
{
|
||||
if ( var_3 istouchingtrigger( self.trigblock ) )
|
||||
{
|
||||
var_1 = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_1 )
|
||||
self.trigblock waittill( "trigger" );
|
||||
|
||||
self notify( "elevator_close_interrupted" );
|
||||
openelevatordoors( var_0, 1 );
|
||||
}
|
||||
|
||||
istouchingtrigger( var_0 )
|
||||
{
|
||||
return isalive( self ) && self istouching( var_0 );
|
||||
}
|
||||
|
||||
elevatordoorsautoclose()
|
||||
{
|
||||
self endon( "elevator_doors_closed" );
|
||||
self endon( "elevator_stop_autoclose" );
|
||||
wait( self.autoclosetimeout );
|
||||
closeelevatordoors( self.curfloor );
|
||||
}
|
||||
|
||||
handleunreslovedcollision( var_0 )
|
||||
{
|
||||
if ( !isplayer( var_0 ) )
|
||||
var_0 dodamage( 1000, var_0.origin, self, self, "MOD_CRUSH" );
|
||||
}
|
||||
|
||||
elevatorclearpath( var_0 )
|
||||
{
|
||||
var_1 = self.pathblockers[var_0];
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_1 connectpaths();
|
||||
var_1 hide();
|
||||
var_1 notsolid();
|
||||
}
|
||||
}
|
||||
|
||||
elevatorblockpath( var_0 )
|
||||
{
|
||||
var_1 = self.pathblockers[var_0];
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_1 show();
|
||||
var_1 solid();
|
||||
var_1 disconnectpaths();
|
||||
}
|
||||
}
|
134
maps/mp/_empgrenade.gsc
Normal file
134
maps/mp/_empgrenade.gsc
Normal file
@ -0,0 +1,134 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
var_0 thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
thread monitorempgrenade();
|
||||
}
|
||||
}
|
||||
|
||||
monitorempgrenade()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "faux_spawn" );
|
||||
self.empendtime = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "emp_damage", var_0, var_1 );
|
||||
|
||||
if ( !isalive( self ) || isdefined( self.usingremote ) || maps\mp\_utility::_hasperk( "specialty_empimmune" ) || !isdefined( var_0 ) )
|
||||
continue;
|
||||
|
||||
var_2 = 1;
|
||||
var_3 = 0;
|
||||
|
||||
if ( level.teambased && var_0 != self && isdefined( var_0.pers["team"] ) && var_0.pers["team"] == self.pers["team"] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
continue;
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
var_3 = 0;
|
||||
var_2 = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
var_2 = 0;
|
||||
var_3 = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
var_3 = 1;
|
||||
var_2 = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var_0 notify( "emp_hit" );
|
||||
|
||||
if ( var_0 != self )
|
||||
var_0 maps\mp\gametypes\_missions::processchallenge( "ch_onthepulse" );
|
||||
}
|
||||
|
||||
if ( var_2 && isdefined( self ) )
|
||||
thread applyemp( var_1 );
|
||||
|
||||
if ( var_3 )
|
||||
var_0 thread applyemp( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
applyemp( var_0 )
|
||||
{
|
||||
self notify( "applyEmp" );
|
||||
self endon( "applyEmp" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
wait 0.05;
|
||||
self.empgrenaded = 1;
|
||||
self shellshock( "flashbang_mp", 1 );
|
||||
self.empendtime = gettime() + var_0 * 1000;
|
||||
maps\mp\killstreaks\_emp_common::applyperplayerempeffects_ondetonate();
|
||||
maps\mp\killstreaks\_emp_common::applyperplayerempeffects();
|
||||
thread emprumbleloop( 0.75 );
|
||||
thread empgrenadedeathwaiter();
|
||||
wait( var_0 );
|
||||
self notify( "empGrenadeTimedOut" );
|
||||
checktoturnoffemp();
|
||||
}
|
||||
|
||||
empgrenadedeathwaiter()
|
||||
{
|
||||
self notify( "empGrenadeDeathWaiter" );
|
||||
self endon( "empGrenadeDeathWaiter" );
|
||||
self endon( "empGrenadeTimedOut" );
|
||||
self waittill( "death" );
|
||||
checktoturnoffemp();
|
||||
}
|
||||
|
||||
checktoturnoffemp()
|
||||
{
|
||||
self.empgrenaded = 0;
|
||||
|
||||
if ( !maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
|
||||
maps\mp\killstreaks\_emp_common::removeperplayerempeffects();
|
||||
}
|
||||
|
||||
emprumbleloop( var_0 )
|
||||
{
|
||||
self endon( "emp_rumble_loop" );
|
||||
self notify( "emp_rumble_loop" );
|
||||
var_1 = gettime() + var_0 * 1000;
|
||||
|
||||
while ( gettime() < var_1 )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
isempgrenaded()
|
||||
{
|
||||
return isdefined( self.empendtime ) && gettime() < self.empendtime;
|
||||
}
|
306
maps/mp/_entityheadicons.gsc
Normal file
306
maps/mp/_entityheadicons.gsc
Normal file
@ -0,0 +1,306 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
if ( isdefined( level.initedentityheadicons ) )
|
||||
return;
|
||||
|
||||
level.initedentityheadicons = 1;
|
||||
|
||||
if ( level.multiteambased )
|
||||
{
|
||||
foreach ( var_1 in level.teamnamelist )
|
||||
{
|
||||
var_2 = "entity_headicon_" + var_1;
|
||||
game[var_2] = maps\mp\gametypes\_teams::mt_getteamheadicon( var_1 );
|
||||
precacheshader( game[var_2] );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
game["entity_headicon_allies"] = maps\mp\gametypes\_teams::getteamheadicon( "allies" );
|
||||
game["entity_headicon_axis"] = maps\mp\gametypes\_teams::getteamheadicon( "axis" );
|
||||
precacheshader( game["entity_headicon_allies"] );
|
||||
precacheshader( game["entity_headicon_axis"] );
|
||||
}
|
||||
}
|
||||
|
||||
setheadicon( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 )
|
||||
{
|
||||
if ( maps\mp\_utility::isgameparticipant( var_0 ) && !isplayer( var_0 ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.entityheadicons ) )
|
||||
self.entityheadicons = [];
|
||||
|
||||
if ( !isdefined( var_5 ) )
|
||||
var_5 = 1;
|
||||
|
||||
if ( !isdefined( var_6 ) )
|
||||
var_6 = 0.05;
|
||||
|
||||
if ( !isdefined( var_7 ) )
|
||||
var_7 = 1;
|
||||
|
||||
if ( !isdefined( var_8 ) )
|
||||
var_8 = 1;
|
||||
|
||||
if ( !isdefined( var_9 ) )
|
||||
var_9 = 0;
|
||||
|
||||
if ( !isdefined( var_10 ) )
|
||||
var_10 = 1;
|
||||
|
||||
if ( !isplayer( var_0 ) && var_0 == "none" )
|
||||
{
|
||||
foreach ( var_13, var_12 in self.entityheadicons )
|
||||
{
|
||||
if ( isdefined( var_12 ) )
|
||||
var_12 destroy();
|
||||
|
||||
self.entityheadicons[var_13] = undefined;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isplayer( var_0 ) )
|
||||
{
|
||||
if ( isdefined( self.entityheadicons[var_0.guid] ) )
|
||||
{
|
||||
self.entityheadicons[var_0.guid] destroy();
|
||||
self.entityheadicons[var_0.guid] = undefined;
|
||||
}
|
||||
|
||||
if ( var_1 == "" )
|
||||
return;
|
||||
|
||||
if ( isdefined( var_0.team ) )
|
||||
{
|
||||
if ( isdefined( self.entityheadicons[var_0.team] ) )
|
||||
{
|
||||
self.entityheadicons[var_0.team] destroy();
|
||||
self.entityheadicons[var_0.team] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
var_12 = newclienthudelem( var_0 );
|
||||
self.entityheadicons[var_0.guid] = var_12;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isdefined( self.entityheadicons[var_0] ) )
|
||||
{
|
||||
self.entityheadicons[var_0] destroy();
|
||||
self.entityheadicons[var_0] = undefined;
|
||||
}
|
||||
|
||||
if ( var_1 == "" )
|
||||
return;
|
||||
|
||||
foreach ( var_13, var_15 in self.entityheadicons )
|
||||
{
|
||||
if ( var_13 == "axis" || var_13 == "allies" )
|
||||
continue;
|
||||
|
||||
var_16 = maps\mp\_utility::getplayerforguid( var_13 );
|
||||
|
||||
if ( var_16.team == var_0 )
|
||||
{
|
||||
self.entityheadicons[var_13] destroy();
|
||||
self.entityheadicons[var_13] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
var_12 = newteamhudelem( var_0 );
|
||||
self.entityheadicons[var_0] = var_12;
|
||||
}
|
||||
|
||||
if ( !isdefined( var_3 ) || !isdefined( var_4 ) )
|
||||
{
|
||||
var_3 = 10;
|
||||
var_4 = 10;
|
||||
}
|
||||
|
||||
var_12.archived = var_5;
|
||||
var_12.x = self.origin[0] + var_2[0];
|
||||
var_12.y = self.origin[1] + var_2[1];
|
||||
var_12.z = self.origin[2] + var_2[2];
|
||||
var_12.alpha = 0.85;
|
||||
var_12 setshader( var_1, var_3, var_4 );
|
||||
var_12 setwaypoint( var_7, var_8, var_9, var_10 );
|
||||
var_12 thread keeppositioned( self, var_2, var_6 );
|
||||
thread destroyiconsondeath();
|
||||
|
||||
if ( isplayer( var_0 ) )
|
||||
var_12 thread destroyonownerdisconnect( var_0 );
|
||||
|
||||
if ( isplayer( self ) )
|
||||
var_12 thread destroyonownerdisconnect( self );
|
||||
}
|
||||
}
|
||||
|
||||
destroyonownerdisconnect( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 waittill( "disconnect" );
|
||||
self destroy();
|
||||
}
|
||||
|
||||
destroyiconsondeath()
|
||||
{
|
||||
self notify( "destroyIconsOnDeath" );
|
||||
self endon( "destroyIconsOnDeath" );
|
||||
self waittill( "death" );
|
||||
|
||||
if ( !isdefined( self.entityheadicons ) )
|
||||
return;
|
||||
|
||||
foreach ( var_2, var_1 in self.entityheadicons )
|
||||
{
|
||||
if ( !isdefined( var_1 ) )
|
||||
continue;
|
||||
|
||||
var_1 destroy();
|
||||
}
|
||||
}
|
||||
|
||||
keeppositioned( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 endon( "death" );
|
||||
var_0 endon( "disconnect" );
|
||||
var_3 = isdefined( var_0.classname ) && !isownercarepakage( var_0 );
|
||||
|
||||
if ( var_3 )
|
||||
self linkwaypointtotargetwithoffset( var_0, var_1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
return;
|
||||
|
||||
if ( !var_3 )
|
||||
{
|
||||
var_4 = var_0.origin;
|
||||
self.x = var_4[0] + var_1[0];
|
||||
self.y = var_4[1] + var_1[1];
|
||||
self.z = var_4[2] + var_1[2];
|
||||
}
|
||||
|
||||
if ( var_2 > 0.05 )
|
||||
{
|
||||
self.alpha = 0.85;
|
||||
self fadeovertime( var_2 );
|
||||
self.alpha = 0;
|
||||
}
|
||||
|
||||
wait( var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
isownercarepakage( var_0 )
|
||||
{
|
||||
return isdefined( var_0.targetname ) && var_0.targetname == "care_package";
|
||||
}
|
||||
|
||||
setteamheadicon( var_0, var_1 )
|
||||
{
|
||||
if ( !level.teambased )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.entityheadiconteam ) )
|
||||
{
|
||||
self.entityheadiconteam = "none";
|
||||
self.entityheadicon = undefined;
|
||||
}
|
||||
|
||||
var_2 = game["entity_headicon_" + var_0];
|
||||
self.entityheadiconteam = var_0;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
self.entityheadiconoffset = var_1;
|
||||
else
|
||||
self.entityheadiconoffset = ( 0, 0, 0 );
|
||||
|
||||
self notify( "kill_entity_headicon_thread" );
|
||||
|
||||
if ( var_0 == "none" )
|
||||
{
|
||||
if ( isdefined( self.entityheadicon ) )
|
||||
self.entityheadicon destroy();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var_3 = newteamhudelem( var_0 );
|
||||
var_3.archived = 1;
|
||||
var_3.x = self.origin[0] + self.entityheadiconoffset[0];
|
||||
var_3.y = self.origin[1] + self.entityheadiconoffset[1];
|
||||
var_3.z = self.origin[2] + self.entityheadiconoffset[2];
|
||||
var_3.alpha = 0.8;
|
||||
var_3 setshader( var_2, 10, 10 );
|
||||
var_3 setwaypoint( 0, 0, 0, 1 );
|
||||
self.entityheadicon = var_3;
|
||||
thread keepiconpositioned();
|
||||
thread destroyheadiconsondeath();
|
||||
}
|
||||
|
||||
setplayerheadicon( var_0, var_1 )
|
||||
{
|
||||
if ( level.teambased )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.entityheadiconteam ) )
|
||||
{
|
||||
self.entityheadiconteam = "none";
|
||||
self.entityheadicon = undefined;
|
||||
}
|
||||
|
||||
self notify( "kill_entity_headicon_thread" );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
if ( isdefined( self.entityheadicon ) )
|
||||
self.entityheadicon destroy();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var_2 = var_0.team;
|
||||
self.entityheadiconteam = var_2;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
self.entityheadiconoffset = var_1;
|
||||
else
|
||||
self.entityheadiconoffset = ( 0, 0, 0 );
|
||||
|
||||
var_3 = game["entity_headicon_" + var_2];
|
||||
var_4 = newclienthudelem( var_0 );
|
||||
var_4.archived = 1;
|
||||
var_4.x = self.origin[0] + self.entityheadiconoffset[0];
|
||||
var_4.y = self.origin[1] + self.entityheadiconoffset[1];
|
||||
var_4.z = self.origin[2] + self.entityheadiconoffset[2];
|
||||
var_4.alpha = 0.8;
|
||||
var_4 setshader( var_3, 10, 10 );
|
||||
var_4 setwaypoint( 0, 0, 0, 1 );
|
||||
self.entityheadicon = var_4;
|
||||
thread keepiconpositioned();
|
||||
thread destroyheadiconsondeath();
|
||||
}
|
||||
|
||||
keepiconpositioned()
|
||||
{
|
||||
self.entityheadicon linkwaypointtotargetwithoffset( self, self.entityheadiconoffset );
|
||||
}
|
||||
|
||||
destroyheadiconsondeath()
|
||||
{
|
||||
self endon( "kill_entity_headicon_thread" );
|
||||
self waittill( "death" );
|
||||
|
||||
if ( !isdefined( self.entityheadicon ) )
|
||||
return;
|
||||
|
||||
self.entityheadicon destroy();
|
||||
}
|
850
maps/mp/_events.gsc
Normal file
850
maps/mp/_events.gsc
Normal file
@ -0,0 +1,850 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
var_0 = [];
|
||||
var_0["dm"] = 3;
|
||||
var_0["war"] = 4;
|
||||
var_0["sd"] = 5;
|
||||
var_0["dom"] = 6;
|
||||
var_0["conf"] = 7;
|
||||
var_0["sr"] = 8;
|
||||
var_0["bnty"] = 9;
|
||||
var_0["grind"] = 10;
|
||||
var_0["blitz"] = 11;
|
||||
var_0["cranked"] = 12;
|
||||
var_0["infect"] = 13;
|
||||
var_0["sotf"] = 14;
|
||||
var_0["sotf_ffa"] = 15;
|
||||
var_0["horde"] = 16;
|
||||
var_0["mugger"] = 17;
|
||||
var_0["aliens"] = 18;
|
||||
var_0["gun"] = 19;
|
||||
var_0["grnd"] = 20;
|
||||
var_0["siege"] = 21;
|
||||
var_1 = level.gametype;
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = getdvar( "g_gametype" );
|
||||
|
||||
var_2 = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_3 = tablelookupbyrow( "mp/xp_event_table.csv", var_2, var_0[var_1] );
|
||||
|
||||
if ( !isdefined( var_3 ) || var_3 == "" )
|
||||
break;
|
||||
|
||||
var_4 = tablelookupbyrow( "mp/xp_event_table.csv", var_2, 0 );
|
||||
|
||||
if ( var_4 == "win" || var_4 == "loss" || var_4 == "tie" )
|
||||
var_3 = float( var_3 );
|
||||
else
|
||||
var_3 = int( var_3 );
|
||||
|
||||
if ( var_3 != -1 )
|
||||
maps\mp\gametypes\_rank::registerscoreinfo( var_4, var_3 );
|
||||
|
||||
var_2++;
|
||||
}
|
||||
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "damage", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "heavy_damage", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "damaged", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "kill", 1 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "killed", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "healed", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "headshot", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "melee", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "backstab", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "longshot", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "pointblank", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "assistedsuicide", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "defender", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "avenger", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "execution", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "comeback", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "revenge", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "buzzkill", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "double", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "triple", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "multi", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "assist", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "firstBlood", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "capture", 1 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "assistedCapture", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "plant", 1 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "defuse", 1 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "vehicleDestroyed", 1 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "3streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "4streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "5streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "6streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "7streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "8streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "9streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "10streak", 0 );
|
||||
maps\mp\killstreaks\_killstreaks::registeradrenalineinfo( "regen", 0 );
|
||||
precacheshader( "crosshair_red" );
|
||||
level._effect["money"] = loadfx( "fx/props/cash_player_drop" );
|
||||
level.numkills = 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
var_0.killedplayers = [];
|
||||
var_0.killedplayerscurrent = [];
|
||||
var_0.ch_extremecrueltycomplete = 0;
|
||||
var_0.ch_tangodowncomplete = 0;
|
||||
var_0.killedby = [];
|
||||
var_0.lastkilledby = undefined;
|
||||
var_0.greatestuniqueplayerkills = 0;
|
||||
var_0.recentkillcount = 0;
|
||||
var_0.lastkilltime = 0;
|
||||
var_0.lastkilldogtime = 0;
|
||||
var_0.damagedplayers = [];
|
||||
var_0 thread monitorcratejacking();
|
||||
var_0 thread monitorobjectives();
|
||||
var_0 thread monitorhealed();
|
||||
}
|
||||
}
|
||||
|
||||
damagedplayer( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( var_1 < 50 && var_1 > 10 )
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "damage" );
|
||||
else
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "heavy_damage" );
|
||||
}
|
||||
|
||||
killedplayernotifysys( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self notify( "killedPlayerNotify" );
|
||||
self endon( "killedPlayerNotify" );
|
||||
|
||||
if ( !isdefined( self.killsinaframecount ) )
|
||||
self.killsinaframecount = 0;
|
||||
|
||||
self.killsinaframecount++;
|
||||
wait 0.05;
|
||||
|
||||
if ( self.killsinaframecount > 1 )
|
||||
thread notifykilledplayer( var_0, var_1, var_2, var_3, self.killsinaframecount );
|
||||
else
|
||||
self notify( "got_a_kill", var_1, var_2, var_3 );
|
||||
|
||||
self.killsinaframecount = 0;
|
||||
}
|
||||
|
||||
notifykilledplayer( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
for ( var_5 = 0; var_5 < var_4; var_5++ )
|
||||
{
|
||||
self notify( "got_a_kill", var_1, var_2, var_3 );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
killedplayer( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = var_1.guid;
|
||||
var_5 = self.guid;
|
||||
var_6 = gettime();
|
||||
thread killedplayernotifysys( var_0, var_1, var_2, var_3 );
|
||||
thread updaterecentkills( var_0 );
|
||||
self.lastkilltime = gettime();
|
||||
self.lastkilledplayer = var_1;
|
||||
self.modifiers = [];
|
||||
level.numkills++;
|
||||
self.damagedplayers[var_4] = undefined;
|
||||
|
||||
if ( !maps\mp\_utility::iskillstreakweapon( var_2 ) && !maps\mp\_utility::isjuggernaut() && !maps\mp\_utility::_hasperk( "specialty_explosivebullets" ) )
|
||||
{
|
||||
if ( var_2 == "none" )
|
||||
return 0;
|
||||
|
||||
if ( var_1.attackers.size == 1 && !isdefined( var_1.attackers[var_1.guid] ) )
|
||||
{
|
||||
var_11 = maps\mp\_utility::getweaponclass( var_2 );
|
||||
|
||||
if ( var_11 == "weapon_sniper" && var_3 != "MOD_MELEE" && gettime() == var_1.attackerdata[self.guid].firsttimedamaged )
|
||||
{
|
||||
self.modifiers["oneshotkill"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "one_shot_kill" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.throwinggrenade ) && var_1.throwinggrenade == "frag_grenade_mp" )
|
||||
self.modifiers["cooking"] = 1;
|
||||
|
||||
if ( isdefined( self.assistedsuicide ) && self.assistedsuicide )
|
||||
assistedsuicide( var_0, var_2, var_3 );
|
||||
|
||||
if ( level.numkills == 1 )
|
||||
firstblood( var_0, var_2, var_3 );
|
||||
|
||||
if ( self.pers["cur_death_streak"] > 3 )
|
||||
comeback( var_0, var_2, var_3 );
|
||||
|
||||
if ( var_3 == "MOD_HEAD_SHOT" )
|
||||
{
|
||||
if ( isdefined( var_1.laststand ) )
|
||||
execution( var_0, var_2, var_3 );
|
||||
else
|
||||
headshot( var_0, var_2, var_3 );
|
||||
}
|
||||
|
||||
if ( isdefined( self.wasti ) && self.wasti && gettime() - self.spawntime <= 5000 )
|
||||
self.modifiers["jackintheboxkill"] = 1;
|
||||
|
||||
if ( !isalive( self ) && self.deathtime + 800 < gettime() )
|
||||
postdeathkill( var_0 );
|
||||
|
||||
if ( level.teambased && var_6 - var_1.lastkilltime < 500 )
|
||||
{
|
||||
if ( var_1.lastkilledplayer != self )
|
||||
avengedplayer( var_0, var_2, var_3 );
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.lastkilldogtime ) && var_6 - var_1.lastkilldogtime < 2000 )
|
||||
avengeddog( var_0, var_2, var_3 );
|
||||
|
||||
foreach ( var_14, var_13 in var_1.damagedplayers )
|
||||
{
|
||||
if ( var_14 == self.guid )
|
||||
continue;
|
||||
|
||||
if ( level.teambased && var_6 - var_13 < 500 )
|
||||
defendedplayer( var_0, var_2, var_3 );
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.attackerposition ) )
|
||||
var_15 = var_1.attackerposition;
|
||||
else
|
||||
var_15 = self.origin;
|
||||
|
||||
if ( ispointblank( self, var_2, var_3, var_15, var_1 ) )
|
||||
thread pointblank( var_0, var_2, var_3 );
|
||||
else if ( islongshot( self, var_2, var_3, var_15, var_1 ) )
|
||||
thread longshot( var_0, var_2, var_3 );
|
||||
|
||||
var_16 = var_1.pers["cur_kill_streak"];
|
||||
|
||||
if ( var_16 > 0 && isdefined( var_1.killstreaks[var_16 + 1] ) )
|
||||
buzzkill( var_0, var_1, var_2, var_3 );
|
||||
|
||||
thread checkmatchdatakills( var_0, var_1, var_2, var_3 );
|
||||
}
|
||||
else if ( var_2 == "guard_dog_mp" )
|
||||
{
|
||||
if ( !isalive( self ) && self.deathtime < gettime() )
|
||||
postdeathdogkill();
|
||||
}
|
||||
|
||||
if ( !isdefined( self.killedplayers[var_4] ) )
|
||||
self.killedplayers[var_4] = 0;
|
||||
|
||||
if ( !isdefined( self.killedplayerscurrent[var_4] ) )
|
||||
self.killedplayerscurrent[var_4] = 0;
|
||||
|
||||
if ( !isdefined( var_1.killedby[var_5] ) )
|
||||
var_1.killedby[var_5] = 0;
|
||||
|
||||
self.killedplayers[var_4]++;
|
||||
|
||||
if ( self.killedplayers[var_4] > self.greatestuniqueplayerkills )
|
||||
maps\mp\_utility::setplayerstat( "killedsameplayer", self.killedplayers[var_4] );
|
||||
|
||||
self.killedplayerscurrent[var_4]++;
|
||||
var_1.killedby[var_5]++;
|
||||
var_1.lastkilledby = self;
|
||||
}
|
||||
|
||||
islongshot( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
if ( isalive( var_0 ) && !var_0 maps\mp\_utility::isusingremote() && ( var_2 == "MOD_RIFLE_BULLET" || var_2 == "MOD_PISTOL_BULLET" || var_2 == "MOD_HEAD_SHOT" ) && !maps\mp\_utility::iskillstreakweapon( var_1 ) && !isdefined( var_0.assistedsuicide ) )
|
||||
{
|
||||
var_5 = maps\mp\_utility::getweaponclass( var_1 );
|
||||
|
||||
switch ( var_5 )
|
||||
{
|
||||
case "weapon_pistol":
|
||||
var_6 = 800;
|
||||
break;
|
||||
case "weapon_smg":
|
||||
var_6 = 1200;
|
||||
break;
|
||||
case "weapon_lmg":
|
||||
case "weapon_dmr":
|
||||
case "weapon_assault":
|
||||
var_6 = 1500;
|
||||
break;
|
||||
case "weapon_sniper":
|
||||
var_6 = 2000;
|
||||
break;
|
||||
case "weapon_shotgun":
|
||||
var_6 = 500;
|
||||
break;
|
||||
case "weapon_projectile":
|
||||
default:
|
||||
var_6 = 1536;
|
||||
break;
|
||||
}
|
||||
|
||||
var_7 = var_6 * var_6;
|
||||
|
||||
if ( distancesquared( var_3, var_4.origin ) > var_7 )
|
||||
{
|
||||
if ( var_0 isitemunlocked( "specialty_holdbreath" ) && var_0 maps\mp\_utility::_hasperk( "specialty_holdbreath" ) )
|
||||
var_0 maps\mp\gametypes\_missions::processchallenge( "ch_longdistance" );
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ispointblank( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
if ( isalive( var_0 ) && !var_0 maps\mp\_utility::isusingremote() && ( var_2 == "MOD_RIFLE_BULLET" || var_2 == "MOD_PISTOL_BULLET" || var_2 == "MOD_HEAD_SHOT" ) && !maps\mp\_utility::iskillstreakweapon( var_1 ) && !isdefined( var_0.assistedsuicide ) )
|
||||
{
|
||||
var_5 = 9216;
|
||||
|
||||
if ( distancesquared( var_3, var_4.origin ) < var_5 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
checkmatchdatakills( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = maps\mp\_utility::getweaponclass( var_2 );
|
||||
var_5 = 0;
|
||||
thread campercheck();
|
||||
|
||||
if ( isdefined( self.lastkilledby ) && self.lastkilledby == var_1 )
|
||||
{
|
||||
self.lastkilledby = undefined;
|
||||
revenge( var_0 );
|
||||
}
|
||||
|
||||
if ( var_1.idflags & level.idflags_penetration )
|
||||
maps\mp\_utility::incplayerstat( "bulletpenkills", 1 );
|
||||
|
||||
var_6 = self.pers["rank"];
|
||||
var_7 = var_1.pers["rank"];
|
||||
|
||||
if ( var_6 < var_7 )
|
||||
maps\mp\_utility::incplayerstat( "higherrankkills", 1 );
|
||||
|
||||
if ( var_6 > var_7 )
|
||||
maps\mp\_utility::incplayerstat( "lowerrankkills", 1 );
|
||||
|
||||
if ( isdefined( self.infinalstand ) && self.infinalstand )
|
||||
maps\mp\_utility::incplayerstat( "laststandkills", 1 );
|
||||
|
||||
if ( isdefined( var_1.infinalstand ) && var_1.infinalstand )
|
||||
maps\mp\_utility::incplayerstat( "laststanderkills", 1 );
|
||||
|
||||
if ( self getcurrentweapon() != self.primaryweapon && self getcurrentweapon() != self.secondaryweapon )
|
||||
maps\mp\_utility::incplayerstat( "otherweaponkills", 1 );
|
||||
|
||||
var_8 = gettime() - var_1.spawntime;
|
||||
|
||||
if ( !maps\mp\_utility::matchmakinggame() )
|
||||
var_1 maps\mp\_utility::setplayerstatiflower( "shortestlife", var_8 );
|
||||
|
||||
var_1 maps\mp\_utility::setplayerstatifgreater( "longestlife", var_8 );
|
||||
|
||||
if ( var_3 != "MOD_MELEE" )
|
||||
{
|
||||
switch ( var_4 )
|
||||
{
|
||||
case "weapon_pistol":
|
||||
case "weapon_projectile":
|
||||
case "weapon_shotgun":
|
||||
case "weapon_lmg":
|
||||
case "weapon_dmr":
|
||||
case "weapon_sniper":
|
||||
case "weapon_assault":
|
||||
case "weapon_smg":
|
||||
checkmatchdataweaponkills( var_1, var_2, var_3, var_4 );
|
||||
break;
|
||||
case "weapon_explosive":
|
||||
case "weapon_grenade":
|
||||
checkmatchdataequipmentkills( var_1, var_2, var_3 );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkmatchdataweaponkills( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = self;
|
||||
var_5 = undefined;
|
||||
var_6 = undefined;
|
||||
var_7 = undefined;
|
||||
|
||||
switch ( var_3 )
|
||||
{
|
||||
case "weapon_pistol":
|
||||
var_5 = "pistolkills";
|
||||
var_6 = "pistolheadshots";
|
||||
break;
|
||||
case "weapon_smg":
|
||||
var_5 = "smgkills";
|
||||
var_6 = "smgheadshots";
|
||||
break;
|
||||
case "weapon_assault":
|
||||
var_5 = "arkills";
|
||||
var_6 = "arheadshots";
|
||||
break;
|
||||
case "weapon_projectile":
|
||||
if ( weaponclass( var_1 ) == "rocketlauncher" )
|
||||
var_5 = "rocketkills";
|
||||
|
||||
break;
|
||||
case "weapon_dmr":
|
||||
var_5 = "dmrkills";
|
||||
var_6 = "dmrheadshots";
|
||||
break;
|
||||
case "weapon_sniper":
|
||||
var_5 = "sniperkills";
|
||||
var_6 = "sniperheadshots";
|
||||
break;
|
||||
case "weapon_shotgun":
|
||||
var_5 = "shotgunkills";
|
||||
var_6 = "shotgunheadshots";
|
||||
var_7 = "shotgundeaths";
|
||||
break;
|
||||
case "weapon_lmg":
|
||||
var_5 = "lmgkills";
|
||||
var_6 = "lmgheadshots";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isdefined( var_5 ) )
|
||||
var_4 maps\mp\_utility::incplayerstat( var_5, 1 );
|
||||
|
||||
if ( isdefined( var_6 ) && var_2 == "MOD_HEAD_SHOT" )
|
||||
var_4 maps\mp\_utility::incplayerstat( var_6, 1 );
|
||||
|
||||
if ( isdefined( var_7 ) && !maps\mp\_utility::matchmakinggame() )
|
||||
var_0 maps\mp\_utility::incplayerstat( var_7, 1 );
|
||||
|
||||
if ( var_4 maps\mp\_utility::isplayerads() )
|
||||
{
|
||||
var_4 maps\mp\_utility::incplayerstat( "adskills", 1 );
|
||||
var_8 = issubstr( var_1, "thermal" );
|
||||
|
||||
if ( var_8 || issubstr( var_1, "acog" ) || issubstr( var_1, "scope" ) )
|
||||
var_4 maps\mp\_utility::incplayerstat( "scopedkills", 1 );
|
||||
|
||||
if ( var_8 )
|
||||
{
|
||||
var_4 maps\mp\_utility::incplayerstat( "thermalkills", 1 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
var_4 maps\mp\_utility::incplayerstat( "hipfirekills", 1 );
|
||||
}
|
||||
|
||||
checkmatchdataequipmentkills( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = self;
|
||||
|
||||
switch ( var_1 )
|
||||
{
|
||||
case "frag_grenade_mp":
|
||||
var_3 maps\mp\_utility::incplayerstat( "fragkills", 1 );
|
||||
var_3 maps\mp\_utility::incplayerstat( "grenadekills", 1 );
|
||||
var_4 = 1;
|
||||
break;
|
||||
case "c4_mp":
|
||||
var_3 maps\mp\_utility::incplayerstat( "c4kills", 1 );
|
||||
var_4 = 1;
|
||||
break;
|
||||
case "semtex_mp":
|
||||
var_3 maps\mp\_utility::incplayerstat( "semtexkills", 1 );
|
||||
var_3 maps\mp\_utility::incplayerstat( "grenadekills", 1 );
|
||||
var_4 = 1;
|
||||
break;
|
||||
case "claymore_mp":
|
||||
var_3 maps\mp\_utility::incplayerstat( "claymorekills", 1 );
|
||||
var_4 = 1;
|
||||
break;
|
||||
case "throwingknife_mp":
|
||||
var_3 maps\mp\_utility::incplayerstat( "throwingknifekills", 1 );
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "knifethrow" );
|
||||
var_4 = 1;
|
||||
break;
|
||||
default:
|
||||
var_4 = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( var_4 )
|
||||
var_3 maps\mp\_utility::incplayerstat( "equipmentkills", 1 );
|
||||
}
|
||||
|
||||
campercheck()
|
||||
{
|
||||
self.lastkillwascamping = 0;
|
||||
|
||||
if ( !isdefined( self.lastkilllocation ) )
|
||||
{
|
||||
self.lastkilllocation = self.origin;
|
||||
self.lastcampkilltime = gettime();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( distance( self.lastkilllocation, self.origin ) < 512 && gettime() - self.lastcampkilltime > 5000 )
|
||||
{
|
||||
maps\mp\_utility::incplayerstat( "mostcamperkills", 1 );
|
||||
self.lastkillwascamping = 1;
|
||||
}
|
||||
|
||||
self.lastkilllocation = self.origin;
|
||||
self.lastcampkilltime = gettime();
|
||||
}
|
||||
|
||||
consolation( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
proximityassist( var_0 )
|
||||
{
|
||||
self.modifiers["proximityAssist"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "proximityassist" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "proximityassist" );
|
||||
}
|
||||
|
||||
proximitykill( var_0 )
|
||||
{
|
||||
self.modifiers["proximityKill"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "proximitykill" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "proximitykill" );
|
||||
}
|
||||
|
||||
longshot( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["longshot"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "longshot" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "longshot", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "longshot" );
|
||||
maps\mp\_utility::incplayerstat( "longshots", 1 );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "longshot" );
|
||||
}
|
||||
|
||||
pointblank( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["pointblank"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "pointblank" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "pointblank", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "pointblank" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "pointblank" );
|
||||
}
|
||||
|
||||
execution( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["execution"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "execution" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "execution", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "execution" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "execution" );
|
||||
}
|
||||
|
||||
headshot( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["headshot"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "headshot" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "headshot", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "headshot" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "headshot" );
|
||||
}
|
||||
|
||||
avengedplayer( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["avenger"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "avenger" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "avenger", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "avenger" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "avenger" );
|
||||
maps\mp\_utility::incplayerstat( "avengekills", 1 );
|
||||
}
|
||||
|
||||
avengeddog( var_0, var_1, var_2 )
|
||||
{
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "dog_avenger" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "dog_avenger", undefined, var_1, var_2 );
|
||||
}
|
||||
|
||||
assistedsuicide( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["assistedsuicide"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "assistedsuicide" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "assistedsuicide", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "assistedsuicide" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "assistedsuicide" );
|
||||
}
|
||||
|
||||
defendedplayer( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["defender"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "defender" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "defender", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "defender" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "defender" );
|
||||
maps\mp\_utility::incplayerstat( "rescues", 1 );
|
||||
}
|
||||
|
||||
postdeathkill( var_0 )
|
||||
{
|
||||
self.modifiers["posthumous"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "posthumous" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "posthumous" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "posthumous" );
|
||||
}
|
||||
|
||||
postdeathdogkill()
|
||||
{
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "martyrdog" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "martyrdog" );
|
||||
}
|
||||
|
||||
backstab( var_0 )
|
||||
{
|
||||
self iprintlnbold( "backstab" );
|
||||
}
|
||||
|
||||
revenge( var_0 )
|
||||
{
|
||||
self.modifiers["revenge"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "revenge" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "revenge" );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "revenge" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "revenge" );
|
||||
maps\mp\_utility::incplayerstat( "revengekills", 1 );
|
||||
}
|
||||
|
||||
multikill( var_0, var_1 )
|
||||
{
|
||||
if ( var_1 == 2 )
|
||||
{
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "double" );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "double" );
|
||||
}
|
||||
else if ( var_1 == 3 )
|
||||
{
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "triple" );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "triple" );
|
||||
thread maps\mp\_utility::teamplayercardsplash( "callout_3xkill", self );
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "multi" );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "multi" );
|
||||
thread maps\mp\_utility::teamplayercardsplash( "callout_3xpluskill", self );
|
||||
}
|
||||
|
||||
thread maps\mp\_matchdata::logmultikill( var_0, var_1 );
|
||||
maps\mp\_utility::setplayerstatifgreater( "multikill", var_1 );
|
||||
maps\mp\_utility::incplayerstat( "mostmultikills", 1 );
|
||||
}
|
||||
|
||||
firstblood( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["firstblood"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "firstblood" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "firstblood", undefined, var_1, var_2 );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "firstblood" );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "firstBlood" );
|
||||
thread maps\mp\_utility::teamplayercardsplash( "callout_firstblood", self );
|
||||
maps\mp\gametypes\_missions::processchallenge( "ch_bornready" );
|
||||
}
|
||||
|
||||
winningshot( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
buzzkill( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self.modifiers["buzzkill"] = var_1.pers["cur_kill_streak"];
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "buzzkill" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "buzzkill", undefined, var_2, var_3 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "buzzkill" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "buzzkill" );
|
||||
}
|
||||
|
||||
comeback( var_0, var_1, var_2 )
|
||||
{
|
||||
self.modifiers["comeback"] = 1;
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "comeback" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "comeback", undefined, var_1, var_2 );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "comeback" );
|
||||
thread maps\mp\_matchdata::logkillevent( var_0, "comeback" );
|
||||
maps\mp\_utility::incplayerstat( "comebacks", 1 );
|
||||
}
|
||||
|
||||
disconnected()
|
||||
{
|
||||
var_0 = self.guid;
|
||||
|
||||
for ( var_1 = 0; var_1 < level.players.size; var_1++ )
|
||||
{
|
||||
if ( isdefined( level.players[var_1].killedplayers[var_0] ) )
|
||||
level.players[var_1].killedplayers[var_0] = undefined;
|
||||
|
||||
if ( isdefined( level.players[var_1].killedplayerscurrent[var_0] ) )
|
||||
level.players[var_1].killedplayerscurrent[var_0] = undefined;
|
||||
|
||||
if ( isdefined( level.players[var_1].killedby[var_0] ) )
|
||||
level.players[var_1].killedby[var_0] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
monitorhealed()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "healed" );
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "healed" );
|
||||
}
|
||||
}
|
||||
|
||||
updaterecentkills( var_0 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self notify( "updateRecentKills" );
|
||||
self endon( "updateRecentKills" );
|
||||
self.recentkillcount++;
|
||||
wait 1.0;
|
||||
|
||||
if ( self.recentkillcount > 1 )
|
||||
multikill( var_0, self.recentkillcount );
|
||||
|
||||
self.recentkillcount = 0;
|
||||
}
|
||||
|
||||
monitorcratejacking()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "hijacker", var_0, var_1 );
|
||||
thread maps\mp\gametypes\_rank::xpeventpopup( "hijacker" );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "hijacker" );
|
||||
var_2 = "hijacked_airdrop";
|
||||
var_3 = "ch_hijacker";
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "sentry":
|
||||
var_2 = "hijacked_sentry";
|
||||
break;
|
||||
case "juggernaut":
|
||||
var_2 = "hijacked_juggernaut";
|
||||
break;
|
||||
case "maniac":
|
||||
var_2 = "hijacked_maniac";
|
||||
break;
|
||||
case "juggernaut_swamp_slasher":
|
||||
var_2 = "hijacked_juggernaut_swamp_slasher";
|
||||
break;
|
||||
case "juggernaut_predator":
|
||||
var_2 = "hijacked_juggernaut_predator";
|
||||
break;
|
||||
case "juggernaut_death_mariachi":
|
||||
var_2 = "hijacked_juggernaut_death_mariachi";
|
||||
break;
|
||||
case "remote_tank":
|
||||
var_2 = "hijacked_remote_tank";
|
||||
break;
|
||||
case "emergency_airdrop":
|
||||
case "mega":
|
||||
var_2 = "hijacked_emergency_airdrop";
|
||||
var_3 = "ch_newjack";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_1 maps\mp\gametypes\_hud_message::playercardsplashnotify( var_2, self );
|
||||
|
||||
self notify( "process", var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
monitorobjectives()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "objective", var_0 );
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "captured":
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "capture" );
|
||||
|
||||
if ( isdefined( self.laststand ) && self.laststand )
|
||||
{
|
||||
thread maps\mp\gametypes\_hud_message::splashnotifydelayed( "heroic", maps\mp\gametypes\_rank::getscoreinfovalue( "reviver" ) );
|
||||
thread maps\mp\gametypes\_rank::giverankxp( "reviver" );
|
||||
}
|
||||
|
||||
break;
|
||||
case "plant":
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "plant" );
|
||||
break;
|
||||
case "defuse":
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "defuse" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
giveobjectivepointstreaks()
|
||||
{
|
||||
var_0 = 1;
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
if ( !isagent( self ) )
|
||||
{
|
||||
self.pers["objectivePointStreak"]++;
|
||||
var_1 = self.pers["objectivePointStreak"] % 2 == 0;
|
||||
|
||||
if ( var_1 )
|
||||
maps\mp\killstreaks\_killstreaks::giveadrenaline( "kill" );
|
||||
|
||||
self setclientomnvar( "ui_half_tick", !var_1 );
|
||||
}
|
||||
}
|
||||
}
|
154
maps/mp/_flashgrenades.gsc
Normal file
154
maps/mp/_flashgrenades.gsc
Normal file
@ -0,0 +1,154 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
startmonitoringflash()
|
||||
{
|
||||
thread monitorflash();
|
||||
}
|
||||
|
||||
stopmonitoringflash( var_0 )
|
||||
{
|
||||
self notify( "stop_monitoring_flash" );
|
||||
}
|
||||
|
||||
flashrumbleloop( var_0 )
|
||||
{
|
||||
self endon( "stop_monitoring_flash" );
|
||||
self endon( "flash_rumble_loop" );
|
||||
self notify( "flash_rumble_loop" );
|
||||
var_1 = gettime() + var_0 * 1000;
|
||||
|
||||
while ( gettime() < var_1 )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
monitorflash()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self notify( "monitorFlash" );
|
||||
self endon( "monitorFlash" );
|
||||
self.flashendtime = 0;
|
||||
var_0 = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "flashbang", var_1, var_2, var_3, var_4, var_5, var_6 );
|
||||
|
||||
if ( !isalive( self ) )
|
||||
break;
|
||||
|
||||
if ( isdefined( self.usingremote ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.owner ) && isdefined( var_4 ) && var_4 == self.owner )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( var_6 ) )
|
||||
var_6 = 0;
|
||||
|
||||
var_7 = 0;
|
||||
var_8 = 1;
|
||||
var_3 = 1;
|
||||
var_9 = var_2 * var_3 * var_0;
|
||||
var_9 = var_9 + var_6;
|
||||
var_9 = maps\mp\perks\_perkfunctions::applystunresistence( var_9 );
|
||||
|
||||
if ( var_9 < 0.25 )
|
||||
continue;
|
||||
|
||||
var_10 = undefined;
|
||||
|
||||
if ( var_9 > 2 )
|
||||
var_10 = 0.75;
|
||||
else
|
||||
var_10 = 0.25;
|
||||
|
||||
if ( level.teambased && isdefined( var_4 ) && isdefined( var_4.team ) && var_4.team == self.team && var_4 != self )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
continue;
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
var_9 = var_9 * 0.5;
|
||||
var_10 = var_10 * 0.5;
|
||||
var_8 = 0;
|
||||
var_7 = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
var_9 = var_9 * 0.5;
|
||||
var_10 = var_10 * 0.5;
|
||||
var_7 = 1;
|
||||
}
|
||||
}
|
||||
else if ( isdefined( var_4 ) )
|
||||
{
|
||||
var_4 notify( "flash_hit" );
|
||||
|
||||
if ( var_4 != self )
|
||||
var_4 maps\mp\gametypes\_missions::processchallenge( "ch_indecentexposure" );
|
||||
}
|
||||
|
||||
if ( var_8 && isdefined( self ) )
|
||||
{
|
||||
thread applyflash( var_9, var_10 );
|
||||
|
||||
if ( isdefined( var_4 ) && var_4 != self )
|
||||
{
|
||||
var_4 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "flash" );
|
||||
var_11 = self;
|
||||
|
||||
if ( isplayer( var_4 ) && var_4 isitemunlocked( "specialty_paint" ) && var_4 maps\mp\_utility::_hasperk( "specialty_paint" ) )
|
||||
{
|
||||
if ( !var_11 maps\mp\perks\_perkfunctions::ispainted() )
|
||||
var_4 maps\mp\gametypes\_missions::processchallenge( "ch_paint_pro" );
|
||||
|
||||
var_11 thread maps\mp\perks\_perkfunctions::setpainted( var_4 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_7 && isdefined( var_4 ) )
|
||||
var_4 thread applyflash( var_9, var_10 );
|
||||
}
|
||||
}
|
||||
|
||||
applyflash( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( self.flashduration ) || var_0 > self.flashduration )
|
||||
self.flashduration = var_0;
|
||||
|
||||
if ( !isdefined( self.flashrumbleduration ) || var_1 > self.flashrumbleduration )
|
||||
self.flashrumbleduration = var_1;
|
||||
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( self.flashduration ) )
|
||||
{
|
||||
self shellshock( "flashbang_mp", self.flashduration );
|
||||
self.flashendtime = gettime() + self.flashduration * 1000;
|
||||
}
|
||||
|
||||
if ( isdefined( self.flashrumbleduration ) )
|
||||
thread flashrumbleloop( self.flashrumbleduration );
|
||||
|
||||
self.flashduration = undefined;
|
||||
self.flashrumbleduration = undefined;
|
||||
}
|
||||
|
||||
isflashbanged()
|
||||
{
|
||||
return isdefined( self.flashendtime ) && gettime() < self.flashendtime;
|
||||
}
|
114
maps/mp/_fx.gsc
Normal file
114
maps/mp/_fx.gsc
Normal file
@ -0,0 +1,114 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
script_print_fx()
|
||||
{
|
||||
if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) )
|
||||
{
|
||||
self delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
var_0 = getent( self.target ).origin;
|
||||
else
|
||||
var_0 = "undefined";
|
||||
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
return;
|
||||
}
|
||||
|
||||
grenadeexplosionfx( var_0 )
|
||||
{
|
||||
playfx( level._effect["mechanical explosion"], var_0 );
|
||||
earthquake( 0.15, 0.5, var_0, 250 );
|
||||
}
|
||||
|
||||
soundfx( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
var_3.origin = var_1;
|
||||
var_3 playloopsound( var_0 );
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_3 thread soundfxdelete( var_2 );
|
||||
}
|
||||
|
||||
soundfxdelete( var_0 )
|
||||
{
|
||||
level waittill( var_0 );
|
||||
self delete();
|
||||
}
|
||||
|
||||
func_glass_handler()
|
||||
{
|
||||
var_0 = [];
|
||||
var_1 = [];
|
||||
var_2 = getentarray( "vfx_custom_glass", "targetname" );
|
||||
|
||||
foreach ( var_4 in var_2 )
|
||||
{
|
||||
if ( isdefined( var_4.script_noteworthy ) )
|
||||
{
|
||||
var_5 = getglass( var_4.script_noteworthy );
|
||||
|
||||
if ( isdefined( var_5 ) )
|
||||
{
|
||||
var_1[var_5] = var_4;
|
||||
var_0[var_0.size] = var_5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var_7 = var_0.size;
|
||||
var_8 = var_0.size;
|
||||
var_9 = 5;
|
||||
var_10 = 0;
|
||||
|
||||
while ( var_7 != 0 )
|
||||
{
|
||||
var_11 = var_10 + var_9 - 1;
|
||||
|
||||
if ( var_11 > var_8 )
|
||||
var_11 = var_8;
|
||||
|
||||
if ( var_10 == var_8 )
|
||||
var_10 = 0;
|
||||
|
||||
while ( var_10 < var_11 )
|
||||
{
|
||||
var_12 = var_0[var_10];
|
||||
var_4 = var_1[var_12];
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
{
|
||||
if ( isglassdestroyed( var_12 ) )
|
||||
{
|
||||
var_4 delete();
|
||||
var_7--;
|
||||
var_1[var_12] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
var_10++;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
blenddelete( var_0 )
|
||||
{
|
||||
self waittill( "death" );
|
||||
var_0 delete();
|
||||
}
|
39
maps/mp/_global_fx.gsc
Normal file
39
maps/mp/_global_fx.gsc
Normal file
@ -0,0 +1,39 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
maps\mp\_global_fx_code::global_fx( "ch_streetlight_02_FX_origin", "fx/misc/lighthaze" );
|
||||
maps\mp\_global_fx_code::global_fx( "me_streetlight_01_FX_origin", "fx/misc/lighthaze_bog_a" );
|
||||
maps\mp\_global_fx_code::global_fx( "ch_street_light_01_on", "fx/misc/light_glow_white" );
|
||||
maps\mp\_global_fx_code::global_fx( "lamp_post_globe_on", "fx/misc/light_glow_white" );
|
||||
maps\mp\_global_fx_code::global_fx( "highway_lamp_post", "fx/misc/lighthaze_villassault" );
|
||||
maps\mp\_global_fx_code::global_fx( "cs_cargoship_spotlight_on_FX_origin", "fx/misc/lighthaze" );
|
||||
maps\mp\_global_fx_code::global_fx( "com_tires_burning01_FX_origin", "fx/fire/tire_fire_med" );
|
||||
maps\mp\_global_fx_code::global_fx( "icbm_powerlinetower_FX_origin", "fx/misc/power_tower_light_red_blink" );
|
||||
maps\mp\_global_fx_code::global_fx( "icbm_mainframe_FX_origin", "fx/props/icbm_mainframe_lightblink" );
|
||||
maps\mp\_global_fx_code::global_fx( "lighthaze_oilrig_FX_origin", "fx/misc/lighthaze_oilrig" );
|
||||
maps\mp\_global_fx_code::global_fx( "lighthaze_white_FX_origin", "fx/misc/lighthaze_white" );
|
||||
maps\mp\_global_fx_code::global_fx( "light_glow_walllight_white_FX_origin", "fx/misc/light_glow_walllight_white" );
|
||||
maps\mp\_global_fx_code::global_fx( "fluorescent_glow_FX_origin", "fx/misc/fluorescent_glow" );
|
||||
maps\mp\_global_fx_code::global_fx( "light_glow_industrial_FX_origin", "fx/misc/light_glow_industrial" );
|
||||
maps\mp\_global_fx_code::global_fx( "highrise_blinky_tower", "fx/misc/power_tower_light_red_blink_large" );
|
||||
maps\mp\_global_fx_code::global_fx( "light_glow_white_bulb_FX_origin", "fx/misc/light_glow_white_bulb" );
|
||||
maps\mp\_global_fx_code::global_fx( "light_glow_white_lamp_FX_origin", "fx/misc/light_glow_white_lamp" );
|
||||
maps\mp\_global_fx_code::global_fx( "mp_snow_light_on", "vfx/ambient/lights/vfx_bulb_prismatic_mp_snow" );
|
||||
maps\mp\_global_fx_code::global_fx( "vfx_fog_water_mp", "vfx/ambient/atmospheric/vfx_fog_water_mp" );
|
||||
maps\mp\_global_fx_code::global_fx( "vfx_mp_handflare", "vfx/ambient/props/vfx_handflare_sov" );
|
||||
maps\mp\_global_fx_code::global_fx( "vfx_mp_sov_ceiling_light", "vfx/ambient/lights/vfx_glow_ceil_light_sov" );
|
||||
maps\mp\_global_fx_code::global_fx( "light_red_steady_FX_origin", "fx/misc/tower_light_red_steady", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "light_blue_steady_FX_origin", "fx/misc/tower_light_blue_steady", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "light_orange_steady_FX_origin", "fx/misc/tower_light_orange_steady", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "glow_stick_pile_FX_origin", "fx/misc/glow_stick_glow_pile", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "glow_stick_orange_pile_FX_origin", "fx/misc/glow_stick_glow_pile_orange", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "light_pulse_red_FX_origin", "fx/misc/light_glow_red_generic_pulse", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "light_pulse_red_FX_origin", "fx/misc/light_glow_red_generic_pulse", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "light_pulse_orange_FX_origin", "fx/misc/light_glow_orange_generic_pulse", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "light_red_blink_FX_origin", "fx/misc/power_tower_light_red_blink", -2 );
|
||||
maps\mp\_global_fx_code::global_fx( "flare_ambient_FX_origin", "fx/misc/flare_ambient", undefined, undefined, "emt_road_flare_burn" );
|
||||
maps\mp\_global_fx_code::global_fx( "me_dumpster_fire_FX_origin", "fx/fire/firelp_med_pm", undefined, undefined, "fire_dumpster_medium" );
|
||||
maps\mp\_global_fx_code::global_fx( "barrel_fireFX_origin", "fx/fire/firelp_barrel_pm", undefined, undefined, "fire_barrel_temp" );
|
||||
}
|
37
maps/mp/_global_fx_code.gsc
Normal file
37
maps/mp/_global_fx_code.gsc
Normal file
@ -0,0 +1,37 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
global_fx( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = common_scripts\utility::getstructarray( var_0, "targetname" );
|
||||
|
||||
if ( var_5.size <= 0 )
|
||||
return;
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = randomfloatrange( -20, -15 );
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
var_3 = var_1;
|
||||
|
||||
foreach ( var_7 in var_5 )
|
||||
{
|
||||
if ( !isdefined( level._effect ) )
|
||||
level._effect = [];
|
||||
|
||||
if ( !isdefined( level._effect[var_3] ) )
|
||||
level._effect[var_3] = loadfx( var_1 );
|
||||
|
||||
if ( !isdefined( var_7.angles ) )
|
||||
var_7.angles = ( 0, 0, 0 );
|
||||
|
||||
var_8 = common_scripts\utility::createoneshoteffect( var_3 );
|
||||
var_8.v["origin"] = var_7.origin;
|
||||
var_8.v["angles"] = var_7.angles;
|
||||
var_8.v["fxid"] = var_3;
|
||||
var_8.v["delay"] = var_2;
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
var_8.v["soundalias"] = var_4;
|
||||
}
|
||||
}
|
16
maps/mp/_highlights.gsc
Normal file
16
maps/mp/_highlights.gsc
Normal file
@ -0,0 +1,16 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
givehighlight( var_0, var_1 )
|
||||
{
|
||||
var_2 = getclientmatchdata( "highlightCount" );
|
||||
|
||||
if ( var_2 < 18 )
|
||||
{
|
||||
setclientmatchdata( "highlights", var_2, "award", var_0 );
|
||||
setclientmatchdata( "highlights", var_2, "clientId", self.clientmatchdataid );
|
||||
setclientmatchdata( "highlights", var_2, "value", var_1 );
|
||||
var_2++;
|
||||
setclientmatchdata( "highlightCount", var_2 );
|
||||
}
|
||||
}
|
458
maps/mp/_javelin.gsc
Normal file
458
maps/mp/_javelin.gsc
Normal file
@ -0,0 +1,458 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
initjavelinusage()
|
||||
{
|
||||
self.javelinstage = undefined;
|
||||
self.javelinpoints = undefined;
|
||||
self.javelinnormals = undefined;
|
||||
self.javelinlockmisses = undefined;
|
||||
self.javelintargetpoint = undefined;
|
||||
self.javelintargetnormal = undefined;
|
||||
self.javelinlockstarttime = undefined;
|
||||
}
|
||||
|
||||
resetjavelinlocking()
|
||||
{
|
||||
if ( !isdefined( self.javelinuseentered ) )
|
||||
return;
|
||||
|
||||
self.javelinuseentered = undefined;
|
||||
self notify( "stop_lockon_sound" );
|
||||
self weaponlockfree();
|
||||
self weaponlocktargettooclose( 0 );
|
||||
self weaponlocknoclearance( 0 );
|
||||
self.currentlylocking = 0;
|
||||
self.currentlylocked = 0;
|
||||
self.javelintarget = undefined;
|
||||
self stoplocalsound( "javelin_clu_lock" );
|
||||
self stoplocalsound( "javelin_clu_aquiring_lock" );
|
||||
initjavelinusage();
|
||||
}
|
||||
|
||||
eyetraceforward()
|
||||
{
|
||||
var_0 = self geteye();
|
||||
var_1 = self getplayerangles();
|
||||
var_2 = anglestoforward( var_1 );
|
||||
var_3 = var_0 + var_2 * 15000;
|
||||
var_4 = bullettrace( var_0, var_3, 0, undefined );
|
||||
|
||||
if ( var_4["surfacetype"] == "none" )
|
||||
return undefined;
|
||||
|
||||
if ( var_4["surfacetype"] == "default" )
|
||||
return undefined;
|
||||
|
||||
var_5 = var_4["entity"];
|
||||
|
||||
if ( isdefined( var_5 ) )
|
||||
{
|
||||
if ( var_5 == level.ac130.planemodel )
|
||||
return undefined;
|
||||
}
|
||||
|
||||
var_6 = [];
|
||||
var_6[0] = var_4["position"];
|
||||
var_6[1] = var_4["normal"];
|
||||
return var_6;
|
||||
}
|
||||
|
||||
lockmissesreset()
|
||||
{
|
||||
self.javelinlockmisses = undefined;
|
||||
}
|
||||
|
||||
lockmissesincr()
|
||||
{
|
||||
if ( !isdefined( self.javelinlockmisses ) )
|
||||
self.javelinlockmisses = 1;
|
||||
else
|
||||
self.javelinlockmisses++;
|
||||
}
|
||||
|
||||
lockmissespassedthreshold()
|
||||
{
|
||||
var_0 = 4;
|
||||
|
||||
if ( isdefined( self.javelinlockmisses ) && self.javelinlockmisses >= var_0 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
targetpointtooclose( var_0 )
|
||||
{
|
||||
var_1 = 1100;
|
||||
var_2 = distance( self.origin, var_0 );
|
||||
|
||||
if ( var_2 < var_1 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
looplocalseeksound( var_0, var_1 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "stop_lockon_sound" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self playlocalsound( var_0 );
|
||||
wait( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
topattackpasses( var_0, var_1 )
|
||||
{
|
||||
var_2 = var_0 + var_1 * 10.0;
|
||||
var_3 = var_2 + ( 0, 0, 2000 );
|
||||
var_4 = bullettrace( var_2, var_3, 0, undefined );
|
||||
|
||||
if ( sighttracepassed( var_2, var_3, 0, undefined ) )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
javelinusageloop()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "faux_spawn" );
|
||||
var_0 = 1150;
|
||||
var_1 = 25;
|
||||
var_2 = 100;
|
||||
var_3 = 400;
|
||||
var_4 = 12;
|
||||
var_5 = 0;
|
||||
var_6 = 0;
|
||||
self.javelintarget = undefined;
|
||||
initjavelinusage();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
var_7 = self getcurrentweapon();
|
||||
|
||||
if ( isbot( self ) && var_7 != "javelin_mp" || !issubstr( var_7, "javelin" ) || maps\mp\_utility::isemped() )
|
||||
{
|
||||
if ( isdefined( self.javelinuseentered ) )
|
||||
resetjavelinlocking();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( self playerads() < 0.95 )
|
||||
{
|
||||
var_6 = gettime();
|
||||
resetjavelinlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
var_8 = 0;
|
||||
|
||||
if ( getdvar( "missileDebugDraw" ) == "1" )
|
||||
var_8 = 1;
|
||||
|
||||
var_9 = 0;
|
||||
|
||||
if ( getdvar( "missileDebugText" ) == "1" )
|
||||
var_9 = 1;
|
||||
|
||||
self.javelinuseentered = 1;
|
||||
|
||||
if ( !isdefined( self.javelinstage ) )
|
||||
self.javelinstage = 1;
|
||||
|
||||
if ( self.javelinstage == 1 )
|
||||
{
|
||||
var_10 = maps\mp\gametypes\_weapons::lockonlaunchers_gettargetarray();
|
||||
|
||||
if ( var_10.size != 0 )
|
||||
{
|
||||
var_11 = [];
|
||||
|
||||
foreach ( var_13 in var_10 )
|
||||
{
|
||||
var_14 = self worldpointinreticle_circle( var_13.origin, 65, 40 );
|
||||
|
||||
if ( var_14 )
|
||||
var_11[var_11.size] = var_13;
|
||||
}
|
||||
|
||||
if ( var_11.size != 0 )
|
||||
{
|
||||
var_16 = sortbydistance( var_11, self.origin );
|
||||
|
||||
if ( !vehiclelocksighttest( var_16[0] ) )
|
||||
continue;
|
||||
|
||||
if ( var_9 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
self.javelintarget = var_16[0];
|
||||
|
||||
if ( !isdefined( self.javelinlockstarttime ) )
|
||||
self.javelinlockstarttime = gettime();
|
||||
|
||||
self.javelinstage = 2;
|
||||
self.javelinlostsightlinetime = 0;
|
||||
javelinlockvehicle( var_0 );
|
||||
self.javelinstage = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( lockmissespassedthreshold() )
|
||||
{
|
||||
resetjavelinlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
var_17 = gettime() - var_6;
|
||||
|
||||
if ( var_17 < var_2 )
|
||||
continue;
|
||||
|
||||
var_17 = gettime() - var_5;
|
||||
|
||||
if ( var_17 < var_1 )
|
||||
continue;
|
||||
|
||||
var_5 = gettime();
|
||||
var_21 = eyetraceforward();
|
||||
|
||||
if ( !isdefined( var_21 ) )
|
||||
{
|
||||
lockmissesincr();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( targetpointtooclose( var_21[0] ) )
|
||||
{
|
||||
self weaponlocktargettooclose( 1 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
self weaponlocktargettooclose( 0 );
|
||||
|
||||
if ( isdefined( self.javelinpoints ) )
|
||||
{
|
||||
var_22 = averagepoint( self.javelinpoints );
|
||||
var_23 = distance( var_22, var_21[0] );
|
||||
|
||||
if ( var_23 > var_3 )
|
||||
{
|
||||
lockmissesincr();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self.javelinpoints = [];
|
||||
self.javelinnormals = [];
|
||||
}
|
||||
|
||||
self.javelinpoints[self.javelinpoints.size] = var_21[0];
|
||||
self.javelinnormals[self.javelinnormals.size] = var_21[1];
|
||||
lockmissesreset();
|
||||
|
||||
if ( self.javelinpoints.size < var_4 )
|
||||
continue;
|
||||
|
||||
self.javelintargetpoint = averagepoint( self.javelinpoints );
|
||||
self.javelintargetnormal = averagenormal( self.javelinnormals );
|
||||
self.javelinlockmisses = undefined;
|
||||
self.javelinpoints = undefined;
|
||||
self.javelinnormals = undefined;
|
||||
self.javelinlockstarttime = gettime();
|
||||
self weaponlockstart( self.javelintargetpoint );
|
||||
thread looplocalseeksound( "javelin_clu_aquiring_lock", 0.6 );
|
||||
self.javelinstage = 2;
|
||||
}
|
||||
|
||||
if ( self.javelinstage == 2 )
|
||||
{
|
||||
var_14 = self worldpointinreticle_circle( self.javelintargetpoint, 65, 45 );
|
||||
|
||||
if ( !var_14 )
|
||||
{
|
||||
resetjavelinlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( targetpointtooclose( self.javelintargetpoint ) )
|
||||
self weaponlocktargettooclose( 1 );
|
||||
else
|
||||
self weaponlocktargettooclose( 0 );
|
||||
|
||||
var_17 = gettime() - self.javelinlockstarttime;
|
||||
|
||||
if ( var_17 < var_0 )
|
||||
continue;
|
||||
|
||||
self weaponlockfinalize( self.javelintargetpoint, ( 0, 0, 0 ), 1 );
|
||||
self notify( "stop_lockon_sound" );
|
||||
self playlocalsound( "javelin_clu_lock" );
|
||||
self.javelinstage = 3;
|
||||
}
|
||||
|
||||
if ( self.javelinstage == 3 )
|
||||
{
|
||||
var_14 = self worldpointinreticle_circle( self.javelintargetpoint, 65, 45 );
|
||||
|
||||
if ( !var_14 )
|
||||
{
|
||||
resetjavelinlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( targetpointtooclose( self.javelintargetpoint ) )
|
||||
self weaponlocktargettooclose( 1 );
|
||||
else
|
||||
self weaponlocktargettooclose( 0 );
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debugsightline( var_0, var_1, var_2 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
vehiclelocksighttest( var_0 )
|
||||
{
|
||||
var_1 = self geteye();
|
||||
var_2 = var_0 getpointinbounds( 0, 0, 0 );
|
||||
var_3 = sighttracepassed( var_1, var_2, 0, var_0 );
|
||||
debugsightline( var_1, var_2, var_3 );
|
||||
|
||||
if ( var_3 )
|
||||
return 1;
|
||||
|
||||
var_4 = var_0 getpointinbounds( 1, 0, 0 );
|
||||
var_3 = sighttracepassed( var_1, var_4, 0, var_0 );
|
||||
debugsightline( var_1, var_4, var_3 );
|
||||
|
||||
if ( var_3 )
|
||||
return 1;
|
||||
|
||||
var_5 = var_0 getpointinbounds( -1, 0, 0 );
|
||||
var_3 = sighttracepassed( var_1, var_5, 0, var_0 );
|
||||
debugsightline( var_1, var_5, var_3 );
|
||||
|
||||
if ( var_3 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
javelinlockvehicle( var_0 )
|
||||
{
|
||||
if ( self.javelinstage == 2 )
|
||||
{
|
||||
self weaponlockstart( self.javelintarget );
|
||||
|
||||
if ( !stillvalidjavelinlock( self.javelintarget ) )
|
||||
{
|
||||
resetjavelinlocking();
|
||||
self.javelinlockstarttime = undefined;
|
||||
return;
|
||||
}
|
||||
|
||||
var_1 = softsighttest();
|
||||
|
||||
if ( !var_1 )
|
||||
{
|
||||
self.javelinlockstarttime = undefined;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !isdefined( self.currentlylocking ) || !self.currentlylocking )
|
||||
{
|
||||
thread looplocalseeksound( "javelin_clu_aquiring_lock", 0.6 );
|
||||
self.currentlylocking = 1;
|
||||
}
|
||||
|
||||
var_2 = gettime() - self.javelinlockstarttime;
|
||||
|
||||
if ( maps\mp\_utility::_hasperk( "specialty_fasterlockon" ) )
|
||||
{
|
||||
if ( var_2 < var_0 * 0.5 )
|
||||
return;
|
||||
}
|
||||
else if ( var_2 < var_0 )
|
||||
return;
|
||||
|
||||
if ( isplayer( self.javelintarget ) )
|
||||
self weaponlockfinalize( self.javelintarget, ( 0, 0, 64 ), 0 );
|
||||
else
|
||||
self weaponlockfinalize( self.javelintarget, ( 0, 0, 0 ), 0 );
|
||||
|
||||
self notify( "stop_lockon_sound" );
|
||||
|
||||
if ( !isdefined( self.currentlylocked ) || !self.currentlylocked )
|
||||
{
|
||||
self playlocalsound( "javelin_clu_lock" );
|
||||
self.currentlylocked = 1;
|
||||
}
|
||||
|
||||
self.javelinstage = 3;
|
||||
}
|
||||
|
||||
if ( self.javelinstage == 3 )
|
||||
{
|
||||
var_1 = softsighttest();
|
||||
|
||||
if ( !var_1 )
|
||||
return;
|
||||
|
||||
if ( !stillvalidjavelinlock( self.javelintarget ) )
|
||||
{
|
||||
resetjavelinlocking();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stillvalidjavelinlock( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( !self worldpointinreticle_circle( var_0.origin, 65, 85 ) )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
softsighttest()
|
||||
{
|
||||
var_0 = 500;
|
||||
|
||||
if ( vehiclelocksighttest( self.javelintarget ) )
|
||||
{
|
||||
self.javelinlostsightlinetime = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( self.javelinlostsightlinetime == 0 )
|
||||
self.javelinlostsightlinetime = gettime();
|
||||
|
||||
var_1 = gettime() - self.javelinlostsightlinetime;
|
||||
|
||||
if ( var_1 >= var_0 )
|
||||
{
|
||||
resetjavelinlocking();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
491
maps/mp/_laserguidedlauncher.gsc
Normal file
491
maps/mp/_laserguidedlauncher.gsc
Normal file
@ -0,0 +1,491 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
lgm_init( var_0, var_1 )
|
||||
{
|
||||
level._effect["laser_guided_launcher_missile_split"] = loadfx( var_0 );
|
||||
level._effect["laser_guided_launcher_missile_spawn_homing"] = loadfx( var_1 );
|
||||
}
|
||||
|
||||
lgm_update_launcherusage( var_0, var_1 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "faux_spawn" );
|
||||
thread lgm_monitorlaser();
|
||||
var_2 = self getcurrentweapon();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while ( var_2 != var_0 )
|
||||
self waittill( "weapon_change", var_2 );
|
||||
|
||||
childthread lgm_firing_monitormissilefire( var_2, var_1 );
|
||||
self waittill( "weapon_change", var_2 );
|
||||
lgm_firing_endmissilefire();
|
||||
}
|
||||
}
|
||||
|
||||
lgm_monitorlaser()
|
||||
{
|
||||
self endon( "LGM_player_endMonitorFire" );
|
||||
common_scripts\utility::waittill_any( "death", "disconnect" );
|
||||
|
||||
if ( isdefined( self ) )
|
||||
lgm_disablelaser();
|
||||
}
|
||||
|
||||
lgm_firing_endmissilefire()
|
||||
{
|
||||
lgm_disablelaser();
|
||||
self notify( "LGM_player_endMonitorFire" );
|
||||
}
|
||||
|
||||
lgm_firing_monitormissilefire( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "LGM_player_endMonitorFire" );
|
||||
lgm_enablelaser();
|
||||
var_3 = undefined;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = undefined;
|
||||
self waittill( "missile_fire", var_4, var_5 );
|
||||
|
||||
if ( isdefined( var_4.ismagicbullet ) && var_4.ismagicbullet )
|
||||
continue;
|
||||
|
||||
if ( var_5 != var_0 )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
var_3 = lgm_requestmissileguideent( self );
|
||||
|
||||
thread lgm_firing_delayspawnchildren( var_0, var_1, var_2, 0.35, 0.1, var_4, var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
lgm_firing_delayspawnchildren( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
||||
{
|
||||
self notify( "monitor_laserGuidedMissile_delaySpawnChildren" );
|
||||
self endon( "monitor_laserGuidedMissile_delaySpawnChildren" );
|
||||
self endon( "death" );
|
||||
self endon( "LGM_player_endMonitorFire" );
|
||||
lgm_missilesnotifyandrelease( var_6 );
|
||||
wait( var_3 );
|
||||
|
||||
if ( !isvalidmissile( var_5 ) )
|
||||
return;
|
||||
|
||||
var_7 = var_5.origin;
|
||||
var_8 = anglestoforward( var_5.angles );
|
||||
var_9 = anglestoup( var_5.angles );
|
||||
var_10 = anglestoright( var_5.angles );
|
||||
var_5 delete();
|
||||
playfx( level._effect["laser_guided_launcher_missile_split"], var_7, var_8, var_9 );
|
||||
var_11 = [];
|
||||
|
||||
for ( var_12 = 0; var_12 < 2; var_12++ )
|
||||
{
|
||||
var_13 = 20;
|
||||
var_14 = 0;
|
||||
|
||||
if ( var_12 == 0 )
|
||||
var_14 = 20;
|
||||
else if ( var_12 == 1 )
|
||||
var_14 = -20;
|
||||
else if ( var_12 == 2 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
var_15 = rotatepointaroundvector( var_10, var_8, var_13 );
|
||||
var_15 = rotatepointaroundvector( var_9, var_15, var_14 );
|
||||
var_16 = magicbullet( var_1, var_7, var_7 + var_15 * 180, self );
|
||||
var_16.ismagicbullet = 1;
|
||||
var_11[var_11.size] = var_16;
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
|
||||
wait( var_4 );
|
||||
var_11 = lgm_removeinvalidmissiles( var_11 );
|
||||
|
||||
if ( var_11.size > 0 )
|
||||
{
|
||||
foreach ( var_18 in var_11 )
|
||||
{
|
||||
var_6.missileschasing[var_6.missileschasing.size] = var_18;
|
||||
var_18 missile_settargetent( var_6 );
|
||||
thread lgm_onmissilenotifies( var_6, var_18 );
|
||||
}
|
||||
|
||||
thread lgm_firing_monitorplayeraim( var_6, var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
lgm_onmissilenotifies( var_0, var_1 )
|
||||
{
|
||||
var_1 common_scripts\utility::waittill_any( "death", "missile_pairedWithFlare", "LGM_missile_abandoned" );
|
||||
|
||||
if ( isdefined( var_0.missileschasing ) && var_0.missileschasing.size > 0 )
|
||||
{
|
||||
var_0.missileschasing = common_scripts\utility::array_remove( var_0.missileschasing, var_1 );
|
||||
var_0.missileschasing = lgm_removeinvalidmissiles( var_0.missileschasing );
|
||||
}
|
||||
|
||||
if ( !isdefined( var_0.missileschasing ) || var_0.missileschasing.size == 0 )
|
||||
self notify( "LGM_player_allMissilesDestroyed" );
|
||||
}
|
||||
|
||||
lgm_firing_monitorplayeraim( var_0, var_1 )
|
||||
{
|
||||
self notify( "LGM_player_newMissilesFired" );
|
||||
self endon( "LGM_player_newMissilesFired" );
|
||||
self endon( "LGM_player_allMissilesDestroyed" );
|
||||
self endon( "LGM_player_endMonitorFire" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
var_2 = undefined;
|
||||
var_3 = undefined;
|
||||
var_4 = undefined;
|
||||
var_5 = 0;
|
||||
var_6 = gettime() + 400;
|
||||
|
||||
while ( isdefined( var_0.missileschasing ) && var_0.missileschasing.size > 0 )
|
||||
{
|
||||
var_7 = lgm_targetfind();
|
||||
|
||||
if ( !isdefined( var_7 ) )
|
||||
{
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
self notify( "LGM_player_targetLost" );
|
||||
var_3 = undefined;
|
||||
|
||||
foreach ( var_9 in var_0.missileschasing )
|
||||
var_9 notify( "missile_targetChanged" );
|
||||
}
|
||||
|
||||
var_4 = undefined;
|
||||
var_5 = 0;
|
||||
var_11 = common_scripts\utility::ter_op( gettime() > var_6, 8000, 800 );
|
||||
var_12 = anglestoforward( self getplayerangles() );
|
||||
var_13 = self geteye() + var_12 * 12;
|
||||
var_14 = bullettrace( var_13, var_13 + var_12 * var_11, 1, self, 0, 0, 0 );
|
||||
var_2 = var_14["position"];
|
||||
}
|
||||
else
|
||||
{
|
||||
var_2 = var_7.origin;
|
||||
var_15 = !isdefined( var_3 ) || var_7 != var_3;
|
||||
var_3 = var_7;
|
||||
|
||||
if ( var_15 || !isdefined( var_4 ) )
|
||||
{
|
||||
var_4 = gettime() + 1500;
|
||||
level thread lgm_locking_think( var_3, self );
|
||||
}
|
||||
else if ( gettime() >= var_4 )
|
||||
{
|
||||
var_5 = 1;
|
||||
self notify( "LGM_player_lockedOn" );
|
||||
}
|
||||
|
||||
if ( var_5 )
|
||||
{
|
||||
waittillframeend;
|
||||
|
||||
if ( var_0.missileschasing.size > 0 )
|
||||
{
|
||||
var_16 = [];
|
||||
|
||||
foreach ( var_9 in var_0.missileschasing )
|
||||
{
|
||||
if ( !isvalidmissile( var_9 ) )
|
||||
continue;
|
||||
|
||||
var_16[var_16.size] = var_9.origin;
|
||||
var_9 notify( "missile_targetChanged" );
|
||||
var_9 notify( "LGM_missile_abandoned" );
|
||||
var_9 delete();
|
||||
}
|
||||
|
||||
if ( var_16.size > 0 )
|
||||
level thread lgm_locked_think( var_3, self, var_1, var_16 );
|
||||
|
||||
var_0.missileschasing = [];
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
else if ( var_15 )
|
||||
lgm_targetnotifymissiles( var_3, self, var_0.missileschasing );
|
||||
}
|
||||
|
||||
var_0.origin = var_2;
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
}
|
||||
|
||||
lgm_requestmissileguideent( var_0 )
|
||||
{
|
||||
if ( !isdefined( level.laserguidedmissileents_inuse ) )
|
||||
level.laserguidedmissileents_inuse = [];
|
||||
|
||||
if ( !isdefined( level.laserguidedmissileents_ready ) )
|
||||
level.laserguidedmissileents_ready = [];
|
||||
|
||||
var_1 = undefined;
|
||||
|
||||
if ( level.laserguidedmissileents_ready.size )
|
||||
{
|
||||
var_1 = level.laserguidedmissileents_ready[0];
|
||||
level.laserguidedmissileents_ready = common_scripts\utility::array_remove( level.laserguidedmissileents_ready, var_1 );
|
||||
}
|
||||
else
|
||||
var_1 = spawn( "script_origin", var_0.origin );
|
||||
|
||||
level.laserguidedmissileents_inuse[level.laserguidedmissileents_inuse.size] = var_1;
|
||||
level thread lgm_monitorlaserentcleanup( var_1, var_0 );
|
||||
var_1.missileschasing = [];
|
||||
return var_1;
|
||||
}
|
||||
|
||||
lgm_monitorlaserentcleanup( var_0, var_1 )
|
||||
{
|
||||
var_1 common_scripts\utility::waittill_any( "death", "disconnect", "LGM_player_endMonitorFire" );
|
||||
|
||||
foreach ( var_3 in var_0.missileschasing )
|
||||
{
|
||||
if ( isvalidmissile( var_3 ) )
|
||||
var_3 missile_cleartarget();
|
||||
}
|
||||
|
||||
var_0.missileschasing = undefined;
|
||||
level.laserguidedmissileents_inuse = common_scripts\utility::array_remove( level.laserguidedmissileents_inuse, var_0 );
|
||||
|
||||
if ( level.laserguidedmissileents_ready.size + level.laserguidedmissileents_inuse.size < 4 )
|
||||
level.laserguidedmissileents_ready[level.laserguidedmissileents_ready.size] = var_0;
|
||||
else
|
||||
var_0 delete();
|
||||
}
|
||||
|
||||
lgm_locking_think( var_0, var_1 )
|
||||
{
|
||||
var_2 = maps\mp\_utility::outlineenableforplayer( var_0, "orange", var_1, 1, "killstreak_personal" );
|
||||
level thread lgm_locking_loopsound( var_1, "maaws_reticle_tracking", 1.5, "LGM_player_lockingDone" );
|
||||
level thread lgm_locking_notifyontargetdeath( var_0, var_1 );
|
||||
var_1 common_scripts\utility::waittill_any( "death", "disconnect", "LGM_player_endMonitorFire", "LGM_player_newMissilesFired", "LGM_player_targetLost", "LGM_player_lockedOn", "LGM_player_allMissilesDestroyed", "LGM_player_targetDied" );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
maps\mp\_utility::outlinedisable( var_2, var_0 );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_1 notify( "LGM_player_lockingDone" );
|
||||
var_1 stoplocalsound( "maaws_reticle_tracking" );
|
||||
}
|
||||
}
|
||||
|
||||
lgm_locked_missileondeath( var_0, var_1, var_2 )
|
||||
{
|
||||
var_1 endon( "death" );
|
||||
var_0 waittill( "death" );
|
||||
var_1.lg_missileslocked[var_2] = common_scripts\utility::array_remove( var_1.lg_missileslocked[var_2], var_0 );
|
||||
|
||||
if ( var_1.lg_missileslocked[var_2].size == 0 )
|
||||
{
|
||||
var_1.lg_missileslocked[var_2] = undefined;
|
||||
var_1 notify( "LGM_target_lockedMissilesDestroyed" );
|
||||
}
|
||||
}
|
||||
|
||||
lgm_locking_notifyontargetdeath( var_0, var_1 )
|
||||
{
|
||||
var_1 endon( "death" );
|
||||
var_1 endon( "disconnect" );
|
||||
var_1 endon( "LGM_player_lockingDone" );
|
||||
var_0 waittill( "death" );
|
||||
var_1 notify( "LGM_player_targetDied" );
|
||||
}
|
||||
|
||||
lgm_locking_loopsound( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
var_0 endon( "disconnect" );
|
||||
var_0 endon( var_3 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 playlocalsound( var_1 );
|
||||
wait( var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
lgm_locked_spawnmissiles( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
var_1 endon( "death" );
|
||||
var_1 endon( "disconnect" );
|
||||
var_4 = [];
|
||||
|
||||
for ( var_5 = 0; var_5 < var_3.size; var_5++ )
|
||||
{
|
||||
var_6 = magicbullet( var_2, var_3[var_5], var_0.origin, var_1 );
|
||||
var_6.ismagicbullet = 1;
|
||||
var_4[var_4.size] = var_6;
|
||||
playfx( level._effect["laser_guided_launcher_missile_spawn_homing"], var_6.origin, anglestoforward( var_6.angles ), anglestoup( var_6.angles ) );
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
lgm_locked_think( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( var_3.size == 0 )
|
||||
return;
|
||||
|
||||
var_4 = lgm_locked_spawnmissiles( var_0, var_1, var_2, var_3 );
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
return;
|
||||
|
||||
var_4 = lgm_removeinvalidmissiles( var_4 );
|
||||
|
||||
if ( var_4.size == 0 )
|
||||
return;
|
||||
|
||||
var_1 playlocalsound( "maaws_reticle_locked" );
|
||||
var_5 = maps\mp\_utility::outlineenableforplayer( var_0, "red", var_1, 0, "killstreak_personal" );
|
||||
var_6 = lgm_gettargetoffset( var_0 );
|
||||
|
||||
foreach ( var_8 in var_4 )
|
||||
{
|
||||
var_8 common_scripts\utility::missile_settargetandflightmode( var_0, "direct", var_6 );
|
||||
lgm_targetnotifymissiles( var_0, var_1, var_4 );
|
||||
}
|
||||
|
||||
if ( !isdefined( var_0.lg_missileslocked ) )
|
||||
var_0.lg_missileslocked = [];
|
||||
|
||||
var_0.lg_missileslocked[var_5] = var_4;
|
||||
|
||||
foreach ( var_11 in var_4 )
|
||||
level thread lgm_locked_missileondeath( var_11, var_0, var_5 );
|
||||
|
||||
var_13 = 1;
|
||||
|
||||
while ( var_13 )
|
||||
{
|
||||
var_14 = var_0 common_scripts\utility::waittill_any_return( "death", "LGM_target_lockedMissilesDestroyed" );
|
||||
|
||||
if ( var_14 == "death" )
|
||||
{
|
||||
var_13 = 0;
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_0.lg_missileslocked[var_5] = undefined;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( var_14 == "LGM_target_lockedMissilesDestroyed" )
|
||||
{
|
||||
waittillframeend;
|
||||
|
||||
if ( !isdefined( var_0.lg_missileslocked[var_5] ) || var_0.lg_missileslocked[var_5].size == 0 )
|
||||
var_13 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
maps\mp\_utility::outlinedisable( var_5, var_0 );
|
||||
}
|
||||
|
||||
lgm_targetfind()
|
||||
{
|
||||
var_0 = maps\mp\gametypes\_weapons::lockonlaunchers_gettargetarray();
|
||||
var_0 = sortbydistance( var_0, self.origin );
|
||||
var_1 = undefined;
|
||||
|
||||
foreach ( var_3 in var_0 )
|
||||
{
|
||||
if ( self worldpointinreticle_circle( var_3.origin, 65, 75 ) )
|
||||
{
|
||||
var_1 = var_3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
lgm_enablelaser()
|
||||
{
|
||||
if ( !isdefined( self.laserguidedlauncher_laseron ) || self.laserguidedlauncher_laseron == 0 )
|
||||
{
|
||||
self.laserguidedlauncher_laseron = 1;
|
||||
maps\mp\_utility::enableweaponlaser();
|
||||
}
|
||||
}
|
||||
|
||||
lgm_disablelaser()
|
||||
{
|
||||
if ( isdefined( self.laserguidedlauncher_laseron ) && self.laserguidedlauncher_laseron == 1 )
|
||||
maps\mp\_utility::disableweaponlaser();
|
||||
|
||||
self.laserguidedlauncher_laseron = undefined;
|
||||
}
|
||||
|
||||
lgm_removeinvalidmissiles( var_0 )
|
||||
{
|
||||
var_1 = [];
|
||||
|
||||
foreach ( var_3 in var_0 )
|
||||
{
|
||||
if ( isvalidmissile( var_3 ) )
|
||||
var_1[var_1.size] = var_3;
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
lgm_targetnotifymissiles( var_0, var_1, var_2 )
|
||||
{
|
||||
level notify( "laserGuidedMissiles_incoming", var_1, var_2, var_0 );
|
||||
var_0 notify( "targeted_by_incoming_missile", var_2 );
|
||||
}
|
||||
|
||||
lgm_gettargetoffset( var_0 )
|
||||
{
|
||||
var_1 = undefined;
|
||||
|
||||
if ( var_0.model != "vehicle_av8b_harrier_jet_mp" )
|
||||
var_1 = var_0 gettagorigin( "tag_missile_target" );
|
||||
else
|
||||
var_1 = var_0 gettagorigin( "tag_body" );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = var_0 getpointinbounds( 0, 0, 0 );
|
||||
|
||||
return var_1 - var_0.origin;
|
||||
}
|
||||
|
||||
lgm_missilesnotifyandrelease( var_0 )
|
||||
{
|
||||
if ( isdefined( var_0.missileschasing ) && var_0.missileschasing.size > 0 )
|
||||
{
|
||||
foreach ( var_2 in var_0.missileschasing )
|
||||
{
|
||||
if ( isvalidmissile( var_2 ) )
|
||||
{
|
||||
var_2 notify( "missile_targetChanged" );
|
||||
var_2 notify( "LGM_missile_abandoned" );
|
||||
var_2 missile_cleartarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var_0.missileschasing = [];
|
||||
}
|
348
maps/mp/_load.gsc
Normal file
348
maps/mp/_load.gsc
Normal file
@ -0,0 +1,348 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
if ( isdefined( level._loadstarted ) )
|
||||
return;
|
||||
|
||||
level._loadstarted = 1;
|
||||
level.createfx_enabled = getdvar( "createfx" ) != "";
|
||||
common_scripts\utility::struct_class_init();
|
||||
maps\mp\_utility::initgameflags();
|
||||
maps\mp\_utility::initlevelflags();
|
||||
maps\mp\_utility::initglobals();
|
||||
level.generic_index = 0;
|
||||
level.flag_struct = spawnstruct();
|
||||
level.flag_struct common_scripts\utility::assign_unique_id();
|
||||
|
||||
if ( !isdefined( level.flag ) )
|
||||
{
|
||||
level.flag = [];
|
||||
level.flags_lock = [];
|
||||
}
|
||||
|
||||
level.requiredmapaspectratio = getdvarfloat( "scr_RequiredMapAspectratio", 1 );
|
||||
level.createclientfontstring_func = maps\mp\gametypes\_hud_util::createfontstring;
|
||||
level.hudsetpoint_func = maps\mp\gametypes\_hud_util::setpoint;
|
||||
level.leaderdialogonplayer_func = maps\mp\_utility::leaderdialogonplayer;
|
||||
thread maps\mp\gametypes\_tweakables::init();
|
||||
|
||||
if ( !isdefined( level.func ) )
|
||||
level.func = [];
|
||||
|
||||
level.func["precacheMpAnim"] = ::precachempanim;
|
||||
level.func["scriptModelPlayAnim"] = ::scriptmodelplayanim;
|
||||
level.func["scriptModelClearAnim"] = ::scriptmodelclearanim;
|
||||
|
||||
if ( !level.createfx_enabled )
|
||||
{
|
||||
thread maps\mp\_minefields::minefields();
|
||||
thread maps\mp\_radiation::radiation();
|
||||
thread maps\mp\_shutter::main();
|
||||
thread maps\mp\_movers::init();
|
||||
thread maps\mp\_destructables::init();
|
||||
thread common_scripts\_elevator::init();
|
||||
thread common_scripts\_dynamic_world::init();
|
||||
thread common_scripts\_destructible::init();
|
||||
level notify( "interactive_start" );
|
||||
}
|
||||
|
||||
game["thermal_vision"] = "thermal_mp";
|
||||
visionsetnaked( "", 0 );
|
||||
visionsetnight( "default_night_mp" );
|
||||
visionsetmissilecam( "missilecam" );
|
||||
visionsetthermal( game["thermal_vision"] );
|
||||
visionsetpain( "", 0 );
|
||||
var_0 = getentarray( "lantern_glowFX_origin", "targetname" );
|
||||
|
||||
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
|
||||
var_0[var_1] thread lanterns();
|
||||
|
||||
maps\mp\_audio::init_audio();
|
||||
maps\mp\_art::main();
|
||||
setupexploders();
|
||||
thread common_scripts\_fx::initfx();
|
||||
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
maps\mp\gametypes\_spawnlogic::setmapcenterfordev();
|
||||
maps\mp\_createfx::createfx();
|
||||
}
|
||||
|
||||
if ( getdvar( "r_reflectionProbeGenerate" ) == "1" )
|
||||
{
|
||||
maps\mp\gametypes\_spawnlogic::setmapcenterfordev();
|
||||
maps\mp\_global_fx::main();
|
||||
level waittill( "eternity" );
|
||||
}
|
||||
|
||||
thread maps\mp\_global_fx::main();
|
||||
|
||||
for ( var_2 = 0; var_2 < 6; var_2++ )
|
||||
{
|
||||
switch ( var_2 )
|
||||
{
|
||||
case 0:
|
||||
var_3 = "trigger_multiple";
|
||||
break;
|
||||
case 1:
|
||||
var_3 = "trigger_once";
|
||||
break;
|
||||
case 2:
|
||||
var_3 = "trigger_use";
|
||||
break;
|
||||
case 3:
|
||||
var_3 = "trigger_radius";
|
||||
break;
|
||||
case 4:
|
||||
var_3 = "trigger_lookat";
|
||||
break;
|
||||
default:
|
||||
var_3 = "trigger_damage";
|
||||
break;
|
||||
}
|
||||
|
||||
var_4 = getentarray( var_3, "classname" );
|
||||
|
||||
for ( var_1 = 0; var_1 < var_4.size; var_1++ )
|
||||
{
|
||||
if ( isdefined( var_4[var_1].script_prefab_exploder ) )
|
||||
var_4[var_1].script_exploder = var_4[var_1].script_prefab_exploder;
|
||||
|
||||
if ( isdefined( var_4[var_1].script_exploder ) )
|
||||
level thread exploder_load( var_4[var_1] );
|
||||
}
|
||||
}
|
||||
|
||||
thread maps\mp\_animatedmodels::main();
|
||||
level.func["damagefeedback"] = maps\mp\gametypes\_damagefeedback::updatedamagefeedback;
|
||||
level.func["setTeamHeadIcon"] = maps\mp\_entityheadicons::setteamheadicon;
|
||||
level.laseron_func = ::laseron;
|
||||
level.laseroff_func = ::laseroff;
|
||||
level.connectpathsfunction = ::connectpaths;
|
||||
level.disconnectpathsfunction = ::disconnectpaths;
|
||||
setdvar( "sm_sunShadowScale", 1 );
|
||||
setdvar( "sm_spotLightScoreModelScale", 0 );
|
||||
setdvar( "r_specularcolorscale", 2.5 );
|
||||
setdvar( "r_diffusecolorscale", 1 );
|
||||
setdvar( "r_lightGridEnableTweaks", 0 );
|
||||
setdvar( "r_lightGridIntensity", 1 );
|
||||
setdvar( "r_lightGridContrast", 0 );
|
||||
setdvar( "ui_showInfo", 1 );
|
||||
setdvar( "ui_showMinimap", 1 );
|
||||
setupdestructiblekillcaments();
|
||||
precacheitem( "bomb_site_mp" );
|
||||
|
||||
if ( !level.console )
|
||||
{
|
||||
level.furfx = loadfx( "vfx/apex/nv_dog_a" );
|
||||
level.wolffurfx = [];
|
||||
level.wolffurfx[0] = loadfx( "vfx/apex/nv_wolf_b" );
|
||||
level.wolffurfx[1] = loadfx( "vfx/apex/nv_wolf_c" );
|
||||
}
|
||||
|
||||
level.fauxvehiclecount = 0;
|
||||
level.littlebird_model = "vehicle_aas_72x_killstreak";
|
||||
}
|
||||
|
||||
exploder_load( var_0 )
|
||||
{
|
||||
level endon( "killexplodertridgers" + var_0.script_exploder );
|
||||
var_0 waittill( "trigger" );
|
||||
|
||||
if ( isdefined( var_0.script_chance ) && randomfloat( 1 ) > var_0.script_chance )
|
||||
{
|
||||
if ( isdefined( var_0.script_delay ) )
|
||||
wait( var_0.script_delay );
|
||||
else
|
||||
wait 4;
|
||||
|
||||
level thread exploder_load( var_0 );
|
||||
return;
|
||||
}
|
||||
|
||||
common_scripts\utility::exploder( var_0.script_exploder );
|
||||
level notify( "killexplodertridgers" + var_0.script_exploder );
|
||||
}
|
||||
|
||||
setupexploders()
|
||||
{
|
||||
var_0 = getentarray( "script_brushmodel", "classname" );
|
||||
var_1 = getentarray( "script_model", "classname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
var_0[var_0.size] = var_1[var_2];
|
||||
|
||||
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
|
||||
{
|
||||
if ( isdefined( var_0[var_2].script_prefab_exploder ) )
|
||||
var_0[var_2].script_exploder = var_0[var_2].script_prefab_exploder;
|
||||
|
||||
if ( isdefined( var_0[var_2].script_exploder ) )
|
||||
{
|
||||
if ( var_0[var_2].model == "fx" && ( !isdefined( var_0[var_2].targetname ) || var_0[var_2].targetname != "exploderchunk" ) )
|
||||
{
|
||||
var_0[var_2] hide();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0[var_2].targetname ) && var_0[var_2].targetname == "exploder" )
|
||||
{
|
||||
var_0[var_2] hide();
|
||||
var_0[var_2] notsolid();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0[var_2].targetname ) && var_0[var_2].targetname == "exploderchunk" )
|
||||
{
|
||||
var_0[var_2] hide();
|
||||
var_0[var_2] notsolid();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var_3 = [];
|
||||
var_4 = getentarray( "script_brushmodel", "classname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_4.size; var_2++ )
|
||||
{
|
||||
if ( isdefined( var_4[var_2].script_prefab_exploder ) )
|
||||
var_4[var_2].script_exploder = var_4[var_2].script_prefab_exploder;
|
||||
|
||||
if ( isdefined( var_4[var_2].script_exploder ) )
|
||||
var_3[var_3.size] = var_4[var_2];
|
||||
}
|
||||
|
||||
var_4 = getentarray( "script_model", "classname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_4.size; var_2++ )
|
||||
{
|
||||
if ( isdefined( var_4[var_2].script_prefab_exploder ) )
|
||||
var_4[var_2].script_exploder = var_4[var_2].script_prefab_exploder;
|
||||
|
||||
if ( isdefined( var_4[var_2].script_exploder ) )
|
||||
var_3[var_3.size] = var_4[var_2];
|
||||
}
|
||||
|
||||
var_4 = getentarray( "item_health", "classname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_4.size; var_2++ )
|
||||
{
|
||||
if ( isdefined( var_4[var_2].script_prefab_exploder ) )
|
||||
var_4[var_2].script_exploder = var_4[var_2].script_prefab_exploder;
|
||||
|
||||
if ( isdefined( var_4[var_2].script_exploder ) )
|
||||
var_3[var_3.size] = var_4[var_2];
|
||||
}
|
||||
|
||||
if ( !isdefined( level.createfxent ) )
|
||||
level.createfxent = [];
|
||||
|
||||
var_5 = [];
|
||||
var_5["exploderchunk visible"] = 1;
|
||||
var_5["exploderchunk"] = 1;
|
||||
var_5["exploder"] = 1;
|
||||
|
||||
for ( var_2 = 0; var_2 < var_3.size; var_2++ )
|
||||
{
|
||||
var_6 = var_3[var_2];
|
||||
var_7 = common_scripts\utility::createexploder( var_6.script_fxid );
|
||||
var_7.v = [];
|
||||
var_7.v["origin"] = var_6.origin;
|
||||
var_7.v["angles"] = var_6.angles;
|
||||
var_7.v["delay"] = var_6.script_delay;
|
||||
var_7.v["firefx"] = var_6.script_firefx;
|
||||
var_7.v["firefxdelay"] = var_6.script_firefxdelay;
|
||||
var_7.v["firefxsound"] = var_6.script_firefxsound;
|
||||
var_7.v["firefxtimeout"] = var_6.script_firefxtimeout;
|
||||
var_7.v["earthquake"] = var_6.script_earthquake;
|
||||
var_7.v["damage"] = var_6.script_damage;
|
||||
var_7.v["damage_radius"] = var_6.script_radius;
|
||||
var_7.v["soundalias"] = var_6.script_soundalias;
|
||||
var_7.v["repeat"] = var_6.script_repeat;
|
||||
var_7.v["delay_min"] = var_6.script_delay_min;
|
||||
var_7.v["delay_max"] = var_6.script_delay_max;
|
||||
var_7.v["target"] = var_6.target;
|
||||
var_7.v["ender"] = var_6.script_ender;
|
||||
var_7.v["type"] = "exploder";
|
||||
|
||||
if ( !isdefined( var_6.script_fxid ) )
|
||||
var_7.v["fxid"] = "No FX";
|
||||
else
|
||||
var_7.v["fxid"] = var_6.script_fxid;
|
||||
|
||||
var_7.v["exploder"] = var_6.script_exploder;
|
||||
|
||||
if ( !isdefined( var_7.v["delay"] ) )
|
||||
var_7.v["delay"] = 0;
|
||||
|
||||
if ( isdefined( var_6.target ) )
|
||||
{
|
||||
var_8 = getent( var_7.v["target"], "targetname" ).origin;
|
||||
var_7.v["angles"] = vectortoangles( var_8 - var_7.v["origin"] );
|
||||
}
|
||||
|
||||
if ( var_6.classname == "script_brushmodel" || isdefined( var_6.model ) )
|
||||
{
|
||||
var_7.model = var_6;
|
||||
var_7.model.disconnect_paths = var_6.script_disconnectpaths;
|
||||
}
|
||||
|
||||
if ( isdefined( var_6.targetname ) && isdefined( var_5[var_6.targetname] ) )
|
||||
var_7.v["exploder_type"] = var_6.targetname;
|
||||
else
|
||||
var_7.v["exploder_type"] = "normal";
|
||||
|
||||
var_7 common_scripts\_createfx::post_entity_creation_function();
|
||||
}
|
||||
}
|
||||
|
||||
lanterns()
|
||||
{
|
||||
if ( !isdefined( level._effect["lantern_light"] ) )
|
||||
level._effect["lantern_light"] = loadfx( "fx/props/glow_latern" );
|
||||
|
||||
common_scripts\_fx::loopfx( "lantern_light", self.origin, 0.3, self.origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
|
||||
setupdestructiblekillcaments()
|
||||
{
|
||||
var_0 = getentarray( "scriptable_destructible_vehicle", "targetname" );
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
var_3 = var_2.origin + ( 0, 0, 5 );
|
||||
var_4 = var_2.origin + ( 0, 0, 128 );
|
||||
var_5 = bullettrace( var_3, var_4, 0, var_2 );
|
||||
var_2.killcament = spawn( "script_model", var_5["position"] );
|
||||
var_2.killcament.targetname = "killCamEnt_destructible_vehicle";
|
||||
var_2.killcament setscriptmoverkillcam( "explosive" );
|
||||
var_2 thread deletedestructiblekillcament();
|
||||
}
|
||||
|
||||
var_7 = getentarray( "scriptable_destructible_barrel", "targetname" );
|
||||
|
||||
foreach ( var_2 in var_7 )
|
||||
{
|
||||
var_3 = var_2.origin + ( 0, 0, 5 );
|
||||
var_4 = var_2.origin + ( 0, 0, 128 );
|
||||
var_5 = bullettrace( var_3, var_4, 0, var_2 );
|
||||
var_2.killcament = spawn( "script_model", var_5["position"] );
|
||||
var_2.killcament.targetname = "killCamEnt_explodable_barrel";
|
||||
var_2.killcament setscriptmoverkillcam( "explosive" );
|
||||
var_2 thread deletedestructiblekillcament();
|
||||
}
|
||||
}
|
||||
|
||||
deletedestructiblekillcament()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
var_0 = self.killcament;
|
||||
var_0 endon( "death" );
|
||||
self waittill( "death" );
|
||||
wait 10;
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_0 delete();
|
||||
}
|
495
maps/mp/_matchdata.gsc
Normal file
495
maps/mp/_matchdata.gsc
Normal file
@ -0,0 +1,495 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isdefined( game["gamestarted"] ) )
|
||||
{
|
||||
setmatchdatadef( "mp/matchdata.def" );
|
||||
setmatchdata( "map", level.script );
|
||||
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
var_0 = level.gametype + " hc";
|
||||
setmatchdata( "gametype", var_0 );
|
||||
}
|
||||
else
|
||||
setmatchdata( "gametype", level.gametype );
|
||||
|
||||
setmatchdata( "buildVersion", getbuildversion() );
|
||||
setmatchdata( "buildNumber", getbuildnumber() );
|
||||
setmatchdata( "dateTime", getsystemtime() );
|
||||
setmatchdataid();
|
||||
}
|
||||
|
||||
level.maxlives = 285;
|
||||
level.maxnamelength = 26;
|
||||
level.maxevents = 150;
|
||||
level.maxkillstreaks = 64;
|
||||
level.maxlogclients = 30;
|
||||
level.maxnumchallengesperplayer = 10;
|
||||
level.maxnumawardsperplayer = 10;
|
||||
|
||||
if ( !maps\mp\_utility::is_aliens() )
|
||||
{
|
||||
level thread gameendlistener();
|
||||
level thread endofgamesummarylogger();
|
||||
}
|
||||
}
|
||||
|
||||
getmatchdatetime()
|
||||
{
|
||||
return getmatchdata( "dateTime" );
|
||||
}
|
||||
|
||||
logkillstreakevent( var_0, var_1 )
|
||||
{
|
||||
if ( !canlogclient( self ) || !canlogkillstreak() )
|
||||
return;
|
||||
|
||||
var_2 = getmatchdata( "killstreakCount" );
|
||||
setmatchdata( "killstreakCount", var_2 + 1 );
|
||||
setmatchdata( "killstreaks", var_2, "eventType", var_0 );
|
||||
setmatchdata( "killstreaks", var_2, "player", self.clientid );
|
||||
setmatchdata( "killstreaks", var_2, "eventTime", gettime() );
|
||||
setmatchdata( "killstreaks", var_2, "eventPos", 0, int( var_1[0] ) );
|
||||
setmatchdata( "killstreaks", var_2, "eventPos", 1, int( var_1[1] ) );
|
||||
setmatchdata( "killstreaks", var_2, "eventPos", 2, int( var_1[2] ) );
|
||||
}
|
||||
|
||||
loggameevent( var_0, var_1 )
|
||||
{
|
||||
if ( !canlogclient( self ) || !canlogevent() )
|
||||
return;
|
||||
|
||||
var_2 = getmatchdata( "eventCount" );
|
||||
setmatchdata( "eventCount", var_2 + 1 );
|
||||
setmatchdata( "events", var_2, "eventType", var_0 );
|
||||
setmatchdata( "events", var_2, "player", self.clientid );
|
||||
setmatchdata( "events", var_2, "eventTime", gettime() );
|
||||
setmatchdata( "events", var_2, "eventPos", 0, int( var_1[0] ) );
|
||||
setmatchdata( "events", var_2, "eventPos", 1, int( var_1[1] ) );
|
||||
setmatchdata( "events", var_2, "eventPos", 2, int( var_1[2] ) );
|
||||
}
|
||||
|
||||
logkillevent( var_0, var_1 )
|
||||
{
|
||||
if ( !canloglife( var_0 ) )
|
||||
return;
|
||||
|
||||
setmatchdata( "lives", var_0, "modifiers", var_1, 1 );
|
||||
}
|
||||
|
||||
logmultikill( var_0, var_1 )
|
||||
{
|
||||
if ( !canloglife( var_0 ) )
|
||||
return;
|
||||
|
||||
setmatchdata( "lives", var_0, "multikill", var_1 );
|
||||
}
|
||||
|
||||
logplayerlife()
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
var_0 = level.maxlives;
|
||||
|
||||
if ( self.curclass == "gamemode" )
|
||||
var_0 = self logmatchdatalife( self.clientid, self.spawnpos, self.spawntime, self.wasti );
|
||||
else if ( issubstr( self.curclass, "custom" ) )
|
||||
{
|
||||
var_1 = maps\mp\_utility::getclassindex( self.curclass );
|
||||
var_2 = maps\mp\gametypes\_class::cac_getweapon( var_1, 0 );
|
||||
var_3 = maps\mp\gametypes\_class::cac_getweaponattachment( var_1, 0 );
|
||||
var_4 = maps\mp\gametypes\_class::cac_getweaponattachmenttwo( var_1, 0 );
|
||||
var_5 = maps\mp\gametypes\_class::cac_getweapon( var_1, 1 );
|
||||
var_6 = maps\mp\gametypes\_class::cac_getweaponattachment( var_1, 1 );
|
||||
var_7 = maps\mp\gametypes\_class::cac_getweaponattachmenttwo( var_1, 1 );
|
||||
var_8 = "none";
|
||||
var_9 = maps\mp\gametypes\_class::cac_getperk( var_1, 0 );
|
||||
var_0 = self logmatchdatalife( self.clientid, self.spawnpos, self.spawntime, self.wasti, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
logplayerabilityperks( var_0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1 = maps\mp\_utility::getclassindex( self.curclass );
|
||||
var_2 = maps\mp\gametypes\_class::table_getweapon( level.classtablename, var_1, 0 );
|
||||
var_3 = maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_1, 0, 0 );
|
||||
var_4 = maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_1, 0, 1 );
|
||||
var_5 = maps\mp\gametypes\_class::table_getweapon( level.classtablename, var_1, 1 );
|
||||
var_6 = maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_1, 1, 0 );
|
||||
var_7 = maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_1, 1, 1 );
|
||||
var_8 = maps\mp\gametypes\_class::table_getoffhand( level.classtablename, var_1 );
|
||||
var_9 = maps\mp\gametypes\_class::table_getequipment( level.classtablename, var_1, 0 );
|
||||
var_0 = self logmatchdatalife( self.clientid, self.spawnpos, self.spawntime, self.wasti, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
logplayerabilityperks( var_0 );
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
logplayerabilityperks( var_0 )
|
||||
{
|
||||
if ( getdvarint( "scr_trackPlayerAbilities", 0 ) != 0 )
|
||||
{
|
||||
if ( isdefined( self.abilityflags ) && self.abilityflags.size == 2 )
|
||||
{
|
||||
setmatchdata( "lives", var_0, "abilityFlags", 0, self.abilityflags[0] );
|
||||
setmatchdata( "lives", var_0, "abilityFlags", 1, self.abilityflags[1] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logplayerxp( var_0, var_1 )
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
setmatchdata( "players", self.clientid, var_1, var_0 );
|
||||
}
|
||||
|
||||
logplayerdeath( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
if ( var_0 >= level.maxlives )
|
||||
return;
|
||||
|
||||
if ( isplayer( var_1 ) && canlogclient( var_1 ) )
|
||||
self logmatchdatadeath( var_0, self.clientid, var_1, var_1.clientid, var_4, var_3, maps\mp\_utility::iskillstreakweapon( var_4 ), var_1 maps\mp\_utility::isjuggernaut() );
|
||||
else
|
||||
self logmatchdatadeath( var_0, self.clientid, undefined, undefined, var_4, var_3, maps\mp\_utility::iskillstreakweapon( var_4 ), 0 );
|
||||
}
|
||||
|
||||
logplayerdata()
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
setmatchdata( "players", self.clientid, "score", maps\mp\_utility::getpersstat( "score" ) );
|
||||
|
||||
if ( maps\mp\_utility::getpersstat( "assists" ) > 255 )
|
||||
setmatchdata( "players", self.clientid, "assists", 255 );
|
||||
else
|
||||
setmatchdata( "players", self.clientid, "assists", maps\mp\_utility::getpersstat( "assists" ) );
|
||||
|
||||
if ( maps\mp\_utility::getpersstat( "longestStreak" ) > 255 )
|
||||
setmatchdata( "players", self.clientid, "longestStreak", 255 );
|
||||
else
|
||||
setmatchdata( "players", self.clientid, "longestStreak", maps\mp\_utility::getpersstat( "longestStreak" ) );
|
||||
|
||||
if ( maps\mp\_utility::getpersstat( "validationInfractions" ) > 255 )
|
||||
setmatchdata( "players", self.clientid, "validationInfractions", 255 );
|
||||
else
|
||||
setmatchdata( "players", self.clientid, "validationInfractions", maps\mp\_utility::getpersstat( "validationInfractions" ) );
|
||||
}
|
||||
|
||||
endofgamesummarylogger()
|
||||
{
|
||||
level waittill( "game_ended" );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_1.detectedexploit ) && var_1.detectedexploit && var_1 maps\mp\_utility::rankingenabled() )
|
||||
var_1 setrankedplayerdata( "restXPGoal", var_1.detectedexploit );
|
||||
|
||||
if ( isdefined( var_1.weaponsused ) )
|
||||
{
|
||||
var_1 doublebubblesort();
|
||||
var_2 = 0;
|
||||
|
||||
if ( var_1.weaponsused.size > 3 )
|
||||
{
|
||||
for ( var_3 = var_1.weaponsused.size - 1; var_3 > var_1.weaponsused.size - 3; var_3-- )
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "weaponsUsed", var_2, var_1.weaponsused[var_3] );
|
||||
var_1 setcommonplayerdata( "round", "weaponXpEarned", var_2, var_1.weaponxpearned[var_3] );
|
||||
var_2++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( var_3 = var_1.weaponsused.size - 1; var_3 >= 0; var_3-- )
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "weaponsUsed", var_2, var_1.weaponsused[var_3] );
|
||||
var_1 setcommonplayerdata( "round", "weaponXpEarned", var_2, var_1.weaponxpearned[var_3] );
|
||||
var_2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "weaponsUsed", 0, "none" );
|
||||
var_1 setcommonplayerdata( "round", "weaponsUsed", 1, "none" );
|
||||
var_1 setcommonplayerdata( "round", "weaponsUsed", 2, "none" );
|
||||
var_1 setcommonplayerdata( "round", "weaponXpEarned", 0, 0 );
|
||||
var_1 setcommonplayerdata( "round", "weaponXpEarned", 1, 0 );
|
||||
var_1 setcommonplayerdata( "round", "weaponXpEarned", 2, 0 );
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.operationscompleted ) )
|
||||
var_1 setcommonplayerdata( "round", "operationNumCompleted", var_1.operationscompleted.size );
|
||||
else
|
||||
var_1 setcommonplayerdata( "round", "operationNumCompleted", 0 );
|
||||
|
||||
for ( var_3 = 0; var_3 < 5; var_3++ )
|
||||
{
|
||||
if ( isdefined( var_1.operationscompleted ) && isdefined( var_1.operationscompleted[var_3] ) && var_1.operationscompleted[var_3] != "ch_prestige" && !issubstr( var_1.operationscompleted[var_3], "_daily" ) && !issubstr( var_1.operationscompleted[var_3], "_weekly" ) )
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "operationsCompleted", var_3, var_1.operationscompleted[var_3] );
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 setcommonplayerdata( "round", "operationsCompleted", var_3, "" );
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.challengescompleted ) )
|
||||
var_1 setcommonplayerdata( "round", "challengeNumCompleted", var_1.challengescompleted.size );
|
||||
else
|
||||
var_1 setcommonplayerdata( "round", "challengeNumCompleted", 0 );
|
||||
|
||||
for ( var_3 = 0; var_3 < 20; var_3++ )
|
||||
{
|
||||
if ( isdefined( var_1.challengescompleted ) && isdefined( var_1.challengescompleted[var_3] ) && var_1.challengescompleted[var_3] != "ch_prestige" && !issubstr( var_1.challengescompleted[var_3], "_daily" ) && !issubstr( var_1.challengescompleted[var_3], "_weekly" ) )
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "challengesCompleted", var_3, var_1.challengescompleted[var_3] );
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 setcommonplayerdata( "round", "challengesCompleted", var_3, "" );
|
||||
}
|
||||
|
||||
var_1 setcommonplayerdata( "round", "gameMode", level.gametype );
|
||||
var_1 setcommonplayerdata( "round", "map", tolower( getdvar( "mapname" ) ) );
|
||||
|
||||
if ( issquadsmode() )
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "squadMode", 1 );
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 setcommonplayerdata( "round", "squadMode", 0 );
|
||||
}
|
||||
}
|
||||
|
||||
doublebubblesort()
|
||||
{
|
||||
var_0 = self.weaponxpearned;
|
||||
var_1 = self.weaponxpearned.size;
|
||||
|
||||
for ( var_2 = var_1 - 1; var_2 > 0; var_2-- )
|
||||
{
|
||||
for ( var_3 = 1; var_3 <= var_2; var_3++ )
|
||||
{
|
||||
if ( var_0[var_3 - 1] < var_0[var_3] )
|
||||
{
|
||||
var_4 = self.weaponsused[var_3];
|
||||
self.weaponsused[var_3] = self.weaponsused[var_3 - 1];
|
||||
self.weaponsused[var_3 - 1] = var_4;
|
||||
var_5 = self.weaponxpearned[var_3];
|
||||
self.weaponxpearned[var_3] = self.weaponxpearned[var_3 - 1];
|
||||
self.weaponxpearned[var_3 - 1] = var_5;
|
||||
var_0 = self.weaponxpearned;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gameendlistener()
|
||||
{
|
||||
level waittill( "game_ended" );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
var_1 logplayerdata();
|
||||
|
||||
if ( !isalive( var_1 ) )
|
||||
continue;
|
||||
|
||||
var_1 logplayerlife();
|
||||
}
|
||||
}
|
||||
|
||||
canlogclient( var_0 )
|
||||
{
|
||||
if ( isagent( var_0 ) )
|
||||
return 0;
|
||||
|
||||
return var_0.clientid < level.maxlogclients;
|
||||
}
|
||||
|
||||
canlogevent()
|
||||
{
|
||||
return getmatchdata( "eventCount" ) < level.maxevents;
|
||||
}
|
||||
|
||||
canlogkillstreak()
|
||||
{
|
||||
return getmatchdata( "killstreakCount" ) < level.maxkillstreaks;
|
||||
}
|
||||
|
||||
canloglife( var_0 )
|
||||
{
|
||||
return getmatchdata( "lifeCount" ) < level.maxlives;
|
||||
}
|
||||
|
||||
logweaponstat( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
if ( var_0 == "iw6_pdwauto" )
|
||||
var_0 = "iw6_pdw";
|
||||
else if ( var_0 == "iw6_knifeonlyfast" )
|
||||
var_0 = "iw6_knifeonly";
|
||||
|
||||
if ( maps\mp\_utility::iskillstreakweapon( var_0 ) )
|
||||
return;
|
||||
|
||||
storeweaponandattachmentstats( "weaponStats", var_0, var_1, var_2 );
|
||||
}
|
||||
|
||||
logattachmentstat( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
storeweaponandattachmentstats( "attachmentsStats", var_0, var_1, var_2 );
|
||||
}
|
||||
|
||||
storeweaponandattachmentstats( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = getmatchdata( "players", self.clientid, var_0, var_1, var_2 );
|
||||
var_5 = var_4 + var_3;
|
||||
|
||||
if ( var_2 == "kills" || var_2 == "deaths" || var_2 == "headShots" )
|
||||
{
|
||||
if ( var_5 > 255 )
|
||||
var_5 = 255;
|
||||
}
|
||||
else if ( var_5 > 65535 )
|
||||
var_5 = 65535;
|
||||
|
||||
setmatchdata( "players", self.clientid, var_0, var_1, var_2, var_5 );
|
||||
}
|
||||
|
||||
buildbaseweaponlist()
|
||||
{
|
||||
var_0 = [];
|
||||
var_1 = 149;
|
||||
|
||||
for ( var_2 = 0; var_2 <= var_1; var_2++ )
|
||||
{
|
||||
var_3 = tablelookup( "mp/statstable.csv", 0, var_2, 4 );
|
||||
|
||||
if ( var_3 == "" || var_3 == "uav" || var_3 == "iw6_knifeonlyfast" || var_3 == "laser_designator" || var_3 == "iw6_pdwauto" )
|
||||
continue;
|
||||
|
||||
if ( !issubstr( tablelookup( "mp/statsTable.csv", 0, var_2, 2 ), "weapon_" ) )
|
||||
continue;
|
||||
|
||||
if ( tablelookup( "mp/statsTable.csv", 0, var_2, 2 ) == "weapon_other" )
|
||||
continue;
|
||||
|
||||
var_0[var_0.size] = var_3;
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
logchallenge( var_0, var_1 )
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
if ( issubstr( var_0, "_daily" ) || issubstr( var_0, "_weekly" ) )
|
||||
return;
|
||||
|
||||
var_2 = getmatchdata( "players", self.clientid, "challengeCount" );
|
||||
|
||||
if ( var_2 < level.maxnumchallengesperplayer )
|
||||
{
|
||||
setmatchdata( "players", self.clientid, "challenge", var_2, var_0 );
|
||||
setmatchdata( "players", self.clientid, "tier", var_2, var_1 );
|
||||
setmatchdata( "players", self.clientid, "challengeCount", var_2 + 1 );
|
||||
}
|
||||
}
|
||||
|
||||
logaward( var_0 )
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
var_1 = getmatchdata( "players", self.clientid, "awardCount" );
|
||||
|
||||
if ( var_1 < level.maxnumawardsperplayer )
|
||||
{
|
||||
setmatchdata( "players", self.clientid, "awards", var_1, var_0 );
|
||||
setmatchdata( "players", self.clientid, "awardCount", var_1 + 1 );
|
||||
}
|
||||
}
|
||||
|
||||
logkillsconfirmed()
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
setmatchdata( "players", self.clientid, "killsConfirmed", self.pers["confirmed"] );
|
||||
}
|
||||
|
||||
logkillsdenied()
|
||||
{
|
||||
if ( !canlogclient( self ) )
|
||||
return;
|
||||
|
||||
setmatchdata( "players", self.clientid, "killsDenied", self.pers["denied"] );
|
||||
}
|
||||
|
||||
loginitialstats()
|
||||
{
|
||||
if ( getdvarint( "mdsd" ) > 0 )
|
||||
{
|
||||
setmatchdata( "players", self.clientid, "startXp", self getrankedplayerdata( "experience" ) );
|
||||
setmatchdata( "players", self.clientid, "startKills", self getrankedplayerdata( "kills" ) );
|
||||
setmatchdata( "players", self.clientid, "startDeaths", self getrankedplayerdata( "deaths" ) );
|
||||
setmatchdata( "players", self.clientid, "startWins", self getrankedplayerdata( "wins" ) );
|
||||
setmatchdata( "players", self.clientid, "startLosses", self getrankedplayerdata( "losses" ) );
|
||||
setmatchdata( "players", self.clientid, "startHits", self getrankedplayerdata( "hits" ) );
|
||||
setmatchdata( "players", self.clientid, "startMisses", self getrankedplayerdata( "misses" ) );
|
||||
setmatchdata( "players", self.clientid, "startGamesPlayed", self getrankedplayerdata( "gamesPlayed" ) );
|
||||
setmatchdata( "players", self.clientid, "startTimePlayedTotal", self getrankedplayerdata( "timePlayedTotal" ) );
|
||||
setmatchdata( "players", self.clientid, "startScore", self getrankedplayerdata( "score" ) );
|
||||
setmatchdata( "players", self.clientid, "startUnlockPoints", self getrankedplayerdata( "unlockPoints" ) );
|
||||
setmatchdata( "players", self.clientid, "startPrestige", self getrankedplayerdata( "prestige" ) );
|
||||
|
||||
for ( var_0 = 0; var_0 < 10; var_0++ )
|
||||
setmatchdata( "players", self.clientid, "startCharacterXP", var_0, self getrankedplayerdata( "characterXP", var_0 ) );
|
||||
}
|
||||
}
|
||||
|
||||
logfinalstats()
|
||||
{
|
||||
if ( getdvarint( "mdsd" ) > 0 )
|
||||
{
|
||||
setmatchdata( "players", self.clientid, "endXp", self getrankedplayerdata( "experience" ) );
|
||||
setmatchdata( "players", self.clientid, "endKills", self getrankedplayerdata( "kills" ) );
|
||||
setmatchdata( "players", self.clientid, "endDeaths", self getrankedplayerdata( "deaths" ) );
|
||||
setmatchdata( "players", self.clientid, "endWins", self getrankedplayerdata( "wins" ) );
|
||||
setmatchdata( "players", self.clientid, "endLosses", self getrankedplayerdata( "losses" ) );
|
||||
setmatchdata( "players", self.clientid, "endHits", self getrankedplayerdata( "hits" ) );
|
||||
setmatchdata( "players", self.clientid, "endMisses", self getrankedplayerdata( "misses" ) );
|
||||
setmatchdata( "players", self.clientid, "endGamesPlayed", self getrankedplayerdata( "gamesPlayed" ) );
|
||||
setmatchdata( "players", self.clientid, "endTimePlayedTotal", self getrankedplayerdata( "timePlayedTotal" ) );
|
||||
setmatchdata( "players", self.clientid, "endScore", self getrankedplayerdata( "score" ) );
|
||||
setmatchdata( "players", self.clientid, "endUnlockPoints", self getrankedplayerdata( "unlockPoints" ) );
|
||||
setmatchdata( "players", self.clientid, "endPrestige", self getrankedplayerdata( "prestige" ) );
|
||||
|
||||
for ( var_0 = 0; var_0 < 10; var_0++ )
|
||||
setmatchdata( "players", self.clientid, "endCharacterXP", var_0, self getrankedplayerdata( "characterXP", var_0 ) );
|
||||
}
|
||||
}
|
395
maps/mp/_matchevents.gsc
Normal file
395
maps/mp/_matchevents.gsc
Normal file
@ -0,0 +1,395 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
level.match_events_fx["smoke"] = loadfx( "fx/smoke/smoke_grenade_11sec_mp" );
|
||||
level.match_events_fx["tracer"] = loadfx( "fx/misc/tracer_incoming" );
|
||||
level.match_events_fx["explosion"] = loadfx( "fx/explosions/building_explosion_huge_gulag" );
|
||||
level.matchevents["mortar"] = ::domortar;
|
||||
level.matchevents["smoke"] = ::dosmoke;
|
||||
level.matchevents["airstrike"] = ::doairstrike;
|
||||
level.matchevents["pavelow"] = ::dopavelow;
|
||||
level.matchevents["heli_insertion"] = ::doheliinsertion;
|
||||
level.matchevents["osprey_insertion"] = ::doospreyinsertion;
|
||||
level.matcheventstarted = 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
if ( level.prematchperiod > 0 )
|
||||
{
|
||||
for (;;)
|
||||
level waittill( "connected", var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
level endon( "matchevent_started" );
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
if ( isdefined( level.alliesinsertchopper ) && !level.alliesinsertchopper.droppedoff && level.prematchperiod > 0 && self.team == "allies" )
|
||||
{
|
||||
self playerlinkto( level.alliesinsertchopper );
|
||||
level.alliesinsertchopper.linkedplayers[level.alliesinsertchopper.linkedplayers.size] = self;
|
||||
}
|
||||
else if ( isdefined( level.alliesinsertchopper ) && !level.alliesinsertchopper.droppedoff && level.prematchperiod > 0 && self.team == "axis" )
|
||||
{
|
||||
self playerlinkto( level.axisinsertchopper );
|
||||
level.axisinsertchopper.linkedplayers[level.axisinsertchopper.linkedplayers.size] = self;
|
||||
}
|
||||
}
|
||||
|
||||
getmapcenter()
|
||||
{
|
||||
if ( isdefined( level.mapcenter ) )
|
||||
return level.mapcenter;
|
||||
|
||||
var_0 = getspawnarray( "mp_tdm_spawn_allies_start" );
|
||||
var_1 = getspawnarray( "mp_tdm_spawn_axis_start" );
|
||||
|
||||
if ( isdefined( var_0 ) && isdefined( var_0[0] ) && isdefined( var_1 ) && isdefined( var_1[0] ) )
|
||||
{
|
||||
var_2 = distance( var_0[0].origin, var_1[0].origin ) / 2;
|
||||
var_3 = vectortoangles( var_0[0].origin - var_1[0].origin );
|
||||
var_3 = vectornormalize( var_3 );
|
||||
return var_0[0].origin + var_3 * var_2;
|
||||
}
|
||||
|
||||
return ( 0, 0, 0 );
|
||||
}
|
||||
|
||||
getstartspawns()
|
||||
{
|
||||
var_0 = getspawnarray( "mp_tdm_spawn_allies_start" );
|
||||
var_1 = getspawnarray( "mp_tdm_spawn_axis_start" );
|
||||
|
||||
if ( isdefined( var_0 ) && isdefined( var_0[0] ) && isdefined( var_1 ) && isdefined( var_1[0] ) )
|
||||
{
|
||||
var_2 = [];
|
||||
var_2["axis"] = var_1;
|
||||
var_2["allies"] = var_0;
|
||||
return var_2;
|
||||
}
|
||||
else
|
||||
return undefined;
|
||||
}
|
||||
|
||||
doheliinsertion( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = 1200;
|
||||
var_4 = 1200;
|
||||
var_5 = 1000;
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = "both";
|
||||
|
||||
if ( var_0 == "axis" )
|
||||
thread insertaxisinsertchopper( var_1 );
|
||||
else if ( var_0 == "allies" )
|
||||
thread insertalliesinsertchopper( var_2 );
|
||||
else
|
||||
{
|
||||
thread insertalliesinsertchopper( var_2 );
|
||||
thread insertaxisinsertchopper( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
insertalliesinsertchopper( var_0 )
|
||||
{
|
||||
var_1 = getstartspawns();
|
||||
var_2 = 1200;
|
||||
var_3 = 1200;
|
||||
var_4 = 1000;
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = var_1["allies"][0];
|
||||
|
||||
var_5 = anglestoforward( var_1["allies"][0].angles ) * 300;
|
||||
var_6 = anglestoup( var_1["allies"][0].angles ) * var_2;
|
||||
var_7 = anglestoright( var_1["allies"][0].angles ) * 3200;
|
||||
var_8 = anglestoright( var_1["allies"][0].angles ) * -3200;
|
||||
var_9 = var_1["allies"][0].origin + var_5 + var_6 + var_7;
|
||||
var_10 = var_1["allies"][0].origin + var_5 + var_6 + var_8;
|
||||
var_11 = spawnhelicopter( self, var_9, var_1["allies"][0].angles, "pavelow_mp", "vehicle_pavelow" );
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
return;
|
||||
|
||||
level.alliesinsertchopper = var_11;
|
||||
level.alliesinsertchopper.linkedplayers = [];
|
||||
level.alliesinsertchopper.droppedoff = 0;
|
||||
var_11 vehicle_setspeed( 50, 15 );
|
||||
var_11 setvehgoalpos( var_1["allies"][0].origin + ( 0, 0, var_3 / 2 ), 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 setyawspeed( 0, 1, 1 );
|
||||
var_11 setvehgoalpos( var_1["allies"][0].origin + ( 0, 0, var_3 / 6 ), 1 );
|
||||
var_11 waittill( "goal" );
|
||||
level.alliesinsertchopper.droppedoff = 1;
|
||||
|
||||
foreach ( var_13 in level.alliesinsertchopper.linkedplayers )
|
||||
var_13 unlink();
|
||||
|
||||
wait 2;
|
||||
var_11 setyawspeed( 60, 40, 40, 0.3 );
|
||||
var_11 setvehgoalpos( var_1["allies"][0].origin + ( 0, 0, var_3 ), 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 vehicle_setspeed( 80, 60 );
|
||||
var_11 setvehgoalpos( var_9 + ( 0, 0, var_4 ) + var_7 * 2, 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 vehicle_setspeed( 120, 120 );
|
||||
var_11 setvehgoalpos( var_9 + ( 0, 0, var_4 ) + var_7 * 2 + var_5 * -20, 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 delete();
|
||||
}
|
||||
|
||||
insertaxisinsertchopper( var_0 )
|
||||
{
|
||||
var_1 = getstartspawns();
|
||||
var_2 = 1200;
|
||||
var_3 = 1200;
|
||||
var_4 = 1000;
|
||||
var_5 = anglestoforward( var_1["axis"][0].angles ) * 300;
|
||||
var_6 = anglestoup( var_1["axis"][0].angles ) * var_2;
|
||||
var_7 = anglestoright( var_1["axis"][0].angles ) * 3200;
|
||||
var_8 = anglestoright( var_1["axis"][0].angles ) * -3200;
|
||||
var_9 = var_1["axis"][0].origin + var_5 + var_6 + var_7;
|
||||
var_10 = var_1["axis"][0].origin + var_5 + var_6 + var_8;
|
||||
var_11 = spawnhelicopter( self, var_9, var_1["axis"][0].angles, "pavelow_mp", "vehicle_pavelow" );
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
return;
|
||||
|
||||
level.axisinsertchopper = var_11;
|
||||
level.axisinsertchopper.linkedplayers = [];
|
||||
level.axisinsertchopper.droppedoff = 0;
|
||||
var_11 vehicle_setspeed( 50, 15 );
|
||||
var_11 setvehgoalpos( var_1["axis"][0].origin + ( 0, 0, var_3 / 2 ), 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 setyawspeed( 0, 1, 1 );
|
||||
var_11 setvehgoalpos( var_1["axis"][0].origin + ( 0, 0, var_3 / 6 ), 1 );
|
||||
var_11 waittill( "goal" );
|
||||
level.axisinsertchopper.droppedoff = 1;
|
||||
|
||||
foreach ( var_13 in level.axisinsertchopper.linkedplayers )
|
||||
var_13 unlink();
|
||||
|
||||
wait 2;
|
||||
var_11 setyawspeed( 60, 40, 40, 0.3 );
|
||||
var_11 setvehgoalpos( var_1["axis"][0].origin + ( 0, 0, var_3 ), 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 vehicle_setspeed( 80, 60 );
|
||||
var_11 setvehgoalpos( var_9 + ( 0, 0, var_4 ) + var_7 * 2, 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 vehicle_setspeed( 120, 120 );
|
||||
var_11 setvehgoalpos( var_9 + ( 0, 0, var_4 ) + var_7 * 2 + var_5 * -20, 1 );
|
||||
var_11 waittill( "goal" );
|
||||
var_11 delete();
|
||||
}
|
||||
|
||||
domortar()
|
||||
{
|
||||
var_0 = getmapcenter();
|
||||
var_1 = 1;
|
||||
|
||||
for ( var_2 = 0; var_2 < 5; var_2++ )
|
||||
{
|
||||
var_3 = var_0 + ( randomintrange( 100, 600 ) * var_1, randomintrange( 100, 600 ) * var_1, 0 );
|
||||
var_4 = bullettrace( var_3 + ( 0, 0, 500 ), var_3 - ( 0, 0, 500 ), 0 );
|
||||
|
||||
if ( isdefined( var_4["position"] ) )
|
||||
{
|
||||
playfx( level.match_events_fx["tracer"], var_3 );
|
||||
thread maps\mp\_utility::playsoundinspace( "fast_artillery_round", var_3 );
|
||||
wait( randomfloatrange( 0.5, 1.5 ) );
|
||||
playfx( level.match_events_fx["explosion"], var_3 );
|
||||
playrumbleonposition( "grenade_rumble", var_3 );
|
||||
earthquake( 1.0, 0.6, var_3, 2000 );
|
||||
thread maps\mp\_utility::playsoundinspace( "exp_suitcase_bomb_main", var_3 );
|
||||
physicsexplosionsphere( var_3 + ( 0, 0, 30 ), 250, 125, 2 );
|
||||
var_1 = var_1 * -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dosmoke()
|
||||
{
|
||||
var_0 = getmapcenter();
|
||||
var_1 = 1;
|
||||
|
||||
for ( var_2 = 0; var_2 < 3; var_2++ )
|
||||
{
|
||||
var_3 = var_0 + ( randomintrange( 100, 600 ) * var_1, randomintrange( 100, 600 ) * var_1, 0 );
|
||||
playfx( level.match_events_fx["smoke"], var_3 );
|
||||
var_1 = var_1 * -1;
|
||||
wait 2;
|
||||
}
|
||||
}
|
||||
|
||||
doairstrike()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
var_0 = 1;
|
||||
var_1 = getmapcenter();
|
||||
|
||||
for ( var_2 = 0; var_2 < 3; var_2++ )
|
||||
{
|
||||
var_3 = var_1 + ( randomintrange( 100, 600 ) * var_0, randomintrange( 100, 600 ) * var_0, 0 );
|
||||
var_4 = bullettrace( var_3 + ( 0, 0, 500 ), var_3 - ( 0, 0, 500 ), 0 );
|
||||
|
||||
if ( isdefined( var_4["position"] ) )
|
||||
{
|
||||
thread doairstrikeflyby( var_4["position"] );
|
||||
var_0 = var_0 * -1;
|
||||
wait( randomintrange( 2, 4 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
doairstrikeflyby( var_0 )
|
||||
{
|
||||
var_1 = randomint( level.spawnpoints.size - 1 );
|
||||
var_2 = level.spawnpoints[var_1].origin * ( 1, 1, 0 );
|
||||
var_3 = 8000;
|
||||
var_4 = 8000;
|
||||
var_5 = getent( "airstrikeheight", "targetname" );
|
||||
var_6 = ( 0, 0, var_5.origin[2] + randomintrange( -100, 600 ) );
|
||||
var_7 = anglestoforward( ( 0, randomint( 45 ), 0 ) );
|
||||
var_8 = var_2 + var_6 + var_7 * var_3 * -1;
|
||||
var_9 = var_2 + var_6 + var_7 * var_4;
|
||||
var_10 = var_8 + ( randomintrange( 400, 500 ), randomintrange( 400, 500 ), randomintrange( 200, 300 ) );
|
||||
var_11 = var_9 + ( randomintrange( 400, 500 ), randomintrange( 400, 500 ), randomintrange( 200, 300 ) );
|
||||
var_12 = spawnplane( self, "script_model", var_8 );
|
||||
var_13 = spawnplane( self, "script_model", var_10 );
|
||||
|
||||
if ( common_scripts\utility::cointoss() )
|
||||
{
|
||||
var_12 setmodel( "vehicle_av8b_harrier_jet_mp" );
|
||||
var_13 setmodel( "vehicle_av8b_harrier_jet_mp" );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_12 setmodel( "vehicle_av8b_harrier_jet_opfor_mp" );
|
||||
var_13 setmodel( "vehicle_av8b_harrier_jet_opfor_mp" );
|
||||
}
|
||||
|
||||
var_12.angles = vectortoangles( var_9 - var_8 );
|
||||
var_12 playloopsound( "veh_mig29_dist_loop" );
|
||||
var_12 thread playplanefx();
|
||||
var_13.angles = vectortoangles( var_9 - var_10 );
|
||||
var_13 playloopsound( "veh_mig29_dist_loop" );
|
||||
var_13 thread playplanefx();
|
||||
var_14 = distance( var_8, var_9 );
|
||||
var_12 moveto( var_9 * 2, var_14 / 2000, 0, 0 );
|
||||
wait( randomfloatrange( 0.25, 0.5 ) );
|
||||
var_13 moveto( var_11 * 2, var_14 / 2000, 0, 0 );
|
||||
wait( var_14 / 2000 );
|
||||
var_12 delete();
|
||||
var_13 delete();
|
||||
}
|
||||
|
||||
playplanefx()
|
||||
{
|
||||
self endon( "death" );
|
||||
wait 0.5;
|
||||
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_right" );
|
||||
wait 0.5;
|
||||
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_left" );
|
||||
wait 0.5;
|
||||
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
|
||||
wait 0.5;
|
||||
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
|
||||
}
|
||||
|
||||
dopavelow()
|
||||
{
|
||||
var_0 = getmapcenter();
|
||||
var_1 = bullettrace( var_0 + ( 0, 0, 500 ), var_0 - ( 0, 0, 500 ), 0 );
|
||||
|
||||
if ( isdefined( var_1["position"] ) )
|
||||
{
|
||||
if ( common_scripts\utility::cointoss() )
|
||||
var_2 = "vehicle_pavelow";
|
||||
else
|
||||
var_2 = "vehicle_pavelow_opfor";
|
||||
|
||||
var_3 = spawnhelicopter( self, var_1["position"] + ( 0, 0, 1000 ), ( 0, 0, 0 ), "pavelow_mp", var_2 );
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
return;
|
||||
|
||||
var_3.team = self.pers["team"];
|
||||
var_3.heli_type = level.heli_types[var_2];
|
||||
var_3 thread [[ level.lightfxfunc[level.heli_types[var_2]] ]]();
|
||||
var_3.zoffset = ( 0, 0, var_3 gettagorigin( "tag_origin" )[2] - var_3 gettagorigin( "tag_ground" )[2] );
|
||||
wait 1;
|
||||
playfxontag( level.chopper_fx["damage"]["on_fire"], var_3, "tag_engine_left" );
|
||||
var_3 thread maps\mp\killstreaks\_helicopter::heli_crash();
|
||||
}
|
||||
}
|
||||
|
||||
doospreyinsertion()
|
||||
{
|
||||
var_0 = getstartspawns();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_1 = 200;
|
||||
var_2 = 200;
|
||||
var_3 = 1000;
|
||||
var_4 = anglestoforward( var_0["allies"][0].angles ) * 300;
|
||||
var_5 = anglestoup( var_0["allies"][0].angles ) * var_1;
|
||||
var_6 = var_0["allies"][0].origin + var_4 + var_5;
|
||||
var_7 = spawnhelicopter( self, var_6, var_0["allies"][0].angles, "osprey_minigun_mp", "vehicle_v22_osprey_body_mp" );
|
||||
|
||||
if ( !isdefined( var_7 ) )
|
||||
return;
|
||||
|
||||
var_8 = anglestoforward( var_0["axis"][0].angles ) * 300;
|
||||
var_9 = anglestoup( var_0["axis"][0].angles ) * var_1;
|
||||
var_10 = var_0["axis"][0].origin + var_8 + var_9;
|
||||
var_11 = spawnhelicopter( self, var_10, var_0["axis"][0].angles, "osprey_minigun_mp", "vehicle_v22_osprey_body_mp" );
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
{
|
||||
var_7 delete();
|
||||
return;
|
||||
}
|
||||
|
||||
var_7 thread maps\mp\killstreaks\_escortairdrop::airshippitchpropsup();
|
||||
var_11 thread maps\mp\killstreaks\_escortairdrop::airshippitchpropsup();
|
||||
var_7 thread maps\mp\killstreaks\_escortairdrop::airshippitchhatchdown();
|
||||
var_11 thread maps\mp\killstreaks\_escortairdrop::airshippitchhatchdown();
|
||||
var_7 vehicle_setspeed( 20, 10 );
|
||||
var_7 setyawspeed( 3, 3, 3, 0.3 );
|
||||
var_7 setvehgoalpos( var_6 + ( 0, 0, var_2 ), 1 );
|
||||
var_11 vehicle_setspeed( 20, 10 );
|
||||
var_11 setyawspeed( 3, 3, 3, 0.3 );
|
||||
var_11 setvehgoalpos( var_10 + ( 0, 0, var_2 ), 1 );
|
||||
var_7 waittill( "goal" );
|
||||
var_7 thread maps\mp\killstreaks\_escortairdrop::airshippitchhatchup();
|
||||
var_11 thread maps\mp\killstreaks\_escortairdrop::airshippitchhatchup();
|
||||
wait 2;
|
||||
var_7 vehicle_setspeed( 80, 60 );
|
||||
var_7 setyawspeed( 30, 15, 15, 0.3 );
|
||||
var_7 setvehgoalpos( var_6 + ( 0, 0, var_3 ), 1 );
|
||||
var_11 vehicle_setspeed( 80, 60 );
|
||||
var_11 setyawspeed( 30, 15, 15, 0.3 );
|
||||
var_11 setvehgoalpos( var_10 + ( 0, 0, var_3 ), 1 );
|
||||
var_7 waittill( "goal" );
|
||||
var_7 thread maps\mp\killstreaks\_escortairdrop::airshippitchpropsdown();
|
||||
var_11 thread maps\mp\killstreaks\_escortairdrop::airshippitchpropsdown();
|
||||
var_7 vehicle_setspeed( 120, 120 );
|
||||
var_7 setyawspeed( 100, 100, 40, 0.3 );
|
||||
var_7 setvehgoalpos( var_6 + ( 0, 0, var_3 ) + var_4 * -20, 1 );
|
||||
var_11 vehicle_setspeed( 120, 120 );
|
||||
var_11 setyawspeed( 100, 100, 40, 0.3 );
|
||||
var_11 setvehgoalpos( var_10 + ( 0, 0, var_3 ) + var_8 * -20, 1 );
|
||||
var_7 waittill( "goal" );
|
||||
var_7 delete();
|
||||
var_11 delete();
|
||||
}
|
||||
}
|
7
maps/mp/_menus.gsc
Normal file
7
maps/mp/_menus.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
|
||||
}
|
45
maps/mp/_minefields.gsc
Normal file
45
maps/mp/_minefields.gsc
Normal file
@ -0,0 +1,45 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
minefields()
|
||||
{
|
||||
var_0 = getentarray( "minefield", "targetname" );
|
||||
|
||||
if ( var_0.size > 0 )
|
||||
level._effect["mine_explosion"] = loadfx( "vfx/gameplay/explosions/weap/gre/vfx_exp_gre_dirt_cg" );
|
||||
|
||||
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
|
||||
var_0[var_1] thread minefield_think();
|
||||
}
|
||||
|
||||
minefield_think()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "trigger", var_0 );
|
||||
|
||||
if ( isplayer( var_0 ) )
|
||||
var_0 thread minefield_kill( self );
|
||||
}
|
||||
}
|
||||
|
||||
minefield_kill( var_0 )
|
||||
{
|
||||
if ( isdefined( self.minefield ) )
|
||||
return;
|
||||
|
||||
self.minefield = 1;
|
||||
wait 0.5;
|
||||
wait( randomfloat( 0.5 ) );
|
||||
|
||||
if ( isdefined( self ) && self istouching( var_0 ) )
|
||||
{
|
||||
var_1 = self getorigin();
|
||||
var_2 = 300;
|
||||
var_3 = 2000;
|
||||
var_4 = 50;
|
||||
radiusdamage( var_1, var_2, var_3, var_4 );
|
||||
}
|
||||
|
||||
self.minefield = undefined;
|
||||
}
|
643
maps/mp/_movable_cover.gsc
Normal file
643
maps/mp/_movable_cover.gsc
Normal file
@ -0,0 +1,643 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
if ( getdvar( "r_reflectionProbeGenerate" ) == "1" )
|
||||
return;
|
||||
|
||||
movable_cover_precache();
|
||||
common_scripts\utility::waitframe();
|
||||
var_0 = getentarray( "movable_cover", "targetname" );
|
||||
var_1 = common_scripts\utility::getstructarray( "movable_cover", "targetname" );
|
||||
|
||||
foreach ( var_3 in var_1 )
|
||||
{
|
||||
if ( isdefined( var_3.target ) )
|
||||
{
|
||||
var_4 = getent( var_3.target, "targetname" );
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
var_0[var_0.size] = var_4;
|
||||
}
|
||||
}
|
||||
|
||||
common_scripts\utility::array_thread( var_0, ::movable_cover_init );
|
||||
}
|
||||
|
||||
movable_cover_precache()
|
||||
{
|
||||
level.movable_cover_use_icons = [];
|
||||
level.movable_cover_use_icons["dumpster"] = "hud_icon_push";
|
||||
level.movable_cover_move_sounds = [];
|
||||
level.movable_cover_move_sounds["dumpster"]["start"] = "mp_dumpster_start";
|
||||
level.movable_cover_move_sounds["dumpster"]["move"] = "mp_dumpster_mvmt_loop";
|
||||
level.movable_cover_move_sounds["dumpster"]["stop"] = "mp_dumpster_end";
|
||||
level.movable_cover_move_anim = [];
|
||||
level.movable_cover_move_anim["dumpster"] = [];
|
||||
level.movable_cover_move_anim["dumpster"]["move"] = "mp_lonestar_dumpster_jitter";
|
||||
level.movable_cover_move_anim["dumpster"]["idle"] = "mp_lonestar_dumpster_jitter_idle";
|
||||
level.movable_cover_default_parameters = [];
|
||||
level.movable_cover_default_parameters["dumpster"] = "goal_radius=1;max_speed=80;accel_time=.8;decel_time=.8;stances=crouch,stand";
|
||||
|
||||
foreach ( var_1 in level.movable_cover_move_anim )
|
||||
{
|
||||
foreach ( var_3 in var_1 )
|
||||
precachempanim( var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_init()
|
||||
{
|
||||
self.moving = 0;
|
||||
self.stay = 0;
|
||||
self.updatepaths = self.spawnflags & 1;
|
||||
self.movable_type = "default";
|
||||
|
||||
if ( isdefined( self.script_noteworthy ) )
|
||||
self.movable_type = self.script_noteworthy;
|
||||
|
||||
movable_cover_parse_parameters();
|
||||
var_0 = [];
|
||||
var_1 = common_scripts\utility::get_links();
|
||||
|
||||
foreach ( var_3 in var_1 )
|
||||
{
|
||||
var_4 = common_scripts\utility::getstruct( var_3, "script_linkname" );
|
||||
|
||||
if ( isdefined( var_4 ) && isdefined( var_4.script_label ) )
|
||||
{
|
||||
var_4.auto = isdefined( var_4.script_parameters ) && var_4.script_parameters == "auto";
|
||||
var_4.stay = isdefined( var_4.script_parameters ) && var_4.script_parameters == "stay";
|
||||
var_0[var_4.script_label] = var_4;
|
||||
}
|
||||
}
|
||||
|
||||
var_6 = [];
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
var_7 = common_scripts\utility::getstructarray( self.target, "targetname" );
|
||||
var_8 = getentarray( self.target, "targetname" );
|
||||
var_6 = common_scripts\utility::array_combine( var_7, var_8 );
|
||||
}
|
||||
|
||||
var_9 = self;
|
||||
var_10 = undefined;
|
||||
|
||||
if ( isdefined( level.movable_cover_move_anim[self.movable_type] ) )
|
||||
{
|
||||
self.animate_ent = spawn( "script_model", self.origin );
|
||||
self.animate_ent setmodel( "generic_prop_raven" );
|
||||
self.animate_ent.angles = self.angles;
|
||||
self.animate_ent linkto( self );
|
||||
var_9 = self.animate_ent;
|
||||
var_10 = "j_prop_1";
|
||||
}
|
||||
|
||||
self.linked_ents = [];
|
||||
|
||||
foreach ( var_12 in var_6 )
|
||||
{
|
||||
if ( !isdefined( var_12.script_noteworthy ) )
|
||||
continue;
|
||||
|
||||
switch ( var_12.script_noteworthy )
|
||||
{
|
||||
case "move_trigger":
|
||||
if ( !isdefined( var_12.script_label ) || !isdefined( var_0[var_12.script_label] ) )
|
||||
break;
|
||||
|
||||
var_12 enablelinkto();
|
||||
var_12 linkto( self );
|
||||
thread movable_cover_trigger( var_12, var_0[var_12.script_label] );
|
||||
thread movable_cover_update_use_icon( var_12, var_0[var_12.script_label] );
|
||||
break;
|
||||
case "link":
|
||||
self.linked_ents[self.linked_ents.size] = var_12;
|
||||
break;
|
||||
case "angels":
|
||||
if ( isdefined( var_12.angles ) && isdefined( self.animate_ent ) )
|
||||
self.animate_ent.angles = var_12.angles;
|
||||
|
||||
break;
|
||||
case "mantlebrush":
|
||||
self.linked_ents[self.linked_ents.size] = var_12;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( var_15 in self.linked_ents )
|
||||
{
|
||||
if ( isdefined( var_10 ) )
|
||||
{
|
||||
var_15 linkto( var_9, var_10 );
|
||||
continue;
|
||||
}
|
||||
|
||||
var_15 linkto( var_9 );
|
||||
}
|
||||
|
||||
var_17 = maps\mp\_utility::getlinknamenodes();
|
||||
self.traverse_nodes = [];
|
||||
|
||||
foreach ( var_19 in var_17 )
|
||||
{
|
||||
if ( !isdefined( var_19.type ) )
|
||||
continue;
|
||||
|
||||
var_19.node_type = var_19.script_noteworthy;
|
||||
|
||||
if ( !isdefined( var_19.node_type ) )
|
||||
var_19.node_type = "closest";
|
||||
|
||||
var_20 = 0;
|
||||
|
||||
switch ( var_19.node_type )
|
||||
{
|
||||
case "closest":
|
||||
var_20 = 1;
|
||||
break;
|
||||
case "radius2d":
|
||||
case "radius3d":
|
||||
case "radius":
|
||||
if ( isdefined( var_19.target ) )
|
||||
{
|
||||
var_12 = common_scripts\utility::getstruct( var_19.target, "targetname" );
|
||||
|
||||
if ( isdefined( var_12 ) && isdefined( var_12.radius ) )
|
||||
{
|
||||
var_19.test_origin = var_12.origin;
|
||||
var_19.test_radius = var_12.radius;
|
||||
var_20 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
var_20 = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( !var_20 )
|
||||
continue;
|
||||
|
||||
if ( var_19.type == "Begin" || var_19.type == "End" )
|
||||
{
|
||||
if ( var_19.type == "Begin" )
|
||||
var_19.connected_nodes = getnodearray( var_19.target, "targetname" );
|
||||
else
|
||||
var_19.connected_nodes = getnodearray( var_19.targetname, "target" );
|
||||
|
||||
foreach ( var_22 in var_19.connected_nodes )
|
||||
disconnectnodepair( var_19, var_22 );
|
||||
|
||||
self.traverse_nodes[self.traverse_nodes.size] = var_19;
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_connect_traversals();
|
||||
}
|
||||
|
||||
movable_cover_set_user( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( self.user ) && isdefined( var_0 ) )
|
||||
self notify( "new_user" );
|
||||
else if ( isdefined( self.user ) && isdefined( var_0 ) && self.user != var_0 )
|
||||
self notify( "new_user" );
|
||||
else if ( isdefined( self.user ) && !isdefined( var_0 ) )
|
||||
self notify( "clear_user" );
|
||||
|
||||
self.user = var_0;
|
||||
self.user_trigger = var_1;
|
||||
}
|
||||
|
||||
movable_cover_update_use_icon( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( level.movable_cover_use_icons[self.movable_type] ) )
|
||||
return;
|
||||
|
||||
while ( !isdefined( level.players ) )
|
||||
{
|
||||
common_scripts\utility::waitframe();
|
||||
continue;
|
||||
}
|
||||
|
||||
var_2 = 100;
|
||||
var_3 = var_2 * var_2;
|
||||
var_4 = var_0 getentitynumber();
|
||||
var_5 = "trigger_" + var_4;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
foreach ( var_7 in level.players )
|
||||
{
|
||||
if ( !isdefined( var_7.movable_cover_huds ) )
|
||||
var_7.movable_cover_huds = [];
|
||||
|
||||
var_8 = distancesquared( var_7.origin + ( 0, 0, 30 ), var_0.origin );
|
||||
|
||||
if ( var_8 <= var_3 && !movable_cover_at_goal( var_1.origin ) )
|
||||
{
|
||||
if ( !isdefined( var_7.movable_cover_huds[var_5] ) )
|
||||
{
|
||||
var_7.movable_cover_huds[var_5] = movable_cover_use_icon( var_7, var_0 );
|
||||
var_7.movable_cover_huds[var_5].alpha = 0;
|
||||
}
|
||||
|
||||
var_7.movable_cover_huds[var_5] notify( "stop_fade" );
|
||||
var_7.movable_cover_huds[var_5] thread movable_cover_fade_in_use_icon();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( var_7.movable_cover_huds[var_5] ) )
|
||||
var_7.movable_cover_huds[var_5] thread movable_cover_fade_out_use_icon();
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_fade_in_use_icon()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
if ( self.alpha == 1 )
|
||||
return;
|
||||
|
||||
self fadeovertime( 0.5 );
|
||||
self.alpha = 1;
|
||||
}
|
||||
|
||||
movable_cover_fade_out_use_icon()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_fade" );
|
||||
|
||||
if ( self.alpha == 0 )
|
||||
return;
|
||||
|
||||
var_0 = 0.5;
|
||||
self fadeovertime( var_0 );
|
||||
self.alpha = 0;
|
||||
wait( var_0 );
|
||||
self destroy();
|
||||
}
|
||||
|
||||
movable_cover_use_icon( var_0, var_1 )
|
||||
{
|
||||
var_2 = var_0 maps\mp\gametypes\_hud_util::createicon( level.movable_cover_use_icons[self.movable_type], 16, 16 );
|
||||
var_2 setwaypoint( 1, 0 );
|
||||
var_2 settargetent( var_1 );
|
||||
var_2.fading = 0;
|
||||
return var_2;
|
||||
}
|
||||
|
||||
movable_cover_parse_parameters()
|
||||
{
|
||||
self.goal_radius = 1;
|
||||
self.max_speed = 50;
|
||||
self.accel_time = 1;
|
||||
self.decel_time = 1;
|
||||
self.requires_push = 1;
|
||||
self.start_delay = 0.2;
|
||||
self.stances = [ "stand", "crouch" ];
|
||||
|
||||
if ( !isdefined( self.script_parameters ) )
|
||||
self.script_parameters = "";
|
||||
|
||||
var_0 = level.movable_cover_default_parameters[self.movable_type];
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
self.script_parameters = var_0 + self.script_parameters;
|
||||
|
||||
var_1 = strtok( self.script_parameters, ";" );
|
||||
|
||||
foreach ( var_3 in var_1 )
|
||||
{
|
||||
var_4 = strtok( var_3, "=" );
|
||||
|
||||
if ( var_4.size != 2 )
|
||||
continue;
|
||||
|
||||
switch ( var_4[0] )
|
||||
{
|
||||
case "goal_radius":
|
||||
self.goal_radius = float( var_4[1] );
|
||||
self.goal_radius = max( 1, self.goal_radius );
|
||||
break;
|
||||
case "max_speed":
|
||||
self.max_speed = float( var_4[1] );
|
||||
break;
|
||||
case "accel_time":
|
||||
self.accel_time = float( var_4[1] );
|
||||
break;
|
||||
case "decel_time":
|
||||
self.decel_time = float( var_4[1] );
|
||||
self.decel_time = max( 0.05, self.decel_time );
|
||||
break;
|
||||
case "stances":
|
||||
self.stances = strtok( var_4[1], "," );
|
||||
break;
|
||||
case "requires_push":
|
||||
self.requires_push = int( var_4[1] );
|
||||
break;
|
||||
case "start_delay":
|
||||
self.start_delay = float( var_4[1] );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_trigger( var_0, var_1 )
|
||||
{
|
||||
var_2 = var_1.auto;
|
||||
var_3 = var_1.stay;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = undefined;
|
||||
|
||||
if ( var_2 && !self.stay )
|
||||
{
|
||||
common_scripts\utility::waitframe();
|
||||
|
||||
if ( isdefined( self.user ) && self.user_trigger != var_0 )
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
movable_cover_set_user( undefined, undefined );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 waittill( "trigger", var_4 );
|
||||
|
||||
if ( isplayer( var_4 ) )
|
||||
break;
|
||||
}
|
||||
|
||||
movable_cover_set_user( var_4, var_0 );
|
||||
}
|
||||
|
||||
if ( movable_cover_at_goal( var_1.origin ) )
|
||||
continue;
|
||||
|
||||
var_5 = vectornormalize( var_1.origin - self.origin );
|
||||
|
||||
if ( !var_2 && !movable_cover_move_delay( self.start_delay, var_4, var_0, var_5 ) )
|
||||
continue;
|
||||
|
||||
var_6 = distance( self.origin, var_1.origin );
|
||||
var_7 = var_6 / self.max_speed;
|
||||
|
||||
if ( var_2 && self.stay && !isdefined( self.user ) )
|
||||
continue;
|
||||
|
||||
if ( self.moving )
|
||||
continue;
|
||||
|
||||
if ( self.updatepaths )
|
||||
self connectpaths();
|
||||
|
||||
movable_cover_disconnect_traversals();
|
||||
self.moving = 1;
|
||||
self.stay = 0;
|
||||
self notify( "move_start" );
|
||||
var_8 = gettime();
|
||||
var_9 = min( var_7, self.accel_time );
|
||||
|
||||
if ( var_2 )
|
||||
var_9 = var_7;
|
||||
|
||||
var_10 = movable_cover_get_sound( "start" );
|
||||
|
||||
if ( isdefined( var_10 ) )
|
||||
self playsound( var_10 );
|
||||
|
||||
var_11 = movable_cover_get_sound( "move" );
|
||||
|
||||
if ( isdefined( var_11 ) )
|
||||
self playloopsound( var_11 );
|
||||
|
||||
if ( isdefined( self.animate_ent ) && isdefined( level.movable_cover_move_anim[self.movable_type]["move"] ) )
|
||||
self.animate_ent scriptmodelplayanim( level.movable_cover_move_anim[self.movable_type]["move"] );
|
||||
|
||||
self moveto( var_1.origin, var_7, var_9 );
|
||||
|
||||
if ( var_2 )
|
||||
movable_cover_wait_for_user_or_timeout( var_7 );
|
||||
else
|
||||
{
|
||||
while ( movable_cover_is_pushed( var_4, var_0, var_5 ) && !movable_cover_at_goal( var_1.origin ) )
|
||||
wait 0.05;
|
||||
|
||||
movable_cover_set_user( undefined, undefined );
|
||||
}
|
||||
|
||||
if ( !movable_cover_at_goal( var_1.origin ) )
|
||||
{
|
||||
var_12 = movable_cover_calc_move_speed_scale( ( gettime() - var_8 ) / 1000, var_7, var_9 );
|
||||
var_13 = self.max_speed * var_12;
|
||||
var_6 = distance( self.origin, var_1.origin );
|
||||
var_14 = var_6;
|
||||
|
||||
if ( var_13 > 0 )
|
||||
var_14 = min( var_6, var_13 * self.decel_time );
|
||||
|
||||
var_7 = 2 * var_14 / self.max_speed;
|
||||
self moveto( self.origin + var_14 * var_5, var_7, 0, var_7 );
|
||||
wait( var_7 );
|
||||
}
|
||||
|
||||
self stoploopsound();
|
||||
var_15 = movable_cover_get_sound( "stop" );
|
||||
|
||||
if ( isdefined( var_15 ) )
|
||||
self playsound( var_15 );
|
||||
|
||||
if ( isdefined( self.animate_ent ) && isdefined( level.movable_cover_move_anim[self.movable_type]["idle"] ) )
|
||||
self.animate_ent scriptmodelplayanim( level.movable_cover_move_anim[self.movable_type]["idle"] );
|
||||
|
||||
if ( var_3 && movable_cover_at_goal( var_1.origin ) )
|
||||
self.stay = 1;
|
||||
|
||||
if ( self.updatepaths )
|
||||
self disconnectpaths();
|
||||
|
||||
movable_cover_connect_traversals();
|
||||
self.moving = 0;
|
||||
self notify( "move_end" );
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_connect_traversals()
|
||||
{
|
||||
movable_cover_disconnect_traversals();
|
||||
|
||||
foreach ( var_1 in self.traverse_nodes )
|
||||
{
|
||||
switch ( var_1.node_type )
|
||||
{
|
||||
case "closest":
|
||||
var_1.connected_to = common_scripts\utility::getclosest( var_1.origin, var_1.connected_nodes );
|
||||
break;
|
||||
case "radius3d":
|
||||
case "radius":
|
||||
var_2 = distance( var_1.origin, var_1.test_origin );
|
||||
|
||||
if ( var_2 <= var_1.test_radius )
|
||||
var_1.connected_to = var_1.connected_nodes[0];
|
||||
|
||||
break;
|
||||
case "radius2d":
|
||||
var_3 = distance2d( var_1.origin, var_1.test_origin );
|
||||
|
||||
if ( var_3 <= var_1.test_radius )
|
||||
var_1.connected_to = var_1.connected_nodes[0];
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isdefined( var_1.connected_to ) )
|
||||
connectnodepair( var_1, var_1.connected_to );
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_disconnect_traversals()
|
||||
{
|
||||
foreach ( var_1 in self.traverse_nodes )
|
||||
{
|
||||
if ( isdefined( var_1.connected_to ) )
|
||||
{
|
||||
disconnectnodepair( var_1, var_1.connected_to );
|
||||
var_1.connected_to = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_get_sound( var_0 )
|
||||
{
|
||||
if ( !isdefined( level.movable_cover_move_sounds[self.movable_type] ) )
|
||||
return undefined;
|
||||
|
||||
return level.movable_cover_move_sounds[self.movable_type][var_0];
|
||||
}
|
||||
|
||||
movable_cover_wait_for_user_or_timeout( var_0 )
|
||||
{
|
||||
self endon( "new_user" );
|
||||
wait( var_0 );
|
||||
}
|
||||
|
||||
movable_cover_calc_move_speed_scale( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = 0;
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
var_3 = 0;
|
||||
|
||||
if ( var_0 >= var_1 || var_0 <= 0 )
|
||||
return 0;
|
||||
else if ( var_0 < var_2 )
|
||||
return 1 - ( var_2 - var_0 ) / var_2;
|
||||
else if ( var_0 > var_1 - var_3 )
|
||||
return 1 - ( var_0 - ( var_1 - var_3 ) ) / var_3;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
movable_cover_is_pushed( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) || !maps\mp\_utility::isreallyalive( var_0 ) || !isplayer( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( !movable_cover_is_touched( var_1, var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( var_0 ismantling() )
|
||||
return 0;
|
||||
|
||||
var_3 = var_0 getstance();
|
||||
|
||||
if ( !common_scripts\utility::array_contains( self.stances, var_3 ) )
|
||||
return 0;
|
||||
|
||||
if ( self.requires_push )
|
||||
{
|
||||
var_4 = var_0 getnormalizedmovement();
|
||||
var_4 = rotatevector( var_4, -1 * var_0.angles );
|
||||
var_4 = vectornormalize( ( var_4[0], -1 * var_4[1], 0 ) );
|
||||
var_5 = vectordot( var_2, var_4 );
|
||||
return var_5 > 0.2;
|
||||
}
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
movable_cover_is_touched( var_0, var_1 )
|
||||
{
|
||||
return isdefined( var_1 ) && maps\mp\_utility::isreallyalive( var_1 ) && var_1 istouching( var_0 );
|
||||
}
|
||||
|
||||
movable_cover_move_delay( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = var_0 * 1000 + gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( var_1 ) || !maps\mp\_utility::isreallyalive( var_1 ) )
|
||||
return 0;
|
||||
|
||||
if ( var_1 ismantling() )
|
||||
return 0;
|
||||
|
||||
if ( !movable_cover_is_pushed( var_1, var_2, var_3 ) )
|
||||
return 0;
|
||||
|
||||
if ( self.moving )
|
||||
return 0;
|
||||
|
||||
if ( gettime() >= var_4 )
|
||||
return 1;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
movable_cover_at_goal( var_0 )
|
||||
{
|
||||
var_1 = distancesquared( self.origin, var_0 );
|
||||
return var_1 <= self.goal_radius * self.goal_radius;
|
||||
}
|
||||
|
||||
movable_cover_mantlebrush_think( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "move_start" );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_0.old_contents = var_0 setcontents( 0 );
|
||||
var_0 hide();
|
||||
}
|
||||
|
||||
self waittill( "move_end" );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_0 show();
|
||||
var_0 setcontents( var_0.old_contents );
|
||||
}
|
||||
}
|
||||
}
|
996
maps/mp/_movers.gsc
Normal file
996
maps/mp/_movers.gsc
Normal file
@ -0,0 +1,996 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
if ( getdvar( "r_reflectionProbeGenerate" ) == "1" )
|
||||
return;
|
||||
|
||||
level.script_mover_defaults = [];
|
||||
level.script_mover_defaults["move_time"] = 5;
|
||||
level.script_mover_defaults["accel_time"] = 0;
|
||||
level.script_mover_defaults["decel_time"] = 0;
|
||||
level.script_mover_defaults["wait_time"] = 0;
|
||||
level.script_mover_defaults["delay_time"] = 0;
|
||||
level.script_mover_defaults["usable"] = 0;
|
||||
level.script_mover_defaults["hintstring"] = "activate";
|
||||
script_mover_add_hintstring( "activate", &"MP_ACTIVATE_MOVER" );
|
||||
script_mover_add_parameters( "none", "" );
|
||||
level.script_mover_named_goals = [];
|
||||
common_scripts\utility::waitframe();
|
||||
var_0 = [];
|
||||
var_1 = script_mover_classnames();
|
||||
|
||||
foreach ( var_3 in var_1 )
|
||||
var_0 = common_scripts\utility::array_combine( var_0, getentarray( var_3, "classname" ) );
|
||||
|
||||
common_scripts\utility::array_thread( var_0, ::script_mover_int );
|
||||
}
|
||||
|
||||
script_mover_classnames()
|
||||
{
|
||||
return [ "script_model_mover", "script_brushmodel_mover" ];
|
||||
}
|
||||
|
||||
script_mover_is_script_mover()
|
||||
{
|
||||
if ( isdefined( self.script_mover ) )
|
||||
return self.script_mover;
|
||||
|
||||
var_0 = script_mover_classnames();
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
if ( self.classname == var_2 )
|
||||
{
|
||||
self.script_mover = 1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
script_mover_add_hintstring( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( level.script_mover_hintstrings ) )
|
||||
level.script_mover_hintstrings = [];
|
||||
|
||||
level.script_mover_hintstrings[var_0] = var_1;
|
||||
}
|
||||
|
||||
script_mover_add_parameters( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( level.script_mover_parameters ) )
|
||||
level.script_mover_parameters = [];
|
||||
|
||||
level.script_mover_parameters[var_0] = var_1;
|
||||
}
|
||||
|
||||
script_mover_int()
|
||||
{
|
||||
if ( !isdefined( self.target ) )
|
||||
return;
|
||||
|
||||
self.script_mover = 1;
|
||||
self.moving = 0;
|
||||
self.origin_ent = self;
|
||||
self.use_triggers = [];
|
||||
self.linked_ents = [];
|
||||
var_0 = common_scripts\utility::getstructarray( self.target, "targetname" );
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
if ( !isdefined( var_2.script_noteworthy ) )
|
||||
continue;
|
||||
|
||||
switch ( var_2.script_noteworthy )
|
||||
{
|
||||
case "origin":
|
||||
if ( !isdefined( var_2.angles ) )
|
||||
var_2.angles = ( 0, 0, 0 );
|
||||
|
||||
self.origin_ent = spawn( "script_model", var_2.origin );
|
||||
self.origin_ent.angles = var_2.angles;
|
||||
self.origin_ent setmodel( "tag_origin" );
|
||||
self.origin_ent linkto( self );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var_4 = getentarray( self.target, "targetname" );
|
||||
|
||||
foreach ( var_2 in var_4 )
|
||||
{
|
||||
if ( !isdefined( var_2.script_noteworthy ) )
|
||||
continue;
|
||||
|
||||
switch ( var_2.script_noteworthy )
|
||||
{
|
||||
case "use_trigger_link":
|
||||
var_2 enablelinkto();
|
||||
var_2 linkto( self );
|
||||
case "use_trigger":
|
||||
var_2 script_mover_parse_targets();
|
||||
thread script_mover_use_trigger( var_2 );
|
||||
self.use_triggers[self.use_triggers.size] = var_2;
|
||||
break;
|
||||
case "link":
|
||||
var_2 linkto( self );
|
||||
self.linked_ents[self.linked_ents.size] = var_2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
thread script_mover_parse_targets();
|
||||
thread script_mover_init_move_parameters();
|
||||
thread script_mover_save_default_move_parameters();
|
||||
thread script_mover_apply_move_parameters( self );
|
||||
thread script_mover_move_to_target();
|
||||
|
||||
foreach ( var_8 in self.use_triggers )
|
||||
script_mover_set_usable( var_8, 1 );
|
||||
}
|
||||
|
||||
script_mover_use_trigger( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 waittill( "trigger" );
|
||||
|
||||
if ( var_0.goals.size > 0 )
|
||||
{
|
||||
self notify( "new_path" );
|
||||
thread script_mover_move_to_target( var_0 );
|
||||
continue;
|
||||
}
|
||||
|
||||
self notify( "trigger" );
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_move_to_named_goal( var_0 )
|
||||
{
|
||||
if ( isdefined( level.script_mover_named_goals[var_0] ) )
|
||||
{
|
||||
self notify( "new_path" );
|
||||
self.goals = [ level.script_mover_named_goals[var_0] ];
|
||||
thread script_mover_move_to_target();
|
||||
}
|
||||
}
|
||||
|
||||
anglesclamp180( var_0 )
|
||||
{
|
||||
return ( angleclamp180( var_0[0] ), angleclamp180( var_0[1] ), angleclamp180( var_0[2] ) );
|
||||
}
|
||||
|
||||
script_mover_parse_targets()
|
||||
{
|
||||
if ( isdefined( self.parsed ) && self.parsed )
|
||||
return;
|
||||
|
||||
self.parsed = 1;
|
||||
self.goals = [];
|
||||
self.movers = [];
|
||||
self.level_notify = [];
|
||||
var_0 = [];
|
||||
var_1 = [];
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
var_0 = common_scripts\utility::getstructarray( self.target, "targetname" );
|
||||
var_1 = getentarray( self.target, "targetname" );
|
||||
}
|
||||
|
||||
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
|
||||
{
|
||||
var_3 = var_0[var_2];
|
||||
|
||||
if ( !isdefined( var_3.script_noteworthy ) )
|
||||
var_3.script_noteworthy = "goal";
|
||||
|
||||
switch ( var_3.script_noteworthy )
|
||||
{
|
||||
case "ignore":
|
||||
if ( isdefined( var_3.target ) )
|
||||
{
|
||||
var_4 = common_scripts\utility::getstructarray( var_3.target, "targetname" );
|
||||
|
||||
foreach ( var_6 in var_4 )
|
||||
var_0[var_0.size] = var_6;
|
||||
}
|
||||
|
||||
break;
|
||||
case "goal":
|
||||
var_3 script_mover_init_move_parameters();
|
||||
var_3 script_mover_parse_targets();
|
||||
self.goals[self.goals.size] = var_3;
|
||||
|
||||
if ( isdefined( var_3.params["name"] ) )
|
||||
level.script_mover_named_goals[var_3.params["name"]] = var_3;
|
||||
|
||||
break;
|
||||
case "level_notify":
|
||||
if ( isdefined( var_3.script_parameters ) )
|
||||
self.level_notify[self.level_notify.size] = var_3;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( var_9 in var_1 )
|
||||
{
|
||||
if ( var_9 script_mover_is_script_mover() )
|
||||
{
|
||||
self.movers[self.movers.size] = var_9;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( !isdefined( var_9.script_noteworthy ) )
|
||||
continue;
|
||||
|
||||
var_10 = strtok( var_9.script_noteworthy, "_" );
|
||||
|
||||
if ( var_10.size != 3 || var_10[1] != "on" )
|
||||
continue;
|
||||
|
||||
switch ( var_10[0] )
|
||||
{
|
||||
case "delete":
|
||||
thread script_mover_call_func_on_notify( var_9, ::delete, var_10[2] );
|
||||
break;
|
||||
case "hide":
|
||||
thread script_mover_call_func_on_notify( var_9, ::hide, var_10[2] );
|
||||
break;
|
||||
case "show":
|
||||
var_9 hide();
|
||||
thread script_mover_call_func_on_notify( var_9, ::show, var_10[2] );
|
||||
break;
|
||||
case "triggerHide":
|
||||
case "triggerhide":
|
||||
thread script_mover_func_on_notify( var_9, common_scripts\utility::trigger_off, var_10[2] );
|
||||
break;
|
||||
case "triggerShow":
|
||||
case "triggershow":
|
||||
var_9 common_scripts\utility::trigger_off();
|
||||
thread script_mover_func_on_notify( var_9, common_scripts\utility::trigger_on, var_10[2] );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_func_on_notify( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( var_2 );
|
||||
var_0 [[ var_1 ]]();
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_call_func_on_notify( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( var_2 );
|
||||
var_0 call [[ var_1 ]]();
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_trigger_on()
|
||||
{
|
||||
common_scripts\utility::trigger_on();
|
||||
}
|
||||
|
||||
script_mover_move_to_target( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "new_path" );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = self;
|
||||
|
||||
while ( var_0.goals.size != 0 )
|
||||
{
|
||||
var_1 = common_scripts\utility::random( var_0.goals );
|
||||
var_2 = self;
|
||||
var_2 script_mover_apply_move_parameters( var_1 );
|
||||
|
||||
if ( isdefined( var_2.params["delay_till"] ) )
|
||||
level waittill( var_2.params["delay_till"] );
|
||||
|
||||
if ( isdefined( var_2.params["delay_till_trigger"] ) && var_2.params["delay_till_trigger"] )
|
||||
self waittill( "trigger" );
|
||||
|
||||
if ( var_2.params["delay_time"] > 0 )
|
||||
wait( var_2.params["delay_time"] );
|
||||
|
||||
var_3 = var_2.params["move_time"];
|
||||
var_4 = var_2.params["accel_time"];
|
||||
var_5 = var_2.params["decel_time"];
|
||||
var_6 = 0;
|
||||
var_7 = 0;
|
||||
var_8 = transformmove( var_1.origin, var_1.angles, self.origin_ent.origin, self.origin_ent.angles, self.origin, self.angles );
|
||||
|
||||
if ( var_2.origin != var_1.origin )
|
||||
{
|
||||
if ( isdefined( var_2.params["move_speed"] ) )
|
||||
{
|
||||
var_9 = distance( var_2.origin, var_1.origin );
|
||||
var_3 = var_9 / var_2.params["move_speed"];
|
||||
}
|
||||
|
||||
if ( isdefined( var_2.params["accel_frac"] ) )
|
||||
var_4 = var_2.params["accel_frac"] * var_3;
|
||||
|
||||
if ( isdefined( var_2.params["decel_frac"] ) )
|
||||
var_5 = var_2.params["decel_frac"] * var_3;
|
||||
|
||||
var_2 moveto( var_8["origin"], var_3, var_4, var_5 );
|
||||
|
||||
foreach ( var_11 in var_1.level_notify )
|
||||
thread script_mover_run_notify( var_11.origin, var_11.script_parameters, self.origin, var_1.origin );
|
||||
|
||||
var_6 = 1;
|
||||
}
|
||||
|
||||
if ( anglesclamp180( var_8["angles"] ) != anglesclamp180( var_2.angles ) )
|
||||
{
|
||||
var_2 rotateto( var_8["angles"], var_3, var_4, var_5 );
|
||||
var_7 = 1;
|
||||
}
|
||||
|
||||
foreach ( var_14 in var_2.movers )
|
||||
var_14 notify( "trigger" );
|
||||
|
||||
var_0 notify( "depart" );
|
||||
var_2 script_mover_allow_usable( 0 );
|
||||
self.moving = 1;
|
||||
|
||||
if ( isdefined( var_2.params["move_time_offset"] ) && var_2.params["move_time_offset"] + var_3 > 0 )
|
||||
wait( var_2.params["move_time_offset"] + var_3 );
|
||||
else if ( var_6 )
|
||||
self waittill( "movedone" );
|
||||
else if ( var_7 )
|
||||
self waittill( "rotatedone" );
|
||||
else
|
||||
wait( var_3 );
|
||||
|
||||
self.moving = 0;
|
||||
self notify( "move_end" );
|
||||
var_1 notify( "arrive" );
|
||||
|
||||
if ( isdefined( var_2.params["solid"] ) )
|
||||
{
|
||||
if ( var_2.params["solid"] )
|
||||
var_2 solid();
|
||||
else
|
||||
var_2 notsolid();
|
||||
}
|
||||
|
||||
foreach ( var_14 in var_1.movers )
|
||||
var_14 notify( "trigger" );
|
||||
|
||||
if ( isdefined( var_2.params["wait_till"] ) )
|
||||
level waittill( var_2.params["wait_till"] );
|
||||
|
||||
if ( var_2.params["wait_time"] > 0 )
|
||||
wait( var_2.params["wait_time"] );
|
||||
|
||||
var_2 script_mover_allow_usable( 1 );
|
||||
var_0 = var_1;
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_run_notify( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self endon( "move_end" );
|
||||
var_4 = self;
|
||||
var_5 = vectornormalize( var_3 - var_2 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_6 = vectornormalize( var_0 - var_4.origin );
|
||||
|
||||
if ( vectordot( var_5, var_6 ) <= 0 )
|
||||
break;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
level notify( var_1 );
|
||||
}
|
||||
|
||||
script_mover_init_move_parameters()
|
||||
{
|
||||
self.params = [];
|
||||
|
||||
if ( !isdefined( self.angles ) )
|
||||
self.angles = ( 0, 0, 0 );
|
||||
|
||||
self.angles = anglesclamp180( self.angles );
|
||||
script_mover_parse_move_parameters( self.script_parameters );
|
||||
}
|
||||
|
||||
script_mover_parse_move_parameters( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = "";
|
||||
|
||||
var_1 = strtok( var_0, ";" );
|
||||
|
||||
foreach ( var_3 in var_1 )
|
||||
{
|
||||
var_4 = strtok( var_3, "=" );
|
||||
|
||||
if ( var_4.size != 2 )
|
||||
continue;
|
||||
|
||||
if ( var_4[1] == "undefined" || var_4[1] == "default" )
|
||||
{
|
||||
self.params[var_4[0]] = undefined;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch ( var_4[0] )
|
||||
{
|
||||
case "move_time_offset":
|
||||
case "decel_frac":
|
||||
case "accel_frac":
|
||||
case "move_speed":
|
||||
case "delay_time":
|
||||
case "wait_time":
|
||||
case "decel_time":
|
||||
case "accel_time":
|
||||
case "move_time":
|
||||
self.params[var_4[0]] = script_mover_parse_range( var_4[1] );
|
||||
break;
|
||||
case "wait_till":
|
||||
case "delay_till":
|
||||
case "hintstring":
|
||||
case "name":
|
||||
self.params[var_4[0]] = var_4[1];
|
||||
break;
|
||||
case "delay_till_trigger":
|
||||
case "usable":
|
||||
case "solid":
|
||||
self.params[var_4[0]] = int( var_4[1] );
|
||||
break;
|
||||
case "script_params":
|
||||
var_5 = var_4[1];
|
||||
var_6 = level.script_mover_parameters[var_5];
|
||||
|
||||
if ( isdefined( var_6 ) )
|
||||
script_mover_parse_move_parameters( var_6 );
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_parse_range( var_0 )
|
||||
{
|
||||
var_1 = 0;
|
||||
var_2 = strtok( var_0, "," );
|
||||
|
||||
if ( var_2.size == 1 )
|
||||
var_1 = float( var_2[0] );
|
||||
else if ( var_2.size == 2 )
|
||||
{
|
||||
var_3 = float( var_2[0] );
|
||||
var_4 = float( var_2[1] );
|
||||
|
||||
if ( var_3 >= var_4 )
|
||||
var_1 = var_3;
|
||||
else
|
||||
var_1 = randomfloatrange( var_3, var_4 );
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
script_mover_apply_move_parameters( var_0 )
|
||||
{
|
||||
foreach ( var_3, var_2 in var_0.params )
|
||||
script_mover_set_param( var_3, var_2 );
|
||||
|
||||
script_mover_set_defaults();
|
||||
}
|
||||
|
||||
script_mover_set_param( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
return;
|
||||
|
||||
if ( var_0 == "usable" && isdefined( var_1 ) )
|
||||
script_mover_set_usable( self, var_1 );
|
||||
|
||||
self.params[var_0] = var_1;
|
||||
}
|
||||
|
||||
script_mover_allow_usable( var_0 )
|
||||
{
|
||||
if ( self.params["usable"] )
|
||||
script_mover_set_usable( self, var_0 );
|
||||
|
||||
foreach ( var_2 in self.use_triggers )
|
||||
script_mover_set_usable( var_2, var_0 );
|
||||
}
|
||||
|
||||
script_mover_set_usable( var_0, var_1 )
|
||||
{
|
||||
if ( var_1 )
|
||||
{
|
||||
var_0 makeusable();
|
||||
var_0 setcursorhint( "HINT_ACTIVATE" );
|
||||
var_0 sethintstring( level.script_mover_hintstrings[self.params["hintstring"]] );
|
||||
}
|
||||
else
|
||||
var_0 makeunusable();
|
||||
}
|
||||
|
||||
script_mover_save_default_move_parameters()
|
||||
{
|
||||
self.params_default = [];
|
||||
|
||||
foreach ( var_2, var_1 in self.params )
|
||||
self.params_default[var_2] = var_1;
|
||||
}
|
||||
|
||||
script_mover_set_defaults()
|
||||
{
|
||||
foreach ( var_2, var_1 in level.script_mover_defaults )
|
||||
{
|
||||
if ( !isdefined( self.params[var_2] ) )
|
||||
script_mover_set_param( var_2, var_1 );
|
||||
}
|
||||
|
||||
if ( isdefined( self.params_default ) )
|
||||
{
|
||||
foreach ( var_2, var_1 in self.params_default )
|
||||
{
|
||||
if ( !isdefined( self.params[var_2] ) )
|
||||
script_mover_set_param( var_2, var_1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init()
|
||||
{
|
||||
level thread script_mover_connect_watch();
|
||||
level thread script_mover_agent_spawn_watch();
|
||||
}
|
||||
|
||||
script_mover_connect_watch()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
var_0 thread player_unresolved_collision_watch();
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_agent_spawn_watch()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "spawned_agent", var_0 );
|
||||
var_0 thread player_unresolved_collision_watch();
|
||||
}
|
||||
}
|
||||
|
||||
player_unresolved_collision_watch()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
if ( isagent( self ) )
|
||||
self endon( "death" );
|
||||
|
||||
self.unresolved_collision_count = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "unresolved_collision", var_0 );
|
||||
self.unresolved_collision_count++;
|
||||
thread clear_unresolved_collision_count_next_frame();
|
||||
var_1 = 3;
|
||||
|
||||
if ( isdefined( var_0 ) && isdefined( var_0.unresolved_collision_notify_min ) )
|
||||
var_1 = var_0.unresolved_collision_notify_min;
|
||||
|
||||
if ( self.unresolved_collision_count >= var_1 )
|
||||
{
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
if ( isdefined( var_0.unresolved_collision_func ) )
|
||||
var_0 [[ var_0.unresolved_collision_func ]]( self );
|
||||
else if ( isdefined( var_0.unresolved_collision_kill ) && var_0.unresolved_collision_kill )
|
||||
var_0 unresolved_collision_owner_damage( self );
|
||||
else
|
||||
var_0 unresolved_collision_nearest_node( self );
|
||||
}
|
||||
else
|
||||
unresolved_collision_nearest_node( self );
|
||||
|
||||
self.unresolved_collision_count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clear_unresolved_collision_count_next_frame()
|
||||
{
|
||||
self endon( "unresolved_collision" );
|
||||
common_scripts\utility::waitframe();
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self.unresolved_collision_count = 0;
|
||||
}
|
||||
|
||||
unresolved_collision_owner_damage( var_0 )
|
||||
{
|
||||
var_1 = self;
|
||||
|
||||
if ( !isdefined( var_1.owner ) )
|
||||
{
|
||||
var_0 mover_suicide();
|
||||
return;
|
||||
}
|
||||
|
||||
var_2 = 0;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( isdefined( var_1.owner.team ) && var_1.owner.team != var_0.team )
|
||||
var_2 = 1;
|
||||
}
|
||||
else if ( var_0 != var_1.owner )
|
||||
var_2 = 1;
|
||||
|
||||
if ( !var_2 )
|
||||
{
|
||||
var_0 mover_suicide();
|
||||
return;
|
||||
}
|
||||
|
||||
var_3 = 1000;
|
||||
|
||||
if ( isdefined( var_1.unresolved_collision_damage ) )
|
||||
var_3 = var_1.unresolved_collision_damage;
|
||||
|
||||
var_0 dodamage( var_3, var_1.origin, var_1.owner, var_1, "MOD_CRUSH" );
|
||||
}
|
||||
|
||||
unresolved_collision_nearest_node( var_0, var_1 )
|
||||
{
|
||||
if ( isdefined( level.override_unresolved_collision ) )
|
||||
{
|
||||
self [[ level.override_unresolved_collision ]]( var_0, var_1 );
|
||||
return;
|
||||
}
|
||||
|
||||
var_2 = self.unresolved_collision_nodes;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_2 = sortbydistance( var_2, var_0.origin );
|
||||
else
|
||||
{
|
||||
var_2 = getnodesinradius( var_0.origin, 300, 0, 200 );
|
||||
var_2 = sortbydistance( var_2, var_0.origin );
|
||||
}
|
||||
|
||||
var_3 = ( 0, 0, -100 );
|
||||
var_0 cancelmantle();
|
||||
var_0 dontinterpolate();
|
||||
var_0 setorigin( var_0.origin + var_3 );
|
||||
|
||||
for ( var_4 = 0; var_4 < var_2.size; var_4++ )
|
||||
{
|
||||
var_5 = var_2[var_4];
|
||||
var_6 = var_5.origin;
|
||||
|
||||
if ( !canspawn( var_6 ) )
|
||||
continue;
|
||||
|
||||
if ( positionwouldtelefrag( var_6 ) )
|
||||
continue;
|
||||
|
||||
if ( var_0 getstance() == "prone" )
|
||||
var_0 setstance( "crouch" );
|
||||
|
||||
var_0 setorigin( var_6 );
|
||||
return;
|
||||
}
|
||||
|
||||
var_0 setorigin( var_0.origin - var_3 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = 1;
|
||||
|
||||
if ( var_1 )
|
||||
var_0 mover_suicide();
|
||||
}
|
||||
|
||||
unresolved_collision_void( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
mover_suicide()
|
||||
{
|
||||
if ( isdefined( level.ishorde ) && !isagent( self ) )
|
||||
return;
|
||||
|
||||
maps\mp\_utility::_suicide();
|
||||
}
|
||||
|
||||
player_pushed_kill( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_player_pushed_kill" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "player_pushed", var_1, var_2 );
|
||||
|
||||
if ( isplayer( var_1 ) || isagent( var_1 ) )
|
||||
{
|
||||
var_3 = length( var_2 );
|
||||
|
||||
if ( var_3 >= var_0 )
|
||||
unresolved_collision_owner_damage( var_1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stop_player_pushed_kill()
|
||||
{
|
||||
self notify( "stop_player_pushed_kill" );
|
||||
}
|
||||
|
||||
script_mover_get_top_parent()
|
||||
{
|
||||
var_0 = self getlinkedparent();
|
||||
|
||||
for ( var_1 = var_0; isdefined( var_1 ); var_1 = var_1 getlinkedparent() )
|
||||
var_0 = var_1;
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
script_mover_start_use( var_0 )
|
||||
{
|
||||
var_1 = var_0 script_mover_get_top_parent();
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_1.startuseorigin = var_1.origin;
|
||||
|
||||
self.startusemover = self getmovingplatformparent();
|
||||
|
||||
if ( isdefined( self.startusemover ) )
|
||||
{
|
||||
var_2 = self.startusemover script_mover_get_top_parent();
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
self.startusemover = var_2;
|
||||
|
||||
self.startusemover.startuseorigin = self.startusemover.origin;
|
||||
}
|
||||
}
|
||||
|
||||
script_mover_has_parent_moved( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
return 0;
|
||||
|
||||
return lengthsquared( var_0.origin - var_0.startuseorigin ) > 0.001;
|
||||
}
|
||||
|
||||
script_mover_use_can_link( var_0 )
|
||||
{
|
||||
if ( !isplayer( self ) )
|
||||
return 1;
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return 0;
|
||||
|
||||
var_1 = var_0 script_mover_get_top_parent();
|
||||
var_2 = self.startusemover;
|
||||
|
||||
if ( !isdefined( var_1 ) && !isdefined( var_2 ) )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_1 ) && isdefined( var_2 ) && var_1 == var_2 )
|
||||
return 1;
|
||||
|
||||
if ( script_mover_has_parent_moved( var_1 ) )
|
||||
return 0;
|
||||
|
||||
if ( script_mover_has_parent_moved( var_2 ) )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
script_mover_link_to_use_object( var_0 )
|
||||
{
|
||||
if ( isplayer( var_0 ) )
|
||||
{
|
||||
var_0 script_mover_start_use( self );
|
||||
var_1 = var_0 getmovingplatformparent();
|
||||
var_2 = undefined;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_2 = var_1;
|
||||
else if ( !isdefined( script_mover_get_top_parent() ) )
|
||||
var_2 = self;
|
||||
else
|
||||
{
|
||||
var_2 = spawn( "script_model", var_0.origin );
|
||||
var_2 setmodel( "tag_origin" );
|
||||
var_0.scriptmoverlinkdummy = var_2;
|
||||
var_0 thread sciprt_mover_use_object_wait_for_disconnect( var_2 );
|
||||
}
|
||||
|
||||
var_0 playerlinkto( var_2 );
|
||||
}
|
||||
else
|
||||
var_0 linkto( self );
|
||||
|
||||
var_0 playerlinkedoffsetenable();
|
||||
}
|
||||
|
||||
script_mover_unlink_from_use_object( var_0 )
|
||||
{
|
||||
var_0 unlink();
|
||||
|
||||
if ( isdefined( var_0.scriptmoverlinkdummy ) )
|
||||
{
|
||||
var_0 notify( "removeMoverLinkDummy" );
|
||||
var_0.scriptmoverlinkdummy delete();
|
||||
var_0.scriptmoverlinkdummy = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
sciprt_mover_use_object_wait_for_disconnect( var_0 )
|
||||
{
|
||||
self endon( "removeMoverLinkDummy" );
|
||||
common_scripts\utility::waittill_any( "death", "disconnect" );
|
||||
self.scriptmoverlinkdummy delete();
|
||||
self.scriptmoverlinkdummy = undefined;
|
||||
}
|
||||
|
||||
notify_moving_platform_invalid()
|
||||
{
|
||||
var_0 = self getlinkedchildren( 0 );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return;
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
if ( isdefined( var_2.no_moving_platfrom_unlink ) && var_2.no_moving_platfrom_unlink )
|
||||
continue;
|
||||
|
||||
var_2 unlink();
|
||||
var_2 notify( "invalid_parent", self );
|
||||
}
|
||||
}
|
||||
|
||||
process_moving_platform_death( var_0, var_1 )
|
||||
{
|
||||
if ( isdefined( var_1 ) && isdefined( var_1.no_moving_platfrom_death ) && var_1.no_moving_platfrom_death )
|
||||
return;
|
||||
|
||||
if ( isdefined( var_0.playdeathfx ) )
|
||||
playfx( common_scripts\utility::getfx( "airdrop_crate_destroy" ), self.origin );
|
||||
|
||||
if ( isdefined( var_0.deathoverridecallback ) )
|
||||
{
|
||||
var_0.lasttouchedplatform = var_1;
|
||||
self thread [[ var_0.deathoverridecallback ]]( var_0 );
|
||||
}
|
||||
else
|
||||
self delete();
|
||||
}
|
||||
|
||||
handle_moving_platform_touch( var_0 )
|
||||
{
|
||||
self notify( "handle_moving_platform_touch" );
|
||||
self endon( "handle_moving_platform_touch" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "stop_handling_moving_platforms" );
|
||||
|
||||
if ( isdefined( var_0.endonstring ) )
|
||||
self endon( var_0.endonstring );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "touching_platform", var_1 );
|
||||
|
||||
if ( isdefined( var_0.validateaccuratetouching ) && var_0.validateaccuratetouching )
|
||||
{
|
||||
if ( !self istouching( var_1 ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
thread process_moving_platform_death( var_0, var_1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
handle_moving_platform_invalid( var_0 )
|
||||
{
|
||||
self notify( "handle_moving_platform_invalid" );
|
||||
self endon( "handle_moving_platform_invalid" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "stop_handling_moving_platforms" );
|
||||
|
||||
if ( isdefined( var_0.endonstring ) )
|
||||
self endon( var_0.endonstring );
|
||||
|
||||
self waittill( "invalid_parent", var_1 );
|
||||
|
||||
if ( isdefined( var_0.invalidparentoverridecallback ) )
|
||||
self thread [[ var_0.invalidparentoverridecallback ]]( var_0 );
|
||||
else
|
||||
thread process_moving_platform_death( var_0, var_1 );
|
||||
}
|
||||
|
||||
handle_moving_platforms( var_0 )
|
||||
{
|
||||
self notify( "handle_moving_platforms" );
|
||||
self endon( "handle_moving_platforms" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "stop_handling_moving_platforms" );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = spawnstruct();
|
||||
|
||||
if ( isdefined( var_0.endonstring ) )
|
||||
self endon( var_0.endonstring );
|
||||
|
||||
if ( isdefined( var_0.linkparent ) )
|
||||
{
|
||||
var_1 = self getlinkedparent();
|
||||
|
||||
if ( !isdefined( var_1 ) || var_1 != var_0.linkparent )
|
||||
self linkto( var_0.linkparent );
|
||||
}
|
||||
|
||||
thread handle_moving_platform_touch( var_0 );
|
||||
thread handle_moving_platform_invalid( var_0 );
|
||||
}
|
||||
|
||||
stop_handling_moving_platforms()
|
||||
{
|
||||
self notify( "stop_handling_moving_platforms" );
|
||||
}
|
||||
|
||||
moving_platform_empty_func( var_0 )
|
||||
{
|
||||
|
||||
}
|
340
maps/mp/_obelisk.gsc
Normal file
340
maps/mp/_obelisk.gsc
Normal file
@ -0,0 +1,340 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
obelisk_init()
|
||||
{
|
||||
level.scanned_obelisks = [];
|
||||
level.drill_tutorial_text = &"MP_ALIEN_DESCENT_DRILL_TUTORIAL_HINT";
|
||||
}
|
||||
|
||||
obelisk()
|
||||
{
|
||||
var_0 = select_obelisks();
|
||||
level thread maps\mp\alien\_spawnlogic::encounter_cycle_spawn( "drill_planted" );
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
var_2 thread obelisk_listener( var_2 );
|
||||
|
||||
level waittill( "obelisk_destroyed" );
|
||||
maps\mp\alien\_spawn_director::end_cycle();
|
||||
level thread maps\mp\alien\_spawnlogic::remaining_alien_management();
|
||||
}
|
||||
|
||||
obelisk_listener( var_0 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
var_0 notify( "stop_listening" );
|
||||
var_0 endon( "stop_listening" );
|
||||
|
||||
if ( isdefined( level.drill ) && !isdefined( level.drill_carrier ) )
|
||||
level waittill( "drill_pickedup" );
|
||||
|
||||
var_1 = maps\mp\alien\_hive::get_hive_waypoint_dist( var_0, 1300 );
|
||||
var_0 thread maps\mp\alien\_hive::set_hive_icon( "waypoint_alien_scan", var_1 );
|
||||
var_2 = var_0 maps\mp\alien\_drill::wait_for_drill_plant();
|
||||
level.current_hive_name = var_0.target;
|
||||
level.encounter_name = var_0.target;
|
||||
level.drill_carrier = undefined;
|
||||
|
||||
if ( level.cycle_count == 1 )
|
||||
level maps\mp\_utility::delaythread( 1, maps\mp\alien\_music_and_dialog::playvoforwavestart );
|
||||
|
||||
var_0 thread scanning( var_0, var_0.origin, var_2 );
|
||||
var_0 maps\mp\alien\_hive::disable_other_strongholds();
|
||||
maps\mp\_utility::delaythread( 2, maps\mp\alien\_challenge::spawn_challenge );
|
||||
maps\mp\alien\_gamescore::reset_encounter_performance();
|
||||
common_scripts\utility::flag_wait( "drill_detonated" );
|
||||
var_0 thread scan_complete_sequence( var_0 );
|
||||
add_to_scanned_obelisk_list( var_0 );
|
||||
maps\mp\alien\_challenge::end_current_challenge();
|
||||
maps\mp\alien\_gamescore::calculate_and_show_encounter_scores( level.players, maps\mp\alien\_hive::get_regular_hive_score_component_name_list() );
|
||||
level.stronghold_hive_locs = common_scripts\utility::array_remove( level.stronghold_hive_locs, var_0 );
|
||||
level.current_hive_name = level.current_hive_name + "_post";
|
||||
level.num_hive_destroyed++;
|
||||
|
||||
if ( isdefined( var_0.scene_trig ) )
|
||||
var_0.scene_trig notify( "trigger", level.players[0] );
|
||||
|
||||
give_players_rewards();
|
||||
level notify( "obelisk_destroyed" );
|
||||
var_0 notify( "stop_listening" );
|
||||
}
|
||||
|
||||
give_players_rewards()
|
||||
{
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
var_1 maps\mp\alien\_persistence::eog_player_update_stat( "hivesdestroyed", 1 );
|
||||
var_1 thread maps\mp\alien\_hive::wait_to_give_rewards();
|
||||
}
|
||||
}
|
||||
|
||||
select_obelisks()
|
||||
{
|
||||
var_0 = [];
|
||||
var_1 = maps\mp\alien\_utility::get_current_area_name();
|
||||
|
||||
foreach ( var_3 in level.stronghold_hive_locs )
|
||||
{
|
||||
if ( !( var_3.area_name == var_1 ) )
|
||||
continue;
|
||||
|
||||
if ( !var_3 maps\mp\alien\_hive::dependent_hives_removed() )
|
||||
continue;
|
||||
|
||||
var_0 = common_scripts\utility::array_add( var_0, var_3 );
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
scanning( var_0, var_1, var_2 )
|
||||
{
|
||||
var_0 endon( "stop_listening" );
|
||||
var_0 endon( "drill_complete" );
|
||||
var_0 thread set_scanner_state_plant( var_0, var_1, var_2 );
|
||||
level.drill endon( "death" );
|
||||
level.drill.owner = var_2;
|
||||
level.drill.stronghold = var_0;
|
||||
common_scripts\utility::flag_set( "drill_drilling" );
|
||||
level.drill waittill( "drill_finished_plant_anim" );
|
||||
var_0 maps\mp\alien\_drill::init_drilling_parameters();
|
||||
var_0 thread set_scanner_state_scan( var_0, var_2 );
|
||||
level.drill waittill( "offline", var_3, var_4 );
|
||||
var_0 thread maps\mp\alien\_drill::set_drill_state_offline();
|
||||
wait 2;
|
||||
maps\mp\gametypes\aliens::alienendgame( "axis", maps\mp\alien\_hud::get_end_game_string_index( "drill_destroyed" ) );
|
||||
}
|
||||
|
||||
set_scanner_state_plant( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isdefined( level.drill ) )
|
||||
{
|
||||
level.drill delete();
|
||||
level.drill = undefined;
|
||||
}
|
||||
|
||||
level.drill = spawn( "script_model", var_1 );
|
||||
level.drill setmodel( "mp_laser_drill" );
|
||||
level.drill playsound( "alien_drill_scanner_plant" );
|
||||
level.drill.state = "planted";
|
||||
level.drill.angles = var_0.angles;
|
||||
level.drill.maxhealth = 20000 + level.drill_health_hardcore;
|
||||
level.drill.health = int( 20000 + level.drill_health_hardcore * var_2 maps\mp\alien\_perk_utility::perk_getdrillhealthscalar() );
|
||||
level.drill thread maps\mp\alien\_drill::watch_to_repair( var_0 );
|
||||
level.drill thread maps\mp\alien\_drill::watch_drill_health_for_challenge();
|
||||
maps\mp\alien\_outline_proto::add_to_outline_drill_watch_list( level.drill, 0 );
|
||||
level thread maps\mp\alien\_music_and_dialog::playvoforbombplant( var_2 );
|
||||
maps\mp\alien\_drill::destroy_drill_icon();
|
||||
level.drill scriptmodelplayanim( "alien_drill_scan_enter" );
|
||||
wait 4;
|
||||
level.drill notify( "drill_finished_plant_anim" );
|
||||
}
|
||||
|
||||
set_scanner_state_scan( var_0, var_1 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
var_0 endon( "stop_listening" );
|
||||
level.drill.state = "online";
|
||||
level.drill makeentitysentient( "allies" );
|
||||
level.drill setthreatbiasgroup( "drill" );
|
||||
level.drill setcandamage( 1 );
|
||||
level.drill makeunusable();
|
||||
level.drill sethintstring( "" );
|
||||
level.drill.threatbias = -3000;
|
||||
level.drill scriptmodelplayanim( "alien_drill_scan_loop" );
|
||||
level.drill thread sfx_scanner_on( level.drill );
|
||||
maps\mp\alien\_drill::update_drill_health_hud();
|
||||
level thread obelisk_scan_fx( var_0 );
|
||||
|
||||
foreach ( var_3 in level.agentarray )
|
||||
{
|
||||
if ( isdefined( var_3.wave_spawned ) && var_3.wave_spawned )
|
||||
var_3 getenemyinfo( level.drill );
|
||||
}
|
||||
|
||||
var_0.depth_marker = gettime();
|
||||
var_0 thread maps\mp\alien\_drill::handle_bomb_damage();
|
||||
var_0 thread maps\mp\alien\_drill::monitor_drill_complete( var_0.depth );
|
||||
var_0 thread maps\mp\alien\_hive::set_hive_icon( "waypoint_alien_defend" );
|
||||
maps\mp\alien\_drill::destroy_drill_icon();
|
||||
maps\mp\alien\_hud::turn_on_drill_meter_hud( var_0.depth );
|
||||
level thread maps\mp\alien\_drill::watch_drill_depth_for_vo( var_0.depth );
|
||||
}
|
||||
|
||||
obelisk_scan_fx( var_0 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
var_0 endon( "stop_listening" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
playfxontag( level._effect["obelisk_scan_loop"], level.drill, "tag_laser" );
|
||||
wait 5;
|
||||
}
|
||||
}
|
||||
|
||||
sfx_scanner_on( var_0 )
|
||||
{
|
||||
level.drill_sfx_lp = spawn_sfx_and_play( var_0.origin, var_0, 0, "alien_drill_scanner_lp" );
|
||||
}
|
||||
|
||||
scan_complete_sequence( var_0 )
|
||||
{
|
||||
var_0 thread play_obelisk_scan_complete_animations( var_0.scriptables[0] );
|
||||
var_0 notify( "hive_dying" );
|
||||
var_0 maps\mp\alien\_hive::destroy_hive_icon();
|
||||
maps\mp\alien\_outline_proto::remove_from_outline_drill_watch_list( level.drill );
|
||||
level.drill scriptmodelplayanim( "alien_drill_scan_exit" );
|
||||
level.drill sfx_scanner_off( level.drill );
|
||||
stopfxontag( level._effect["obelisk_scan_loop"], level.drill, "tag_laser" );
|
||||
wait 3.8;
|
||||
|
||||
if ( !isdefined( var_0.last_hive ) || !var_0.last_hive )
|
||||
{
|
||||
var_1 = level.drill.origin + ( 0, 0, 8 );
|
||||
maps\mp\alien\_drill::drop_drill( var_1, var_0.angles - ( 0, 90, 0 ) );
|
||||
}
|
||||
|
||||
if ( isdefined( var_0.last_hive ) && var_0.last_hive )
|
||||
common_scripts\utility::flag_set( "hives_cleared" );
|
||||
|
||||
common_scripts\utility::flag_clear( "drill_detonated" );
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_true( level.no_grab_drill_vo ) )
|
||||
level maps\mp\_utility::delaythread( 8, maps\mp\alien\_music_and_dialog::play_vo_for_grab_drill );
|
||||
}
|
||||
|
||||
play_obelisk_scan_complete_animations( var_0 )
|
||||
{
|
||||
var_1 = 5.0;
|
||||
var_0 setscriptablepartstate( 0, 1 );
|
||||
wait( var_1 );
|
||||
var_0 setscriptablepartstate( 0, 2 );
|
||||
}
|
||||
|
||||
sfx_scanner_off( var_0 )
|
||||
{
|
||||
var_0 playsound( "alien_drill_scanner_off" );
|
||||
safe_delete( level.drill_sfx_lp );
|
||||
safe_delete( level.drill_overheat_lp_02 );
|
||||
}
|
||||
|
||||
wait_for_all_scanned_obelisk_destroyed( var_0, var_1, var_2 )
|
||||
{
|
||||
foreach ( var_4 in level.scanned_obelisks )
|
||||
var_4 thread obelisk_damage_listener( var_4, var_0, var_1, "waypoint_alien_destroy" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "scanned_obelisk_destroyed", var_6 );
|
||||
level.scanned_obelisks = common_scripts\utility::array_remove( level.scanned_obelisks, var_6 );
|
||||
|
||||
if ( level.scanned_obelisks.size == 0 )
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
add_to_scanned_obelisk_list( var_0 )
|
||||
{
|
||||
level.scanned_obelisks[level.scanned_obelisks.size] = var_0;
|
||||
}
|
||||
|
||||
obelisk_damage_listener( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = get_obelisk_clip( var_0 );
|
||||
var_4 setcandamage( 1 );
|
||||
var_4 setcanradiusdamage( 1 );
|
||||
var_0.health = var_1;
|
||||
var_5 = maps\mp\alien\_hud::make_waypoint( var_3, 20, 20, 1, var_4.origin );
|
||||
var_6 = spawn( "script_model", var_0.scriptables[0].origin );
|
||||
var_6.angles = var_0.scriptables[0].angles;
|
||||
var_6 setmodel( "dct_alien_obelisk" );
|
||||
maps\mp\alien\_outline_proto::enable_outline_for_players( var_6, level.players, 2, 0, "high" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 waittill( "damage", var_7, var_8, var_9, var_10, var_11, var_12, var_13, var_14, var_15, var_16 );
|
||||
|
||||
if ( !isdefined( var_8.team ) || var_8.team != "allies" )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_2 ) && isdefined( var_16 ) && !common_scripts\utility::array_contains( var_2, var_16 ) )
|
||||
var_7 = int( var_7 * 0.1 );
|
||||
|
||||
if ( isdefined( var_8 ) )
|
||||
{
|
||||
var_17 = "standard";
|
||||
|
||||
if ( isdefined( var_16 ) && var_16 == "alienvanguard_projectile_mp" )
|
||||
var_17 = "hitaliensoft";
|
||||
|
||||
if ( !isplayer( var_8 ) && isdefined( var_8.inuseby ) )
|
||||
var_8 = var_8.inuseby;
|
||||
|
||||
var_8 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_17 );
|
||||
}
|
||||
|
||||
var_0.health = var_0.health - var_7;
|
||||
|
||||
if ( var_0.health < 0 )
|
||||
break;
|
||||
else
|
||||
{
|
||||
if ( var_0.health < var_1 * 0.33 )
|
||||
{
|
||||
var_0.scriptables[0] setscriptablepartstate( 0, "damaged_2" );
|
||||
maps\mp\alien\_outline_proto::enable_outline_for_players( var_6, level.players, 1, 0, "high" );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( var_0.health < var_1 * 0.66 )
|
||||
{
|
||||
var_0.scriptables[0] setscriptablepartstate( 0, "damaged_1" );
|
||||
maps\mp\alien\_outline_proto::enable_outline_for_players( var_6, level.players, 5, 0, "high" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var_0 thread sfx_obelisk_destroyed();
|
||||
maps\mp\alien\_outline_proto::disable_outline_for_players( var_6, level.players );
|
||||
var_6 delete();
|
||||
var_0.scriptables[0] setscriptablepartstate( 0, "remove" );
|
||||
var_4 delete();
|
||||
var_5 destroy();
|
||||
level notify( "scanned_obelisk_destroyed", var_0 );
|
||||
}
|
||||
|
||||
spawn_sfx_and_play( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = spawn( "script_origin", var_0 );
|
||||
var_4 linkto( var_1 );
|
||||
var_4 thread play_sfx( var_4, var_2, var_3 );
|
||||
return var_4;
|
||||
}
|
||||
|
||||
play_sfx( var_0, var_1, var_2 )
|
||||
{
|
||||
wait( var_1 );
|
||||
var_0 playloopsound( var_2 );
|
||||
}
|
||||
|
||||
safe_delete( var_0 )
|
||||
{
|
||||
if ( isdefined( var_0 ) )
|
||||
var_0 delete();
|
||||
}
|
||||
|
||||
get_obelisk_clip( var_0 )
|
||||
{
|
||||
foreach ( var_2 in self.removeables )
|
||||
{
|
||||
if ( var_2.classname == "script_brushmodel" )
|
||||
return var_2;
|
||||
}
|
||||
}
|
||||
|
||||
sfx_obelisk_destroyed()
|
||||
{
|
||||
playsoundatpos( self.origin, "alien_obelisk_destroyed" );
|
||||
}
|
199
maps/mp/_radiation.gsc
Normal file
199
maps/mp/_radiation.gsc
Normal file
@ -0,0 +1,199 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
radiation()
|
||||
{
|
||||
var_0 = getentarray( "radiation", "targetname" );
|
||||
|
||||
if ( var_0.size > 0 )
|
||||
{
|
||||
foreach ( var_2 in var_0 )
|
||||
var_2 thread common_scripts\_dynamic_world::triggertouchthink( ::playerenterarea, ::playerleavearea );
|
||||
|
||||
thread onplayerconnect();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
var_0.numareas = 0;
|
||||
}
|
||||
}
|
||||
|
||||
playerenterarea( var_0 )
|
||||
{
|
||||
self.numareas++;
|
||||
|
||||
if ( self.numareas == 1 )
|
||||
radiationeffect();
|
||||
}
|
||||
|
||||
playerleavearea( var_0 )
|
||||
{
|
||||
self.numareas--;
|
||||
|
||||
if ( self.numareas != 0 )
|
||||
return;
|
||||
|
||||
self.poison = 0;
|
||||
self notify( "leftTrigger" );
|
||||
|
||||
if ( isdefined( self.radiationoverlay ) )
|
||||
self.radiationoverlay fadeoutblackout( 0.1, 0 );
|
||||
}
|
||||
|
||||
soundwatcher( var_0 )
|
||||
{
|
||||
common_scripts\utility::waittill_any( "death", "leftTrigger" );
|
||||
self stoploopsound();
|
||||
}
|
||||
|
||||
radiationeffect()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "leftTrigger" );
|
||||
self.poison = 0;
|
||||
thread soundwatcher( self );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self.poison++;
|
||||
|
||||
switch ( self.poison )
|
||||
{
|
||||
case 1:
|
||||
self.radiationsound = "item_geigercouner_level2";
|
||||
self playloopsound( self.radiationsound );
|
||||
self viewkick( 1, self.origin );
|
||||
break;
|
||||
case 3:
|
||||
self shellshock( "mp_radiation_low", 4 );
|
||||
self.radiationsound = "item_geigercouner_level3";
|
||||
self stoploopsound();
|
||||
self playloopsound( self.radiationsound );
|
||||
self viewkick( 3, self.origin );
|
||||
doradiationdamage( 15 );
|
||||
break;
|
||||
case 4:
|
||||
self shellshock( "mp_radiation_med", 5 );
|
||||
self.radiationsound = "item_geigercouner_level3";
|
||||
self stoploopsound();
|
||||
self playloopsound( self.radiationsound );
|
||||
self viewkick( 15, self.origin );
|
||||
thread blackout();
|
||||
doradiationdamage( 25 );
|
||||
break;
|
||||
case 6:
|
||||
self shellshock( "mp_radiation_high", 5 );
|
||||
self.radiationsound = "item_geigercouner_level4";
|
||||
self stoploopsound();
|
||||
self playloopsound( self.radiationsound );
|
||||
self viewkick( 75, self.origin );
|
||||
doradiationdamage( 45 );
|
||||
break;
|
||||
case 8:
|
||||
self shellshock( "mp_radiation_high", 5 );
|
||||
self.radiationsound = "item_geigercouner_level4";
|
||||
self stoploopsound();
|
||||
self playloopsound( self.radiationsound );
|
||||
self viewkick( 127, self.origin );
|
||||
doradiationdamage( 175 );
|
||||
break;
|
||||
}
|
||||
|
||||
wait 1;
|
||||
}
|
||||
|
||||
wait 5;
|
||||
}
|
||||
|
||||
blackout()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "leftTrigger" );
|
||||
|
||||
if ( !isdefined( self.radiationoverlay ) )
|
||||
{
|
||||
self.radiationoverlay = newclienthudelem( self );
|
||||
self.radiationoverlay.x = 0;
|
||||
self.radiationoverlay.y = 0;
|
||||
self.radiationoverlay setshader( "black", 640, 480 );
|
||||
self.radiationoverlay.alignx = "left";
|
||||
self.radiationoverlay.aligny = "top";
|
||||
self.radiationoverlay.horzalign = "fullscreen";
|
||||
self.radiationoverlay.vertalign = "fullscreen";
|
||||
self.radiationoverlay.alpha = 0;
|
||||
}
|
||||
|
||||
var_0 = 1;
|
||||
var_1 = 2;
|
||||
var_2 = 0.25;
|
||||
var_3 = 1;
|
||||
var_4 = 5;
|
||||
var_5 = 100;
|
||||
var_6 = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while ( self.poison > 1 )
|
||||
{
|
||||
var_7 = var_5 - var_4;
|
||||
var_6 = ( self.poison - var_4 ) / var_7;
|
||||
|
||||
if ( var_6 < 0 )
|
||||
var_6 = 0;
|
||||
else if ( var_6 > 1 )
|
||||
var_6 = 1;
|
||||
|
||||
var_8 = var_1 - var_0;
|
||||
var_9 = var_0 + var_8 * ( 1 - var_6 );
|
||||
var_10 = var_3 - var_2;
|
||||
var_11 = var_2 + var_10 * var_6;
|
||||
var_12 = var_6 * 0.5;
|
||||
|
||||
if ( var_6 == 1 )
|
||||
break;
|
||||
|
||||
var_13 = var_9 / 2;
|
||||
self.radiationoverlay fadeinblackout( var_13, var_11 );
|
||||
self.radiationoverlay fadeoutblackout( var_13, var_12 );
|
||||
wait( var_6 * 0.5 );
|
||||
}
|
||||
|
||||
if ( var_6 == 1 )
|
||||
break;
|
||||
|
||||
if ( self.radiationoverlay.alpha != 0 )
|
||||
self.radiationoverlay fadeoutblackout( 1, 0 );
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self.radiationoverlay fadeinblackout( 2, 0 );
|
||||
}
|
||||
|
||||
doradiationdamage( var_0 )
|
||||
{
|
||||
self thread [[ level.callbackplayerdamage ]]( self, self, var_0, 0, "MOD_SUICIDE", "claymore_mp", self.origin, ( 0, 0, 0 ) - self.origin, "none", 0 );
|
||||
}
|
||||
|
||||
fadeinblackout( var_0, var_1 )
|
||||
{
|
||||
self fadeovertime( var_0 );
|
||||
self.alpha = var_1;
|
||||
wait( var_0 );
|
||||
}
|
||||
|
||||
fadeoutblackout( var_0, var_1 )
|
||||
{
|
||||
self fadeovertime( var_0 );
|
||||
self.alpha = var_1;
|
||||
wait( var_0 );
|
||||
}
|
189
maps/mp/_scoreboard.gsc
Normal file
189
maps/mp/_scoreboard.gsc
Normal file
@ -0,0 +1,189 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
processlobbyscoreboards()
|
||||
{
|
||||
foreach ( var_1 in level.placement["all"] )
|
||||
var_1 setplayerscoreboardinfo();
|
||||
|
||||
if ( level.multiteambased )
|
||||
{
|
||||
buildscoreboardtype( "multiteam" );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
var_1 setcommonplayerdata( "round", "scoreboardType", "multiteam" );
|
||||
|
||||
setclientmatchdata( "alliesScore", -1 );
|
||||
setclientmatchdata( "axisScore", -1 );
|
||||
setclientmatchdata( "alliesKills", -1 );
|
||||
setclientmatchdata( "alliesDeaths", -1 );
|
||||
}
|
||||
else if ( level.teambased )
|
||||
{
|
||||
var_5 = getteamscore( "allies" );
|
||||
var_6 = getteamscore( "axis" );
|
||||
var_7 = 0;
|
||||
var_8 = 0;
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( isdefined( var_1.pers["team"] ) && var_1.pers["team"] == "allies" )
|
||||
{
|
||||
var_7 = var_7 + var_1.pers["kills"];
|
||||
var_8 = var_8 + var_1.pers["deaths"];
|
||||
}
|
||||
}
|
||||
|
||||
setclientmatchdata( "alliesScore", var_5 );
|
||||
setclientmatchdata( "axisScore", var_6 );
|
||||
setclientmatchdata( "alliesKills", var_7 );
|
||||
setclientmatchdata( "alliesDeaths", var_8 );
|
||||
|
||||
if ( var_5 == var_6 )
|
||||
var_11 = "tied";
|
||||
else if ( var_5 > var_6 )
|
||||
var_11 = "allies";
|
||||
else
|
||||
var_11 = "axis";
|
||||
|
||||
if ( var_11 == "tied" )
|
||||
{
|
||||
buildscoreboardtype( "allies" );
|
||||
buildscoreboardtype( "axis" );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
var_13 = var_1.pers["team"];
|
||||
|
||||
if ( !isdefined( var_13 ) )
|
||||
continue;
|
||||
|
||||
if ( var_13 == "spectator" )
|
||||
{
|
||||
var_1 setcommonplayerdata( "round", "scoreboardType", "allies" );
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 setcommonplayerdata( "round", "scoreboardType", var_13 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
buildscoreboardtype( var_11 );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
var_1 setcommonplayerdata( "round", "scoreboardType", var_11 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
buildscoreboardtype( "neutral" );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
var_1 setcommonplayerdata( "round", "scoreboardType", "neutral" );
|
||||
|
||||
setclientmatchdata( "alliesScore", -1 );
|
||||
setclientmatchdata( "axisScore", -1 );
|
||||
setclientmatchdata( "alliesKills", -1 );
|
||||
setclientmatchdata( "alliesDeaths", -1 );
|
||||
}
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( !isai( var_1 ) && ( maps\mp\_utility::privatematch() || maps\mp\_utility::matchmakinggame() ) )
|
||||
var_1 setcommonplayerdata( "round", "squadMemberIndex", var_1.pers["activeSquadMember"] );
|
||||
|
||||
var_1 setcommonplayerdata( "round", "totalXp", var_1.pers["summary"]["xp"] );
|
||||
var_1 setcommonplayerdata( "round", "scoreXp", var_1.pers["summary"]["score"] );
|
||||
var_1 setcommonplayerdata( "round", "operationXp", var_1.pers["summary"]["operation"] );
|
||||
var_1 setcommonplayerdata( "round", "challengeXp", var_1.pers["summary"]["challenge"] );
|
||||
var_1 setcommonplayerdata( "round", "matchXp", var_1.pers["summary"]["match"] );
|
||||
var_1 setcommonplayerdata( "round", "miscXp", var_1.pers["summary"]["misc"] );
|
||||
var_1 setcommonplayerdatareservedint( "common_entitlement_xp", var_1.pers["summary"]["entitlementXP"] );
|
||||
var_1 setcommonplayerdatareservedint( "common_clan_wars_xp", var_1.pers["summary"]["clanWarsXP"] );
|
||||
}
|
||||
}
|
||||
|
||||
setplayerscoreboardinfo()
|
||||
{
|
||||
var_0 = getclientmatchdata( "scoreboardPlayerCount" );
|
||||
|
||||
if ( var_0 <= 24 )
|
||||
{
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "score", self.pers["score"] );
|
||||
|
||||
if ( isdefined( level.ishorde ) )
|
||||
var_1 = self.pers["hordeKills"];
|
||||
else
|
||||
var_1 = self.pers["kills"];
|
||||
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "kills", var_1 );
|
||||
|
||||
if ( isdefined( level.ishorde ) )
|
||||
var_2 = self.pers["hordeRevives"];
|
||||
else if ( level.gametype == "dm" || level.gametype == "sotf_ffa" || level.gametype == "gun" )
|
||||
var_2 = self.assists;
|
||||
else
|
||||
var_2 = self.pers["assists"];
|
||||
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "assists", var_2 );
|
||||
var_3 = self.pers["deaths"];
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "deaths", var_3 );
|
||||
var_4 = self.pers["team"];
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "team", var_4 );
|
||||
var_5 = game[self.pers["team"]];
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "faction", var_5 );
|
||||
var_6 = self.pers["extrascore0"];
|
||||
setclientmatchdata( "players", self.clientmatchdataid, "extrascore0", var_6 );
|
||||
var_0++;
|
||||
setclientmatchdata( "scoreboardPlayerCount", var_0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
buildscoreboardtype( var_0 )
|
||||
{
|
||||
if ( var_0 == "multiteam" )
|
||||
{
|
||||
var_1 = 0;
|
||||
|
||||
foreach ( var_3 in level.teamnamelist )
|
||||
{
|
||||
foreach ( var_5 in level.placement[var_3] )
|
||||
{
|
||||
setclientmatchdata( "scoreboards", "multiteam", var_1, var_5.clientmatchdataid );
|
||||
var_1++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( var_0 == "neutral" )
|
||||
{
|
||||
var_1 = 0;
|
||||
|
||||
foreach ( var_5 in level.placement["all"] )
|
||||
{
|
||||
setclientmatchdata( "scoreboards", var_0, var_1, var_5.clientmatchdataid );
|
||||
var_1++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var_10 = maps\mp\_utility::getotherteam( var_0 );
|
||||
var_1 = 0;
|
||||
|
||||
foreach ( var_5 in level.placement[var_0] )
|
||||
{
|
||||
setclientmatchdata( "scoreboards", var_0, var_1, var_5.clientmatchdataid );
|
||||
var_1++;
|
||||
}
|
||||
|
||||
foreach ( var_5 in level.placement[var_10] )
|
||||
{
|
||||
setclientmatchdata( "scoreboards", var_0, var_1, var_5.clientmatchdataid );
|
||||
var_1++;
|
||||
}
|
||||
}
|
||||
}
|
167
maps/mp/_shutter.gsc
Normal file
167
maps/mp/_shutter.gsc
Normal file
@ -0,0 +1,167 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
level.inc = 0;
|
||||
common_scripts\utility::array_levelthread( getentarray( "wire", "targetname" ), ::wirewander );
|
||||
var_0 = getentarray( "shutter_left", "targetname" );
|
||||
var_1 = getentarray( "shutter_right_open", "targetname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
var_0[var_0.size] = var_1[var_2];
|
||||
|
||||
var_1 = getentarray( "shutter_left_closed", "targetname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
var_0[var_0.size] = var_1[var_2];
|
||||
|
||||
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
|
||||
{
|
||||
var_3 = var_0[var_2];
|
||||
var_3 rotateto( ( var_3.angles[0], var_3.angles[1] + 180, var_3.angles[2] ), 0.1 );
|
||||
}
|
||||
|
||||
wait 0.2;
|
||||
|
||||
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
|
||||
var_0[var_2].startyaw = var_0[var_2].angles[1];
|
||||
|
||||
var_4 = getentarray( "shutter_right", "targetname" );
|
||||
var_1 = getentarray( "shutter_left_open", "targetname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
var_4[var_4.size] = var_1[var_2];
|
||||
|
||||
var_1 = getentarray( "shutter_right_closed", "targetname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
var_4[var_4.size] = var_1[var_2];
|
||||
|
||||
for ( var_2 = 0; var_2 < var_4.size; var_2++ )
|
||||
var_4[var_2].startyaw = var_4[var_2].angles[1];
|
||||
|
||||
var_1 = undefined;
|
||||
var_5 = "left";
|
||||
|
||||
for (;;)
|
||||
{
|
||||
common_scripts\utility::array_levelthread( var_0, ::shutterwanderleft, var_5 );
|
||||
common_scripts\utility::array_levelthread( var_4, ::shutterwanderright, var_5 );
|
||||
level waittill( "wind blows", var_5 );
|
||||
}
|
||||
}
|
||||
|
||||
windcontroller()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
var_0 = "left";
|
||||
|
||||
if ( randomint( 100 ) > 50 )
|
||||
var_0 = "right";
|
||||
|
||||
level notify( "wind blows", var_0 );
|
||||
wait( 2 + randomfloat( 10 ) );
|
||||
}
|
||||
}
|
||||
|
||||
shutterwanderleft( var_0, var_1 )
|
||||
{
|
||||
level.inc++;
|
||||
level endon( "wind blows" );
|
||||
var_2 = var_0.startyaw;
|
||||
|
||||
if ( var_1 == "left" )
|
||||
var_2 = var_2 + 179.9;
|
||||
|
||||
var_3 = 0.2;
|
||||
var_0 rotateto( ( var_0.angles[0], var_2, var_0.angles[2] ), var_3 );
|
||||
wait( var_3 + 0.1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = randomint( 80 );
|
||||
|
||||
if ( randomint( 100 ) > 50 )
|
||||
var_4 = var_4 * -1;
|
||||
|
||||
var_2 = var_0.angles[1] + var_4;
|
||||
var_5 = var_0.angles[1] + var_4 * -1;
|
||||
|
||||
if ( var_2 < var_0.startyaw || var_2 > var_0.startyaw + 179 )
|
||||
var_2 = var_5;
|
||||
|
||||
var_6 = abs( var_0.angles[1] - var_2 );
|
||||
var_3 = var_6 * 0.02 + randomfloat( 2 );
|
||||
|
||||
if ( var_3 < 0.3 )
|
||||
var_3 = 0.3;
|
||||
|
||||
var_0 rotateto( ( var_0.angles[0], var_2, var_0.angles[2] ), var_3, var_3 * 0.5, var_3 * 0.5 );
|
||||
wait( var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
shutterwanderright( var_0, var_1 )
|
||||
{
|
||||
level.inc++;
|
||||
level endon( "wind blows" );
|
||||
var_2 = var_0.startyaw;
|
||||
|
||||
if ( var_1 == "left" )
|
||||
var_2 = var_2 + 179.9;
|
||||
|
||||
var_3 = 0.2;
|
||||
var_0 rotateto( ( var_0.angles[0], var_2, var_0.angles[2] ), var_3 );
|
||||
wait( var_3 + 0.1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = randomint( 80 );
|
||||
|
||||
if ( randomint( 100 ) > 50 )
|
||||
var_4 = var_4 * -1;
|
||||
|
||||
var_2 = var_0.angles[1] + var_4;
|
||||
var_5 = var_0.angles[1] + var_4 * -1;
|
||||
|
||||
if ( var_2 < var_0.startyaw || var_2 > var_0.startyaw + 179 )
|
||||
var_2 = var_5;
|
||||
|
||||
var_6 = abs( var_0.angles[1] - var_2 );
|
||||
var_3 = var_6 * 0.02 + randomfloat( 2 );
|
||||
|
||||
if ( var_3 < 0.3 )
|
||||
var_3 = 0.3;
|
||||
|
||||
var_0 rotateto( ( var_0.angles[0], var_2, var_0.angles[2] ), var_3, var_3 * 0.5, var_3 * 0.5 );
|
||||
wait( var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
wirewander( var_0 )
|
||||
{
|
||||
var_1 = getentarray( var_0.target, "targetname" );
|
||||
var_2 = var_1[0].origin;
|
||||
var_3 = var_1[1].origin;
|
||||
var_4 = vectortoangles( var_2 - var_3 );
|
||||
var_5 = spawn( "script_model", ( 0, 0, 0 ) );
|
||||
var_5.origin = var_2 * 0.5 + var_3 * 0.5;
|
||||
var_5.angles = var_4;
|
||||
var_0 linkto( var_5 );
|
||||
var_6 = 2;
|
||||
var_7 = 0.9;
|
||||
var_8 = 4 + randomfloat( 2 );
|
||||
var_5 rotateroll( var_8 * 0.5, 0.2 );
|
||||
wait 0.2;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_9 = var_6 + randomfloat( var_7 ) - var_7 * 0.5;
|
||||
var_5 rotateroll( var_8, var_9, var_9 * 0.5, var_9 * 0.5 );
|
||||
wait( var_9 );
|
||||
var_5 rotateroll( var_8 * -1, var_9, var_9 * 0.5, var_9 * 0.5 );
|
||||
wait( var_9 );
|
||||
}
|
||||
}
|
282
maps/mp/_stinger.gsc
Normal file
282
maps/mp/_stinger.gsc
Normal file
@ -0,0 +1,282 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
initstingerusage()
|
||||
{
|
||||
self.stingerstage = undefined;
|
||||
self.stingertarget = undefined;
|
||||
self.stingerlockstarttime = undefined;
|
||||
self.stingerlostsightlinetime = undefined;
|
||||
thread resetstingerlockingondeath();
|
||||
level.stingertargets = [];
|
||||
}
|
||||
|
||||
resetstingerlocking()
|
||||
{
|
||||
if ( !isdefined( self.stingeruseentered ) )
|
||||
return;
|
||||
|
||||
self.stingeruseentered = undefined;
|
||||
self notify( "stop_javelin_locking_feedback" );
|
||||
self notify( "stop_javelin_locked_feedback" );
|
||||
self weaponlockfree();
|
||||
initstingerusage();
|
||||
}
|
||||
|
||||
resetstingerlockingondeath()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self notify( "ResetStingerLockingOnDeath" );
|
||||
self endon( "ResetStingerLockingOnDeath" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "death" );
|
||||
resetstingerlocking();
|
||||
}
|
||||
}
|
||||
|
||||
stillvalidstingerlock( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( !self worldpointinreticle_circle( var_0.origin, 65, 85 ) )
|
||||
return 0;
|
||||
|
||||
if ( self.stingertarget == level.ac130.planemodel && !isdefined( level.ac130player ) )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
loopstingerlockingfeedback()
|
||||
{
|
||||
self endon( "stop_javelin_locking_feedback" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( level.chopper ) && isdefined( level.chopper.gunner ) && isdefined( self.stingertarget ) && self.stingertarget == level.chopper.gunner )
|
||||
level.chopper.gunner playlocalsound( "missile_locking" );
|
||||
|
||||
if ( isdefined( level.ac130player ) && isdefined( self.stingertarget ) && self.stingertarget == level.ac130.planemodel )
|
||||
level.ac130player playlocalsound( "missile_locking" );
|
||||
|
||||
self playlocalsound( "stinger_locking" );
|
||||
self playrumbleonentity( "ac130_25mm_fire" );
|
||||
wait 0.6;
|
||||
}
|
||||
}
|
||||
|
||||
loopstingerlockedfeedback()
|
||||
{
|
||||
self endon( "stop_javelin_locked_feedback" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( level.chopper ) && isdefined( level.chopper.gunner ) && isdefined( self.stingertarget ) && self.stingertarget == level.chopper.gunner )
|
||||
level.chopper.gunner playlocalsound( "missile_locking" );
|
||||
|
||||
if ( isdefined( level.ac130player ) && isdefined( self.stingertarget ) && self.stingertarget == level.ac130.planemodel )
|
||||
level.ac130player playlocalsound( "missile_locking" );
|
||||
|
||||
self playlocalsound( "stinger_locked" );
|
||||
self playrumbleonentity( "ac130_25mm_fire" );
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
locksighttest( var_0 )
|
||||
{
|
||||
var_1 = self geteye();
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return 0;
|
||||
|
||||
var_2 = sighttracepassed( var_1, var_0.origin, 0, var_0 );
|
||||
|
||||
if ( var_2 )
|
||||
return 1;
|
||||
|
||||
var_3 = var_0 getpointinbounds( 1, 0, 0 );
|
||||
var_2 = sighttracepassed( var_1, var_3, 0, var_0 );
|
||||
|
||||
if ( var_2 )
|
||||
return 1;
|
||||
|
||||
var_4 = var_0 getpointinbounds( -1, 0, 0 );
|
||||
var_2 = sighttracepassed( var_1, var_4, 0, var_0 );
|
||||
|
||||
if ( var_2 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
stingerdebugdraw( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
softsighttest()
|
||||
{
|
||||
var_0 = 500;
|
||||
|
||||
if ( locksighttest( self.stingertarget ) )
|
||||
{
|
||||
self.stingerlostsightlinetime = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( self.stingerlostsightlinetime == 0 )
|
||||
self.stingerlostsightlinetime = gettime();
|
||||
|
||||
var_1 = gettime() - self.stingerlostsightlinetime;
|
||||
|
||||
if ( var_1 >= var_0 )
|
||||
{
|
||||
resetstingerlocking();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
stingerusageloop()
|
||||
{
|
||||
if ( !isplayer( self ) )
|
||||
return;
|
||||
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "faux_spawn" );
|
||||
var_0 = 1000;
|
||||
initstingerusage();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( self playerads() < 0.95 )
|
||||
{
|
||||
resetstingerlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 = self getcurrentweapon();
|
||||
|
||||
if ( var_1 != "stinger_mp" && var_1 != "at4_mp" && var_1 != "iw5_smaw_mp" )
|
||||
{
|
||||
resetstingerlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
self.stingeruseentered = 1;
|
||||
|
||||
if ( !isdefined( self.stingerstage ) )
|
||||
self.stingerstage = 0;
|
||||
|
||||
stingerdebugdraw( self.stingertarget );
|
||||
|
||||
if ( self.stingerstage == 0 )
|
||||
{
|
||||
var_2 = maps\mp\gametypes\_weapons::lockonlaunchers_gettargetarray();
|
||||
|
||||
if ( var_2.size == 0 )
|
||||
continue;
|
||||
|
||||
var_3 = [];
|
||||
|
||||
foreach ( var_5 in var_2 )
|
||||
{
|
||||
if ( !isdefined( var_5 ) )
|
||||
continue;
|
||||
|
||||
var_6 = self worldpointinreticle_circle( var_5.origin, 65, 75 );
|
||||
|
||||
if ( var_6 )
|
||||
var_3[var_3.size] = var_5;
|
||||
}
|
||||
|
||||
if ( var_3.size == 0 )
|
||||
continue;
|
||||
|
||||
var_8 = sortbydistance( var_3, self.origin );
|
||||
|
||||
if ( !locksighttest( var_8[0] ) )
|
||||
continue;
|
||||
|
||||
thread loopstingerlockingfeedback();
|
||||
self.stingertarget = var_8[0];
|
||||
self.stingerlockstarttime = gettime();
|
||||
self.stingerstage = 1;
|
||||
self.stingerlostsightlinetime = 0;
|
||||
}
|
||||
|
||||
if ( self.stingerstage == 1 )
|
||||
{
|
||||
if ( !stillvalidstingerlock( self.stingertarget ) )
|
||||
{
|
||||
resetstingerlocking();
|
||||
continue;
|
||||
}
|
||||
|
||||
var_9 = softsighttest();
|
||||
|
||||
if ( !var_9 )
|
||||
continue;
|
||||
|
||||
var_10 = gettime() - self.stingerlockstarttime;
|
||||
|
||||
if ( maps\mp\_utility::_hasperk( "specialty_fasterlockon" ) )
|
||||
{
|
||||
if ( var_10 < var_0 * 0.5 )
|
||||
continue;
|
||||
}
|
||||
else if ( var_10 < var_0 )
|
||||
continue;
|
||||
|
||||
self notify( "stop_javelin_locking_feedback" );
|
||||
thread loopstingerlockedfeedback();
|
||||
|
||||
if ( checkvehiclemodelforlock( self.stingertarget.model ) )
|
||||
self weaponlockfinalize( self.stingertarget );
|
||||
else if ( isplayer( self.stingertarget ) )
|
||||
self weaponlockfinalize( self.stingertarget, ( 100, 0, 64 ) );
|
||||
else
|
||||
self weaponlockfinalize( self.stingertarget, ( 100, 0, -32 ) );
|
||||
|
||||
self.stingerstage = 2;
|
||||
}
|
||||
|
||||
if ( self.stingerstage == 2 )
|
||||
{
|
||||
var_9 = softsighttest();
|
||||
|
||||
if ( !var_9 )
|
||||
continue;
|
||||
|
||||
if ( !stillvalidstingerlock( self.stingertarget ) )
|
||||
{
|
||||
resetstingerlocking();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkvehiclemodelforlock( var_0 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "vehicle_ugv_talon_mp":
|
||||
case "vehicle_av8b_harrier_jet_opfor_mp":
|
||||
case "vehicle_av8b_harrier_jet_mp":
|
||||
return 1;
|
||||
default:
|
||||
if ( var_0 == level.littlebird_model )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
1316
maps/mp/_teleport.gsc
Normal file
1316
maps/mp/_teleport.gsc
Normal file
File diff suppressed because it is too large
Load Diff
5274
maps/mp/_utility.gsc
Normal file
5274
maps/mp/_utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
377
maps/mp/_water.gsc
Normal file
377
maps/mp/_water.gsc
Normal file
@ -0,0 +1,377 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
watershallowfx()
|
||||
{
|
||||
level._effect["water_kick"] = loadfx( "vfx/moments/flood/flood_db_foam_allie_ch_fast_cheap" );
|
||||
level._effect["water_splash_emerge"] = loadfx( "vfx/moments/flood/flood_db_foam_allie_vertical_splash_sml" );
|
||||
level._effect["water_splash_large"] = loadfx( "vfx/moments/flood/flood_db_foam_allie_vertical_splash_lrg" );
|
||||
}
|
||||
|
||||
watershallowinit( var_0, var_1 )
|
||||
{
|
||||
if ( isdefined( var_0 ) )
|
||||
level.waterdeletez = var_0;
|
||||
|
||||
level.trigunderwater = getent( "trigger_underwater", "targetname" );
|
||||
level.trigabovewater = getent( "trigger_abovewater", "targetname" );
|
||||
level.trigunderwater thread watchplayerenterwater( level.trigabovewater, var_1 );
|
||||
level thread clearwatervarsonspawn( level.trigunderwater );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
level thread watchentsindeepwater( level.trigunderwater, var_0 );
|
||||
}
|
||||
|
||||
watchentsindeepwater( var_0, var_1 )
|
||||
{
|
||||
level childthread watchentsindeepwater_mines( var_0, var_1 );
|
||||
level childthread watchentsindeepwater_ks( var_0, var_1 );
|
||||
}
|
||||
|
||||
watchentsindeepwater_ks( var_0, var_1 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
var_2 = level.placedims;
|
||||
var_2 = common_scripts\utility::array_combine( var_2, level.uplinks );
|
||||
var_2 = common_scripts\utility::array_combine( var_2, level.turrets );
|
||||
|
||||
foreach ( var_4 in var_2 )
|
||||
{
|
||||
if ( !isdefined( var_4 ) )
|
||||
continue;
|
||||
|
||||
var_5 = common_scripts\utility::ter_op( isdefined( var_4.sentrytype ) && var_4.sentrytype == "sentry_minigun", var_1 - 35, var_1 );
|
||||
|
||||
if ( var_4.origin[2] <= var_5 && var_4 istouching( var_0 ) )
|
||||
var_4 notify( "death" );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
|
||||
foreach ( var_8 in level.characters )
|
||||
{
|
||||
if ( isdefined( var_8 ) && isalive( var_8 ) && isai( var_8 ) && var_8.origin[2] <= var_1 - 35 && var_8 istouching( var_0 ) )
|
||||
{
|
||||
if ( isagent( var_8 ) && isdefined( var_8.agent_type ) && var_8.agent_type == "dog" )
|
||||
{
|
||||
if ( !isdefined( var_8.spawntime ) || gettime() - var_8.spawntime > 2000 )
|
||||
var_8 [[ var_8 maps\mp\agents\_agent_utility::agentfunc( "on_damaged" ) ]]( level, undefined, int( ceil( var_8.maxhealth * 0.08 ) ), 0, "MOD_CRUSH", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0 );
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
var_8 dodamage( int( ceil( var_8.maxhealth * 0.08 ) ), var_8.origin );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchentsindeepwater_mines( var_0, var_1 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "mine_planted" );
|
||||
waittillframeend;
|
||||
var_2 = level.mines;
|
||||
|
||||
foreach ( var_6, var_4 in var_2 )
|
||||
{
|
||||
if ( !isdefined( var_4 ) )
|
||||
continue;
|
||||
|
||||
var_5 = 0;
|
||||
|
||||
if ( isdefined( var_4.istallforwaterchecks ) )
|
||||
var_5 = 28;
|
||||
|
||||
if ( var_4.origin[2] <= var_1 - var_5 && var_4 istouching( var_0 ) )
|
||||
var_4 maps\mp\gametypes\_weapons::deleteexplosive();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clearwatervarsonspawn( var_0 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "player_spawned", var_1 );
|
||||
|
||||
if ( !var_1 istouching( var_0 ) )
|
||||
{
|
||||
var_1.inwater = undefined;
|
||||
var_1.underwater = undefined;
|
||||
var_1 notify( "out_of_water" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchplayerenterwater( var_0, var_1 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "trigger", var_2 );
|
||||
|
||||
if ( !isplayer( var_2 ) && !isagent( var_2 ) )
|
||||
continue;
|
||||
|
||||
if ( !isalive( var_2 ) || isagent( var_2 ) && isdefined( var_2.agent_type ) && var_2.agent_type == "dog" )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( var_2.inwater ) )
|
||||
{
|
||||
var_2.inwater = 1;
|
||||
var_2 thread playerinwater( self, var_0, var_1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playersplash()
|
||||
{
|
||||
self endon( "out_of_water" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
var_0 = self getvelocity();
|
||||
|
||||
if ( var_0[2] > -100 )
|
||||
return;
|
||||
|
||||
wait 0.2;
|
||||
var_0 = self getvelocity();
|
||||
|
||||
if ( var_0[2] <= -100 )
|
||||
{
|
||||
self playsound( "watersplash_lrg" );
|
||||
playfx( level._effect["water_splash_large"], self.origin + ( 0, 0, 36 ), ( 0, 0, 1 ), anglestoforward( ( 0, self.angles[1], 0 ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
playerinwater( var_0, var_1, var_2 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
thread inwaterwake( var_2 );
|
||||
thread playerwaterclearwait();
|
||||
thread playersplash();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !self istouching( var_0 ) )
|
||||
{
|
||||
self.inwater = undefined;
|
||||
self.underwater = undefined;
|
||||
self notify( "out_of_water" );
|
||||
stopwatervisuals();
|
||||
break;
|
||||
}
|
||||
|
||||
if ( !isdefined( self.underwater ) && !self istouching( var_1 ) )
|
||||
{
|
||||
if ( self.classname == "script_vehicle" )
|
||||
self notify( "death" );
|
||||
else
|
||||
{
|
||||
self.underwater = 1;
|
||||
thread playerunderwater();
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( self.underwater ) && self istouching( var_1 ) )
|
||||
{
|
||||
self.underwater = undefined;
|
||||
self notify( "above_water" );
|
||||
stopwatervisuals();
|
||||
|
||||
if ( isplayer( self ) )
|
||||
{
|
||||
if ( self hasfemalecustomizationmodel() )
|
||||
self playlocalsound( "Fem_breathing_better" );
|
||||
else
|
||||
self playlocalsound( "breathing_better" );
|
||||
}
|
||||
|
||||
playfx( level._effect["water_splash_emerge"], self.origin + ( 0, 0, 24 ) );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
isactivekillstreakpoolrestricted( var_0 )
|
||||
{
|
||||
if ( isdefined( var_0.killstreakindexweapon ) )
|
||||
{
|
||||
var_1 = self.pers["killstreaks"][self.killstreakindexweapon].streakname;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
switch ( var_1 )
|
||||
{
|
||||
case "sam_turret":
|
||||
case "remote_tank":
|
||||
case "sentry":
|
||||
case "ims":
|
||||
case "minigun_turret":
|
||||
case "remote_mg_turret":
|
||||
case "remote_uav":
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
playerwaterclearwait()
|
||||
{
|
||||
common_scripts\utility::waittill_any( "death", "disconnect", "out_of_water" );
|
||||
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
self.inwater = undefined;
|
||||
self.underwater = undefined;
|
||||
}
|
||||
|
||||
inwaterwake( var_0 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "out_of_water" );
|
||||
var_1 = common_scripts\utility::ter_op( isdefined( var_0 ), var_0, self.origin[2] );
|
||||
var_2 = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( var_2 )
|
||||
wait 0.05;
|
||||
else
|
||||
wait 0.3;
|
||||
|
||||
if ( !isdefined( level.waterkicktimenext ) )
|
||||
level.waterkicktimenext = gettime() + 200;
|
||||
else
|
||||
{
|
||||
var_3 = gettime();
|
||||
|
||||
if ( gettime() < level.waterkicktimenext )
|
||||
{
|
||||
var_2 = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
level.waterkicktimenext = var_3 + 200;
|
||||
}
|
||||
|
||||
var_2 = 0;
|
||||
var_4 = self getvelocity();
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
if ( abs( var_4[2] ) <= 1 )
|
||||
var_1 = self.origin[2];
|
||||
}
|
||||
|
||||
if ( abs( var_4[2] ) > 30 )
|
||||
{
|
||||
playfx( level._effect["water_kick"], ( self.origin[0], self.origin[1], min( var_1, self.origin[2] ) ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( length2dsquared( var_4 ) > 3600 )
|
||||
{
|
||||
var_5 = vectornormalize( ( var_4[0], var_4[1], 0 ) );
|
||||
playfx( level._effect["water_kick"], ( self.origin[0], self.origin[1], min( var_1, self.origin[2] ) ) + var_5 * 36, var_5, ( 0, 0, 1 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerunderwater()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "above_water" );
|
||||
self endon( "out_of_water" );
|
||||
|
||||
if ( !maps\mp\_utility::isusingremote() )
|
||||
{
|
||||
startwatervisuals();
|
||||
thread stopwatervisualsonremote();
|
||||
}
|
||||
|
||||
playfx( level._effect["water_splash_emerge"], self geteye() - ( 0, 0, 24 ) );
|
||||
wait 2;
|
||||
thread onplayerdrowned();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self dodamage( 20, self.origin );
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdrowned()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "above_water" );
|
||||
self endon( "out_of_water" );
|
||||
self waittill( "death" );
|
||||
self.inwater = undefined;
|
||||
self.underwater = undefined;
|
||||
}
|
||||
|
||||
underwaterbubbles()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "using_remote" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "above_water" );
|
||||
self endon( "out_of_water" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
playfx( level._effect["water_bubbles"], self geteye() + anglestoup( self.angles ) * -13 + anglestoforward( self.angles ) * 25 );
|
||||
wait 0.75;
|
||||
}
|
||||
}
|
||||
|
||||
startwatervisuals()
|
||||
{
|
||||
self shellshock( "mp_flooded_water", 8 );
|
||||
|
||||
if ( isplayer( self ) )
|
||||
self setblurforplayer( 10, 0.0 );
|
||||
}
|
||||
|
||||
stopwatervisuals()
|
||||
{
|
||||
self stopshellshock();
|
||||
|
||||
if ( isplayer( self ) )
|
||||
self setblurforplayer( 0, 0.85 );
|
||||
}
|
||||
|
||||
stopwatervisualsonremote()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "above_water" );
|
||||
self endon( "out_of_water" );
|
||||
self waittill( "using_remote" );
|
||||
stopwatervisuals();
|
||||
}
|
113
maps/mp/_zipline.gsc
Normal file
113
maps/mp/_zipline.gsc
Normal file
@ -0,0 +1,113 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
var_0 = [];
|
||||
var_1 = getentarray( "zipline", "targetname" );
|
||||
|
||||
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
||||
{
|
||||
var_3 = maps\mp\gametypes\_gameobjects::createuseobject( "neutral", var_1[var_2], var_0, ( 0, 0, 0 ) );
|
||||
var_3 maps\mp\gametypes\_gameobjects::allowuse( "any" );
|
||||
var_3 maps\mp\gametypes\_gameobjects::setusetime( 0.25 );
|
||||
var_3 maps\mp\gametypes\_gameobjects::setusetext( &"MP_ZIPLINE_USE" );
|
||||
var_3 maps\mp\gametypes\_gameobjects::setusehinttext( &"MP_ZIPLINE_USE" );
|
||||
var_3 maps\mp\gametypes\_gameobjects::setvisibleteam( "any" );
|
||||
var_3.onbeginuse = ::onbeginuse;
|
||||
var_3.onuse = ::onuse;
|
||||
var_4 = [];
|
||||
var_5 = getent( var_1[var_2].target, "targetname" );
|
||||
|
||||
if ( !isdefined( var_5 ) )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
while ( isdefined( var_5 ) )
|
||||
{
|
||||
var_4[var_4.size] = var_5;
|
||||
|
||||
if ( isdefined( var_5.target ) )
|
||||
{
|
||||
var_5 = getent( var_5.target, "targetname" );
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
var_3.targets = var_4;
|
||||
}
|
||||
|
||||
precachemodel( "tag_player" );
|
||||
}
|
||||
|
||||
onbeginuse( var_0 )
|
||||
{
|
||||
var_0 playsound( "scrambler_pullout_lift_plr" );
|
||||
}
|
||||
|
||||
onuse( var_0 )
|
||||
{
|
||||
var_0 thread zip( self );
|
||||
}
|
||||
|
||||
zip( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "zipline_drop" );
|
||||
level endon( "game_ended" );
|
||||
var_1 = spawn( "script_origin", var_0.trigger.origin );
|
||||
var_1.origin = var_0.trigger.origin;
|
||||
var_1.angles = self.angles;
|
||||
var_1 setmodel( "tag_player" );
|
||||
self playerlinktodelta( var_1, "tag_player", 1, 180, 180, 180, 180 );
|
||||
thread watchdeath( var_1 );
|
||||
thread watchdrop( var_1 );
|
||||
var_2 = var_0.targets;
|
||||
|
||||
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
|
||||
{
|
||||
var_4 = distance( var_1.origin, var_2[var_3].origin ) / 600;
|
||||
var_5 = 0.0;
|
||||
|
||||
if ( var_3 == 0 )
|
||||
var_5 = var_4 * 0.2;
|
||||
|
||||
var_1 moveto( var_2[var_3].origin, var_4, var_5 );
|
||||
|
||||
if ( var_1.angles != var_2[var_3].angles )
|
||||
var_1 rotateto( var_2[var_3].angles, var_4 * 0.8 );
|
||||
|
||||
wait( var_4 );
|
||||
}
|
||||
|
||||
self notify( "destination" );
|
||||
self unlink();
|
||||
var_1 delete();
|
||||
}
|
||||
|
||||
watchdrop( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "destination" );
|
||||
level endon( "game_ended" );
|
||||
self notifyonplayercommand( "zipline_drop", "+gostand" );
|
||||
self waittill( "zipline_drop" );
|
||||
self unlink();
|
||||
var_0 delete();
|
||||
}
|
||||
|
||||
watchdeath( var_0 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "destination" );
|
||||
self endon( "zipline_drop" );
|
||||
level endon( "game_ended" );
|
||||
self waittill( "death" );
|
||||
self unlink();
|
||||
var_0 delete();
|
||||
}
|
89
maps/mp/agents/_agent_common.gsc
Normal file
89
maps/mp/agents/_agent_common.gsc
Normal file
@ -0,0 +1,89 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
codecallback_agentadded()
|
||||
{
|
||||
maps\mp\agents\_agent_utility::initagentscriptvariables();
|
||||
var_0 = "axis";
|
||||
|
||||
if ( level.numagents % 2 == 0 )
|
||||
var_0 = "allies";
|
||||
|
||||
level.numagents++;
|
||||
maps\mp\agents\_agent_utility::set_agent_team( var_0 );
|
||||
level.agentarray[level.agentarray.size] = self;
|
||||
}
|
||||
|
||||
codecallback_agentdamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
var_1 = maps\mp\_utility::_validateattacker( var_1 );
|
||||
self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
|
||||
codecallback_agentkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
var_1 = maps\mp\_utility::_validateattacker( var_1 );
|
||||
self thread [[ maps\mp\agents\_agent_utility::agentfunc( "on_killed" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
}
|
||||
|
||||
init()
|
||||
{
|
||||
initagentlevelvariables();
|
||||
level thread add_agents_to_game();
|
||||
}
|
||||
|
||||
connectnewagent( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = maps\mp\agents\_agent_utility::getfreeagent( var_0 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_3.connecttime = gettime();
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_3 maps\mp\agents\_agent_utility::set_agent_team( var_1 );
|
||||
else
|
||||
var_3 maps\mp\agents\_agent_utility::set_agent_team( var_3.team );
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_3.class_override = var_2;
|
||||
|
||||
if ( isdefined( level.agent_funcs[var_0]["onAIConnect"] ) )
|
||||
var_3 [[ var_3 maps\mp\agents\_agent_utility::agentfunc( "onAIConnect" ) ]]();
|
||||
|
||||
var_3 maps\mp\gametypes\_spawnlogic::addtocharactersarray();
|
||||
}
|
||||
|
||||
return var_3;
|
||||
}
|
||||
|
||||
initagentlevelvariables()
|
||||
{
|
||||
level.agentarray = [];
|
||||
level.numagents = 0;
|
||||
}
|
||||
|
||||
add_agents_to_game()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
level waittill( "connected", var_0 );
|
||||
var_1 = getmaxagents();
|
||||
|
||||
while ( level.agentarray.size < var_1 )
|
||||
{
|
||||
var_2 = addagent();
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
{
|
||||
common_scripts\utility::waitframe();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set_agent_health( var_0 )
|
||||
{
|
||||
self.agenthealth = var_0;
|
||||
self.health = var_0;
|
||||
self.maxhealth = var_0;
|
||||
}
|
335
maps/mp/agents/_agent_utility.gsc
Normal file
335
maps/mp/agents/_agent_utility.gsc
Normal file
@ -0,0 +1,335 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
agentfunc( var_0 )
|
||||
{
|
||||
return level.agent_funcs[self.agent_type][var_0];
|
||||
}
|
||||
|
||||
set_agent_team( var_0, var_1 )
|
||||
{
|
||||
self.team = var_0;
|
||||
self.agentteam = var_0;
|
||||
self.pers["team"] = var_0;
|
||||
self.owner = var_1;
|
||||
self setotherent( var_1 );
|
||||
self setentityowner( var_1 );
|
||||
}
|
||||
|
||||
initagentscriptvariables()
|
||||
{
|
||||
self.agent_type = "player";
|
||||
self.pers = [];
|
||||
self.hasdied = 0;
|
||||
self.isactive = 0;
|
||||
self.isagent = 1;
|
||||
self.wasti = 0;
|
||||
self.issniper = 0;
|
||||
self.spawntime = 0;
|
||||
self.entity_number = self getentitynumber();
|
||||
self.agent_teamparticipant = 0;
|
||||
self.agent_gameparticipant = 0;
|
||||
self.canperformclienttraces = 0;
|
||||
self.agentname = undefined;
|
||||
self detachall();
|
||||
initplayerscriptvariables( 0 );
|
||||
}
|
||||
|
||||
initplayerscriptvariables( var_0 )
|
||||
{
|
||||
if ( !var_0 )
|
||||
{
|
||||
self.class = undefined;
|
||||
self.lastclass = undefined;
|
||||
self.movespeedscaler = undefined;
|
||||
self.avoidkillstreakonspawntimer = undefined;
|
||||
self.guid = undefined;
|
||||
self.name = undefined;
|
||||
self.saved_actionslotdata = undefined;
|
||||
self.perks = undefined;
|
||||
self.weaponlist = undefined;
|
||||
self.omaclasschanged = undefined;
|
||||
self.objectivescaler = undefined;
|
||||
self.touchtriggers = undefined;
|
||||
self.carryobject = undefined;
|
||||
self.claimtrigger = undefined;
|
||||
self.canpickupobject = undefined;
|
||||
self.killedinuse = undefined;
|
||||
self.sessionteam = undefined;
|
||||
self.sessionstate = undefined;
|
||||
self.lastspawntime = undefined;
|
||||
self.lastspawnpoint = undefined;
|
||||
self.disabledweapon = undefined;
|
||||
self.disabledweaponswitch = undefined;
|
||||
self.disabledoffhandweapons = undefined;
|
||||
self.disabledusability = undefined;
|
||||
self.shielddamage = undefined;
|
||||
self.shieldbullethits = undefined;
|
||||
self.recentshieldxp = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.movespeedscaler = 1;
|
||||
self.avoidkillstreakonspawntimer = 5;
|
||||
self.guid = maps\mp\_utility::getuniqueid();
|
||||
self.name = self.guid;
|
||||
self.sessionteam = self.team;
|
||||
self.sessionstate = "playing";
|
||||
self.shielddamage = 0;
|
||||
self.shieldbullethits = 0;
|
||||
self.recentshieldxp = 0;
|
||||
self.agent_gameparticipant = 1;
|
||||
maps\mp\gametypes\_playerlogic::setupsavedactionslots();
|
||||
thread maps\mp\perks\_perks::onplayerspawned();
|
||||
|
||||
if ( maps\mp\_utility::isgameparticipant( self ) )
|
||||
{
|
||||
self.objectivescaler = 1;
|
||||
maps\mp\gametypes\_gameobjects::init_player_gameobjects();
|
||||
self.disabledweapon = 0;
|
||||
self.disabledweaponswitch = 0;
|
||||
self.disabledoffhandweapons = 0;
|
||||
}
|
||||
}
|
||||
|
||||
self.disabledusability = 1;
|
||||
}
|
||||
|
||||
getfreeagent( var_0 )
|
||||
{
|
||||
var_1 = undefined;
|
||||
|
||||
if ( isdefined( level.agentarray ) )
|
||||
{
|
||||
foreach ( var_3 in level.agentarray )
|
||||
{
|
||||
if ( !isdefined( var_3.isactive ) || !var_3.isactive )
|
||||
{
|
||||
if ( isdefined( var_3.waitingtodeactivate ) && var_3.waitingtodeactivate )
|
||||
continue;
|
||||
|
||||
var_1 = var_3;
|
||||
var_1 initagentscriptvariables();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_1.agent_type = var_0;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
activateagent()
|
||||
{
|
||||
self.isactive = 1;
|
||||
}
|
||||
|
||||
deactivateagent()
|
||||
{
|
||||
thread deactivateagentdelayed();
|
||||
}
|
||||
|
||||
deactivateagentdelayed()
|
||||
{
|
||||
self notify( "deactivateAgentDelayed" );
|
||||
self endon( "deactivateAgentDelayed" );
|
||||
|
||||
if ( maps\mp\_utility::isgameparticipant( self ) )
|
||||
maps\mp\gametypes\_spawnlogic::removefromparticipantsarray();
|
||||
|
||||
maps\mp\gametypes\_spawnlogic::removefromcharactersarray();
|
||||
wait 0.05;
|
||||
self.isactive = 0;
|
||||
self.hasdied = 0;
|
||||
self.owner = undefined;
|
||||
self.connecttime = undefined;
|
||||
self.waitingtodeactivate = undefined;
|
||||
|
||||
foreach ( var_1 in level.characters )
|
||||
{
|
||||
if ( isdefined( var_1.attackers ) )
|
||||
{
|
||||
foreach ( var_4, var_3 in var_1.attackers )
|
||||
{
|
||||
if ( var_3 == self )
|
||||
var_1.attackers[var_4] = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( self.headmodel ) )
|
||||
{
|
||||
self detach( self.headmodel );
|
||||
self.headmodel = undefined;
|
||||
}
|
||||
|
||||
self notify( "disconnect" );
|
||||
}
|
||||
|
||||
getnumactiveagents( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = "all";
|
||||
|
||||
var_1 = getactiveagentsoftype( var_0 );
|
||||
return var_1.size;
|
||||
}
|
||||
|
||||
getactiveagentsoftype( var_0 )
|
||||
{
|
||||
var_1 = [];
|
||||
|
||||
if ( !isdefined( level.agentarray ) )
|
||||
return var_1;
|
||||
|
||||
foreach ( var_3 in level.agentarray )
|
||||
{
|
||||
if ( isdefined( var_3.isactive ) && var_3.isactive )
|
||||
{
|
||||
if ( var_0 == "all" || var_3.agent_type == var_0 )
|
||||
var_1[var_1.size] = var_3;
|
||||
}
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
getnumownedactiveagents( var_0 )
|
||||
{
|
||||
return getnumownedactiveagentsbytype( var_0, "all" );
|
||||
}
|
||||
|
||||
getnumownedactiveagentsbytype( var_0, var_1 )
|
||||
{
|
||||
var_2 = 0;
|
||||
|
||||
if ( !isdefined( level.agentarray ) )
|
||||
return var_2;
|
||||
|
||||
foreach ( var_4 in level.agentarray )
|
||||
{
|
||||
if ( isdefined( var_4.isactive ) && var_4.isactive )
|
||||
{
|
||||
if ( isdefined( var_4.owner ) && var_4.owner == var_0 )
|
||||
{
|
||||
if ( var_1 == "all" && var_4.agent_type != "alien" || var_4.agent_type == var_1 )
|
||||
var_2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return var_2;
|
||||
}
|
||||
|
||||
getvalidspawnpathnodenearplayer( var_0, var_1 )
|
||||
{
|
||||
var_2 = getnodesinradius( self.origin, 350, 64, 128, "Path" );
|
||||
|
||||
if ( !isdefined( var_2 ) || var_2.size == 0 )
|
||||
return undefined;
|
||||
|
||||
if ( isdefined( level.waterdeletez ) && isdefined( level.trigunderwater ) )
|
||||
{
|
||||
var_3 = var_2;
|
||||
var_2 = [];
|
||||
|
||||
foreach ( var_5 in var_3 )
|
||||
{
|
||||
if ( var_5.origin[2] > level.waterdeletez || !ispointinvolume( var_5.origin, level.trigunderwater ) )
|
||||
var_2[var_2.size] = var_5;
|
||||
}
|
||||
}
|
||||
|
||||
var_7 = anglestoforward( self.angles );
|
||||
var_8 = -10;
|
||||
var_9 = maps\mp\gametypes\_spawnlogic::getplayertraceheight( self );
|
||||
var_10 = ( 0, 0, var_9 );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = 0;
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = 0;
|
||||
|
||||
var_11 = [];
|
||||
var_12 = [];
|
||||
|
||||
foreach ( var_14 in var_2 )
|
||||
{
|
||||
if ( !var_14 doesnodeallowstance( "stand" ) || isdefined( var_14.no_agent_spawn ) )
|
||||
continue;
|
||||
|
||||
var_15 = vectornormalize( var_14.origin - self.origin );
|
||||
var_16 = vectordot( var_7, var_15 );
|
||||
|
||||
for ( var_17 = 0; var_17 < var_12.size; var_17++ )
|
||||
{
|
||||
if ( var_16 > var_12[var_17] )
|
||||
{
|
||||
for ( var_18 = var_12.size; var_18 > var_17; var_18-- )
|
||||
{
|
||||
var_12[var_18] = var_12[var_18 - 1];
|
||||
var_11[var_18] = var_11[var_18 - 1];
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var_11[var_17] = var_14;
|
||||
var_12[var_17] = var_16;
|
||||
}
|
||||
|
||||
for ( var_17 = 0; var_17 < var_11.size; var_17++ )
|
||||
{
|
||||
var_14 = var_11[var_17];
|
||||
var_20 = self.origin + var_10;
|
||||
var_21 = var_14.origin + var_10;
|
||||
|
||||
if ( var_17 > 0 )
|
||||
wait 0.05;
|
||||
|
||||
if ( !sighttracepassed( var_20, var_21, 0, self ) )
|
||||
continue;
|
||||
|
||||
if ( var_1 )
|
||||
{
|
||||
if ( var_17 > 0 )
|
||||
wait 0.05;
|
||||
|
||||
var_22 = playerphysicstrace( var_14.origin + var_10, var_14.origin );
|
||||
|
||||
if ( distancesquared( var_22, var_14.origin ) > 1 )
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( var_0 )
|
||||
{
|
||||
if ( var_17 > 0 )
|
||||
wait 0.05;
|
||||
|
||||
var_22 = physicstrace( var_20, var_21 );
|
||||
|
||||
if ( distancesquared( var_22, var_21 ) > 1 )
|
||||
continue;
|
||||
}
|
||||
|
||||
return var_14;
|
||||
}
|
||||
|
||||
if ( var_11.size > 0 && isdefined( level.ishorde ) )
|
||||
return var_11[0];
|
||||
}
|
||||
|
||||
killagent( var_0 )
|
||||
{
|
||||
var_0 dodamage( var_0.health + 500000, var_0.origin );
|
||||
}
|
||||
|
||||
killdog()
|
||||
{
|
||||
self [[ agentfunc( "on_damaged" ) ]]( level, undefined, self.health + 1, 0, "MOD_CRUSH", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0 );
|
||||
}
|
302
maps/mp/agents/_agents.gsc
Normal file
302
maps/mp/agents/_agents.gsc
Normal file
@ -0,0 +1,302 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
if ( isdefined( level.createfx_enabled ) && level.createfx_enabled )
|
||||
return;
|
||||
|
||||
setup_callbacks();
|
||||
level.badplace_cylinder_func = ::badplace_cylinder;
|
||||
level.badplace_delete_func = ::badplace_delete;
|
||||
level thread maps\mp\agents\_agent_common::init();
|
||||
level thread maps\mp\killstreaks\_agent_killstreak::init();
|
||||
level thread maps\mp\killstreaks\_dog_killstreak::init();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
if ( !isdefined( level.agent_funcs ) )
|
||||
level.agent_funcs = [];
|
||||
|
||||
level.agent_funcs["player"] = [];
|
||||
level.agent_funcs["player"]["spawn"] = ::spawn_agent_player;
|
||||
level.agent_funcs["player"]["think"] = maps\mp\bots\_bots_gametype_war::bot_war_think;
|
||||
level.agent_funcs["player"]["on_killed"] = ::on_agent_player_killed;
|
||||
level.agent_funcs["player"]["on_damaged"] = ::on_agent_player_damaged;
|
||||
level.agent_funcs["player"]["on_damaged_finished"] = ::agent_damage_finished;
|
||||
maps\mp\killstreaks\_agent_killstreak::setup_callbacks();
|
||||
maps\mp\killstreaks\_dog_killstreak::setup_callbacks();
|
||||
}
|
||||
|
||||
wait_till_agent_funcs_defined()
|
||||
{
|
||||
while ( !isdefined( level.agent_funcs ) )
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
add_humanoid_agent( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
var_9 = maps\mp\agents\_agent_common::connectnewagent( var_0, var_1, var_2 );
|
||||
|
||||
if ( isdefined( var_9 ) )
|
||||
var_9 thread [[ var_9 maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]( var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
|
||||
return var_9;
|
||||
}
|
||||
|
||||
spawn_agent_player( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
while ( !isdefined( level.getspawnpoint ) )
|
||||
common_scripts\utility::waitframe();
|
||||
|
||||
if ( self.hasdied )
|
||||
wait( randomintrange( 6, 10 ) );
|
||||
|
||||
maps\mp\agents\_agent_utility::initplayerscriptvariables( 1 );
|
||||
|
||||
if ( isdefined( var_0 ) && isdefined( var_1 ) )
|
||||
{
|
||||
var_6 = var_0;
|
||||
var_7 = var_1;
|
||||
self.lastspawnpoint = spawnstruct();
|
||||
self.lastspawnpoint.origin = var_6;
|
||||
self.lastspawnpoint.angles = var_7;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_8 = self [[ level.getspawnpoint ]]();
|
||||
var_6 = var_8.origin;
|
||||
var_7 = var_8.angles;
|
||||
self.lastspawnpoint = var_8;
|
||||
}
|
||||
|
||||
maps\mp\agents\_agent_utility::activateagent();
|
||||
self.lastspawntime = gettime();
|
||||
self.spawntime = gettime();
|
||||
var_9 = var_6 + ( 0, 0, 25 );
|
||||
var_10 = var_6;
|
||||
var_11 = playerphysicstrace( var_9, var_10 );
|
||||
|
||||
if ( distancesquared( var_11, var_9 ) > 1 )
|
||||
var_6 = var_11;
|
||||
|
||||
self spawnagent( var_6, var_7 );
|
||||
|
||||
if ( isdefined( var_3 ) && var_3 )
|
||||
maps\mp\bots\_bots_personality::bot_assign_personality_functions();
|
||||
else
|
||||
maps\mp\bots\_bots_util::bot_set_personality( "default" );
|
||||
|
||||
if ( isdefined( var_5 ) )
|
||||
maps\mp\bots\_bots_util::bot_set_difficulty( var_5 );
|
||||
|
||||
initplayerclass();
|
||||
maps\mp\agents\_agent_common::set_agent_health( 100 );
|
||||
|
||||
if ( isdefined( var_4 ) && var_4 )
|
||||
self.respawn_on_death = 1;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
maps\mp\agents\_agent_utility::set_agent_team( var_2.team, var_2 );
|
||||
|
||||
if ( isdefined( self.owner ) )
|
||||
thread destroyonownerdisconnect( self.owner );
|
||||
|
||||
thread maps\mp\_flashgrenades::monitorflash();
|
||||
self enableanimstate( 0 );
|
||||
self [[ level.onspawnplayer ]]();
|
||||
maps\mp\gametypes\_class::giveloadout( self.team, self.class, 1 );
|
||||
thread maps\mp\bots\_bots::bot_think_watch_enemy( 1 );
|
||||
thread maps\mp\bots\_bots::bot_think_crate();
|
||||
|
||||
if ( self.agent_type == "player" )
|
||||
thread maps\mp\bots\_bots::bot_think_level_actions();
|
||||
else if ( self.agent_type == "odin_juggernaut" )
|
||||
thread maps\mp\bots\_bots::bot_think_level_actions( 128 );
|
||||
|
||||
thread maps\mp\bots\_bots_strategy::bot_think_tactical_goals();
|
||||
self thread [[ maps\mp\agents\_agent_utility::agentfunc( "think" ) ]]();
|
||||
|
||||
if ( !self.hasdied )
|
||||
maps\mp\gametypes\_spawnlogic::addtoparticipantsarray();
|
||||
|
||||
self.hasdied = 0;
|
||||
thread maps\mp\gametypes\_weapons::onplayerspawned();
|
||||
thread maps\mp\gametypes\_healthoverlay::playerhealthregen();
|
||||
thread maps\mp\gametypes\_battlechatter_mp::onplayerspawned();
|
||||
level notify( "spawned_agent_player", self );
|
||||
level notify( "spawned_agent", self );
|
||||
self notify( "spawned_player" );
|
||||
}
|
||||
|
||||
destroyonownerdisconnect( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 waittill( "killstreak_disowned" );
|
||||
self notify( "owner_disconnect" );
|
||||
|
||||
if ( maps\mp\gametypes\_hostmigration::waittillhostmigrationdone() )
|
||||
wait 0.05;
|
||||
|
||||
self suicide();
|
||||
}
|
||||
|
||||
agent_damage_finished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( isdefined( var_0 ) || isdefined( var_1 ) )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
var_0 = var_1;
|
||||
|
||||
if ( isdefined( self.allowvehicledamage ) && !self.allowvehicledamage )
|
||||
{
|
||||
if ( isdefined( var_0.classname ) && var_0.classname == "script_vehicle" )
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0.classname ) && var_0.classname == "auto_turret" )
|
||||
var_1 = var_0;
|
||||
|
||||
if ( isdefined( var_1 ) && var_4 != "MOD_FALLING" && var_4 != "MOD_SUICIDE" )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( isdefined( var_1.team ) && var_1.team != self.team )
|
||||
self setagentattacker( var_1 );
|
||||
}
|
||||
else
|
||||
self setagentattacker( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
self finishagentdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, 0.0 );
|
||||
|
||||
if ( !isdefined( self.isactive ) )
|
||||
self.waitingtodeactivate = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
on_agent_generic_damaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
var_10 = isdefined( var_1 ) && isdefined( self.owner ) && self.owner == var_1;
|
||||
var_11 = maps\mp\_utility::attackerishittingteam( self.owner, var_1 ) || var_10;
|
||||
|
||||
if ( level.teambased && var_11 && !level.friendlyfire )
|
||||
return 0;
|
||||
|
||||
if ( !level.teambased && var_10 )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( var_4 ) && var_4 == "MOD_CRUSH" && isdefined( var_0 ) && isdefined( var_0.classname ) && var_0.classname == "script_vehicle" )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( self ) || !maps\mp\_utility::isreallyalive( self ) )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( var_1 ) && var_1.classname == "script_origin" && isdefined( var_1.type ) && var_1.type == "soft_landing" )
|
||||
return 0;
|
||||
|
||||
if ( var_5 == "killstreak_emp_mp" )
|
||||
return 0;
|
||||
|
||||
if ( var_5 == "bouncingbetty_mp" && !maps\mp\gametypes\_weapons::minedamageheightpassed( var_0, self ) )
|
||||
return 0;
|
||||
|
||||
if ( ( var_5 == "throwingknife_mp" || var_5 == "throwingknifejugg_mp" ) && var_4 == "MOD_IMPACT" )
|
||||
var_2 = self.health + 1;
|
||||
|
||||
if ( isdefined( var_0 ) && isdefined( var_0.stuckenemyentity ) && var_0.stuckenemyentity == self )
|
||||
var_2 = self.health + 1;
|
||||
|
||||
if ( var_2 <= 0 )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( var_1 ) && var_1 != self && var_2 > 0 && ( !isdefined( var_8 ) || var_8 != "shield" ) )
|
||||
{
|
||||
if ( var_3 & level.idflags_stun )
|
||||
var_12 = "stun";
|
||||
else if ( !maps\mp\gametypes\_damage::shouldweaponfeedback( var_5 ) )
|
||||
var_12 = "none";
|
||||
else
|
||||
var_12 = common_scripts\utility::ter_op( var_2 >= self.health, "hitkill", "standard" );
|
||||
|
||||
var_1 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_12 );
|
||||
}
|
||||
|
||||
if ( isdefined( level.modifyplayerdamage ) )
|
||||
var_2 = [[ level.modifyplayerdamage ]]( self, var_1, var_2, var_4, var_5, var_6, var_7, var_8 );
|
||||
|
||||
return self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
|
||||
on_agent_player_damaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
var_10 = isdefined( var_1 ) && isdefined( self.owner ) && self.owner == var_1;
|
||||
|
||||
if ( !level.teambased && var_10 )
|
||||
return 0;
|
||||
|
||||
maps\mp\gametypes\_damage::callback_playerdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
|
||||
on_agent_player_killed( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
on_humanoid_agent_killed_common( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, 1 );
|
||||
|
||||
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
|
||||
maps\mp\gametypes\_damage::onkillstreakkilled( var_1, var_4, var_3, var_2, "destroyed_squad_mate" );
|
||||
|
||||
maps\mp\gametypes\_weapons::dropscavengerfordeath( var_1 );
|
||||
|
||||
if ( self.isactive )
|
||||
{
|
||||
self.hasdied = 1;
|
||||
|
||||
if ( maps\mp\_utility::getgametypenumlives() != 1 && ( isdefined( self.respawn_on_death ) && self.respawn_on_death ) )
|
||||
self thread [[ maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]();
|
||||
else
|
||||
maps\mp\agents\_agent_utility::deactivateagent();
|
||||
}
|
||||
}
|
||||
|
||||
on_humanoid_agent_killed_common( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( self.hasriotshieldequipped )
|
||||
{
|
||||
maps\mp\gametypes\_damage::launchshield( var_2, var_3 );
|
||||
|
||||
if ( !var_9 )
|
||||
{
|
||||
var_10 = self dropitem( self getcurrentweapon() );
|
||||
|
||||
if ( isdefined( var_10 ) )
|
||||
{
|
||||
var_10 thread maps\mp\gametypes\_weapons::deletepickupafterawhile();
|
||||
var_10.owner = self;
|
||||
var_10.ownersattacker = var_1;
|
||||
var_10 makeunusable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_9 )
|
||||
self [[ level.weapondropfunction ]]( var_1, var_3 );
|
||||
|
||||
self.body = self cloneagent( var_8 );
|
||||
thread maps\mp\gametypes\_damage::delaystartragdoll( self.body, var_6, var_5, var_4, var_0, var_3 );
|
||||
maps\mp\_utility::riotshield_clear();
|
||||
}
|
||||
|
||||
initplayerclass()
|
||||
{
|
||||
if ( isdefined( self.class_override ) )
|
||||
self.class = self.class_override;
|
||||
else if ( maps\mp\bots\_bots_loadout::bot_setup_loadout_callback() )
|
||||
self.class = "callback";
|
||||
else
|
||||
self.class = "class1";
|
||||
}
|
153
maps/mp/agents/_agents_civ_hvt.gsc
Normal file
153
maps/mp/agents/_agents_civ_hvt.gsc
Normal file
@ -0,0 +1,153 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["civ_hvt"] = [];
|
||||
level.agent_funcs["civ_hvt"]["spawn"] = ::onspawn;
|
||||
level.agent_funcs["civ_hvt"]["think"] = ::agentthink;
|
||||
level.agent_funcs["civ_hvt"]["on_killed"] = ::onagentkilled;
|
||||
level.agent_funcs["civ_hvt"]["on_damaged"] = maps\mp\agents\_agents::on_agent_player_damaged;
|
||||
level.agent_funcs["civ_hvt"]["on_damaged_finished"] = maps\mp\agents\_agents::agent_damage_finished;
|
||||
}
|
||||
|
||||
onspawn( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
self.hvtisfollowing = 0;
|
||||
maps\mp\agents\_agents::spawn_agent_player( var_0, var_1, var_2, var_3, var_4, var_5 );
|
||||
thread handleplayeruse();
|
||||
}
|
||||
|
||||
onagentkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
self.defendnode = undefined;
|
||||
self.hvttrigger makeunusable();
|
||||
self.hvttrigger = undefined;
|
||||
self.body = self cloneagent( var_8 );
|
||||
thread maps\mp\gametypes\_damage::delaystartragdoll( self.body, var_6, var_5, var_4, var_0, var_3 );
|
||||
|
||||
if ( isdefined( self.onkilledcallback ) )
|
||||
self [[ self.onkilledcallback ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
|
||||
maps\mp\agents\_agent_utility::deactivateagent();
|
||||
self.owner notify( "hvt_killed" );
|
||||
}
|
||||
|
||||
agentthink()
|
||||
{
|
||||
self notify( "agent_think" );
|
||||
self endon( "agent_think" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "owner_disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.hvtisfollowing )
|
||||
{
|
||||
followthink();
|
||||
continue;
|
||||
}
|
||||
|
||||
waitthink( 150 );
|
||||
}
|
||||
}
|
||||
|
||||
waitthink( var_0 )
|
||||
{
|
||||
self botsetstance( "none" );
|
||||
self botclearscriptgoal();
|
||||
maps\mp\bots\_bots_strategy::bot_disable_tactical_goals();
|
||||
var_1 = self.owner maps\mp\agents\_agent_utility::getvalidspawnpathnodenearplayer();
|
||||
self.cur_defend_node = undefined;
|
||||
self.bot_defending = 1;
|
||||
self.bot_defending_center = var_1.origin;
|
||||
self.bot_defending_radius = var_0;
|
||||
self.cur_defend_stance = "crouch";
|
||||
self.bot_defending_type = "protect";
|
||||
|
||||
for ( var_2 = ""; var_2 != "goal"; self.cur_defend_node = undefined )
|
||||
{
|
||||
self.cur_defend_node = var_1;
|
||||
self botsetscriptgoalnode( self.cur_defend_node, "tactical" );
|
||||
var_2 = common_scripts\utility::waittill_any_return( "goal", "bad_path" );
|
||||
self.node_closest_to_defend_center = var_1;
|
||||
}
|
||||
|
||||
childthread maps\mp\bots\_bots_strategy::defense_watch_entrances_at_goal();
|
||||
self waittill( "hvt_toggle" );
|
||||
}
|
||||
|
||||
followthink()
|
||||
{
|
||||
self botclearscriptgoal();
|
||||
maps\mp\bots\_bots_strategy::bot_disable_tactical_goals();
|
||||
|
||||
if ( !maps\mp\bots\_bots_util::bot_is_guarding_player( self.owner ) )
|
||||
maps\mp\bots\_bots_strategy::bot_guard_player( self.owner, 250 );
|
||||
|
||||
self waittill( "hvt_toggle" );
|
||||
}
|
||||
|
||||
handleplayeruse()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
|
||||
if ( !isdefined( self.hvttrigger ) )
|
||||
{
|
||||
self.hvttrigger = spawn( "script_model", self.origin );
|
||||
self.hvttrigger linkto( self );
|
||||
}
|
||||
|
||||
self.hvttrigger makeusable();
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( var_1 != self.owner )
|
||||
{
|
||||
self.hvttrigger disableplayeruse( var_1 );
|
||||
continue;
|
||||
}
|
||||
|
||||
self.hvttrigger enableplayeruse( var_1 );
|
||||
}
|
||||
|
||||
thread waitforplayerconnect();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
setfollowerhintstring();
|
||||
self.hvttrigger waittill( "trigger", var_1 );
|
||||
self.hvtisfollowing = !self.hvtisfollowing;
|
||||
self notify( "hvt_toggle" );
|
||||
}
|
||||
}
|
||||
|
||||
setfollowerhintstring()
|
||||
{
|
||||
var_0 = &"MP_HVT_FOLLOW";
|
||||
|
||||
if ( self.hvtisfollowing )
|
||||
var_0 = &"MP_HVT_WAIT";
|
||||
|
||||
self.hvttrigger sethintstring( var_0 );
|
||||
}
|
||||
|
||||
waitforplayerconnect()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", var_0 );
|
||||
self.hvttrigger disableplayeruse( var_0 );
|
||||
}
|
||||
}
|
7
maps/mp/agents/_agents_gametype_aliens.gsc
Normal file
7
maps/mp/agents/_agents_gametype_aliens.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
7
maps/mp/agents/_agents_gametype_blitz.gsc
Normal file
7
maps/mp/agents/_agents_gametype_blitz.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
62
maps/mp/agents/_agents_gametype_conf.gsc
Normal file
62
maps/mp/agents/_agents_gametype_conf.gsc
Normal file
@ -0,0 +1,62 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["squadmate"]["gametype_update"] = ::agent_squadmember_conf_think;
|
||||
level.agent_funcs["player"]["think"] = ::agent_player_conf_think;
|
||||
}
|
||||
|
||||
agent_player_conf_think()
|
||||
{
|
||||
thread maps\mp\bots\_bots_gametype_conf::bot_conf_think();
|
||||
}
|
||||
|
||||
agent_squadmember_conf_think()
|
||||
{
|
||||
if ( !isdefined( self.tags_seen_by_owner ) )
|
||||
self.tags_seen_by_owner = [];
|
||||
|
||||
if ( !isdefined( self.next_time_check_tags ) )
|
||||
self.next_time_check_tags = gettime() + 500;
|
||||
|
||||
if ( gettime() > self.next_time_check_tags )
|
||||
{
|
||||
self.next_time_check_tags = gettime() + 500;
|
||||
var_0 = 0.78;
|
||||
var_1 = self.owner getnearestnode();
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_2 = self.owner maps\mp\bots\_bots_gametype_conf::bot_find_visible_tags( 1, var_1, var_0 );
|
||||
self.tags_seen_by_owner = maps\mp\bots\_bots_gametype_conf::bot_combine_tag_seen_arrays( var_2, self.tags_seen_by_owner );
|
||||
}
|
||||
}
|
||||
|
||||
self.tags_seen_by_owner = maps\mp\bots\_bots_gametype_conf::bot_remove_invalid_tags( self.tags_seen_by_owner );
|
||||
var_3 = maps\mp\bots\_bots_gametype_conf::bot_find_best_tag_from_array( self.tags_seen_by_owner, 0 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
if ( !isdefined( self.tag_getting ) || distancesquared( var_3.curorigin, self.tag_getting.curorigin ) > 1 )
|
||||
{
|
||||
self.tag_getting = var_3;
|
||||
maps\mp\bots\_bots_strategy::bot_defend_stop();
|
||||
self botsetscriptgoal( self.tag_getting.curorigin, 0, "objective", undefined, level.bot_tag_obj_radius );
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if ( isdefined( self.tag_getting ) )
|
||||
{
|
||||
self botclearscriptgoal();
|
||||
self.tag_getting = undefined;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
7
maps/mp/agents/_agents_gametype_cranked.gsc
Normal file
7
maps/mp/agents/_agents_gametype_cranked.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
7
maps/mp/agents/_agents_gametype_dm.gsc
Normal file
7
maps/mp/agents/_agents_gametype_dm.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
44
maps/mp/agents/_agents_gametype_dom.gsc
Normal file
44
maps/mp/agents/_agents_gametype_dom.gsc
Normal file
@ -0,0 +1,44 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["squadmate"]["gametype_update"] = ::agent_squadmember_dom_think;
|
||||
level.agent_funcs["player"]["think"] = ::agent_player_dom_think;
|
||||
}
|
||||
|
||||
agent_player_dom_think()
|
||||
{
|
||||
thread maps\mp\bots\_bots_gametype_dom::bot_dom_think();
|
||||
}
|
||||
|
||||
agent_squadmember_dom_think()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
foreach ( var_2 in self.owner.touchtriggers )
|
||||
{
|
||||
if ( var_2.useobj.id == "domFlag" )
|
||||
var_0 = var_2;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_4 = var_0 maps\mp\gametypes\dom::getflagteam();
|
||||
|
||||
if ( var_4 != self.team )
|
||||
{
|
||||
if ( !maps\mp\bots\_bots_gametype_dom::bot_is_capturing_flag( var_0 ) )
|
||||
maps\mp\bots\_bots_gametype_dom::capture_flag( var_0, "critical", 1 );
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
13
maps/mp/agents/_agents_gametype_grind.gsc
Normal file
13
maps/mp/agents/_agents_gametype_grind.gsc
Normal file
@ -0,0 +1,13 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["squadmate"]["gametype_update"] = maps\mp\agents\_agents_gametype_conf::agent_squadmember_conf_think;
|
||||
level.agent_funcs["player"]["think"] = maps\mp\agents\_agents_gametype_conf::agent_player_conf_think;
|
||||
}
|
7
maps/mp/agents/_agents_gametype_gun.gsc
Normal file
7
maps/mp/agents/_agents_gametype_gun.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
460
maps/mp/agents/_agents_gametype_horde.gsc
Normal file
460
maps/mp/agents/_agents_gametype_horde.gsc
Normal file
@ -0,0 +1,460 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
level thread runroundspawning();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["player"]["onAIConnect"] = ::onaiconnect;
|
||||
level.agent_funcs["player"]["think"] = ::enemyagentthink;
|
||||
level.agent_funcs["player"]["on_killed"] = ::onagentkilled;
|
||||
level.agent_funcs["squadmate"]["onAIConnect"] = ::onaiconnect;
|
||||
level.agent_funcs["squadmate"]["think"] = ::allyagentthink;
|
||||
level.agent_funcs["dog"]["onAIConnect"] = ::onaiconnect;
|
||||
level.agent_funcs["dog"]["think"] = ::agentdogthink;
|
||||
level.agent_funcs["dog"]["on_killed"] = ::ondogkilled;
|
||||
}
|
||||
|
||||
onaiconnect()
|
||||
{
|
||||
self.gamemodefirstspawn = 1;
|
||||
self.agentname = &"HORDE_INFECTED";
|
||||
self.horde_type = "";
|
||||
}
|
||||
|
||||
runroundspawning()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "start_round" );
|
||||
|
||||
if ( maps\mp\gametypes\_horde_util::isspecialround() )
|
||||
{
|
||||
runspecialround();
|
||||
continue;
|
||||
}
|
||||
|
||||
runnormalround();
|
||||
}
|
||||
}
|
||||
|
||||
runspecialround()
|
||||
{
|
||||
maps\mp\gametypes\_horde_crates::runlootdrop();
|
||||
}
|
||||
|
||||
runnormalround()
|
||||
{
|
||||
level childthread highlightlastenemies();
|
||||
|
||||
while ( level.currentenemycount < level.maxenemycount )
|
||||
{
|
||||
while ( level.currentaliveenemycount < level.maxaliveenemycount )
|
||||
{
|
||||
createenemy();
|
||||
|
||||
if ( level.currentenemycount == level.maxenemycount )
|
||||
break;
|
||||
}
|
||||
|
||||
level waittill( "enemy_death" );
|
||||
}
|
||||
}
|
||||
|
||||
createenemy()
|
||||
{
|
||||
if ( maps\mp\gametypes\_horde_util::isdoground() && randomintrange( 1, 101 ) < level.chancetospawndog )
|
||||
createdogenemy();
|
||||
else
|
||||
createhumanoidenemy();
|
||||
}
|
||||
|
||||
createhumanoidenemy()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
while ( !isdefined( var_0 ) )
|
||||
{
|
||||
var_0 = maps\mp\agents\_agents::add_humanoid_agent( "player", level.enemyteam, "class1" );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
level.currentenemycount++;
|
||||
level.currentaliveenemycount++;
|
||||
}
|
||||
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
}
|
||||
|
||||
createdogenemy()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
while ( !isdefined( var_0 ) )
|
||||
{
|
||||
var_0 = maps\mp\agents\_agent_common::connectnewagent( "dog", level.enemyteam );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_0 thread [[ var_0 maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]();
|
||||
level.currentenemycount++;
|
||||
level.currentaliveenemycount++;
|
||||
}
|
||||
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
}
|
||||
|
||||
playaispawneffect()
|
||||
{
|
||||
playfx( level._effect["spawn_effect"], self.origin );
|
||||
}
|
||||
|
||||
highlightlastenemies()
|
||||
{
|
||||
level endon( "round_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "enemy_death" );
|
||||
|
||||
if ( level.currentenemycount != level.maxenemycount )
|
||||
continue;
|
||||
|
||||
if ( level.currentaliveenemycount < 3 )
|
||||
{
|
||||
foreach ( var_1 in level.characters )
|
||||
{
|
||||
if ( maps\mp\gametypes\_horde_util::isonhumanteam( var_1 ) )
|
||||
continue;
|
||||
|
||||
if ( maps\mp\_utility::isreallyalive( var_1 ) )
|
||||
{
|
||||
var_1 hudoutlineenable( level.enemyoutlinecolor, 0 );
|
||||
var_1.outlinecolor = level.enemyoutlinecolor;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onagentkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
if ( !maps\mp\gametypes\_horde_util::isonhumanteam( self ) )
|
||||
hordeenemykilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
|
||||
self hudoutlinedisable();
|
||||
maps\mp\agents\_agents::on_humanoid_agent_killed_common( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, 0 );
|
||||
maps\mp\agents\_agent_utility::deactivateagent();
|
||||
}
|
||||
|
||||
ondogkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
if ( !maps\mp\gametypes\_horde_util::isonhumanteam( self ) )
|
||||
hordeenemykilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
|
||||
self hudoutlinedisable();
|
||||
maps\mp\killstreaks\_dog_killstreak::on_agent_dog_killed( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
}
|
||||
|
||||
hordeenemykilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
level.currentaliveenemycount--;
|
||||
trackintelkills( var_4, var_3 );
|
||||
level thread maps\mp\gametypes\horde::chancetospawnpickup( self );
|
||||
level notify( "enemy_death" );
|
||||
|
||||
if ( isplayer( var_1 ) )
|
||||
{
|
||||
maps\mp\gametypes\_horde_util::awardhordekill( var_1 );
|
||||
|
||||
if ( var_1 maps\mp\_utility::_hasperk( "specialty_triggerhappy" ) )
|
||||
var_1 thread maps\mp\perks\_perkfunctions::settriggerhappyinternal();
|
||||
}
|
||||
|
||||
if ( isdefined( var_1 ) && isdefined( var_1.owner ) && isplayer( var_1.owner ) && isdefined( var_1.owner.killz ) )
|
||||
maps\mp\gametypes\_horde_util::awardhordekill( var_1.owner );
|
||||
}
|
||||
|
||||
trackintelkills( var_0, var_1 )
|
||||
{
|
||||
if ( level.isteamintelcomplete )
|
||||
return;
|
||||
|
||||
if ( var_0 == "none" )
|
||||
return;
|
||||
|
||||
if ( var_1 == "MOD_MELEE" )
|
||||
level.nummeleekillsintel++;
|
||||
|
||||
if ( !maps\mp\_utility::iskillstreakweapon( var_0 ) && var_1 == "MOD_HEAD_SHOT" )
|
||||
level.numheadshotsintel++;
|
||||
|
||||
if ( maps\mp\_utility::iskillstreakweapon( var_0 ) && var_0 != level.intelminigun )
|
||||
level.numkillstreakkillsintel++;
|
||||
|
||||
if ( maps\mp\gametypes\_class::isvalidequipment( var_0, 0 ) || maps\mp\gametypes\_class::isvalidoffhand( var_0, 0 ) )
|
||||
level.numequipmentkillsintel++;
|
||||
}
|
||||
|
||||
enemyagentthink()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self botsetflag( "no_enemy_search", 1 );
|
||||
thread monitorbadhumanoidai();
|
||||
thread locateenemypositions();
|
||||
}
|
||||
|
||||
monitorbadhumanoidai()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
var_0 = gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 5.0;
|
||||
|
||||
if ( !maps\mp\bots\_bots_util::bot_in_combat( 120000 ) )
|
||||
{
|
||||
outlinestuckai( self );
|
||||
|
||||
if ( !maps\mp\bots\_bots_util::bot_in_combat( 240000 ) )
|
||||
break;
|
||||
}
|
||||
|
||||
if ( checkexpiretime( var_0, 240, 480 ) )
|
||||
break;
|
||||
}
|
||||
|
||||
maps\mp\agents\_agent_utility::killagent( self );
|
||||
}
|
||||
|
||||
monitorbaddogai()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
var_0 = gettime();
|
||||
var_1 = self.origin;
|
||||
var_2 = var_0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 5.0;
|
||||
var_3 = distancesquared( self.origin, var_1 );
|
||||
var_4 = ( gettime() - var_2 ) / 1000;
|
||||
|
||||
if ( var_3 > 16384 )
|
||||
{
|
||||
var_1 = self.origin;
|
||||
var_2 = gettime();
|
||||
}
|
||||
else if ( var_4 > 25 )
|
||||
{
|
||||
outlinestuckai( self );
|
||||
|
||||
if ( var_4 > 55 )
|
||||
break;
|
||||
}
|
||||
|
||||
if ( checkexpiretime( var_0, 120, 240 ) )
|
||||
break;
|
||||
}
|
||||
|
||||
maps\mp\agents\_agent_utility::killagent( self );
|
||||
}
|
||||
|
||||
checkexpiretime( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = ( gettime() - var_0 ) / 1000;
|
||||
|
||||
if ( var_3 > var_1 )
|
||||
{
|
||||
outlinestuckai( self );
|
||||
|
||||
if ( var_3 > var_2 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
outlinestuckai( var_0 )
|
||||
{
|
||||
var_0 hudoutlineenable( level.enemyoutlinecolor, 0 );
|
||||
var_0.outlinecolor = level.enemyoutlinecolor;
|
||||
}
|
||||
|
||||
allyagentthink()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "owner_disconnect" );
|
||||
self botsetflag( "force_sprint", 1 );
|
||||
var_0 = 0;
|
||||
var_1 = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( float( self.owner.health ) / self.owner.maxhealth < 0.5 && gettime() > var_1 )
|
||||
{
|
||||
var_2 = getnodesinradiussorted( self.owner.origin, 256, 0 );
|
||||
|
||||
if ( var_2.size >= 2 )
|
||||
{
|
||||
self.defense_force_next_node_goal = var_2[1];
|
||||
self notify( "defend_force_node_recalculation" );
|
||||
var_1 = gettime() + 1000;
|
||||
}
|
||||
}
|
||||
else if ( float( self.health ) / self.maxhealth >= 0.6 )
|
||||
var_0 = 0;
|
||||
else if ( !var_0 )
|
||||
{
|
||||
var_3 = maps\mp\bots\_bots_util::bot_find_node_to_guard_player( self.owner.origin, 350, 1 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
self.defense_force_next_node_goal = var_3;
|
||||
self notify( "defend_force_node_recalculation" );
|
||||
var_0 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !maps\mp\bots\_bots_util::bot_is_guarding_player( self.owner ) )
|
||||
{
|
||||
var_4["override_goal_type"] = "critical";
|
||||
var_4["min_goal_time"] = 20;
|
||||
var_4["max_goal_time"] = 30;
|
||||
maps\mp\bots\_bots_strategy::bot_guard_player( self.owner, 350, var_4 );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
hordesetupdogstate()
|
||||
{
|
||||
maps\mp\_utility::_setnameplatematerial( "player_name_bg_green_dog", "player_name_bg_red_dog" );
|
||||
self.enableextendedkill = 0;
|
||||
self.agentname = &"HORDE_QUAD";
|
||||
self.horde_type = "Quad";
|
||||
self.lassetgoalpos = ( 0, 0, 0 );
|
||||
self.bhasnopath = 0;
|
||||
self.randompathstoptime = 0;
|
||||
maps\mp\gametypes\horde::setenemyagenthealth( self );
|
||||
}
|
||||
|
||||
agentdogthink()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "owner_disconnect" );
|
||||
maps\mp\agents\dog\_dog_think::setupdogstate();
|
||||
hordesetupdogstate();
|
||||
thread locateenemypositions();
|
||||
self thread [[ self.watchattackstatefunc ]]();
|
||||
thread waitforbadpathhorde();
|
||||
thread monitorbaddogai();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate != "melee" && !self.statelocked && maps\mp\agents\dog\_dog_think::readytomeleetarget() && !maps\mp\agents\dog\_dog_think::didpastmeleefail() )
|
||||
self scragentbeginmelee( self.curmeleetarget );
|
||||
|
||||
if ( self.randompathstoptime > gettime() )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( !isdefined( self.enemy ) || self.bhasnopath )
|
||||
{
|
||||
var_0 = getnodesinradiussorted( self.origin, 1024, 256, 128, "Path" );
|
||||
|
||||
if ( var_0.size > 0 )
|
||||
{
|
||||
var_1 = randomintrange( int( var_0.size * 0.9 ), var_0.size );
|
||||
self scragentsetgoalpos( var_0[var_1].origin );
|
||||
self.bhasnopath = 0;
|
||||
self.randompathstoptime = gettime() + 2500;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var_2 = maps\mp\agents\dog\_dog_think::getattackpoint( self.enemy );
|
||||
self.curmeleetarget = self.enemy;
|
||||
self.movemode = "sprint";
|
||||
self.barrivalsenabled = 0;
|
||||
|
||||
if ( distancesquared( var_2, self.lassetgoalpos ) > 4096 )
|
||||
{
|
||||
self scragentsetgoalpos( var_2 );
|
||||
self.lassetgoalpos = var_2;
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
waitforbadpathhorde()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "bad_path", var_0 );
|
||||
self.bhasnopath = 1;
|
||||
}
|
||||
}
|
||||
|
||||
locateenemypositions()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
foreach ( var_1 in level.participants )
|
||||
{
|
||||
if ( maps\mp\gametypes\_horde_util::isonhumanteam( var_1 ) )
|
||||
self getenemyinfo( var_1 );
|
||||
}
|
||||
|
||||
wait 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
findclosestplayer()
|
||||
{
|
||||
var_0 = undefined;
|
||||
var_1 = 1410065408;
|
||||
|
||||
foreach ( var_3 in level.players )
|
||||
{
|
||||
if ( maps\mp\_utility::isreallyalive( var_3 ) && maps\mp\gametypes\_horde_util::isonhumanteam( var_3 ) && !maps\mp\gametypes\_horde_util::isplayerinlaststand( var_3 ) )
|
||||
{
|
||||
var_4 = distancesquared( var_3.origin, self.origin );
|
||||
|
||||
if ( var_4 < var_1 )
|
||||
{
|
||||
var_0 = var_3;
|
||||
var_1 = var_4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
7
maps/mp/agents/_agents_gametype_infect.gsc
Normal file
7
maps/mp/agents/_agents_gametype_infect.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
66
maps/mp/agents/_agents_gametype_mugger.gsc
Normal file
66
maps/mp/agents/_agents_gametype_mugger.gsc
Normal file
@ -0,0 +1,66 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["squadmate"]["gametype_update"] = ::agent_squadmember_mugger_think;
|
||||
level.agent_funcs["player"]["think"] = ::agent_player_mugger_think;
|
||||
}
|
||||
|
||||
agent_player_mugger_think()
|
||||
{
|
||||
thread maps\mp\bots\_bots_gametype_mugger::bot_mugger_think();
|
||||
}
|
||||
|
||||
agent_squadmember_mugger_think()
|
||||
{
|
||||
if ( !isdefined( self.tags_seen_by_owner ) )
|
||||
self.tags_seen_by_owner = [];
|
||||
|
||||
if ( !isdefined( self.next_time_check_tags ) )
|
||||
self.next_time_check_tags = gettime() + 500;
|
||||
|
||||
if ( gettime() > self.next_time_check_tags )
|
||||
{
|
||||
self.next_time_check_tags = gettime() + 500;
|
||||
var_0 = 0.78;
|
||||
|
||||
if ( isbot( self.owner ) )
|
||||
var_0 = self botgetfovdot();
|
||||
|
||||
var_1 = self.owner getnearestnode();
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_2 = self.owner maps\mp\bots\_bots_gametype_mugger::bot_find_visible_tags_mugger( var_1, var_0 );
|
||||
self.tags_seen_by_owner = maps\mp\bots\_bots_gametype_conf::bot_combine_tag_seen_arrays( var_2, self.tags_seen_by_owner );
|
||||
}
|
||||
}
|
||||
|
||||
self.tags_seen_by_owner = maps\mp\bots\_bots_gametype_conf::bot_remove_invalid_tags( self.tags_seen_by_owner );
|
||||
var_3 = maps\mp\bots\_bots_gametype_conf::bot_find_best_tag_from_array( self.tags_seen_by_owner, 0 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
if ( !isdefined( self.tag_getting ) || distancesquared( var_3.curorigin, self.tag_getting.curorigin ) > 1 )
|
||||
{
|
||||
self.tag_getting = var_3;
|
||||
maps\mp\bots\_bots_strategy::bot_defend_stop();
|
||||
self botsetscriptgoal( self.tag_getting.curorigin, 0, "objective", undefined, level.bot_tag_obj_radius );
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if ( isdefined( self.tag_getting ) )
|
||||
{
|
||||
self botclearscriptgoal();
|
||||
self.tag_getting = undefined;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
18
maps/mp/agents/_agents_gametype_sd.gsc
Normal file
18
maps/mp/agents/_agents_gametype_sd.gsc
Normal file
@ -0,0 +1,18 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setup_callbacks();
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
level.agent_funcs["player"]["think"] = ::agent_player_sd_think;
|
||||
}
|
||||
|
||||
agent_player_sd_think()
|
||||
{
|
||||
common_scripts\utility::_enableusability();
|
||||
thread maps\mp\bots\_bots_gametype_sd::bot_sd_think();
|
||||
}
|
7
maps/mp/agents/_agents_gametype_siege.gsc
Normal file
7
maps/mp/agents/_agents_gametype_siege.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
7
maps/mp/agents/_agents_gametype_sotf.gsc
Normal file
7
maps/mp/agents/_agents_gametype_sotf.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
7
maps/mp/agents/_agents_gametype_sotf_ffa.gsc
Normal file
7
maps/mp/agents/_agents_gametype_sotf_ffa.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
7
maps/mp/agents/_agents_gametype_sr.gsc
Normal file
7
maps/mp/agents/_agents_gametype_sr.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
7
maps/mp/agents/_agents_gametype_war.gsc
Normal file
7
maps/mp/agents/_agents_gametype_war.gsc
Normal file
@ -0,0 +1,7 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
214
maps/mp/agents/_scriptedagents.gsc
Normal file
214
maps/mp/agents/_scriptedagents.gsc
Normal file
@ -0,0 +1,214 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
onenterstate( var_0, var_1 )
|
||||
{
|
||||
if ( isdefined( self.onenteranimstate ) )
|
||||
self [[ self.onenteranimstate ]]( var_0, var_1 );
|
||||
}
|
||||
|
||||
ondeactivate()
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
}
|
||||
|
||||
playanimuntilnotetrack( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
playanimnuntilnotetrack( var_0, 0, var_1, var_2, var_3 );
|
||||
}
|
||||
|
||||
playanimnuntilnotetrack( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
self setanimstate( var_0, var_1 );
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
var_3 = "end";
|
||||
|
||||
waituntilnotetrack( var_2, var_3, var_0, var_1, var_4 );
|
||||
}
|
||||
|
||||
playanimnatrateuntilnotetrack( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
self setanimstate( var_0, var_1, var_2 );
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
var_4 = "end";
|
||||
|
||||
waituntilnotetrack( var_3, var_4, var_0, var_1, var_5 );
|
||||
}
|
||||
|
||||
waituntilnotetrack( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = gettime();
|
||||
var_6 = undefined;
|
||||
var_7 = undefined;
|
||||
|
||||
if ( isdefined( var_2 ) && isdefined( var_3 ) )
|
||||
var_7 = getanimlength( self getanimentry( var_2, var_3 ) );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( var_0, var_8 );
|
||||
|
||||
if ( isdefined( var_7 ) )
|
||||
var_6 = ( gettime() - var_5 ) * 0.001 / var_7;
|
||||
|
||||
if ( !isdefined( var_7 ) || var_6 > 0 )
|
||||
{
|
||||
if ( var_8 == var_1 || var_8 == "end" || var_8 == "anim_will_finish" || var_8 == "finish" )
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
[[ var_4 ]]( var_8, var_2, var_3, var_6 );
|
||||
}
|
||||
}
|
||||
|
||||
playanimfortime( var_0, var_1 )
|
||||
{
|
||||
playanimnfortime( var_0, 0, var_1 );
|
||||
}
|
||||
|
||||
playanimnfortime( var_0, var_1, var_2 )
|
||||
{
|
||||
self setanimstate( var_0, var_1 );
|
||||
wait( var_2 );
|
||||
}
|
||||
|
||||
playanimnatratefortime( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self setanimstate( var_0, var_1, var_2 );
|
||||
wait( var_3 );
|
||||
}
|
||||
|
||||
getanimscalefactors( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = length2d( var_0 );
|
||||
var_4 = var_0[2];
|
||||
var_5 = length2d( var_1 );
|
||||
var_6 = var_1[2];
|
||||
var_7 = 1;
|
||||
var_8 = 1;
|
||||
|
||||
if ( isdefined( var_2 ) && var_2 )
|
||||
{
|
||||
var_9 = ( var_1[0], var_1[1], 0 );
|
||||
var_10 = vectornormalize( var_9 );
|
||||
|
||||
if ( vectordot( var_10, var_0 ) < 0 )
|
||||
var_7 = 0;
|
||||
else if ( var_5 > 0 )
|
||||
var_7 = var_3 / var_5;
|
||||
}
|
||||
else if ( var_5 > 0 )
|
||||
var_7 = var_3 / var_5;
|
||||
|
||||
if ( abs( var_6 ) > 0.001 && var_6 * var_4 >= 0 )
|
||||
var_8 = var_4 / var_6;
|
||||
|
||||
var_11 = spawnstruct();
|
||||
var_11.xy = var_7;
|
||||
var_11.z = var_8;
|
||||
return var_11;
|
||||
}
|
||||
|
||||
getangleindex( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = 10;
|
||||
|
||||
if ( var_0 < 0 )
|
||||
return int( ceil( ( 180 + var_0 - var_1 ) / 45 ) );
|
||||
else
|
||||
return int( floor( ( 180 + var_0 + var_1 ) / 45 ) );
|
||||
}
|
||||
|
||||
droppostoground( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = 18;
|
||||
|
||||
var_2 = var_0 + ( 0, 0, var_1 );
|
||||
var_3 = var_0 + ( 0, 0, var_1 * -1 );
|
||||
var_4 = self aiphysicstrace( var_2, var_3, self.radius, self.height, 1 );
|
||||
|
||||
if ( abs( var_4[2] - var_2[2] ) < 0.1 )
|
||||
return undefined;
|
||||
|
||||
if ( abs( var_4[2] - var_3[2] ) < 0.1 )
|
||||
return undefined;
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
canmovepointtopoint( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = 6;
|
||||
|
||||
var_3 = ( 0, 0, 1 ) * var_2;
|
||||
var_4 = var_0 + var_3;
|
||||
var_5 = var_1 + var_3;
|
||||
return self aiphysicstracepassed( var_4, var_5, self.radius, self.height - var_2, 1 );
|
||||
}
|
||||
|
||||
getvalidpointtopointmovelocation( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = 6;
|
||||
|
||||
var_3 = ( 0, 0, 1 ) * var_2;
|
||||
var_4 = var_0 + var_3;
|
||||
var_5 = var_1 + var_3;
|
||||
return self aiphysicstrace( var_4, var_5, self.radius + 4, self.height - var_2, 1 );
|
||||
}
|
||||
|
||||
getsafeanimmovedeltapercentage( var_0 )
|
||||
{
|
||||
var_1 = getmovedelta( var_0 );
|
||||
var_2 = self localtoworldcoords( var_1 );
|
||||
var_3 = getvalidpointtopointmovelocation( self.origin, var_2 );
|
||||
var_4 = distance( self.origin, var_3 );
|
||||
var_5 = distance( self.origin, var_2 );
|
||||
return min( 1.0, var_4 / var_5 );
|
||||
}
|
||||
|
||||
safelyplayanimuntilnotetrack( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = getrandomanimentry( var_0 );
|
||||
safelyplayanimnuntilnotetrack( var_0, var_4, var_1, var_2, var_3 );
|
||||
}
|
||||
|
||||
safelyplayanimatrateuntilnotetrack( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = getrandomanimentry( var_0 );
|
||||
safelyplayanimnatrateuntilnotetrack( var_0, var_5, var_1, var_2, var_3, var_4 );
|
||||
}
|
||||
|
||||
safelyplayanimnatrateuntilnotetrack( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
self setanimstate( var_0, var_1, var_2 );
|
||||
safelyplayanimnuntilnotetrack( var_0, var_1, var_3, var_4, var_5 );
|
||||
}
|
||||
|
||||
safelyplayanimnuntilnotetrack( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = self getanimentry( var_0, var_1 );
|
||||
var_6 = getsafeanimmovedeltapercentage( var_5 );
|
||||
self scragentsetanimscale( var_6, 1.0 );
|
||||
playanimnuntilnotetrack( var_0, var_1, var_2, var_3, var_4 );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
}
|
||||
|
||||
getrandomanimentry( var_0 )
|
||||
{
|
||||
var_1 = self getanimentrycount( var_0 );
|
||||
return randomint( var_1 );
|
||||
}
|
||||
|
||||
getangleindexfromselfyaw( var_0 )
|
||||
{
|
||||
var_1 = vectortoangles( var_0 );
|
||||
var_2 = angleclamp180( var_1[1] - self.angles[1] );
|
||||
return getangleindex( var_2 );
|
||||
}
|
508
maps/mp/agents/alien/_alien_agents.gsc
Normal file
508
maps/mp/agents/alien/_alien_agents.gsc
Normal file
@ -0,0 +1,508 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
if ( isdefined( level.createfx_enabled ) && level.createfx_enabled )
|
||||
return;
|
||||
|
||||
setup_callbacks();
|
||||
level.badplace_cylinder_func = ::badplace_cylinder;
|
||||
level.badplace_delete_func = ::badplace_delete;
|
||||
level thread maps\mp\agents\_agent_common::init();
|
||||
level.spitter_last_cloud_time = 0;
|
||||
}
|
||||
|
||||
setup_callbacks()
|
||||
{
|
||||
if ( !isdefined( level.agent_funcs ) )
|
||||
level.agent_funcs = [];
|
||||
|
||||
level.agent_funcs["alien"] = [];
|
||||
level.agent_funcs["alien"]["spawn"] = ::alienagentspawn;
|
||||
level.agent_funcs["alien"]["think"] = ::alienagentthink;
|
||||
level.agent_funcs["alien"]["on_killed"] = maps\mp\alien\_death::onalienagentkilled;
|
||||
level.agent_funcs["alien"]["on_damaged"] = maps\mp\alien\_damage::onalienagentdamaged;
|
||||
level.agent_funcs["alien"]["on_damaged_finished"] = maps\mp\agents\alien\_alien_think::ondamagefinish;
|
||||
level.alien_funcs["goon"]["approach"] = maps\mp\agents\alien\_alien_think::default_approach;
|
||||
level.alien_funcs["minion"]["approach"] = maps\mp\agents\alien\_alien_minion::minion_approach;
|
||||
level.alien_funcs["spitter"]["approach"] = maps\mp\agents\alien\_alien_think::default_approach;
|
||||
level.alien_funcs["elite"]["approach"] = maps\mp\agents\alien\_alien_elite::elite_approach;
|
||||
level.alien_funcs["brute"]["approach"] = maps\mp\agents\alien\_alien_think::default_approach;
|
||||
level.alien_funcs["locust"]["approach"] = maps\mp\agents\alien\_alien_think::default_approach;
|
||||
level.alien_funcs["leper"]["approach"] = maps\mp\agents\alien\_alien_think::default_approach;
|
||||
level.alien_funcs["goon"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
||||
level.alien_funcs["minion"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
||||
level.alien_funcs["spitter"]["combat"] = maps\mp\agents\alien\_alien_spitter::spitter_combat;
|
||||
level.alien_funcs["elite"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
||||
level.alien_funcs["brute"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
||||
level.alien_funcs["locust"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
||||
level.alien_funcs["leper"]["combat"] = maps\mp\agents\alien\_alien_leper::leper_combat;
|
||||
level.alien_funcs["goon"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.alien_funcs["minion"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.alien_funcs["spitter"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.alien_funcs["elite"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.alien_funcs["brute"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.alien_funcs["locust"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.alien_funcs["leper"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
level.used_nodes = [];
|
||||
level.used_nodes_list_size = 20;
|
||||
level.used_nodes_list_index = 0;
|
||||
level.alien_jump_melee_speed = 1.05;
|
||||
level.alien_jump_melee_gravity = 900;
|
||||
}
|
||||
|
||||
alienagentthink()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
alienagentspawn( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = "wave goon";
|
||||
|
||||
var_4 = remove_spawn_type( var_2 );
|
||||
|
||||
if ( !isdefined( var_0 ) || !isdefined( var_1 ) )
|
||||
{
|
||||
var_5 = self [[ level.getspawnpoint ]]();
|
||||
var_0 = var_5.origin;
|
||||
var_1 = var_5.angles;
|
||||
}
|
||||
|
||||
set_alien_model( var_4 );
|
||||
|
||||
if ( common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" ) && self.agentteam == "axis" )
|
||||
{
|
||||
if ( !common_scripts\utility::flag_exist( "nuke_went_off" ) || !common_scripts\utility::flag( "nuke_went_off" ) )
|
||||
{
|
||||
self.notriggerhurt = 1;
|
||||
var_6 = 0;
|
||||
var_7 = strtok( var_2, " " );
|
||||
var_8 = var_7[0];
|
||||
|
||||
if ( var_7.size > 1 )
|
||||
var_8 = var_7[1];
|
||||
|
||||
if ( var_4 == "spitter" && isdefined( level.escape_spitter_target_node ) )
|
||||
var_0 = maps\mp\alien\_spawnlogic::port_to_escape_spitter_location();
|
||||
else
|
||||
{
|
||||
var_9 = maps\mp\alien\_spawnlogic::port_to_player_loc( var_8 );
|
||||
|
||||
if ( !isdefined( var_9 ) )
|
||||
var_6 = 1;
|
||||
else
|
||||
{
|
||||
var_0 = var_9[0];
|
||||
var_1 = var_9[1];
|
||||
}
|
||||
}
|
||||
|
||||
if ( !var_6 )
|
||||
{
|
||||
var_0 = getgroundposition( var_0, 16 );
|
||||
var_0 = var_0 - ( 0, 0, 90 );
|
||||
var_3 = level.cycle_data.spawn_node_info["queen_test"].vignetteinfo[var_8];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
spawn_alien_agent( var_0, var_1, var_4 );
|
||||
level notify( "spawned_agent", self );
|
||||
set_alien_attributes( var_2 );
|
||||
set_code_fields( var_4 );
|
||||
set_script_fields( var_0 );
|
||||
set_threat_bias_group( var_4 );
|
||||
type_specific_init();
|
||||
setup_watcher();
|
||||
misc_setup();
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
dointrovignetteanim( var_3 );
|
||||
|
||||
if ( isdefined( self.notriggerhurt ) )
|
||||
self.notriggerhurt = undefined;
|
||||
|
||||
maps\mp\alien\_ffotd::onspawnalien();
|
||||
thread maps\mp\agents\alien\_alien_think::main();
|
||||
}
|
||||
|
||||
set_code_fields( var_0 )
|
||||
{
|
||||
self.allowjump = 1;
|
||||
self.allowladders = 1;
|
||||
self.movemode = get_default_movemode();
|
||||
self.radius = 15;
|
||||
self.height = 72;
|
||||
self.turnrate = 0.3;
|
||||
self.sharpturnnotifydist = 48;
|
||||
self.traversesoonnotifydist = level.alienanimdata.jumplauncharrival_maxmovedelta;
|
||||
self.stopsoonnotifydist = level.alienanimdata.stopsoon_notifydist;
|
||||
self.jumpcost = level.alien_types[var_0].attributes["jump_cost"];
|
||||
|
||||
if ( common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" ) )
|
||||
self.jumpcost = max( 0.85, self.jumpcost * 0.66 );
|
||||
|
||||
self.traversecost = level.alien_types[var_0].attributes["traverse_cost"];
|
||||
self.runcost = level.alien_types[var_0].attributes["run_cost"];
|
||||
|
||||
if ( isdefined( level.alien_types[var_0].attributes["wall_run_cost"] ) )
|
||||
self scragentsetwallruncost( level.alien_types[var_0].attributes["wall_run_cost"] );
|
||||
}
|
||||
|
||||
get_default_movemode()
|
||||
{
|
||||
var_0 = maps\mp\alien\_utility::get_alien_type();
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "minion":
|
||||
return "walk";
|
||||
default:
|
||||
return "run";
|
||||
}
|
||||
}
|
||||
|
||||
set_threat_bias_group( var_0 )
|
||||
{
|
||||
if ( !can_attack_drill( var_0 ) )
|
||||
{
|
||||
self setthreatbiasgroup( "dontattackdrill" );
|
||||
return;
|
||||
}
|
||||
|
||||
self setthreatbiasgroup( "other_aliens" );
|
||||
}
|
||||
|
||||
can_attack_drill( var_0 )
|
||||
{
|
||||
if ( isdefined( level.dlc_alien_can_attack_drill_override_func ) )
|
||||
{
|
||||
var_1 = [[ level.dlc_alien_can_attack_drill_override_func ]]( var_0 );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
return var_1;
|
||||
}
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "mammoth":
|
||||
case "gargoyle":
|
||||
case "locust":
|
||||
case "minion":
|
||||
case "elite":
|
||||
return 0;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
set_script_fields( var_0 )
|
||||
{
|
||||
self.species = "alien";
|
||||
self.enablestop = 1;
|
||||
maps\mp\agents\_agent_utility::activateagent();
|
||||
self.spawntime = gettime();
|
||||
self.attacking_player = 0;
|
||||
self.spawnorigin = var_0;
|
||||
self.recentdamages = [];
|
||||
self.damagelistindex = 0;
|
||||
self.swipechance = 0.5;
|
||||
self.leapendpos = undefined;
|
||||
self.trajectoryactive = 0;
|
||||
self.melee_in_move_back = 0;
|
||||
self.melee_in_posture = 0;
|
||||
}
|
||||
|
||||
remove_spawn_type( var_0 )
|
||||
{
|
||||
var_1 = strtok( var_0, " " );
|
||||
|
||||
if ( isdefined( var_1 ) && var_1.size == 2 )
|
||||
return var_1[1];
|
||||
else
|
||||
return var_0;
|
||||
}
|
||||
|
||||
set_alien_model( var_0 )
|
||||
{
|
||||
if ( isdefined( level.get_alien_model_func ) )
|
||||
var_1 = [[ level.get_alien_model_func ]]( var_0 );
|
||||
else
|
||||
var_1 = level.alien_types[var_0].attributes["model"];
|
||||
|
||||
self setmodel( var_1 );
|
||||
self show();
|
||||
self motionblurhqenable();
|
||||
}
|
||||
|
||||
spawn_alien_agent( var_0, var_1, var_2 )
|
||||
{
|
||||
self.onenteranimstate = maps\mp\agents\alien\_alien_think::onenteranimstate;
|
||||
var_3 = get_anim_class( var_2 );
|
||||
self spawnagent( var_0, var_1, var_3, 15, 50 );
|
||||
}
|
||||
|
||||
get_anim_class( var_0 )
|
||||
{
|
||||
return level.alien_types[var_0].attributes["animclass"];
|
||||
}
|
||||
|
||||
set_alien_attributes( var_0 )
|
||||
{
|
||||
maps\mp\alien\_spawnlogic::assign_alien_attributes( var_0 );
|
||||
}
|
||||
|
||||
type_specific_init()
|
||||
{
|
||||
switch ( maps\mp\alien\_utility::get_alien_type() )
|
||||
{
|
||||
case "elite":
|
||||
maps\mp\agents\alien\_alien_elite::elite_init();
|
||||
break;
|
||||
case "minion":
|
||||
maps\mp\agents\alien\_alien_minion::minion_init();
|
||||
break;
|
||||
case "spitter":
|
||||
maps\mp\agents\alien\_alien_spitter::spitter_init();
|
||||
break;
|
||||
case "leper":
|
||||
maps\mp\agents\alien\_alien_leper::leper_init();
|
||||
break;
|
||||
default:
|
||||
if ( isdefined( level.dlc_alien_init_override_func ) )
|
||||
[[ level.dlc_alien_init_override_func ]]();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
misc_setup()
|
||||
{
|
||||
self scragentsetclipmode( "agent" );
|
||||
self takeallweapons();
|
||||
}
|
||||
|
||||
setup_watcher()
|
||||
{
|
||||
thread maps\mp\agents\alien\_alien_think::watch_for_scripted();
|
||||
thread maps\mp\agents\alien\_alien_think::watch_for_badpath();
|
||||
thread maps\mp\agents\alien\_alien_think::watch_for_insolid();
|
||||
thread maps\mp\_flashgrenades::monitorflash();
|
||||
thread maps\mp\agents\alien\_alien_think::monitorflash();
|
||||
}
|
||||
|
||||
dointrovignetteanim( var_0 )
|
||||
{
|
||||
var_1 = 0;
|
||||
var_2 = 1;
|
||||
var_3 = 2;
|
||||
var_4 = 3;
|
||||
var_5 = 4;
|
||||
var_6 = 5;
|
||||
var_7 = 6;
|
||||
var_8 = 7;
|
||||
self scragentsetscripted( 1 );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
var_0 = strtok( var_0, ";" );
|
||||
self.vignetteaniminfo = [];
|
||||
self.vignetteaniminfo["FX"] = replacenonewithemptystring( var_0[var_5] );
|
||||
self.vignetteaniminfo["scriptableName"] = strtok( replacenonewithemptystring( var_0[var_6] ), "," );
|
||||
self.vignetteaniminfo["scriptableState"] = strtok( replacenonewithemptystring( var_0[var_7] ), "," );
|
||||
self.vignetteaniminfo["spawnNodeID"] = replacenonewithemptystring( var_0[var_8] );
|
||||
var_9 = replacenonewithemptystring( var_0[var_1] );
|
||||
var_10 = strtok( replacenonewithemptystring( var_0[var_2] ), "," );
|
||||
var_11 = int( var_10[randomint( var_10.size )] );
|
||||
var_12 = replacenonewithemptystring( var_0[var_3] );
|
||||
var_13 = replacenonewithemptystring( var_0[var_4] );
|
||||
var_14 = self getanimentry( var_9, var_11 );
|
||||
|
||||
if ( shoulddogroundlerp( var_14 ) )
|
||||
dolerptoendonground( var_9, var_11 );
|
||||
|
||||
if ( willplayscriptables( var_14 ) )
|
||||
resetallscriptables( self.vignetteaniminfo["scriptableName"], self.origin );
|
||||
|
||||
var_15 = maps\mp\agents\alien\_alien_traverse::needflexibleheightsupport( var_14 );
|
||||
|
||||
if ( var_15.need_support )
|
||||
dospawnvignettewithflexibleheight( var_9, var_11, var_12, var_14, var_15.start_notetrack, var_15.end_notetrack, ::vignettenotetrackhandler );
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_9, var_11, var_12, var_13, ::vignettenotetrackhandler );
|
||||
|
||||
self scragentsetscripted( 0 );
|
||||
}
|
||||
|
||||
shoulddogroundlerp( var_0 )
|
||||
{
|
||||
return !animhasnotetrack( var_0, "skip_ground_lerp" );
|
||||
}
|
||||
|
||||
willplayscriptables( var_0 )
|
||||
{
|
||||
return animhasnotetrack( var_0, "play_scriptable" ) && can_play_scriptable( self.vignetteaniminfo["spawnNodeID"], self.vignetteaniminfo["scriptableName"] );
|
||||
}
|
||||
|
||||
dospawnvignettewithflexibleheight( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
||||
{
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_1, var_2, var_4, var_6 );
|
||||
var_7 = getendloconground( var_3 );
|
||||
maps\mp\agents\alien\_alien_traverse::dotraversalwithflexibleheight_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_7, 1, ::vignettenotetrackhandler );
|
||||
}
|
||||
|
||||
getendloconground( var_0 )
|
||||
{
|
||||
var_1 = 32;
|
||||
var_2 = -300;
|
||||
var_3 = maps\mp\agents\alien\_alien_anim_utils::getposinspaceatanimtime( var_0, self.origin, self.angles, getanimlength( var_0 ) );
|
||||
return common_scripts\utility::drop_to_ground( var_3, var_1, var_2 );
|
||||
}
|
||||
|
||||
replacenonewithemptystring( var_0 )
|
||||
{
|
||||
if ( var_0 == "NONE" )
|
||||
return "";
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
vignettenotetrackhandler( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "play_fx":
|
||||
case "alien_drone_spawn_underground":
|
||||
if ( !is_empty_string( self.vignetteaniminfo["FX"] ) )
|
||||
playspawnvignettefx( self.vignetteaniminfo["FX"] );
|
||||
|
||||
break;
|
||||
case "play_scriptable":
|
||||
if ( can_play_scriptable( self.vignetteaniminfo["spawnNodeID"], self.vignetteaniminfo["scriptableName"] ) )
|
||||
{
|
||||
playanimonallscriptables( self.vignetteaniminfo["scriptableName"], self.origin, self.vignetteaniminfo["scriptableState"] );
|
||||
|
||||
if ( is_one_off_scriptable( self.vignetteaniminfo["spawnNodeID"] ) )
|
||||
inactivate_scriptable_for_node( self.vignetteaniminfo["spawnNodeID"] );
|
||||
}
|
||||
|
||||
break;
|
||||
case "play_earthquake":
|
||||
earthquake( 0.5, 1.5, self.origin, 800 );
|
||||
break;
|
||||
case "delete_spawn_clip":
|
||||
if ( isdefined( self.intro_clips ) )
|
||||
delete_items( self.intro_clips );
|
||||
|
||||
break;
|
||||
case "frontal_cone_knock_player_back":
|
||||
frontal_cone_knock_player_back();
|
||||
break;
|
||||
case "apply_physics":
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
can_play_scriptable( var_0, var_1 )
|
||||
{
|
||||
return ( is_scriptable_status( var_0, "always_on" ) || is_scriptable_status( var_0, "one_off" ) ) && var_1.size > 0;
|
||||
}
|
||||
|
||||
is_scriptable_status( var_0, var_1 )
|
||||
{
|
||||
return level.cycle_data.spawn_node_info[var_0].scriptablestatus == var_1;
|
||||
}
|
||||
|
||||
is_one_off_scriptable( var_0 )
|
||||
{
|
||||
return is_scriptable_status( var_0, "one_off" );
|
||||
}
|
||||
|
||||
inactivate_scriptable_for_node( var_0 )
|
||||
{
|
||||
level.cycle_data.spawn_node_info[var_0].scriptablestatus = "inactive";
|
||||
}
|
||||
|
||||
delete_items( var_0 )
|
||||
{
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
if ( isdefined( var_2 ) )
|
||||
var_2 delete();
|
||||
}
|
||||
}
|
||||
|
||||
frontal_cone_knock_player_back()
|
||||
{
|
||||
var_0 = 22500;
|
||||
var_1 = 650;
|
||||
var_2 = 0.2588;
|
||||
var_3 = anglestoforward( self.angles );
|
||||
|
||||
foreach ( var_5 in level.players )
|
||||
{
|
||||
var_6 = vectornormalize( var_5.origin - self.origin );
|
||||
|
||||
if ( vectordot( var_6, var_3 ) > var_2 && distancesquared( var_5.origin, self.origin ) <= var_0 )
|
||||
{
|
||||
var_5 setvelocity( vectornormalize( var_5.origin - self.origin ) * var_1 );
|
||||
var_5 dodamage( var_5.health / 10, self.origin );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resetallscriptables( var_0, var_1 )
|
||||
{
|
||||
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
|
||||
maps\mp\agents\alien\_alien_anim_utils::resetscriptable( var_0[var_2], var_1 );
|
||||
}
|
||||
|
||||
playanimonallscriptables( var_0, var_1, var_2 )
|
||||
{
|
||||
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
|
||||
maps\mp\agents\alien\_alien_anim_utils::playanimonscriptable( var_0[var_3], var_1, int( var_2[var_3] ) );
|
||||
}
|
||||
|
||||
is_empty_string( var_0 )
|
||||
{
|
||||
return var_0 == "";
|
||||
}
|
||||
|
||||
playspawnvignettefx( var_0 )
|
||||
{
|
||||
var_1 = level._effect[var_0];
|
||||
var_2 = getgroundposition( self.origin + ( 0, 0, 100 ), 16 );
|
||||
playfx( var_1, var_2, ( 0, 0, 1 ) );
|
||||
}
|
||||
|
||||
dolerptoendonground( var_0, var_1 )
|
||||
{
|
||||
var_2 = 2;
|
||||
var_3 = self getanimentry( var_0, var_1 );
|
||||
var_4 = maps\mp\agents\alien\_alien_anim_utils::getlerptime( var_3 );
|
||||
var_5 = maps\mp\agents\alien\_alien_anim_utils::getposinspaceatanimtime( var_3, self.origin, self.angles, var_4 );
|
||||
var_6 = getverticaldeltatoendgroud( var_3 );
|
||||
var_5 = var_5 + ( 0, 0, var_6 + var_2 );
|
||||
thread maps\mp\agents\alien\_alien_anim_utils::dolerp( var_5, var_4 );
|
||||
}
|
||||
|
||||
getverticaldeltatoendgroud( var_0 )
|
||||
{
|
||||
var_1 = 100;
|
||||
var_2 = 32;
|
||||
var_3 = 72;
|
||||
var_4 = getmovedelta( var_0, 0, 1 );
|
||||
var_4 = rotatevector( var_4, self.angles );
|
||||
var_5 = var_4[2];
|
||||
var_6 = self.origin + var_4;
|
||||
var_7 = var_6 + ( 0, 0, var_1 );
|
||||
var_8 = var_6 - ( 0, 0, var_1 );
|
||||
var_9 = self aiphysicstrace( var_7, var_8, var_2, var_3 );
|
||||
var_10 = var_9 - self.origin[2];
|
||||
return var_10 - var_5;
|
||||
}
|
741
maps/mp/agents/alien/_alien_anim_utils.gsc
Normal file
741
maps/mp/agents/alien/_alien_anim_utils.gsc
Normal file
@ -0,0 +1,741 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
initalienanims()
|
||||
{
|
||||
level.alienanimdata = spawnstruct();
|
||||
initaliencannedtraverses( level.alienanimdata );
|
||||
initalienjumptraverses( level.alienanimdata );
|
||||
initalienpain( level.alienanimdata );
|
||||
initaliendeath( level.alienanimdata );
|
||||
initmovebackanims();
|
||||
level.alienanimdata.jumplauncharrival_maxmovedelta = 107.659;
|
||||
level.alienanimdata.stopsoon_notifydist = 99.4488;
|
||||
}
|
||||
|
||||
calculateanimdata()
|
||||
{
|
||||
calculate_jumplauncharrivalmaxmovedelta();
|
||||
calculate_stopsoonnotifydist();
|
||||
}
|
||||
|
||||
calculate_jumplauncharrivalmaxmovedelta()
|
||||
{
|
||||
iprintln( "level.alienAnimData.jumpLaunchArrival_maxMoveDelta = " + calculate_maxmovedeltainanimstate( "jump_launch_arrival" ) );
|
||||
}
|
||||
|
||||
calculate_stopsoonnotifydist()
|
||||
{
|
||||
iprintln( "level.alienAnimData.stopSoon_NotifyDist = " + calculate_maxmovedeltainanimstate( "run_stop" ) );
|
||||
}
|
||||
|
||||
calculate_maxmovedeltainanimstate( var_0 )
|
||||
{
|
||||
var_1 = 0;
|
||||
var_2 = self getanimentrycount( var_0 );
|
||||
|
||||
for ( var_3 = 0; var_3 < var_2; var_3++ )
|
||||
{
|
||||
var_4 = self getanimentry( var_0, var_3 );
|
||||
var_5 = getmovedelta( var_4, 0, 1 );
|
||||
var_6 = lengthsquared( var_5 );
|
||||
|
||||
if ( var_6 > var_1 )
|
||||
var_1 = var_6;
|
||||
}
|
||||
|
||||
return sqrt( var_1 );
|
||||
}
|
||||
|
||||
initaliencannedtraverses( var_0 )
|
||||
{
|
||||
var_0.cannedtraverseanims = [];
|
||||
var_0.cannedtraverseanims["alien_crawl_door"] = registertraversedata( "traverse_group_1", [ 0 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_sidewall_l"] = registertraversedata( "traverse_group_1", [ 1 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_sidewall_r"] = registertraversedata( "traverse_group_1", [ 2 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_leap_clear_height_54"] = registertraversedata( "traverse_group_1", [ 3 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_drone_traverse_corner_wall_crawl"] = registertraversedata( "traverse_group_1", [ 4 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_leap_clear_height_36"] = registertraversedata( "traverse_group_1", [ 5 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_leap_tree"] = registertraversedata( "traverse_group_1", [ 6 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_under_car"] = registertraversedata( "traverse_group_1", [ 7 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_on_car"] = registertraversedata( "traverse_group_1", [ 8 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_step_up_56"] = registertraversedata( "traverse_group_1", [ 9 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_step_down_56"] = registertraversedata( "traverse_group_1", [ 10 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_deadtree"] = registertraversedata( "traverse_group_1", [ 11 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_back_humvee"] = registertraversedata( "traverse_group_1", [ 12 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_car"] = registertraversedata( "traverse_group_1", [ 13 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_humvee"] = registertraversedata( "traverse_group_1", [ 14 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_sidecar"] = registertraversedata( "traverse_group_1", [ 15 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_crawl_sidehumvee"] = registertraversedata( "traverse_group_1", [ 16 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_under_fence"] = registertraversedata( "traverse_group_1", [ 17, 24 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_climb_up_spiral_tree"] = registertraversedata( "traverse_group_1", [ 18 ], 1 );
|
||||
var_0.cannedtraverseanims["alien_climb_up_gutter_L"] = registertraversedata( "traverse_group_1", [ 19 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_climb_up_gutter_R"] = registertraversedata( "traverse_group_1", [ 20 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_climb_over_fence_112"] = registertraversedata( "traverse_group_1", [ 21, 22, 23 ], 0 );
|
||||
var_0.cannedtraverseanims["alien_mantle_36"] = registertraversedata( "traverse_group_2", [ 0 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_drone_traverse_climb_vault_8"] = registertraversedata( "traverse_group_2", [ 1 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_drone_traverse_climb_over_fence"] = registertraversedata( "traverse_group_2", [ 2 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_crawl_rail_vault_lodge"] = registertraversedata( "traverse_group_2", [ 3 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_rail_lodge"] = registertraversedata( "traverse_group_2", [ 4 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_roof_to_ceiling"] = registertraversedata( "traverse_group_2", [ 5 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_climb_over_fence_88"] = registertraversedata( "traverse_group_2", [ 6 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_100"] = registertraversedata( "traverse_group_2", [ 7 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_200"] = registertraversedata( "traverse_group_2", [ 8 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_70"] = registertraversedata( "traverse_group_2", [ 9 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_200"] = registertraversedata( "traverse_group_2", [ 10 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_straight"] = registertraversedata( "traverse_group_2", [ 11 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_roof_to_ground"] = registertraversedata( "traverse_group_2", [ 12 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_128_rail_32"] = registertraversedata( "traverse_group_2", [ 13 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_128_rail_36"] = registertraversedata( "traverse_group_2", [ 14 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_128_rail_48"] = registertraversedata( "traverse_group_2", [ 15 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_climb_up_rail_32_idle"] = registertraversedata( "traverse_group_2", [ 16 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_climb_up_rail_32_run"] = registertraversedata( "traverse_group_2", [ 17 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_mantle_32"] = registertraversedata( "traverse_group_2", [ 18 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_mantle_48"] = registertraversedata( "traverse_group_2", [ 19 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_128_rail_32"] = registertraversedata( "traverse_group_2", [ 20 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_128_rail_36"] = registertraversedata( "traverse_group_2", [ 21 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_128_rail_48"] = registertraversedata( "traverse_group_2", [ 22 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_climb_down_128_rail_36"] = registertraversedata( "traverse_group_2", [ 23 ], 1, 1 );
|
||||
var_0.cannedtraverseanims["alien_mantle_crate_48"] = registertraversedata( "traverse_group_2", [ 24 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_mantle_crate_64"] = registertraversedata( "traverse_group_2", [ 25 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_56_idle"] = registertraversedata( "traverse_group_2", [ 26 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_56_run"] = registertraversedata( "traverse_group_2", [ 27 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_56_idle"] = registertraversedata( "traverse_group_2", [ 28 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_56_run"] = registertraversedata( "traverse_group_2", [ 29 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_fence_88_enter_scale"] = registertraversedata( "traverse_group_2", [ 30 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_fence_88_exit_scale"] = registertraversedata( "traverse_group_2", [ 31 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_up_90_rail_32"] = registertraversedata( "traverse_group_3", [ 0 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_fence_high_to_low"] = registertraversedata( "traverse_group_3", [ 1 ], 0, 0 );
|
||||
var_0.cannedtraverseanims["alien_jump_fence_low_to_high"] = registertraversedata( "traverse_group_3", [ 2 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_straight_forward_56"] = registertraversedata( "traverse_group_3", [ 3 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_jump_down_straight_360_dlc"] = registertraversedata( "traverse_group_3", [ 4 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_rail_32_jump_down_idle_dlc"] = registertraversedata( "traverse_group_3", [ 5 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_rail_36_jump_down_idle_dlc"] = registertraversedata( "traverse_group_3", [ 6 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_rail_48_jump_down_idle_dlc"] = registertraversedata( "traverse_group_3", [ 7 ], 0, 1 );
|
||||
var_0.cannedtraverseanims["alien_climb_up"] = registertraversedata( "traverse_climb_up" );
|
||||
var_0.cannedtraverseanims["alien_climb_down"] = registertraversedata( "traverse_climb_down" );
|
||||
var_0.cannedtraverseanims["alien_climb_up_over_56"] = registertraversedata( "traverse_climb_up_over_56" );
|
||||
var_0.cannedtraverseanims["alien_climb_over_56_down"] = registertraversedata( "traverse_climb_over_56_down" );
|
||||
var_0.cannedtraverseanims["climb_up_end_jump_side_l"] = registertraversedata( "climb_up_end_jump_side_l" );
|
||||
var_0.cannedtraverseanims["climb_up_end_jump_side_r"] = registertraversedata( "climb_up_end_jump_side_r" );
|
||||
var_0.cannedtraverseanims["alien_climb_up_ledge_18_run"] = registertraversedata( "traverse_climb_up_ledge_18_run" );
|
||||
var_0.cannedtraverseanims["alien_climb_up_ledge_18_idle"] = registertraversedata( "traverse_climb_up_ledge_18_idle" );
|
||||
var_0.cannedtraverseanims["alien_wall_run"] = registertraversedata( "run" );
|
||||
}
|
||||
|
||||
initalienjumptraverses( var_0 )
|
||||
{
|
||||
level.alienanimdata.jumpgravity = 907.029;
|
||||
level.alienanimdata.jumplaunchgrounddelta = 16.8476;
|
||||
level.alienanimdata.jumplaunchinairanimlength = 0.111111;
|
||||
level.alienanimdata.jumplaunchdirection = [];
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_up"] = [];
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_level"] = [];
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_down"] = [];
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_up"][0] = ( 0.338726, 0, 0.940885 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_up"][1] = ( 0.688542, 0, 0.725196 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_up"][2] = ( 0.906517, 0, 0.422169 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_level"][0] = ( 0.248516, 0, 0.968628 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_level"][1] = ( 0.579155, 0, 0.815218 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_level"][2] = ( 0.906514, 0, 0.422177 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_down"][0] = ( 0.333125, 0, 0.942883 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_down"][1] = ( 0.518112, 0, 0.855313 );
|
||||
level.alienanimdata.jumplaunchdirection["jump_launch_down"][2] = ( 0.892489, 0, 0.451068 );
|
||||
level.alienanimdata.inairanimentry = [];
|
||||
level.alienanimdata.inairanimentry["jump_launch_up"] = [];
|
||||
level.alienanimdata.inairanimentry["jump_launch_level"] = [];
|
||||
level.alienanimdata.inairanimentry["jump_launch_down"] = [];
|
||||
level.alienanimdata.inairanimentry["jump_launch_up"]["jump_land_up"] = 0;
|
||||
level.alienanimdata.inairanimentry["jump_launch_up"]["jump_land_level"] = 1;
|
||||
level.alienanimdata.inairanimentry["jump_launch_up"]["jump_land_down"] = 2;
|
||||
level.alienanimdata.inairanimentry["jump_launch_level"]["jump_land_up"] = 3;
|
||||
level.alienanimdata.inairanimentry["jump_launch_level"]["jump_land_level"] = 4;
|
||||
level.alienanimdata.inairanimentry["jump_launch_level"]["jump_land_down"] = 5;
|
||||
level.alienanimdata.inairanimentry["jump_launch_down"]["jump_land_up"] = 6;
|
||||
level.alienanimdata.inairanimentry["jump_launch_down"]["jump_land_level"] = 7;
|
||||
level.alienanimdata.inairanimentry["jump_launch_down"]["jump_land_down"] = 8;
|
||||
level.alienanimdata.inairanimentry["jump_launch_up"]["jump_land_sidewall_high"] = 9;
|
||||
level.alienanimdata.inairanimentry["jump_launch_level"]["jump_land_sidewall_high"] = 9;
|
||||
level.alienanimdata.inairanimentry["jump_launch_down"]["jump_land_sidewall_high"] = 9;
|
||||
level.alienanimdata.inairanimentry["jump_launch_up"]["jump_land_sidewall_low"] = 9;
|
||||
level.alienanimdata.inairanimentry["jump_launch_level"]["jump_land_sidewall_low"] = 9;
|
||||
level.alienanimdata.inairanimentry["jump_launch_down"]["jump_land_sidewall_low"] = 9;
|
||||
}
|
||||
|
||||
initalienpain( var_0 )
|
||||
{
|
||||
var_0.painanims = [];
|
||||
var_1 = [];
|
||||
var_1["front"]["head"] = [ 0 ];
|
||||
var_1["front"]["up_chest"] = [ 1 ];
|
||||
var_1["front"]["low_chest"] = [ 1 ];
|
||||
var_1["front"]["up_body_L"] = [ 1 ];
|
||||
var_1["front"]["up_body_R"] = [ 2 ];
|
||||
var_1["front"]["low_body_L"] = [ 2 ];
|
||||
var_1["front"]["low_body_R"] = [ 2 ];
|
||||
var_1["front"]["armor"] = [ 0 ];
|
||||
var_1["front"]["soft"] = [ 0 ];
|
||||
var_1["right"]["head"] = [ 0 ];
|
||||
var_1["right"]["up_chest"] = [ 3 ];
|
||||
var_1["right"]["low_chest"] = [ 3 ];
|
||||
var_1["right"]["up_body_L"] = [ 3 ];
|
||||
var_1["right"]["up_body_R"] = [ 2 ];
|
||||
var_1["right"]["low_body_L"] = [ 4 ];
|
||||
var_1["right"]["low_body_R"] = [ 4 ];
|
||||
var_1["right"]["armor"] = [ 0 ];
|
||||
var_1["right"]["soft"] = [ 0 ];
|
||||
var_1["left"]["head"] = [ 0 ];
|
||||
var_1["left"]["up_chest"] = [ 1 ];
|
||||
var_1["left"]["low_chest"] = [ 1 ];
|
||||
var_1["left"]["up_body_L"] = [ 5 ];
|
||||
var_1["left"]["up_body_R"] = [ 5 ];
|
||||
var_1["left"]["low_body_L"] = [ 6 ];
|
||||
var_1["left"]["low_body_R"] = [ 6 ];
|
||||
var_1["left"]["armor"] = [ 2 ];
|
||||
var_1["left"]["soft"] = [ 2 ];
|
||||
var_1["back"]["head"] = [ 0 ];
|
||||
var_1["back"]["up_chest"] = [ 1 ];
|
||||
var_1["back"]["low_chest"] = [ 1 ];
|
||||
var_1["back"]["up_body_L"] = [ 1 ];
|
||||
var_1["back"]["up_body_R"] = [ 7 ];
|
||||
var_1["back"]["low_body_L"] = [ 7 ];
|
||||
var_1["back"]["low_body_R"] = [ 7 ];
|
||||
var_1["back"]["armor"] = [ 0 ];
|
||||
var_1["back"]["soft"] = [ 0 ];
|
||||
var_0.painanims["idle"] = var_1;
|
||||
var_2 = [];
|
||||
var_2["front"]["head"] = [ 0 ];
|
||||
var_2["front"]["up_chest"] = [ 9 ];
|
||||
var_2["front"]["low_chest"] = [ 8 ];
|
||||
var_2["front"]["up_body_L"] = [ 8 ];
|
||||
var_2["front"]["up_body_R"] = [ 9 ];
|
||||
var_2["front"]["low_body_L"] = [ 10 ];
|
||||
var_2["front"]["low_body_R"] = [ 10 ];
|
||||
var_2["front"]["armor"] = [ 0 ];
|
||||
var_2["front"]["soft"] = [ 0 ];
|
||||
var_2["right"]["head"] = [ 7 ];
|
||||
var_2["right"]["up_chest"] = [ 7 ];
|
||||
var_2["right"]["low_chest"] = [ 11 ];
|
||||
var_2["right"]["up_body_L"] = [ 7 ];
|
||||
var_2["right"]["up_body_R"] = [ 7 ];
|
||||
var_2["right"]["low_body_L"] = [ 11 ];
|
||||
var_2["right"]["low_body_R"] = [ 11 ];
|
||||
var_2["right"]["armor"] = [ 0 ];
|
||||
var_2["right"]["soft"] = [ 0 ];
|
||||
var_2["left"]["head"] = [ 5 ];
|
||||
var_2["left"]["up_chest"] = [ 5 ];
|
||||
var_2["left"]["low_chest"] = [ 6 ];
|
||||
var_2["left"]["up_body_L"] = [ 5 ];
|
||||
var_2["left"]["up_body_R"] = [ 5 ];
|
||||
var_2["left"]["low_body_L"] = [ 6 ];
|
||||
var_2["left"]["low_body_R"] = [ 6 ];
|
||||
var_2["left"]["armor"] = [ 0 ];
|
||||
var_2["left"]["soft"] = [ 0 ];
|
||||
var_2["back"]["head"] = [ 12 ];
|
||||
var_2["back"]["up_chest"] = [ 12 ];
|
||||
var_2["back"]["low_chest"] = [ 13 ];
|
||||
var_2["back"]["up_body_L"] = [ 12 ];
|
||||
var_2["back"]["up_body_R"] = [ 12 ];
|
||||
var_2["back"]["low_body_L"] = [ 13 ];
|
||||
var_2["back"]["low_body_R"] = [ 13 ];
|
||||
var_2["back"]["armor"] = [ 0 ];
|
||||
var_2["back"]["soft"] = [ 0 ];
|
||||
var_0.painanims["run"] = var_2;
|
||||
var_3 = [];
|
||||
var_3["front"]["head"] = [ 0 ];
|
||||
var_3["front"]["up_chest"] = [ 1 ];
|
||||
var_3["front"]["low_chest"] = [ 1 ];
|
||||
var_3["front"]["up_body_L"] = [ 2 ];
|
||||
var_3["front"]["up_body_R"] = [ 3 ];
|
||||
var_3["front"]["low_body_L"] = [ 4 ];
|
||||
var_3["front"]["low_body_R"] = [ 4 ];
|
||||
var_3["front"]["armor"] = [ 0 ];
|
||||
var_3["front"]["soft"] = [ 0 ];
|
||||
var_3["right"]["head"] = [ 7 ];
|
||||
var_3["right"]["up_chest"] = [ 7 ];
|
||||
var_3["right"]["low_chest"] = [ 8 ];
|
||||
var_3["right"]["up_body_L"] = [ 7 ];
|
||||
var_3["right"]["up_body_R"] = [ 7 ];
|
||||
var_3["right"]["low_body_L"] = [ 8 ];
|
||||
var_3["right"]["low_body_R"] = [ 8 ];
|
||||
var_3["right"]["armor"] = [ 0 ];
|
||||
var_3["right"]["soft"] = [ 0 ];
|
||||
var_3["left"]["head"] = [ 5 ];
|
||||
var_3["left"]["up_chest"] = [ 5 ];
|
||||
var_3["left"]["low_chest"] = [ 6 ];
|
||||
var_3["left"]["up_body_L"] = [ 5 ];
|
||||
var_3["left"]["up_body_R"] = [ 5 ];
|
||||
var_3["left"]["low_body_L"] = [ 6 ];
|
||||
var_3["left"]["low_body_R"] = [ 6 ];
|
||||
var_3["left"]["armor"] = [ 0 ];
|
||||
var_3["left"]["soft"] = [ 0 ];
|
||||
var_3["back"]["head"] = [ 9 ];
|
||||
var_3["back"]["up_chest"] = [ 9 ];
|
||||
var_3["back"]["low_chest"] = [ 10 ];
|
||||
var_3["back"]["up_body_L"] = [ 9 ];
|
||||
var_3["back"]["up_body_R"] = [ 9 ];
|
||||
var_3["back"]["low_body_L"] = [ 10 ];
|
||||
var_3["back"]["low_body_R"] = [ 10 ];
|
||||
var_3["back"]["armor"] = [ 0 ];
|
||||
var_3["back"]["soft"] = [ 0 ];
|
||||
var_0.painanims["jump"] = var_3;
|
||||
var_4 = [];
|
||||
var_4["front"] = [ 0, 1 ];
|
||||
var_4["right"] = [ 2 ];
|
||||
var_4["left"] = [ 3 ];
|
||||
var_4["back"] = [ 4 ];
|
||||
var_0.painanims["push_back"] = var_4;
|
||||
var_5 = [];
|
||||
var_5["front"] = [ 0 ];
|
||||
var_5["right"] = [ 0 ];
|
||||
var_5["left"] = [ 0 ];
|
||||
var_5["back"] = [ 0 ];
|
||||
var_0.painanims["move_back"] = var_5;
|
||||
var_6 = [];
|
||||
var_6["front"] = [ 0, 1, 2 ];
|
||||
var_6["right"] = [ 0, 1, 2 ];
|
||||
var_6["left"] = [ 0, 1, 2 ];
|
||||
var_6["back"] = [ 0, 1, 2 ];
|
||||
var_0.painanims["melee"] = var_6;
|
||||
var_7 = [];
|
||||
var_7["head"] = "head";
|
||||
var_7["neck"] = "head";
|
||||
var_7["torso_upper"] = "up_chest";
|
||||
var_7["none"] = "up_chest";
|
||||
var_7["torso_lower"] = "low_chest";
|
||||
var_7["left_arm_upper"] = "up_body_L";
|
||||
var_7["left_arm_lower"] = "up_body_L";
|
||||
var_7["left_hand"] = "up_body_L";
|
||||
var_7["right_arm_upper"] = "up_body_R";
|
||||
var_7["right_arm_lower"] = "up_body_R";
|
||||
var_7["right_hand"] = "up_body_R";
|
||||
var_7["left_leg_upper"] = "low_body_L";
|
||||
var_7["left_leg_lower"] = "low_body_L";
|
||||
var_7["left_foot"] = "low_body_L";
|
||||
var_7["right_leg_upper"] = "low_body_R";
|
||||
var_7["right_leg_lower"] = "low_body_R";
|
||||
var_7["right_foot"] = "low_body_R";
|
||||
var_7["armor"] = "armor";
|
||||
var_7["soft"] = "soft";
|
||||
var_0.painanims["hitLoc"] = var_7;
|
||||
var_8 = [];
|
||||
var_8[0] = "back";
|
||||
var_8[1] = "back";
|
||||
var_8[2] = "right";
|
||||
var_8[3] = "right";
|
||||
var_8[4] = "front";
|
||||
var_8[5] = "left";
|
||||
var_8[6] = "left";
|
||||
var_8[7] = "back";
|
||||
var_8[8] = "back";
|
||||
var_0.painanims["hitDirection"] = var_8;
|
||||
var_9 = [];
|
||||
var_9[0] = [ 0 ];
|
||||
var_9[1] = [ 1 ];
|
||||
var_9[2] = [ 2 ];
|
||||
var_9[3] = [ 3 ];
|
||||
var_9[4] = [ 4 ];
|
||||
var_9[5] = [ 5 ];
|
||||
var_9[6] = [ 6 ];
|
||||
var_9[7] = [ 7 ];
|
||||
var_9[8] = [ 8 ];
|
||||
var_9[9] = [ 9 ];
|
||||
var_9[10] = [ 10 ];
|
||||
var_0.painanims["idleToImpactMap"] = var_9;
|
||||
}
|
||||
|
||||
initaliendeath( var_0 )
|
||||
{
|
||||
var_0.deathanims = [];
|
||||
var_1 = [];
|
||||
var_1["front"]["head"] = [ 0 ];
|
||||
var_1["front"]["up_chest"] = [ 1 ];
|
||||
var_1["front"]["low_chest"] = [ 1 ];
|
||||
var_1["front"]["up_body_L"] = [ 1 ];
|
||||
var_1["front"]["up_body_R"] = [ 2 ];
|
||||
var_1["front"]["low_body_L"] = [ 2 ];
|
||||
var_1["front"]["low_body_R"] = [ 2 ];
|
||||
var_1["front"]["armor"] = [ 0 ];
|
||||
var_1["front"]["soft"] = [ 0 ];
|
||||
var_1["right"]["head"] = [ 0 ];
|
||||
var_1["right"]["up_chest"] = [ 4 ];
|
||||
var_1["right"]["low_chest"] = [ 3 ];
|
||||
var_1["right"]["up_body_L"] = [ 4 ];
|
||||
var_1["right"]["up_body_R"] = [ 4 ];
|
||||
var_1["right"]["low_body_L"] = [ 2 ];
|
||||
var_1["right"]["low_body_R"] = [ 2 ];
|
||||
var_1["right"]["armor"] = [ 0 ];
|
||||
var_1["right"]["soft"] = [ 0 ];
|
||||
var_1["left"]["head"] = [ 0 ];
|
||||
var_1["left"]["up_chest"] = [ 1 ];
|
||||
var_1["left"]["low_chest"] = [ 1 ];
|
||||
var_1["left"]["up_body_L"] = [ 1 ];
|
||||
var_1["left"]["up_body_R"] = [ 2 ];
|
||||
var_1["left"]["low_body_L"] = [ 5 ];
|
||||
var_1["left"]["low_body_R"] = [ 5 ];
|
||||
var_1["left"]["armor"] = [ 0 ];
|
||||
var_1["left"]["soft"] = [ 0 ];
|
||||
var_1["back"]["head"] = [ 0 ];
|
||||
var_1["back"]["up_chest"] = [ 1 ];
|
||||
var_1["back"]["low_chest"] = [ 1 ];
|
||||
var_1["back"]["up_body_L"] = [ 1 ];
|
||||
var_1["back"]["up_body_R"] = [ 2 ];
|
||||
var_1["back"]["low_body_L"] = [ 2 ];
|
||||
var_1["back"]["low_body_R"] = [ 2 ];
|
||||
var_1["back"]["armor"] = [ 0 ];
|
||||
var_1["back"]["soft"] = [ 0 ];
|
||||
var_0.deathanims["idle"] = var_1;
|
||||
var_2 = [];
|
||||
var_2["front"]["head"] = [ 0 ];
|
||||
var_2["front"]["up_chest"] = [ 1 ];
|
||||
var_2["front"]["low_chest"] = [ 3 ];
|
||||
var_2["front"]["up_body_L"] = [ 4 ];
|
||||
var_2["front"]["up_body_R"] = [ 9 ];
|
||||
var_2["front"]["low_body_L"] = [ 4 ];
|
||||
var_2["front"]["low_body_R"] = [ 3 ];
|
||||
var_2["front"]["armor"] = [ 0 ];
|
||||
var_2["front"]["soft"] = [ 0 ];
|
||||
var_2["right"]["head"] = [ 2 ];
|
||||
var_2["right"]["up_chest"] = [ 1 ];
|
||||
var_2["right"]["low_chest"] = [ 0 ];
|
||||
var_2["right"]["up_body_L"] = [ 7 ];
|
||||
var_2["right"]["up_body_R"] = [ 7 ];
|
||||
var_2["right"]["low_body_L"] = [ 3 ];
|
||||
var_2["right"]["low_body_R"] = [ 4 ];
|
||||
var_2["right"]["armor"] = [ 0 ];
|
||||
var_2["right"]["soft"] = [ 0 ];
|
||||
var_2["left"]["head"] = [ 5 ];
|
||||
var_2["left"]["up_chest"] = [ 5 ];
|
||||
var_2["left"]["low_chest"] = [ 6 ];
|
||||
var_2["left"]["up_body_L"] = [ 5 ];
|
||||
var_2["left"]["up_body_R"] = [ 5 ];
|
||||
var_2["left"]["low_body_L"] = [ 8 ];
|
||||
var_2["left"]["low_body_R"] = [ 6 ];
|
||||
var_2["left"]["armor"] = [ 0 ];
|
||||
var_2["left"]["soft"] = [ 0 ];
|
||||
var_2["back"]["head"] = [ 1 ];
|
||||
var_2["back"]["up_chest"] = [ 5 ];
|
||||
var_2["back"]["low_chest"] = [ 4 ];
|
||||
var_2["back"]["up_body_L"] = [ 3 ];
|
||||
var_2["back"]["up_body_R"] = [ 2 ];
|
||||
var_2["back"]["low_body_L"] = [ 1 ];
|
||||
var_2["back"]["low_body_R"] = [ 4 ];
|
||||
var_2["back"]["armor"] = [ 0 ];
|
||||
var_2["back"]["soft"] = [ 0 ];
|
||||
var_0.deathanims["run"] = var_2;
|
||||
var_3 = [];
|
||||
var_3["front"]["head"] = [ 1 ];
|
||||
var_3["front"]["up_chest"] = [ 0 ];
|
||||
var_3["front"]["low_chest"] = [ 0 ];
|
||||
var_3["front"]["up_body_L"] = [ 2 ];
|
||||
var_3["front"]["up_body_R"] = [ 3 ];
|
||||
var_3["front"]["low_body_L"] = [ 4 ];
|
||||
var_3["front"]["low_body_R"] = [ 4 ];
|
||||
var_3["front"]["armor"] = [ 1 ];
|
||||
var_3["front"]["soft"] = [ 1 ];
|
||||
var_3["right"]["head"] = [ 7 ];
|
||||
var_3["right"]["up_chest"] = [ 7 ];
|
||||
var_3["right"]["low_chest"] = [ 8 ];
|
||||
var_3["right"]["up_body_L"] = [ 7 ];
|
||||
var_3["right"]["up_body_R"] = [ 7 ];
|
||||
var_3["right"]["low_body_L"] = [ 8 ];
|
||||
var_3["right"]["low_body_R"] = [ 8 ];
|
||||
var_3["right"]["armor"] = [ 1 ];
|
||||
var_3["right"]["soft"] = [ 1 ];
|
||||
var_3["left"]["head"] = [ 5 ];
|
||||
var_3["left"]["up_chest"] = [ 5 ];
|
||||
var_3["left"]["low_chest"] = [ 6 ];
|
||||
var_3["left"]["up_body_L"] = [ 5 ];
|
||||
var_3["left"]["up_body_R"] = [ 5 ];
|
||||
var_3["left"]["low_body_L"] = [ 6 ];
|
||||
var_3["left"]["low_body_R"] = [ 6 ];
|
||||
var_3["left"]["armor"] = [ 1 ];
|
||||
var_3["left"]["soft"] = [ 1 ];
|
||||
var_3["back"]["head"] = [ 9 ];
|
||||
var_3["back"]["up_chest"] = [ 9 ];
|
||||
var_3["back"]["low_chest"] = [ 10 ];
|
||||
var_3["back"]["up_body_L"] = [ 9 ];
|
||||
var_3["back"]["up_body_R"] = [ 9 ];
|
||||
var_3["back"]["low_body_L"] = [ 10 ];
|
||||
var_3["back"]["low_body_R"] = [ 10 ];
|
||||
var_3["back"]["armor"] = [ 1 ];
|
||||
var_3["back"]["soft"] = [ 1 ];
|
||||
var_0.deathanims["jump"] = var_3;
|
||||
var_4 = [];
|
||||
var_4["head"] = "head";
|
||||
var_4["neck"] = "head";
|
||||
var_4["torso_upper"] = "up_chest";
|
||||
var_4["none"] = "up_chest";
|
||||
var_4["torso_lower"] = "low_chest";
|
||||
var_4["left_arm_upper"] = "up_body_L";
|
||||
var_4["left_arm_lower"] = "up_body_L";
|
||||
var_4["left_hand"] = "up_body_L";
|
||||
var_4["right_arm_upper"] = "up_body_R";
|
||||
var_4["right_arm_lower"] = "up_body_R";
|
||||
var_4["right_hand"] = "up_body_R";
|
||||
var_4["left_leg_upper"] = "low_body_L";
|
||||
var_4["left_leg_lower"] = "low_body_L";
|
||||
var_4["left_foot"] = "low_body_L";
|
||||
var_4["right_leg_upper"] = "low_body_R";
|
||||
var_4["right_leg_lower"] = "low_body_R";
|
||||
var_4["right_foot"] = "low_body_R";
|
||||
var_4["armor"] = "armor";
|
||||
var_4["soft"] = "soft";
|
||||
var_0.deathanims["hitLoc"] = var_4;
|
||||
var_5 = [];
|
||||
var_5[0] = "back";
|
||||
var_5[1] = "back";
|
||||
var_5[2] = "right";
|
||||
var_5[3] = "right";
|
||||
var_5[4] = "front";
|
||||
var_5[5] = "left";
|
||||
var_5[6] = "left";
|
||||
var_5[7] = "back";
|
||||
var_5[8] = "back";
|
||||
var_0.deathanims["hitDirection"] = var_5;
|
||||
var_6 = [];
|
||||
var_6["electric_shock_death"] = [ 0 ];
|
||||
var_6["traverse"] = [ 1 ];
|
||||
var_0.deathanims["special"] = var_6;
|
||||
}
|
||||
|
||||
initmovebackanims()
|
||||
{
|
||||
level.alienanimdata.alienmovebackanimchance[0] = 40;
|
||||
level.alienanimdata.alienmovebackanimchance[1] = 40;
|
||||
level.alienanimdata.alienmovebackanimchance[2] = 20;
|
||||
}
|
||||
|
||||
registertraversedata( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
var_6 = [];
|
||||
var_6["animState"] = var_0;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_6["animIndexArray"] = var_1;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_6["endInOriented"] = var_2;
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
var_6["flexHeightEndAtTraverseEnd"] = var_3;
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
var_6["traverseSound"] = var_4;
|
||||
|
||||
if ( isdefined( var_5 ) )
|
||||
var_6["traverseAnimScale"] = var_5;
|
||||
|
||||
return var_6;
|
||||
}
|
||||
|
||||
turntowardsentity( var_0 )
|
||||
{
|
||||
var_1 = var_0.origin - self.origin;
|
||||
return turntowardsvector( var_1 );
|
||||
}
|
||||
|
||||
turntowardsvector( var_0 )
|
||||
{
|
||||
var_1 = getturninplaceindex( anglestoforward( self.angles ), var_0, anglestoup( self.angles ) );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
if ( var_1 != 4 )
|
||||
{
|
||||
self.statelocked = 1;
|
||||
|
||||
if ( self.oriented )
|
||||
self scragentsetanimmode( "anim angle delta" );
|
||||
else
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
|
||||
var_2 = getturninplaceanimstate();
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, var_1, "turn_in_place", "code_move" );
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_idle_state_locked() )
|
||||
self.statelocked = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
getturninplaceanimstate()
|
||||
{
|
||||
if ( isdefined( level.dlc_alien_turn_in_place_anim_state_override_func ) )
|
||||
{
|
||||
var_0 = [[ level.dlc_alien_turn_in_place_anim_state_override_func ]]();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
return var_0;
|
||||
}
|
||||
|
||||
return "turn_in_place";
|
||||
}
|
||||
|
||||
getturninplaceindex( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = undefined;
|
||||
var_4 = undefined;
|
||||
var_5 = getprojectiondata( var_0, var_1, var_2 );
|
||||
var_6 = var_5.rotatedyaw;
|
||||
var_7 = var_5.projintooutright;
|
||||
var_8 = 10;
|
||||
|
||||
if ( var_7 > 0 )
|
||||
var_4 = int( ceil( ( 180 - var_6 - var_8 ) / 45 ) );
|
||||
else
|
||||
var_4 = int( floor( ( 180 + var_6 + var_8 ) / 45 ) );
|
||||
|
||||
var_4 = int( clamp( var_4, 0, 8 ) );
|
||||
return var_4;
|
||||
}
|
||||
|
||||
getprojectiondata( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = spawnstruct();
|
||||
var_4 = vectornormalize( projectvectortoplane( var_0, var_2 ) );
|
||||
var_5 = vectornormalize( projectvectortoplane( var_1, var_2 ) );
|
||||
var_6 = vectorcross( var_5, var_2 );
|
||||
var_7 = vectornormalize( projectvectortoplane( var_6, var_2 ) );
|
||||
var_8 = vectordot( var_4 * -1, var_7 );
|
||||
var_9 = vectordot( var_5, var_4 );
|
||||
var_9 = clamp( var_9, -1, 1 );
|
||||
var_10 = acos( var_9 );
|
||||
var_3.rotatedyaw = var_10;
|
||||
var_3.projintooutright = var_8;
|
||||
return var_3;
|
||||
}
|
||||
|
||||
projectvectortoplane( var_0, var_1 )
|
||||
{
|
||||
var_2 = vectordot( var_0, var_1 );
|
||||
var_3 = var_0 - var_1 * var_2;
|
||||
return var_3;
|
||||
}
|
||||
|
||||
pain_getcombinedhitloc( var_0 )
|
||||
{
|
||||
return level.alienanimdata.painanims["hitLoc"][var_0];
|
||||
}
|
||||
|
||||
pain_getincomingdirection( var_0 )
|
||||
{
|
||||
var_1 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_0 );
|
||||
return level.alienanimdata.painanims["hitDirection"][var_1];
|
||||
}
|
||||
|
||||
death_getcombinedhitloc( var_0 )
|
||||
{
|
||||
return level.alienanimdata.deathanims["hitLoc"][var_0];
|
||||
}
|
||||
|
||||
death_getincomingdirection( var_0 )
|
||||
{
|
||||
var_1 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_0 );
|
||||
return level.alienanimdata.deathanims["hitDirection"][var_1];
|
||||
}
|
||||
|
||||
getpainanimstate( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = getdamagedegree( var_1, var_2 );
|
||||
return var_0 + "_" + var_3;
|
||||
}
|
||||
|
||||
getdamagedegree( var_0, var_1 )
|
||||
{
|
||||
var_2 = maps\mp\alien\_utility::get_alien_type();
|
||||
var_3 = level.alien_types[var_2].attributes["heavy_damage_threshold"];
|
||||
|
||||
if ( var_0 < var_3 && !var_1 )
|
||||
return "light";
|
||||
else
|
||||
return "heavy";
|
||||
}
|
||||
|
||||
getpainanimindex( var_0, var_1, var_2 )
|
||||
{
|
||||
var_1 = pain_getincomingdirection( var_1 * -1 );
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_2 = pain_getcombinedhitloc( var_2 );
|
||||
|
||||
return getpaindeathanimindex_internal( var_0, var_1, var_2, level.alienanimdata.painanims );
|
||||
}
|
||||
|
||||
getimpactpainanimindex( var_0 )
|
||||
{
|
||||
var_1 = level.alienanimdata.painanims["idleToImpactMap"][var_0];
|
||||
var_2 = randomintrange( 0, var_1.size );
|
||||
return var_1[var_2];
|
||||
}
|
||||
|
||||
getdeathanimstate( var_0, var_1 )
|
||||
{
|
||||
var_2 = getdamagedegree( var_1, 0 );
|
||||
return var_0 + "_" + var_2;
|
||||
}
|
||||
|
||||
getdeathanimindex( var_0, var_1, var_2 )
|
||||
{
|
||||
var_1 = death_getincomingdirection( var_1 * -1 );
|
||||
var_2 = death_getcombinedhitloc( var_2 );
|
||||
return getpaindeathanimindex_internal( var_0, var_1, var_2, level.alienanimdata.deathanims );
|
||||
}
|
||||
|
||||
getpaindeathanimindex_internal( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( isdefined( var_2 ) )
|
||||
var_4 = var_3[var_0][var_1][var_2];
|
||||
else
|
||||
var_4 = var_3[var_0][var_1];
|
||||
|
||||
return var_4[randomint( var_4.size )];
|
||||
}
|
||||
|
||||
getspecialdeathanimindex( var_0 )
|
||||
{
|
||||
var_1 = level.alienanimdata.deathanims["special"][var_0];
|
||||
return var_1[randomint( var_1.size )];
|
||||
}
|
||||
|
||||
resetscriptable( var_0, var_1 )
|
||||
{
|
||||
var_2 = getent( var_0, "targetname" );
|
||||
var_2 setscriptablepartstate( 0, 0 );
|
||||
}
|
||||
|
||||
playanimonscriptable( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = getent( var_0, "targetname" );
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = 1;
|
||||
|
||||
var_3 setscriptablepartstate( 0, var_2 );
|
||||
level notify( "scriptable", var_0 );
|
||||
}
|
||||
|
||||
getlerptime( var_0 )
|
||||
{
|
||||
var_1 = getanimlength( var_0 );
|
||||
return min( 0.2, var_1 );
|
||||
}
|
||||
|
||||
getposinspaceatanimtime( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = getanimlength( var_0 );
|
||||
var_5 = getmovedelta( var_0, 0, var_3 / var_4 );
|
||||
var_6 = rotatevector( var_5, var_2 );
|
||||
return var_1 + var_6;
|
||||
}
|
||||
|
||||
dolerp( var_0, var_1 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self scragentdoanimlerp( self.origin, var_0, var_1 );
|
||||
wait( var_1 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
}
|
319
maps/mp/agents/alien/_alien_bomber.gsc
Normal file
319
maps/mp/agents/alien/_alien_bomber.gsc
Normal file
@ -0,0 +1,319 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
bomber_level_init()
|
||||
{
|
||||
if ( !isdefined( level.alien_funcs ) )
|
||||
level.alien_funcs = [];
|
||||
|
||||
level.alien_funcs["bomber"]["approach"] = ::blank_script;
|
||||
level.alien_funcs["bomber"]["combat"] = ::blank_script;
|
||||
level.alien_funcs["bomber"]["badpath"] = maps\mp\agents\alien\_alien_think::handle_badpath;
|
||||
load_bomber_fx();
|
||||
}
|
||||
|
||||
load_bomber_fx()
|
||||
{
|
||||
level._effect["alien_bomber_explode"] = loadfx( "vfx/gameplay/alien/vfx_alien_bomber_explode" );
|
||||
}
|
||||
|
||||
blank_script()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bomber_init()
|
||||
{
|
||||
maps\mp\alien\_utility::enable_alien_scripted();
|
||||
self scragentsetscripted( 1 );
|
||||
self scragentsetgoalradius( 20000.0 );
|
||||
var_0 = ( 0, 0, -100 );
|
||||
var_1 = ( 0, 0, -3000 );
|
||||
var_2 = bullettrace( self.origin + var_0, self.origin + var_1, 0 );
|
||||
self.ground_origin = var_2["position"];
|
||||
self.pain_registered = 1;
|
||||
self setthreatbiasgroup( "dontattackdrill" );
|
||||
self playsound( "divebomber_spawn_sfx" );
|
||||
thread bomber_idle_vo();
|
||||
thread bomber_think();
|
||||
}
|
||||
|
||||
bomber_think()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "game_ended" );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
thread animate_ceiling_idle();
|
||||
wait_for_divebomb();
|
||||
var_0 = wait_for_enemy_before_attack();
|
||||
self.divebomborigin = get_divebomb_origin( var_0 );
|
||||
bomber_attack( "divebomb", var_0 );
|
||||
|
||||
if ( !maps\mp\_utility::isreallyalive( var_0 ) )
|
||||
var_0 = acquire_enemy_before_charge();
|
||||
|
||||
bomber_attack( "kamikaze", var_0 );
|
||||
}
|
||||
|
||||
wait_for_divebomb()
|
||||
{
|
||||
var_0 = 0.3;
|
||||
wait( randomfloatrange( 1.0 - var_0, 1.0 + var_0 ) );
|
||||
}
|
||||
|
||||
get_divebomb_origin( var_0 )
|
||||
{
|
||||
var_1 = getnodesinradius( var_0.origin, 1024.0, 256.0, 2000, "jump" );
|
||||
var_1 = get_flyable_nodes( var_1 );
|
||||
var_2 = get_divebomb_node_rated( var_0, var_1 );
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
return var_2.origin + ( 0, 0, 256 );
|
||||
|
||||
return level.players[0].origin + ( 0, 0, 256 );
|
||||
}
|
||||
|
||||
get_flyable_nodes( var_0 )
|
||||
{
|
||||
var_1 = [];
|
||||
|
||||
foreach ( var_3 in var_0 )
|
||||
{
|
||||
if ( isdefined( var_3.script_noteworthy ) && var_3.script_noteworthy == "flyable" )
|
||||
var_1[var_1.size] = var_3;
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
get_divebomb_node_rated( var_0, var_1 )
|
||||
{
|
||||
var_2 = [];
|
||||
var_2["direction"] = "player_front";
|
||||
var_2["direction_weight"] = 1.5;
|
||||
var_2["min_height"] = 64.0;
|
||||
var_2["max_height"] = 256.0;
|
||||
var_2["height_weight"] = 2.0;
|
||||
var_2["enemy_los"] = 1;
|
||||
var_2["enemy_los_weight"] = 4.0;
|
||||
var_2["min_dist_from_enemy"] = 400.0;
|
||||
var_2["max_dist_from_enemy"] = 1000.0;
|
||||
var_2["desired_dist_from_enemy"] = 600.0;
|
||||
var_2["dist_from_enemy_weight"] = 2.0;
|
||||
var_2["min_dist_from_all_enemies"] = 200.0;
|
||||
var_2["min_dist_from_all_enemies_weight"] = 1.0;
|
||||
var_2["not_recently_used_weight"] = 4.0;
|
||||
var_2["random_weight"] = 1.0;
|
||||
var_2["test_offset"] = ( 0, 0, 256 );
|
||||
return maps\mp\agents\alien\_alien_think::get_retreat_node_rated( var_0, var_2, var_1 );
|
||||
}
|
||||
|
||||
wait_for_enemy_before_attack()
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 = undefined;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_1 = maps\mp\alien\_utility::get_closest_living_player();
|
||||
var_2 = get_closest_living_vanguard();
|
||||
|
||||
if ( isdefined( var_1 ) && !player_controlling_vanguard( var_1, var_2 ) )
|
||||
return var_1;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
return var_2;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
player_controlling_vanguard( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_1 ) || !isdefined( var_1.owner ) )
|
||||
return 0;
|
||||
|
||||
return var_1.owner == var_0;
|
||||
}
|
||||
|
||||
get_closest_living_vanguard()
|
||||
{
|
||||
if ( isdefined( level.alien_vanguard ) )
|
||||
return level.alien_vanguard;
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
acquire_enemy_before_charge()
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
return self.enemy;
|
||||
|
||||
return wait_for_enemy_before_attack();
|
||||
}
|
||||
|
||||
bomber_attack( var_0, var_1 )
|
||||
{
|
||||
self.melee_type = var_0;
|
||||
level notify( "dlc_vo_notify", "bomber_attack", self );
|
||||
self notify( var_0 );
|
||||
self scragentbeginmelee( var_1 );
|
||||
self scragentsetgoalentity( var_1 );
|
||||
self scragentsetgoalradius( 20000.0 );
|
||||
self waittill( "melee_complete" );
|
||||
}
|
||||
|
||||
divebomb( var_0 )
|
||||
{
|
||||
var_1 = self.origin;
|
||||
var_2 = self.divebomborigin;
|
||||
var_3 = distance( var_1, var_2 );
|
||||
var_4 = vectortoangles( var_2 - var_1 );
|
||||
self scragentsetorientmode( "face angle abs", var_4 );
|
||||
var_5 = self getanimentry( "fly", 0 );
|
||||
var_6 = self getanimentry( "glide", 0 );
|
||||
var_7 = self getanimentry( "glide", 2 );
|
||||
var_8 = self getanimentry( "fly", 2 );
|
||||
var_9 = length( getmovedelta( var_5 ) );
|
||||
var_10 = length( getmovedelta( var_6 ) );
|
||||
var_11 = length( getmovedelta( var_7 ) );
|
||||
var_12 = length( getmovedelta( var_8 ) );
|
||||
var_13 = getanimlength( var_5 ) / 1.0;
|
||||
var_14 = getanimlength( var_6 ) / 1.0;
|
||||
var_15 = getanimlength( var_7 ) / 1.0;
|
||||
var_16 = getanimlength( var_8 ) / 1.0;
|
||||
|
||||
if ( var_3 > var_9 + var_10 + var_11 + var_12 )
|
||||
{
|
||||
self setanimstate( "fly", 0, 1.0 );
|
||||
wait( var_13 );
|
||||
var_3 = distance( self.origin, var_2 );
|
||||
}
|
||||
|
||||
if ( var_3 > var_10 + var_11 + var_12 )
|
||||
{
|
||||
self setanimstate( "glide", 0, 1.0 );
|
||||
wait( var_14 );
|
||||
var_3 = distance( self.origin, var_2 );
|
||||
}
|
||||
|
||||
if ( var_3 > var_11 + var_12 )
|
||||
{
|
||||
self setanimstate( "glide", 1, 1.0 );
|
||||
var_17 = var_11 + var_12;
|
||||
var_17 = var_17 * var_17;
|
||||
|
||||
while ( distancesquared( self.origin, var_2 ) > var_17 )
|
||||
wait 0.05;
|
||||
|
||||
var_3 = var_11 + var_12;
|
||||
}
|
||||
|
||||
if ( var_3 >= var_11 + var_12 )
|
||||
{
|
||||
self setanimstate( "glide", 2, 1.0 );
|
||||
wait( var_15 );
|
||||
var_3 = distance( self.origin, var_2 );
|
||||
}
|
||||
|
||||
self setanimstate( "fly", 2, 1.0 );
|
||||
wait( var_16 );
|
||||
self scragentsetorientmode( "face enemy" );
|
||||
self setanimstate( "idle_fly" );
|
||||
var_18 = 0.3;
|
||||
wait( randomfloatrange( 1.0 - var_18, 1.0 + var_18 ) );
|
||||
}
|
||||
|
||||
kamikaze( var_0 )
|
||||
{
|
||||
thread track_enemy( var_0 );
|
||||
var_1 = distance( self.origin, var_0.origin );
|
||||
var_2 = getanimlength( self getanimentry( "fly", 0 ) ) / 1.0;
|
||||
var_3 = getanimlength( self getanimentry( "glide", 0 ) ) / 1.0;
|
||||
self setanimstate( "fly", 0, 1.0 );
|
||||
wait( var_2 );
|
||||
self playsound( "divebomber_atk_sfx" );
|
||||
self setanimstate( "glide", 0, 1.0 );
|
||||
wait( var_3 );
|
||||
self setanimstate( "glide", 1 );
|
||||
wait 5.0;
|
||||
self suicide();
|
||||
}
|
||||
|
||||
track_enemy( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 endon( "death" );
|
||||
var_1 = 25.0;
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
var_2 = self.origin;
|
||||
var_3 = var_0.origin + ( 0, 0, 30 );
|
||||
var_4 = distancesquared( var_2, var_3 );
|
||||
|
||||
if ( var_4 < 576.0 )
|
||||
{
|
||||
self suicide();
|
||||
return;
|
||||
}
|
||||
|
||||
var_5 = vectornormalize( var_3 - var_2 );
|
||||
var_6 = vectortoangles( var_5 );
|
||||
var_7 = bullettrace( var_2, var_2 + var_1 * var_5, 1, self );
|
||||
|
||||
if ( var_7["fraction"] < 1.0 )
|
||||
{
|
||||
self suicide();
|
||||
return;
|
||||
}
|
||||
|
||||
self scragentsetorientmode( "face angle abs", var_6 );
|
||||
}
|
||||
}
|
||||
|
||||
bomber_animate()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
switch ( self.bomberanimstate )
|
||||
{
|
||||
case "ceiling_idle":
|
||||
thread animate_ceiling_idle();
|
||||
break;
|
||||
case "float_idle":
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
animate_ceiling_idle()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "divebomb" );
|
||||
self setanimstate( "idle", 0 );
|
||||
}
|
||||
|
||||
bomber_idle_vo()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait( randomfloatrange( 2, 5 ) );
|
||||
self playsound( "divebomber_idle_sfx" );
|
||||
}
|
||||
}
|
||||
|
||||
bomber_death( var_0 )
|
||||
{
|
||||
wait 0.05;
|
||||
playfx( level._effect["alien_bomber_explode"], var_0 + ( 0, 0, 32 ) );
|
||||
playsoundatpos( var_0, "alien_bomber_explode" );
|
||||
radiusdamage( var_0, 150, level.alien_types["bomber"].attributes["explode_max_damage"], level.alien_types["minion"].attributes["explode_min_damage"], undefined, "MOD_EXPLOSIVE", "alien_minion_explosion" );
|
||||
}
|
552
maps/mp/agents/alien/_alien_elite.gsc
Normal file
552
maps/mp/agents/alien/_alien_elite.gsc
Normal file
@ -0,0 +1,552 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
elite_approach( var_0, var_1 )
|
||||
{
|
||||
if ( distancesquared( var_0.origin, self.origin ) > 250000 )
|
||||
maps\mp\agents\alien\_alien_think::run_near_enemy( 500, var_0 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( can_do_charge_attack( var_0 ) )
|
||||
return "charge";
|
||||
else if ( run_to_slam( var_0 ) )
|
||||
return "slam";
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
run_to_slam( var_0 )
|
||||
{
|
||||
thread monitor_charge_range( var_0 );
|
||||
thread run_to_enemy( var_0 );
|
||||
var_1 = common_scripts\utility::waittill_any_return( "run_to_slam_complete", "in_charge_range", "enemy", "bad_path" );
|
||||
|
||||
if ( !self agentcanseesentient( var_0 ) )
|
||||
return 0;
|
||||
|
||||
return var_1 == "run_to_slam_complete";
|
||||
}
|
||||
|
||||
run_to_enemy( var_0 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
self endon( "enemy" );
|
||||
self endon( "bad_path" );
|
||||
var_1 = gettime();
|
||||
maps\mp\agents\alien\_alien_think::run_near_enemy( 175, var_0 );
|
||||
|
||||
if ( var_1 == gettime() )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "run_to_slam_complete" );
|
||||
}
|
||||
|
||||
monitor_charge_range( var_0 )
|
||||
{
|
||||
self endon( "goal_reached" );
|
||||
var_0 endon( "death" );
|
||||
self endon( "enemy" );
|
||||
self endon( "bad_path" );
|
||||
var_1 = 122500;
|
||||
wait 0.05;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( distancesquared( self.origin, var_0.origin ) >= var_1 )
|
||||
break;
|
||||
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
self notify( "in_charge_range" );
|
||||
}
|
||||
|
||||
can_do_charge_attack( var_0 )
|
||||
{
|
||||
if ( gettime() < self.last_charge_time + 12000 )
|
||||
return 0;
|
||||
|
||||
if ( distancesquared( self.origin, var_0.origin ) < 122500 )
|
||||
return 0;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_0.origin ) )
|
||||
return 0;
|
||||
|
||||
return maps\mp\alien\_utility::is_normal_upright( anglestoup( self.angles ) );
|
||||
}
|
||||
|
||||
ground_slam( var_0 )
|
||||
{
|
||||
self.melee_type = "slam";
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
do_ground_slam( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
|
||||
self scragentsetorientmode( "face enemy" );
|
||||
maps\mp\agents\alien\_alien_melee::try_preliminary_swipes( "swipe", var_0, 125, 175 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_melee_swipe", 2, "attack_melee", "alien_slam_big" );
|
||||
var_1 = level.alien_types[self.alien_type].attributes["slam_min_damage"];
|
||||
var_2 = level.alien_types[self.alien_type].attributes["slam_max_damage"];
|
||||
|
||||
if ( isdefined( self.elite_angered ) )
|
||||
{
|
||||
var_1 = var_1 * get_angered_damage_scalar();
|
||||
var_2 = var_2 * get_angered_damage_scalar();
|
||||
}
|
||||
|
||||
area_damage_and_impulse( 250, var_1, var_2, 800 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "attack_melee", "end" );
|
||||
|
||||
if ( !isdefined( self.elite_angered ) )
|
||||
var_3 = maps\mp\agents\alien\_alien_melee::move_back( var_0, 1 );
|
||||
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
}
|
||||
|
||||
charge_attack( var_0 )
|
||||
{
|
||||
if ( var_0 being_charged() )
|
||||
{
|
||||
wait 0.2;
|
||||
return;
|
||||
}
|
||||
|
||||
self.melee_type = "charge";
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
var_0.being_charged = 0;
|
||||
}
|
||||
|
||||
angered( var_0 )
|
||||
{
|
||||
self.melee_type = "angered";
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
do_charge_attack( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0.being_charged = 1;
|
||||
self.last_charge_time = gettime();
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self scragentsetorientmode( "face enemy" );
|
||||
var_1 = get_charge_start_index();
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( "charge_attack_start", var_1, 1.15, "charge_attack_start", "end", ::chargestartnotetrackhandler );
|
||||
|
||||
if ( isalive( var_0 ) && can_see_enemy( var_0 ) )
|
||||
{
|
||||
thread track_enemy( var_0 );
|
||||
self setanimstate( "charge_attack", var_1, 1.0 );
|
||||
var_2 = watch_charge_hit( var_0, var_1 );
|
||||
self notify( "charge_complete" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = "fail";
|
||||
|
||||
switch ( var_2 )
|
||||
{
|
||||
case "success":
|
||||
maps\mp\agents\_scriptedagents::safelyplayanimnatrateuntilnotetrack( "charge_attack_bump", var_1, 1.0, "charge_attack_bump", "end", ::chargeendnotetrackhandler );
|
||||
break;
|
||||
case "fail":
|
||||
play_stop_anim( var_1 );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
self scragentsetanimmode( "code_move" );
|
||||
}
|
||||
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
}
|
||||
|
||||
can_see_enemy( var_0 )
|
||||
{
|
||||
return sighttracepassed( self geteye(), var_0 geteye(), 0, self );
|
||||
}
|
||||
|
||||
track_enemy( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "charge_complete" );
|
||||
var_1 = 105625;
|
||||
self.charge_tracking_enemy = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( distancesquared( self.origin, var_0.origin ) < var_1 )
|
||||
break;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.charge_tracking_enemy = 0;
|
||||
}
|
||||
|
||||
play_stop_anim( var_0 )
|
||||
{
|
||||
var_1 = 120;
|
||||
|
||||
if ( hit_geo( var_1 ) )
|
||||
go_hit_geo();
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::safelyplayanimnatrateuntilnotetrack( "charge_attack_stop", var_0, 1.0, "charge_attack_stop", "end", ::chargeendnotetrackhandler );
|
||||
}
|
||||
|
||||
go_hit_geo()
|
||||
{
|
||||
var_0 = get_hit_geo_index();
|
||||
var_1 = self getanimentry( "charge_hit_geo", var_0 );
|
||||
var_2 = getnotetracktimes( var_1, "forward_end" );
|
||||
var_3 = length( getmovedelta( var_1, 0.0, var_2[0] ) );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( hit_geo( var_3 ) )
|
||||
break;
|
||||
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
|
||||
maps\mp\agents\_scriptedagents::safelyplayanimnatrateuntilnotetrack( "charge_hit_geo", var_0, 1.0, "charge_hit_geo", "end", ::chargeendnotetrackhandler );
|
||||
}
|
||||
|
||||
watch_charge_hit( var_0, var_1 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 endon( "death" );
|
||||
var_2 = 3.0;
|
||||
var_3 = 6.0;
|
||||
var_4 = 0.05;
|
||||
var_5 = self getanimentry( "charge_attack_stop", var_1 );
|
||||
var_6 = int( randomfloatrange( var_2, var_3 ) / var_4 );
|
||||
var_7 = length( getmovedelta( var_5 ) );
|
||||
var_8 = getanimlength( var_5 );
|
||||
var_9 = var_7 / var_8 * var_4 * 3;
|
||||
|
||||
for ( var_10 = 0; var_10 < var_6; var_10++ )
|
||||
{
|
||||
if ( hit_player() )
|
||||
return "success";
|
||||
|
||||
if ( self.charge_tracking_enemy )
|
||||
var_11 = distance( var_0.origin, self.origin );
|
||||
else
|
||||
var_11 = var_9;
|
||||
|
||||
if ( hit_geo( var_11 ) )
|
||||
return "fail";
|
||||
|
||||
if ( !self.charge_tracking_enemy && missed_enemy( var_0 ) )
|
||||
return "fail";
|
||||
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
|
||||
return "fail";
|
||||
}
|
||||
|
||||
hit_player()
|
||||
{
|
||||
var_0 = 140;
|
||||
|
||||
foreach ( var_2 in level.players )
|
||||
{
|
||||
if ( distancesquared( self.origin, var_2.origin ) < var_0 * var_0 && might_hit_enemy( var_2 ) )
|
||||
{
|
||||
maps\mp\agents\alien\_alien_melee::melee_dodamage( var_2, "charge" );
|
||||
var_2 player_fly_back( 1200, vectornormalize( var_2.origin - self.origin ) );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
hit_geo( var_0 )
|
||||
{
|
||||
var_1 = 18.0;
|
||||
var_2 = 0.866;
|
||||
var_3 = self.origin + ( 0, 0, var_1 );
|
||||
var_4 = var_3 + anglestoforward( self.angles ) * var_0;
|
||||
var_5 = self aiphysicstrace( var_3, var_4, self.radius, self.height - var_1, 1, 1 );
|
||||
return var_5["fraction"] < 1.0 && var_5["normal"][2] < var_2;
|
||||
}
|
||||
|
||||
player_fly_back( var_0, var_1 )
|
||||
{
|
||||
var_2 = 600.0;
|
||||
var_3 = self getvelocity();
|
||||
var_4 = var_1 * var_0;
|
||||
var_5 = ( var_3 + var_4 ) * ( 1, 1, 0 );
|
||||
var_6 = length( var_5 );
|
||||
|
||||
if ( var_6 >= 400.0 )
|
||||
var_5 = vectornormalize( var_5 ) * 400.0;
|
||||
|
||||
self setvelocity( var_5 );
|
||||
}
|
||||
|
||||
might_hit_enemy( var_0 )
|
||||
{
|
||||
var_1 = 0.866;
|
||||
var_2 = can_see_enemy( var_0 );
|
||||
var_3 = vectornormalize( var_0.origin - self.origin );
|
||||
var_4 = anglestoforward( self.angles );
|
||||
var_5 = vectordot( var_3, var_4 ) > var_1;
|
||||
return var_2 && var_5;
|
||||
}
|
||||
|
||||
missed_enemy( var_0 )
|
||||
{
|
||||
var_1 = -256;
|
||||
var_2 = can_see_enemy( var_0 );
|
||||
|
||||
if ( !var_2 )
|
||||
return 1;
|
||||
|
||||
var_3 = var_0.origin - self.origin;
|
||||
var_4 = anglestoforward( self.angles );
|
||||
var_5 = vectordot( var_3, var_4 );
|
||||
|
||||
if ( var_5 > 0 )
|
||||
return 0;
|
||||
|
||||
return var_5 < var_1;
|
||||
}
|
||||
|
||||
being_charged()
|
||||
{
|
||||
return isdefined( self.being_charged ) && self.being_charged;
|
||||
}
|
||||
|
||||
get_charge_start_index()
|
||||
{
|
||||
var_0 = [ 40, 30, 30 ];
|
||||
return get_weighted_index( "charge_attack_start", var_0 );
|
||||
}
|
||||
|
||||
get_hit_geo_index()
|
||||
{
|
||||
var_0 = [ 15, 25, 60 ];
|
||||
return get_weighted_index( "charge_hit_geo", var_0 );
|
||||
}
|
||||
|
||||
get_weighted_index( var_0, var_1 )
|
||||
{
|
||||
var_2 = self getanimentrycount( var_0 );
|
||||
return maps\mp\alien\_utility::getrandomindex( var_1 );
|
||||
}
|
||||
|
||||
load_queen_fx()
|
||||
{
|
||||
level._effect["queen_shield_impact"] = loadfx( "fx/impacts/large_metalhit_1" );
|
||||
level._effect["queen_ground_spawn"] = loadfx( "vfx/gameplay/alien/vfx_alien_elite_ground_spawn" );
|
||||
}
|
||||
|
||||
elite_init()
|
||||
{
|
||||
self.next_health_regen_time = gettime();
|
||||
self.last_charge_time = gettime();
|
||||
|
||||
if ( !maps\mp\alien\_utility::isplayingsolo() )
|
||||
{
|
||||
self.elite_angered = 1;
|
||||
self.moveplaybackrate = 1.2;
|
||||
}
|
||||
}
|
||||
|
||||
activate_angered_state()
|
||||
{
|
||||
prepare_to_regenerate();
|
||||
var_0 = 10.0;
|
||||
var_1 = 60000;
|
||||
self.elite_angered = 1;
|
||||
self.moveplaybackrate = 1.2;
|
||||
activate_health_regen_shield();
|
||||
}
|
||||
|
||||
activate_health_regen()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
prepare_to_regenerate();
|
||||
var_0 = 10.0;
|
||||
var_1 = 60000;
|
||||
self.next_health_regen_time = gettime() + var_1;
|
||||
thread play_health_regen_anim();
|
||||
activate_health_regen_shield();
|
||||
thread queen_health_regen( var_0 );
|
||||
common_scripts\utility::waittill_any_timeout( var_0, "stop_queen_health_regen" );
|
||||
disable_health_regen_shield();
|
||||
}
|
||||
|
||||
prepare_to_regenerate()
|
||||
{
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( "prepare_to_regen", 0, 2.0, "prepare_to_regen", "end" );
|
||||
var_0 = level.alien_types[self.alien_type].attributes["explode_min_damage"];
|
||||
var_1 = level.alien_types[self.alien_type].attributes["explode_max_damage"];
|
||||
|
||||
if ( isdefined( self.elite_angered ) )
|
||||
{
|
||||
var_0 = var_0 * get_angered_damage_scalar();
|
||||
var_1 = var_1 * get_angered_damage_scalar();
|
||||
}
|
||||
|
||||
area_damage_and_impulse( 200, var_0, var_1, 800 );
|
||||
}
|
||||
|
||||
play_health_regen_anim()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "stop_queen_health_regen" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
var_0 = "regen";
|
||||
|
||||
for (;;)
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( var_0, var_0, "end" );
|
||||
}
|
||||
|
||||
queen_health_regen( var_0 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
self endon( "stop_queen_health_regen" );
|
||||
var_1 = 1.0;
|
||||
var_2 = int( var_0 / var_1 );
|
||||
var_3 = ( self.maxhealth - self.health ) / 2;
|
||||
var_4 = int( var_3 / var_2 );
|
||||
|
||||
for ( var_5 = 0; var_5 < var_2; var_5++ )
|
||||
{
|
||||
wait( var_1 );
|
||||
self.health = self.health + var_4;
|
||||
}
|
||||
}
|
||||
|
||||
activate_health_regen_shield()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
disable_health_regen_shield()
|
||||
{
|
||||
self setscriptablepartstate( "body", "normal" );
|
||||
}
|
||||
|
||||
clean_up_on_owner_death( var_0 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
var_0 endon( "stop_queen_health_regen" );
|
||||
var_0 waittill( "death" );
|
||||
self delete();
|
||||
}
|
||||
|
||||
deploy_health_regen_shield()
|
||||
{
|
||||
var_0 = spawn( "script_model", self.origin );
|
||||
var_0 setmodel( "alien_shield_bubble_distortion" );
|
||||
var_0 linkto( self, "tag_origin" );
|
||||
var_0 setcandamage( 1 );
|
||||
return var_0;
|
||||
}
|
||||
|
||||
play_shield_impact_fx( var_0, var_1 )
|
||||
{
|
||||
if ( isdefined( var_1 ) )
|
||||
var_2 = var_1 * -1;
|
||||
else
|
||||
var_2 = anglestoforward( self.angles );
|
||||
|
||||
var_3 = anglestoup( vectortoangles( var_2 ) );
|
||||
playfx( level._effect["queen_shield_impact"], var_0, var_2, var_3 );
|
||||
}
|
||||
|
||||
elitedamageprocessing( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
switch ( var_4 )
|
||||
{
|
||||
case "MOD_PROJECTILE_SPLASH":
|
||||
case "MOD_GRENADE_SPLASH":
|
||||
case "MOD_PROJECTILE":
|
||||
case "MOD_GRENADE":
|
||||
case "MOD_EXPLOSIVE":
|
||||
var_2 = var_2 * 0.5;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return var_2;
|
||||
}
|
||||
|
||||
on_jump_impact()
|
||||
{
|
||||
var_0 = 256;
|
||||
var_1 = 30;
|
||||
var_2 = 10;
|
||||
var_3 = anglestoup( self.angles );
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_normal_upright( var_3 ) )
|
||||
return;
|
||||
|
||||
area_damage_and_impulse( var_0, var_2, var_1, 500 );
|
||||
}
|
||||
|
||||
area_damage_and_impulse( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
radiusdamage( self.origin, var_0, var_2, var_1, self, "MOD_EXPLOSIVE", "alienrhinoslam_mp" );
|
||||
var_4 = var_0 * var_0;
|
||||
|
||||
foreach ( var_6 in level.players )
|
||||
{
|
||||
if ( distancesquared( self.origin, var_6.origin ) > var_4 )
|
||||
continue;
|
||||
|
||||
var_7 = vectornormalize( var_6.origin - self.origin );
|
||||
var_6 player_fly_back( var_3, var_7 );
|
||||
}
|
||||
}
|
||||
|
||||
get_angered_damage_scalar()
|
||||
{
|
||||
return 1.25;
|
||||
}
|
||||
|
||||
chargestartnotetrackhandler( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "queen_roll_start":
|
||||
self playloopsound( "queen_roll" );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
chargeendnotetrackhandler( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "queen_roll_stop":
|
||||
self stoploopsound( "queen_roll" );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
1027
maps/mp/agents/alien/_alien_gargoyle.gsc
Normal file
1027
maps/mp/agents/alien/_alien_gargoyle.gsc
Normal file
File diff suppressed because it is too large
Load Diff
89
maps/mp/agents/alien/_alien_human.gsc
Normal file
89
maps/mp/agents/alien/_alien_human.gsc
Normal file
@ -0,0 +1,89 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
inithuman( var_0 )
|
||||
{
|
||||
level.agent_funcs["alienHuman"] = [];
|
||||
level.agent_funcs["alienHuman"]["spawn"] = ::alienhumanspawn;
|
||||
level.agent_funcs["alienHuman"]["on_killed"] = ::alienhumankilled;
|
||||
level.agent_funcs["alienHuman"]["on_damaged"] = ::alienhumandamaged;
|
||||
level.agent_funcs["alienHuman"]["on_damaged_finished"] = ::alienhumandamagefinished;
|
||||
level.human_agent_anim_class = var_0;
|
||||
}
|
||||
|
||||
alienhumanspawn( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = maps\mp\agents\_agent_common::connectnewagent( "alienHuman", "allies" );
|
||||
|
||||
if ( !isdefined( var_0 ) || !isdefined( var_1 ) )
|
||||
{
|
||||
var_6 = var_5 [[ level.getspawnpoint ]]();
|
||||
var_0 = var_6.origin;
|
||||
var_1 = var_6.angles;
|
||||
}
|
||||
|
||||
var_5 setmodel( var_2 );
|
||||
var_5 show();
|
||||
var_5 spawnagent( var_0, var_1, level.human_agent_anim_class );
|
||||
var_5 scragentsetphysicsmode( "noclip" );
|
||||
var_5 attach( var_3, "J_spine4" );
|
||||
var_5.moveplaybackrate = 1.0;
|
||||
var_5.defaultmoveplaybackrate = 1.0;
|
||||
var_5.xyanimscale = 1.0;
|
||||
var_5 maps\mp\agents\_agent_utility::activateagent();
|
||||
var_5.spawntime = gettime();
|
||||
var_5.spawn_origin = var_0;
|
||||
var_5 scragentsetclipmode( "agent" );
|
||||
var_5.maxhealth = 100;
|
||||
var_5.health = 100;
|
||||
var_5.ignoreme = !isdefined( var_4 ) || !var_4;
|
||||
return var_5;
|
||||
}
|
||||
|
||||
checklocation()
|
||||
{
|
||||
var_0 = self.origin;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_1 = self.origin;
|
||||
var_2 = undefined;
|
||||
var_3 = 0.0;
|
||||
|
||||
if ( isdefined( self.startanimtime ) && length( var_1 - var_0 ) > 0.1 )
|
||||
{
|
||||
var_2 = self getanimentryname();
|
||||
var_3 = ( gettime() - self.startanimtime ) / 1000.0;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
var_0 = var_1;
|
||||
}
|
||||
}
|
||||
|
||||
playanimation( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self.startanimtime = gettime();
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
var_2 = "end";
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_1, var_0, var_2, var_3 );
|
||||
}
|
||||
|
||||
alienhumandamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
return self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
|
||||
alienhumandamagefinished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
self finishagentdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, 0.0, 0 );
|
||||
}
|
||||
|
||||
alienhumankilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
|
||||
}
|
193
maps/mp/agents/alien/_alien_idle.gsc
Normal file
193
maps/mp/agents/alien/_alien_idle.gsc
Normal file
@ -0,0 +1,193 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
init_alien_idle();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( self.attractor_flare ) )
|
||||
{
|
||||
play_attractor_idle();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( self.enemy_downed ) && self.enemy_downed )
|
||||
{
|
||||
play_enemy_downed_idle();
|
||||
|
||||
if ( level.gameended )
|
||||
self.enemy_downed = 0;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
play_idle();
|
||||
}
|
||||
}
|
||||
|
||||
init_alien_idle()
|
||||
{
|
||||
self.idle_anim_counter = 0;
|
||||
self.consecutive_posture_counter = 0;
|
||||
|
||||
if ( isdefined( self.xyanimscale ) )
|
||||
self scragentsetanimscale( self.xyanimscale, 1.0 );
|
||||
|
||||
if ( isdefined( self.idle_state_locked ) && self.idle_state_locked )
|
||||
self.statelocked = 1;
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self.previousanimstate = "idle";
|
||||
|
||||
if ( isdefined( self.idle_state_locked ) && self.idle_state_locked )
|
||||
{
|
||||
self.statelocked = 0;
|
||||
self.idle_state_locked = 0;
|
||||
}
|
||||
}
|
||||
|
||||
play_enemy_downed_idle()
|
||||
{
|
||||
facetarget();
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( "posture", "posture", "end" );
|
||||
}
|
||||
|
||||
play_attractor_idle()
|
||||
{
|
||||
var_0 = vectortoangles( self.attractor_flare.origin - self.origin );
|
||||
var_0 = ( self.angles[0], var_0[1], self.angles[2] );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", var_0 );
|
||||
var_1 = maps\mp\agents\_scriptedagents::getrandomanimentry( "idle_flare" );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "idle_flare", var_1, "idle_flare", "end" );
|
||||
}
|
||||
|
||||
play_idle()
|
||||
{
|
||||
facetarget();
|
||||
var_0 = selectidleanimstate();
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, undefined, var_0, "end" );
|
||||
}
|
||||
|
||||
selectidleanimstate()
|
||||
{
|
||||
if ( isdefined( level.dlc_idle_anim_state_override_func ) )
|
||||
{
|
||||
var_0 = self [[ level.dlc_idle_anim_state_override_func ]]( self.enemy );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
return var_0;
|
||||
}
|
||||
|
||||
if ( isalive( self.enemy ) )
|
||||
{
|
||||
if ( common_scripts\utility::cointoss() && self.consecutive_posture_counter < 2 )
|
||||
{
|
||||
self.consecutive_posture_counter++;
|
||||
return "idle_posture";
|
||||
}
|
||||
}
|
||||
|
||||
self.consecutive_posture_counter = 0;
|
||||
|
||||
if ( self.idle_anim_counter < 2 + randomintrange( 0, 1 ) )
|
||||
{
|
||||
var_1 = "idle_default";
|
||||
self.idle_anim_counter = self.idle_anim_counter + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1 = "idle";
|
||||
self.idle_anim_counter = 0;
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
facetarget()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
if ( isalive( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < 2560000 )
|
||||
var_0 = self.enemy;
|
||||
else if ( isdefined( self.owner ) )
|
||||
var_0 = self.owner;
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( isdefined( level.dlc_can_do_pain_override_func ) )
|
||||
{
|
||||
var_10 = [[ level.dlc_can_do_pain_override_func ]]( "idle" );
|
||||
|
||||
if ( !var_10 )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( maps\mp\alien\_utility::is_pain_available( var_1, var_4 ) )
|
||||
dopain( var_3, var_7, var_8, var_2, var_4 );
|
||||
}
|
||||
|
||||
dopain( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
var_5 = var_0 & level.idflags_stun;
|
||||
|
||||
if ( var_4 == "MOD_MELEE" || var_5 )
|
||||
{
|
||||
var_6 = "pain_pushback";
|
||||
var_7 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "push_back", var_1 );
|
||||
var_8 = "pain_pushback";
|
||||
}
|
||||
else
|
||||
{
|
||||
var_9 = getbasepainanimstate();
|
||||
var_6 = maps\mp\agents\alien\_alien_anim_utils::getpainanimstate( var_9, var_3, var_5 );
|
||||
var_7 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "idle", var_1, var_2 );
|
||||
var_8 = "idle_pain";
|
||||
}
|
||||
|
||||
var_10 = self getanimentry( var_6, var_7 );
|
||||
maps\mp\alien\_utility::always_play_pain_sound( var_10 );
|
||||
maps\mp\alien\_utility::register_pain( var_10 );
|
||||
self.statelocked = 1;
|
||||
|
||||
if ( isdefined( self.oriented ) && self.oriented )
|
||||
self scragentsetanimmode( "code_move" );
|
||||
else
|
||||
{
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
}
|
||||
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_6, var_7, var_8 );
|
||||
|
||||
if ( !isdefined( self.idle_state_locked ) || !self.idle_state_locked )
|
||||
self.statelocked = 0;
|
||||
|
||||
self setanimstate( "idle" );
|
||||
}
|
||||
|
||||
getbasepainanimstate()
|
||||
{
|
||||
if ( isdefined( level.dlc_alien_pain_anim_state_override_func ) )
|
||||
{
|
||||
var_0 = [[ level.dlc_alien_pain_anim_state_override_func ]]( "idle" );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
return var_0;
|
||||
}
|
||||
|
||||
return "idle_pain";
|
||||
}
|
532
maps/mp/agents/alien/_alien_jump.gsc
Normal file
532
maps/mp/agents/alien/_alien_jump.gsc
Normal file
@ -0,0 +1,532 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
jump( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
||||
{
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_2 - var_0 );
|
||||
var_7 = self scragentgetmaxturnspeed();
|
||||
thread jumpinternal( var_0, var_1, var_2, var_3, var_4, var_5, var_6 );
|
||||
self waittill( "jump_finished" );
|
||||
jumpcleanup( var_7, var_3 );
|
||||
}
|
||||
|
||||
jumpcleanup( var_0, var_1 )
|
||||
{
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
self scragentsetmaxturnspeed( var_0 );
|
||||
|
||||
if ( maps\mp\alien\_utility::is_normal_upright( anglestoup( var_1 ) ) )
|
||||
{
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self.oriented = 0;
|
||||
self.ignoreme = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self.oriented = 1;
|
||||
self.ignoreme = 1;
|
||||
}
|
||||
}
|
||||
|
||||
jumpinternal( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_2 - var_0 );
|
||||
|
||||
if ( isdefined( var_6 ) )
|
||||
maps\mp\agents\alien\_alien_anim_utils::resetscriptable( var_6, var_2 );
|
||||
|
||||
self.trajectoryactive = 0;
|
||||
var_7 = spawnstruct();
|
||||
var_8 = getjumpinfo( var_0, var_1, var_2, var_3, var_4 );
|
||||
getjumpanimstates( var_8, var_7 );
|
||||
|
||||
if ( isdefined( var_5 ) && isdefined( var_5.fnsetanimstates ) )
|
||||
self [[ var_5.fnsetanimstates ]]( var_8, var_7 );
|
||||
|
||||
var_9 = getjumpstartangles( var_0, var_1, var_2 );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetorientmode( "face angle abs", var_9 );
|
||||
var_10 = 0;
|
||||
var_11 = self getanimentry( var_7.launchanimstate, var_7.launchanimentry );
|
||||
var_12 = self getanimentry( var_7.landanimstate, var_7.landanimentry );
|
||||
var_13 = getnotetracktimes( var_12, "finish" );
|
||||
|
||||
if ( var_13.size > 0 )
|
||||
var_14 = var_13[0] * getanimlength( var_12 );
|
||||
else
|
||||
var_14 = getanimlength( var_12 );
|
||||
|
||||
var_15 = var_14 / var_7.playbackrate;
|
||||
var_16 = floor( var_15 * 20.0 );
|
||||
var_17 = var_16 / 20.0 / var_15;
|
||||
var_18 = getnotetracktimes( var_12, "stop_teleport" );
|
||||
|
||||
if ( var_18.size > 0 )
|
||||
{
|
||||
var_19 = var_18[0] * var_15;
|
||||
var_20 = ceil( var_19 * 20.0 );
|
||||
var_21 = var_20 / 20.0 / var_15;
|
||||
var_22 = getmovedelta( var_12, var_21, var_17 );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_19 = 0.8 * var_15;
|
||||
var_20 = ceil( var_19 * 20.0 );
|
||||
var_21 = var_20 / 20.0 / var_15;
|
||||
var_22 = getmovedelta( var_12, var_21, var_17 );
|
||||
}
|
||||
|
||||
var_3 = getjumpendangles( var_0, var_2, var_3 );
|
||||
var_23 = rotatevector( var_22, var_3 );
|
||||
var_24 = var_2 - var_23;
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self playsoundonmovingent( get_jump_sfx_alias() );
|
||||
|
||||
if ( animhasnotetrack( var_11, "start_teleport" ) )
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_7.launchanimstate, var_7.launchanimentry, var_7.playbackrate, "jump_launch", "start_teleport" );
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnatratefortime( var_7.launchanimstate, var_7.launchanimentry, var_7.playabackrate, 0.5 * getanimlength( var_11 ) / var_7.playbackrate );
|
||||
|
||||
var_25 = gettime();
|
||||
var_10 = self scragentdotrajectory( self.origin, var_24, var_8.jumpspeed2d );
|
||||
self.trajectoryactive = 1;
|
||||
self endon( "jump_pain_interrupt" );
|
||||
thread jumppain( var_10, var_2 );
|
||||
self notify( "jump_launching" );
|
||||
var_26 = self scragentgetmaxturnspeed();
|
||||
thread jumporient( var_8, var_3, var_26, var_10 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "jump_launch", "end" );
|
||||
var_27 = ( gettime() - var_25 ) / 1000;
|
||||
var_28 = var_10 - var_27 - var_19;
|
||||
|
||||
if ( var_28 > 0 )
|
||||
maps\mp\agents\_scriptedagents::playanimnatratefortime( var_7.inairanimstate, var_7.inairanimentry, var_7.playbackrate, var_28 );
|
||||
|
||||
if ( isdefined( var_5 ) && isdefined( var_5.fnlandanimstatechoice ) )
|
||||
self [[ var_5.fnlandanimstatechoice ]]( var_8, var_7 );
|
||||
|
||||
self setanimstate( var_7.landanimstate, var_7.landanimentry, var_7.playbackrate );
|
||||
self waittill( "traverse_complete" );
|
||||
self.trajectoryactive = 0;
|
||||
|
||||
if ( isdefined( var_6 ) )
|
||||
maps\mp\agents\alien\_alien_anim_utils::playanimonscriptable( var_6, var_2 );
|
||||
|
||||
self scragentsetanimscale( 1.0, 0.0 );
|
||||
self scragentsetmaxturnspeed( 20.2832 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", var_3 );
|
||||
thread waitforlandimpact( "jump_land" );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "jump_land", "end" );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
self setorigin( var_2, 0 );
|
||||
self notify( "jump_finished" );
|
||||
}
|
||||
|
||||
waitforlandimpact( var_0 )
|
||||
{
|
||||
var_1 = maps\mp\alien\_utility::get_alien_type();
|
||||
|
||||
switch ( var_1 )
|
||||
{
|
||||
case "elite":
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( var_0, "jump_land_impact" );
|
||||
maps\mp\agents\alien\_alien_elite::on_jump_impact();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
jumporient( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_4 = ( 0, 0, 1 );
|
||||
var_5 = 0.85;
|
||||
var_6 = maps\mp\alien\_utility::is_normal_upright( var_0.startupvector );
|
||||
var_7 = maps\mp\alien\_utility::is_normal_upright( var_0.endupvector );
|
||||
|
||||
if ( var_6 && !var_7 )
|
||||
{
|
||||
var_8 = 0.5;
|
||||
var_9 = 1.0;
|
||||
}
|
||||
else if ( !var_6 && var_7 )
|
||||
{
|
||||
var_8 = 0.0;
|
||||
var_9 = 0.5;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_8 = 0.0;
|
||||
var_9 = 1.0;
|
||||
}
|
||||
|
||||
var_10 = var_9 - var_8;
|
||||
|
||||
if ( var_8 > 0 )
|
||||
wait( var_3 * var_8 );
|
||||
|
||||
var_11 = 1.0;
|
||||
|
||||
if ( distancesquared( self.angles, var_1 ) > var_11 )
|
||||
{
|
||||
var_12 = anglesdelta( self.angles, var_1 );
|
||||
var_13 = var_12 / ( var_3 * var_10 );
|
||||
var_13 = var_13 * 3.14159 / 180.0;
|
||||
var_13 = var_13 / 20;
|
||||
self scragentsetmaxturnspeed( var_13 );
|
||||
}
|
||||
|
||||
self scragentsetorientmode( "face angle abs", var_1 );
|
||||
}
|
||||
|
||||
getjumpinfo( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = spawnstruct();
|
||||
var_6 = var_2 - var_0;
|
||||
var_7 = var_6 * ( 1, 1, 0 );
|
||||
var_7 = vectornormalize( var_7 );
|
||||
var_5.launchorigin = var_0 + var_7 * level.alienanimdata.jumplaunchgrounddelta;
|
||||
var_5.landorigin = var_2;
|
||||
var_5.jumpvector = var_5.landorigin - var_5.launchorigin;
|
||||
var_5.jumpvector2d = var_5.jumpvector * ( 1, 1, 0 );
|
||||
var_5.jumpdistance2d = length( var_5.jumpvector2d );
|
||||
var_5.jumpdirection2d = var_5.jumpvector2d / var_5.jumpdistance2d;
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
var_5.landvector = var_4 - var_2;
|
||||
else if ( isdefined( self.enemy ) )
|
||||
var_5.landvector = self.enemy.origin - var_2;
|
||||
else
|
||||
var_5.landvector = anglestoforward( self.angles );
|
||||
|
||||
var_5.startangles = getjumpangles( var_5.jumpvector, anglestoup( var_1 ) );
|
||||
var_5.endangles = getjumpangles( var_5.jumpvector, anglestoup( var_3 ) );
|
||||
var_5.startupvector = anglestoup( var_5.startangles );
|
||||
var_5.endupvector = anglestoup( var_5.endangles );
|
||||
getjumpvelocity( var_5 );
|
||||
return var_5;
|
||||
}
|
||||
|
||||
getjumpangles( var_0, var_1 )
|
||||
{
|
||||
var_2 = maps\mp\agents\alien\_alien_anim_utils::projectvectortoplane( var_0, var_1 );
|
||||
var_3 = vectorcross( var_2, var_1 );
|
||||
var_4 = axistoangles( var_2, var_3, var_1 );
|
||||
return var_4;
|
||||
}
|
||||
|
||||
getjumpvelocity( var_0 )
|
||||
{
|
||||
var_1 = var_0.jumpdistance2d;
|
||||
var_2 = var_0.jumpvector[2];
|
||||
var_3 = !maps\mp\alien\_utility::is_normal_upright( var_0.endupvector );
|
||||
var_4 = getjumpgravity( var_3 );
|
||||
var_5 = 1.01;
|
||||
var_6 = trajectorycalculateminimumvelocity( var_0.launchorigin, var_0.landorigin, var_4 );
|
||||
var_7 = getjumpspeedmultiplier( var_3 );
|
||||
var_8 = var_6 * var_5 * var_7;
|
||||
var_9 = trajectorycalculateexitangle( var_8, var_4, var_1, var_2 );
|
||||
var_10 = cos( var_9 );
|
||||
var_0.jumptime = var_0.jumpdistance2d / ( var_8 * var_10 );
|
||||
var_11 = var_4 * ( 0, 0, -1 );
|
||||
var_0.launchvelocity = trajectorycalculateinitialvelocity( var_0.launchorigin, var_0.landorigin, var_11, var_0.jumptime );
|
||||
var_0.launchvelocity2d = var_0.launchvelocity * ( 1, 1, 0 );
|
||||
var_0.jumpspeed2d = length( var_0.launchvelocity2d );
|
||||
}
|
||||
|
||||
getjumpspeedmultiplier( var_0 )
|
||||
{
|
||||
if ( isdefined( self.melee_jumping ) && self.melee_jumping )
|
||||
return level.alien_jump_melee_speed;
|
||||
else if ( var_0 )
|
||||
return getdvarfloat( "agent_jumpWallSpeed" );
|
||||
else
|
||||
return getdvarfloat( "agent_jumpSpeed" );
|
||||
}
|
||||
|
||||
getjumpgravity( var_0 )
|
||||
{
|
||||
if ( isdefined( self.melee_jumping ) && self.melee_jumping )
|
||||
return level.alien_jump_melee_gravity;
|
||||
else if ( var_0 )
|
||||
return getdvarfloat( "agent_jumpWallGravity" );
|
||||
else
|
||||
return getdvarfloat( "agent_jumpGravity" );
|
||||
}
|
||||
|
||||
getjumpplaybackrate( var_0, var_1 )
|
||||
{
|
||||
var_2 = self getanimentry( var_1.launchanimstate, var_1.launchanimentry );
|
||||
var_3 = self getanimentry( var_1.inairanimstate, var_1.inairanimentry );
|
||||
var_4 = self getanimentry( var_1.landanimstate, var_1.landanimentry );
|
||||
var_5 = getanimlength( var_2 );
|
||||
var_6 = var_5 * 0.5;
|
||||
var_7 = getnotetracktimes( var_2, "start_teleport" );
|
||||
|
||||
if ( isdefined( var_7 ) && var_7.size > 0 )
|
||||
var_6 = var_5 - var_7[0] * var_5;
|
||||
|
||||
var_8 = getanimlength( var_4 );
|
||||
var_9 = var_8 * 0.5;
|
||||
var_10 = getnotetracktimes( var_4, "stop_teleport" );
|
||||
|
||||
if ( isdefined( var_10 ) && var_10.size > 0 )
|
||||
var_9 = var_10[0] * var_8;
|
||||
|
||||
var_11 = getanimlength( var_3 );
|
||||
var_12 = ceil( var_0.jumptime * 20.0 );
|
||||
var_13 = var_12 / 20.0;
|
||||
var_14 = var_11 + var_6 + var_9;
|
||||
var_15 = var_14 / var_13;
|
||||
var_16 = var_11 / var_15 + 0.1;
|
||||
var_17 = var_11 / var_16;
|
||||
return var_17;
|
||||
}
|
||||
|
||||
getjumpanimstates( var_0, var_1 )
|
||||
{
|
||||
var_1.launchanimstate = getlaunchanimstate( var_0 );
|
||||
var_1.launchanimentry = getlaunchanimentry( var_0, var_1.launchanimstate );
|
||||
var_1.landanimstate = getlandanimstate( var_0 );
|
||||
var_1.landanimentry = getlandanimentry( var_0, var_1.landanimstate );
|
||||
var_1.inairanimstate = getinairanimstate( var_0, var_1.launchanimstate, var_1.landanimstate );
|
||||
var_1.inairanimentry = getinairanimentry( var_0, var_1.launchanimstate, var_1.landanimstate );
|
||||
var_1.playbackrate = getjumpplaybackrate( var_0, var_1 );
|
||||
}
|
||||
|
||||
getjumpstartangles( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = anglestoup( var_1 );
|
||||
var_4 = vectornormalize( var_2 - var_0 );
|
||||
|
||||
if ( vectordot( var_3, var_4 ) > 0.98 )
|
||||
var_4 = ( 0, 0, 1 );
|
||||
|
||||
var_5 = vectorcross( var_3, var_4 );
|
||||
var_4 = vectorcross( var_5, var_3 );
|
||||
return axistoangles( var_4, -1 * var_5, var_3 );
|
||||
}
|
||||
|
||||
getlaunchanimstate( var_0 )
|
||||
{
|
||||
var_1 = 20;
|
||||
var_2 = cos( 90 - var_1 );
|
||||
var_3 = vectornormalize( var_0.jumpvector );
|
||||
var_4 = vectordot( var_3, var_0.startupvector );
|
||||
|
||||
if ( abs( var_4 ) <= var_2 )
|
||||
return "jump_launch_level";
|
||||
else if ( var_4 > 0 )
|
||||
return "jump_launch_up";
|
||||
else if ( var_4 < 0 )
|
||||
return "jump_launch_down";
|
||||
}
|
||||
|
||||
getlaunchanimentry( var_0, var_1 )
|
||||
{
|
||||
var_2 = vectornormalize( var_0.launchvelocity );
|
||||
var_2 = rotatevector( var_2, var_0.startangles );
|
||||
var_3 = self getanimentrycount( var_1 );
|
||||
var_4 = 0;
|
||||
var_5 = vectordot( level.alienanimdata.jumplaunchdirection[var_1][var_4], var_2 );
|
||||
|
||||
for ( var_6 = 1; var_6 < var_3; var_6++ )
|
||||
{
|
||||
var_7 = vectordot( level.alienanimdata.jumplaunchdirection[var_1][var_6], var_2 );
|
||||
|
||||
if ( var_7 > var_5 )
|
||||
{
|
||||
var_4 = var_6;
|
||||
var_5 = var_7;
|
||||
}
|
||||
}
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
getinairanimstate( var_0, var_1, var_2 )
|
||||
{
|
||||
return "jump_in_air";
|
||||
}
|
||||
|
||||
getinairanimentry( var_0, var_1, var_2 )
|
||||
{
|
||||
return level.alienanimdata.inairanimentry[var_1][var_2];
|
||||
}
|
||||
|
||||
getjumpendangles( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = anglestoup( var_2 );
|
||||
var_4 = vectornormalize( var_1 - var_0 );
|
||||
|
||||
if ( vectordot( var_3, var_4 ) > 0.98 )
|
||||
var_4 = ( 0, 0, 1 );
|
||||
|
||||
var_5 = vectorcross( var_3, var_4 );
|
||||
var_4 = vectorcross( var_5, var_3 );
|
||||
return axistoangles( var_4, -1 * var_5, var_3 );
|
||||
}
|
||||
|
||||
getlandanimstate( var_0 )
|
||||
{
|
||||
var_1 = length( var_0.jumpvector );
|
||||
var_2 = 0.342;
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_normal_upright( var_0.endupvector ) )
|
||||
{
|
||||
var_3 = ( 0, 0, 1 );
|
||||
var_4 = vectordot( var_0.jumpvector, var_3 ) / var_1;
|
||||
|
||||
if ( var_4 > var_2 )
|
||||
return "jump_land_sidewall_low";
|
||||
else
|
||||
return "jump_land_sidewall_high";
|
||||
}
|
||||
|
||||
var_4 = vectordot( var_0.jumpvector, var_0.endupvector ) / var_1;
|
||||
|
||||
if ( var_4 > var_2 )
|
||||
return "jump_land_down";
|
||||
else if ( var_4 < var_2 * -1 )
|
||||
return "jump_land_up";
|
||||
else
|
||||
return "jump_land_level";
|
||||
}
|
||||
|
||||
getlandanimentry( var_0, var_1 )
|
||||
{
|
||||
var_2 = maps\mp\agents\alien\_alien_anim_utils::projectvectortoplane( var_0.jumpvector, var_0.endupvector );
|
||||
var_3 = maps\mp\agents\alien\_alien_anim_utils::projectvectortoplane( var_0.landvector, var_0.endupvector );
|
||||
var_4 = var_2 - var_3;
|
||||
var_5 = vectorcross( var_3, var_0.endupvector );
|
||||
var_6 = vectornormalize( maps\mp\agents\alien\_alien_anim_utils::projectvectortoplane( var_5, var_0.endupvector ) ) * 100;
|
||||
var_7 = vectordot( var_2 * -1, var_6 );
|
||||
var_8 = length( var_2 );
|
||||
var_9 = length( var_3 );
|
||||
var_10 = length( var_4 );
|
||||
var_11 = 0.001;
|
||||
|
||||
if ( var_8 < var_11 || var_9 < var_11 )
|
||||
return 1;
|
||||
|
||||
var_12 = ( var_8 * var_8 + var_9 * var_9 - var_10 * var_10 ) / ( 2 * var_8 * var_9 );
|
||||
|
||||
if ( var_12 <= -1 )
|
||||
return 6;
|
||||
else if ( var_12 >= 1 )
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
var_13 = acos( var_12 );
|
||||
|
||||
if ( var_7 > 0 )
|
||||
{
|
||||
if ( 0 <= var_13 && var_13 < 22.5 )
|
||||
return 1;
|
||||
else if ( 22.5 <= var_13 && var_13 < 67.5 )
|
||||
return 2;
|
||||
else if ( 67.5 <= var_13 && var_13 < 112.5 )
|
||||
return 4;
|
||||
else if ( 112.5 <= var_13 && var_13 < 157.5 )
|
||||
return 7;
|
||||
else
|
||||
return 6;
|
||||
}
|
||||
else if ( 0 <= var_13 && var_13 < 22.5 )
|
||||
return 1;
|
||||
else if ( 22.5 <= var_13 && var_13 < 67.5 )
|
||||
return 0;
|
||||
else if ( 67.5 <= var_13 && var_13 < 112.5 )
|
||||
return 3;
|
||||
else if ( 112.5 <= var_13 && var_13 < 157.5 )
|
||||
return 5;
|
||||
else
|
||||
return 6;
|
||||
}
|
||||
}
|
||||
|
||||
jumppain( var_0, var_1 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "jump_finished" );
|
||||
var_2 = gettime();
|
||||
var_3 = var_0 * 1000;
|
||||
self waittill( "jump_pain", var_4, var_5, var_6, var_7 );
|
||||
|
||||
if ( !self.trajectoryactive )
|
||||
return;
|
||||
|
||||
self notify( "jump_pain_interrupt" );
|
||||
var_8 = maps\mp\agents\alien\_alien_anim_utils::getpainanimstate( "jump_pain", var_6, var_7 );
|
||||
var_9 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "jump", var_4, var_5 );
|
||||
var_10 = maps\mp\agents\alien\_alien_anim_utils::getdamagedegree( var_6, var_7 );
|
||||
var_11 = var_2 * 0.001 + var_0;
|
||||
playinairjumppainanims( var_8, var_9, var_11, var_10 );
|
||||
self scragentsetanimscale( 1.0, 0.0 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
var_12 = getimpactpainanimstate( var_10 );
|
||||
var_13 = maps\mp\agents\alien\_alien_anim_utils::getimpactpainanimindex( var_9 );
|
||||
self setanimstate( var_12, var_13, 1.0 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( var_12, "code_move" );
|
||||
self notify( "jump_finished" );
|
||||
}
|
||||
|
||||
playinairjumppainanims( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "jump_finished" );
|
||||
self setanimstate( var_0, var_1, 1.0 );
|
||||
var_4 = common_scripts\utility::waittill_any_return( "jump_pain", "traverse_complete" );
|
||||
|
||||
if ( var_4 == "traverse_complete" )
|
||||
return;
|
||||
|
||||
var_5 = var_2 - gettime() * 0.001;
|
||||
|
||||
if ( var_5 > 0 )
|
||||
{
|
||||
var_6 = 2.0;
|
||||
var_7 = getjumppainidleanimstate( var_3 );
|
||||
var_8 = self getanimentry( var_7, var_1 );
|
||||
var_9 = getanimlength( var_8 );
|
||||
var_10 = min( var_6, var_9 / var_5 );
|
||||
self setanimstate( var_7, var_1, var_10 );
|
||||
}
|
||||
|
||||
self waittill( "traverse_complete" );
|
||||
}
|
||||
|
||||
getjumppainidleanimstate( var_0 )
|
||||
{
|
||||
return "jump_pain_idle_" + var_0;
|
||||
}
|
||||
|
||||
getimpactpainanimstate( var_0 )
|
||||
{
|
||||
return "jump_impact_pain_" + var_0;
|
||||
}
|
||||
|
||||
get_jump_sfx_alias()
|
||||
{
|
||||
switch ( maps\mp\alien\_utility::get_alien_type() )
|
||||
{
|
||||
case "elite":
|
||||
return "null";
|
||||
case "spitter":
|
||||
return "spitter_jump";
|
||||
case "seeder":
|
||||
return "seed_jump";
|
||||
case "gargoyle":
|
||||
return "gg_jump";
|
||||
default:
|
||||
return "alien_jump";
|
||||
}
|
||||
}
|
171
maps/mp/agents/alien/_alien_leper.gsc
Normal file
171
maps/mp/agents/alien/_alien_leper.gsc
Normal file
@ -0,0 +1,171 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
leper_init()
|
||||
{
|
||||
self.leperdespawntime = gettime() + 35000;
|
||||
thread handle_favorite_enemy();
|
||||
}
|
||||
|
||||
leper_combat( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 endon( "death" );
|
||||
leper_retreat( var_0 );
|
||||
}
|
||||
|
||||
leper_retreat( var_0 )
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
leper_approach( var_0 );
|
||||
leper_wait_at_node( var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
leper_challenge_despawn( var_0 )
|
||||
{
|
||||
self endon( "leper_despawn" );
|
||||
self endon( "death" );
|
||||
wait( var_0 );
|
||||
leper_despawn();
|
||||
}
|
||||
|
||||
handle_favorite_enemy()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self.favoriteenemy = maps\mp\alien\_utility::get_closest_living_player();
|
||||
wait 5;
|
||||
}
|
||||
}
|
||||
|
||||
leper_despawn()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.health = 30000;
|
||||
self.maxhealth = 30000;
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 2048 );
|
||||
playfxontag( level._effect["alien_teleport"], self, "tag_origin" );
|
||||
wait 1.0;
|
||||
self suicide();
|
||||
}
|
||||
|
||||
leper_approach( var_0 )
|
||||
{
|
||||
var_1 = get_leper_retreat_node( var_0 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
{
|
||||
wait 1;
|
||||
return;
|
||||
}
|
||||
|
||||
self scragentsetgoalnode( var_1 );
|
||||
self scragentsetgoalradius( 64 );
|
||||
self waittill( "goal_reached" );
|
||||
}
|
||||
|
||||
leave_node_on_distance_breach( var_0 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
self endon( "death" );
|
||||
self endon( "enemy" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
self endon( "leave_node " );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( distancesquared( var_0.origin, self.origin ) < 1048576 )
|
||||
self notify( "leave_node" );
|
||||
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
leave_node_on_attacked( var_0 )
|
||||
{
|
||||
var_0 endon( "death" );
|
||||
self endon( "death" );
|
||||
self endon( "enemy" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
self endon( "leave_node " );
|
||||
self waittill( "damage" );
|
||||
wait 1.5;
|
||||
self notify( "leave_node" );
|
||||
}
|
||||
|
||||
leper_wait_at_node( var_0 )
|
||||
{
|
||||
self endon( "leave_node" );
|
||||
thread leave_node_on_attacked( var_0 );
|
||||
thread leave_node_on_distance_breach( var_0 );
|
||||
wait 5.0;
|
||||
}
|
||||
|
||||
get_leper_retreat_node( var_0 )
|
||||
{
|
||||
var_1 = get_named_retreat_nodes();
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = get_possible_retreat_nodes();
|
||||
|
||||
var_2 = [];
|
||||
var_2["direction"] = "override";
|
||||
var_2["direction_override"] = get_direction_away_from_players();
|
||||
var_2["direction_weight"] = 2.0;
|
||||
var_2["min_height"] = 64.0;
|
||||
var_2["max_height"] = 500.0;
|
||||
var_2["height_weight"] = 2.0;
|
||||
var_2["enemy_los"] = 0;
|
||||
var_2["enemy_los_weight"] = 2.0;
|
||||
var_2["min_dist_from_enemy"] = 500.0;
|
||||
var_2["max_dist_from_enemy"] = 2048.0;
|
||||
var_2["desired_dist_from_enemy"] = 1500.0;
|
||||
var_2["dist_from_enemy_weight"] = 3.0;
|
||||
var_2["min_dist_from_all_enemies"] = 800.0;
|
||||
var_2["min_dist_from_all_enemies_weight"] = 5.0;
|
||||
var_2["not_recently_used_weight"] = 4.0;
|
||||
var_2["random_weight"] = 1.5;
|
||||
var_3 = maps\mp\agents\alien\_alien_think::get_retreat_node_rated( var_0, var_2, var_1 );
|
||||
return var_3;
|
||||
}
|
||||
|
||||
get_possible_retreat_nodes()
|
||||
{
|
||||
var_0 = getnodesinradius( self.origin, 1024, 400, 500, "jump" );
|
||||
return var_0;
|
||||
}
|
||||
|
||||
get_direction_away_from_players()
|
||||
{
|
||||
if ( level.players.size == 0 )
|
||||
return self.origin + anglestoforward( self.angles ) * 100;
|
||||
|
||||
var_0 = ( 0, 0, 0 );
|
||||
|
||||
foreach ( var_2 in level.players )
|
||||
var_0 = var_0 + var_2.origin;
|
||||
|
||||
var_0 = var_0 / level.players.size;
|
||||
return self.origin - var_0;
|
||||
}
|
||||
|
||||
leper_attack()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
get_named_retreat_nodes()
|
||||
{
|
||||
var_0 = maps\mp\alien\_utility::get_current_area_name();
|
||||
var_1 = getnodearray( var_0 + "_leper_location", "targetname" );
|
||||
|
||||
if ( isdefined( var_1 ) && var_1.size > 0 )
|
||||
return var_1;
|
||||
|
||||
return undefined;
|
||||
}
|
494
maps/mp/agents/alien/_alien_mammoth.gsc
Normal file
494
maps/mp/agents/alien/_alien_mammoth.gsc
Normal file
@ -0,0 +1,494 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
mammoth_level_init()
|
||||
{
|
||||
if ( !isdefined( level.alien_funcs ) )
|
||||
level.alien_funcs = [];
|
||||
|
||||
level.alien_funcs["mammoth"]["approach"] = ::mammoth_approach;
|
||||
level.alien_funcs["mammoth"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
||||
level.alien_funcs["mammoth"]["badpath"] = ::handle_badpath;
|
||||
level.donotburrowvolumes = getentarray( "donotburrow", "targetname" );
|
||||
}
|
||||
|
||||
mammoth_init()
|
||||
{
|
||||
self.last_charge_time = gettime();
|
||||
self.lastattacktime = gettime();
|
||||
self.fissurespawntimeout = get_fissure_spawn_timeout();
|
||||
self.burrowtimeout = get_burrow_timeout();
|
||||
self.currentphase = 0;
|
||||
self.canburrow = 1;
|
||||
self.canfissurespawn = 0;
|
||||
self.elite_angered = 1;
|
||||
self.burrowing = 0;
|
||||
self.lastburrowattacktime = gettime();
|
||||
self.lastfissurespawntime = gettime() + int( self.fissurespawntimeout * 0.5 );
|
||||
maps\mp\agents\alien\_alien_think::set_alien_movemode( "walk" );
|
||||
self.fissurespawnlocs = [];
|
||||
self.cannothypno = 1;
|
||||
thread watch_for_immediate_abilities();
|
||||
}
|
||||
|
||||
get_fissure_spawn_timeout()
|
||||
{
|
||||
switch ( level.players.size )
|
||||
{
|
||||
case 1:
|
||||
return 20000;
|
||||
case 2:
|
||||
return 20000;
|
||||
case 3:
|
||||
return 20000;
|
||||
case 4:
|
||||
return 20000;
|
||||
}
|
||||
}
|
||||
|
||||
get_burrow_timeout()
|
||||
{
|
||||
switch ( level.players.size )
|
||||
{
|
||||
case 1:
|
||||
return 15000;
|
||||
case 2:
|
||||
return 15000;
|
||||
case 3:
|
||||
return 15000;
|
||||
case 4:
|
||||
return 15000;
|
||||
}
|
||||
}
|
||||
|
||||
get_default_fissure_spawns()
|
||||
{
|
||||
switch ( level.players.size )
|
||||
{
|
||||
case 1:
|
||||
return 1;
|
||||
case 2:
|
||||
return 1;
|
||||
case 3:
|
||||
return 2;
|
||||
case 4:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
burrow_attack( var_0 )
|
||||
{
|
||||
self.melee_type = "burrow";
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
burrow( var_0 )
|
||||
{
|
||||
level notify( "dlc_vo_notify", "warn_dig", self );
|
||||
thread burrow_fx();
|
||||
|
||||
if ( isdefined( self.burrow_now ) && self.burrow_now )
|
||||
self.burrow_now = undefined;
|
||||
|
||||
self.lastburrowattacktime = gettime();
|
||||
self.burrowing = 1;
|
||||
self.last_burrow_location = self.origin;
|
||||
self.last_burrow_angles = self.angles;
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "burrow", 0, "burrow", "end", ::handleburrownotes );
|
||||
self hide();
|
||||
level notify( "dlc_vo_notify", "warn_underground", self );
|
||||
wait( randomfloatrange( 2.0, 6.0 ) );
|
||||
var_1 = self getanimentry( "burrow", 1 );
|
||||
var_2 = getanimlength( var_1 );
|
||||
var_3 = getmovedelta( var_1, 0.0, 1.0 );
|
||||
var_4 = get_valid_burrow_emerge_location( self.enemy );
|
||||
|
||||
if ( isalive( self.enemy ) )
|
||||
{
|
||||
var_5 = self.enemy.origin;
|
||||
var_6 = vectortoangles( var_5 - var_4 );
|
||||
}
|
||||
else if ( isdefined( self.emerge_angles ) )
|
||||
var_6 = self.emerge_angles;
|
||||
else
|
||||
var_6 = self.last_burrow_angles;
|
||||
|
||||
self scragentsetorientmode( "face angle abs", var_6 );
|
||||
var_3 = rotatevector( var_3, var_6 );
|
||||
var_7 = var_4 - var_3;
|
||||
self setorigin( var_7, 0 );
|
||||
wait 0.1;
|
||||
level notify( "dlc_vo_notify", "warn_emerge", self );
|
||||
self show();
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "burrow", 1, "burrow", "end", ::handleburrownotes );
|
||||
self.lastattacktime = gettime();
|
||||
self.burrowing = 0;
|
||||
}
|
||||
|
||||
burrow_fx()
|
||||
{
|
||||
playfx( level._effect["mammoth_burrow"], self.origin + ( 0, 0, 0 ) );
|
||||
}
|
||||
|
||||
handleburrownotes( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "burrow_note":
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
get_valid_burrow_emerge_location( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_1 = 56;
|
||||
var_2 = 356;
|
||||
var_3 = 512;
|
||||
var_4 = undefined;
|
||||
|
||||
if ( isalive( var_0 ) && !is_enemy_vanguard( var_0 ) )
|
||||
{
|
||||
var_4 = find_emerge_node( var_0, var_1, var_2 );
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
var_4 = find_emerge_node( var_0, var_2, var_3 );
|
||||
}
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
{
|
||||
wait 0.05;
|
||||
var_4 = find_emerge_node( self, var_1, var_3 );
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
{
|
||||
self.emerge_angles = undefined;
|
||||
return self.last_burrow_location;
|
||||
}
|
||||
}
|
||||
|
||||
self.emerge_angles = var_4.angles;
|
||||
return var_4.origin;
|
||||
}
|
||||
|
||||
find_emerge_node( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = getnodesinradiussorted( var_0.origin, var_2, var_1 );
|
||||
var_4 = undefined;
|
||||
|
||||
foreach ( var_6 in var_3 )
|
||||
{
|
||||
if ( maps\mp\alien\_utility::is_normal_upright( anglestoup( var_6.angles ) ) )
|
||||
{
|
||||
if ( getpathdist( var_6.origin, var_0.origin, 256 ) != -1 )
|
||||
{
|
||||
var_4 = var_6;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
mammoth_approach( var_0, var_1 )
|
||||
{
|
||||
if ( distancesquared( var_0.origin, self.origin ) > 250000 )
|
||||
mammoth_approach_enemy( 500, var_0 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !self.burrowing )
|
||||
{
|
||||
if ( should_do_fissure_spawn() )
|
||||
return "fissure_spawn";
|
||||
|
||||
if ( should_do_new_phase() )
|
||||
return "mammoth_angered";
|
||||
else if ( should_burrow( var_0 ) )
|
||||
return "burrow";
|
||||
else if ( maps\mp\agents\alien\_alien_elite::can_do_charge_attack( var_0 ) )
|
||||
return "charge";
|
||||
else if ( maps\mp\agents\alien\_alien_elite::run_to_slam( var_0 ) )
|
||||
return "slam";
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
mammoth_approach_enemy( var_0, var_1 )
|
||||
{
|
||||
self endon( "stop_mammoth_approach" );
|
||||
thread watch_for_immediate_abilities();
|
||||
maps\mp\agents\alien\_alien_think::run_near_enemy( var_0, var_1 );
|
||||
self notify( "stop_mammoth_approach" );
|
||||
}
|
||||
|
||||
should_burrow( var_0 )
|
||||
{
|
||||
if ( isdefined( self.burrow_now ) && self.burrow_now )
|
||||
return 1;
|
||||
|
||||
if ( is_enemy_vanguard( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( !self.canburrow )
|
||||
return 0;
|
||||
|
||||
if ( !self isonground() )
|
||||
return 0;
|
||||
|
||||
foreach ( var_2 in level.donotburrowvolumes )
|
||||
{
|
||||
if ( ispointinvolume( self.origin, var_2 ) )
|
||||
return 0;
|
||||
}
|
||||
|
||||
var_4 = 0;
|
||||
|
||||
if ( distancesquared( self.origin, var_0.origin ) > 262144.0 )
|
||||
var_4 = 1;
|
||||
else if ( attack_timer_expired() || burrow_timer_expired() )
|
||||
var_4 = 1;
|
||||
|
||||
return var_4 && has_room_to_burrow();
|
||||
}
|
||||
|
||||
is_enemy_vanguard( var_0 )
|
||||
{
|
||||
return isdefined( var_0.helitype ) && var_0.helitype == "remote_uav";
|
||||
}
|
||||
|
||||
has_room_to_burrow()
|
||||
{
|
||||
var_0 = maps\mp\agents\_scriptedagents::droppostoground( self.origin + anglestoforward( self.angles ) * 48.0 );
|
||||
return isdefined( var_0 );
|
||||
}
|
||||
|
||||
attack_timer_expired()
|
||||
{
|
||||
if ( gettime() - self.lastattacktime > 10000 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
burrow_timer_expired()
|
||||
{
|
||||
if ( gettime() - self.lastburrowattacktime > self.burrowtimeout )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
should_do_new_phase()
|
||||
{
|
||||
var_0 = [ 0.85, 0.5, 0.25 ];
|
||||
|
||||
if ( self.currentphase >= var_0.size - 1 )
|
||||
return 0;
|
||||
|
||||
if ( self.health / self.maxhealth > var_0[self.currentphase] )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
should_do_fissure_spawn( var_0 )
|
||||
{
|
||||
if ( !self.canfissurespawn )
|
||||
return 0;
|
||||
|
||||
if ( !fissure_spawn_timer_expired() )
|
||||
return 0;
|
||||
|
||||
if ( !fissure_spawn_find_spawn_loc() )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
fissure_spawn_timer_expired()
|
||||
{
|
||||
if ( gettime() - self.lastfissurespawntime > self.fissurespawntimeout )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fissure_spawn_find_spawn_loc()
|
||||
{
|
||||
var_0 = anglestoforward( self.angles );
|
||||
var_1 = anglestoright( self.angles );
|
||||
self.fissurespawnlocs = [];
|
||||
var_2 = self.origin + var_0 * 56.0;
|
||||
var_2 = maps\mp\agents\_scriptedagents::droppostoground( var_2 );
|
||||
|
||||
if ( isdefined( var_2 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_2, 12.0 ) )
|
||||
self.fissurespawnlocs[self.fissurespawnlocs.size] = var_2;
|
||||
|
||||
var_3 = self.origin + var_1 * 56.0;
|
||||
var_3 = maps\mp\agents\_scriptedagents::droppostoground( var_3 );
|
||||
|
||||
if ( isdefined( var_3 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_3, 12.0 ) )
|
||||
self.fissurespawnlocs[self.fissurespawnlocs.size] = var_3;
|
||||
|
||||
var_4 = self.origin + var_1 * -56.0;
|
||||
var_4 = maps\mp\agents\_scriptedagents::droppostoground( var_4 );
|
||||
|
||||
if ( isdefined( var_4 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_4, 12.0 ) )
|
||||
self.fissurespawnlocs[self.fissurespawnlocs.size] = var_4;
|
||||
|
||||
if ( self.fissurespawnlocs.size > 0 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fissure_spawn_attack( var_0 )
|
||||
{
|
||||
self.melee_type = "fissure_spawn";
|
||||
self.numfissurespawns = get_default_fissure_spawns();
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
release_reserved_space_on_death()
|
||||
{
|
||||
self waittill( "death" );
|
||||
|
||||
if ( isdefined( self.reserved_space ) && self.reserved_space > 0 )
|
||||
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.reserved_space );
|
||||
}
|
||||
|
||||
fissure_spawn( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self.reserved_space = int( maps\mp\alien\_spawn_director::reserve_custom_spawn_space( self.numfissurespawns, 1 ) );
|
||||
thread release_reserved_space_on_death();
|
||||
self.lastfissurespawntime = gettime();
|
||||
|
||||
while ( self.reserved_space > 0 )
|
||||
{
|
||||
var_1 = min( self.reserved_space, self.fissurespawnlocs.size );
|
||||
do_fissure_spawn( var_1, self.fissurespawnlocs );
|
||||
}
|
||||
|
||||
if ( self.reserved_space > 0 )
|
||||
{
|
||||
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.reserved_space );
|
||||
self.reserved_space = 0;
|
||||
}
|
||||
}
|
||||
|
||||
do_fissure_spawn( var_0, var_1 )
|
||||
{
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_melee_swipe", 2, "attack_melee", "alien_slam_big" );
|
||||
var_2 = level.alien_types[self.alien_type].attributes["slam_min_damage"];
|
||||
var_3 = level.alien_types[self.alien_type].attributes["slam_max_damage"];
|
||||
maps\mp\agents\alien\_alien_elite::area_damage_and_impulse( 250, var_2, var_3, 800 );
|
||||
thread process_fissure_spawns( var_0, var_1 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "attack_melee", "end" );
|
||||
level notify( "dlc_vo_notify", "phantom_backup", self );
|
||||
}
|
||||
|
||||
process_fissure_spawns( var_0, var_1, var_2 )
|
||||
{
|
||||
var_2 = spawnstruct();
|
||||
var_2.angles = self.angles;
|
||||
var_3 = level.cycle_data.spawn_node_info["chen_test"].vignetteinfo["brute"];
|
||||
var_4 = ( 0, 0, -100 );
|
||||
|
||||
for ( var_5 = 0; var_5 < var_0; var_5++ )
|
||||
{
|
||||
var_6 = var_5 % var_1.size;
|
||||
var_2.origin = var_1[var_6] + var_4;
|
||||
var_7 = maps\mp\alien\_spawn_director::process_custom_spawn( "brute", var_2, var_3 );
|
||||
self.reserved_space--;
|
||||
wait( randomfloatrange( 0.01, 0.14 ) );
|
||||
}
|
||||
}
|
||||
|
||||
mammoth_angered( var_0 )
|
||||
{
|
||||
self.currentphase++;
|
||||
|
||||
switch ( self.currentphase )
|
||||
{
|
||||
case 1:
|
||||
self.moveplaybackrate = 1.4;
|
||||
self.defaultemissive = 0.2;
|
||||
self.maxemissive = 0.2;
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
self.canfissurespawn = 1;
|
||||
self.damagescalar = 1.2;
|
||||
break;
|
||||
case 2:
|
||||
self.moveplaybackrate = 1.2;
|
||||
self.defaultemissive = 1.0;
|
||||
self.maxemissive = 1.0;
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
self.damagescalar = 1.4;
|
||||
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( "prepare_to_regen", 0, 2.0, "prepare_to_regen", "end" );
|
||||
fissure_spawn_angered( var_0 );
|
||||
}
|
||||
|
||||
fissure_spawn_angered( var_0 )
|
||||
{
|
||||
self.numfissurespawns = get_default_fissure_spawns() * 2;
|
||||
|
||||
if ( !fissure_spawn_find_spawn_loc() )
|
||||
self.fissurespawnlocs[self.fissurespawnlocs.size] = self.origin;
|
||||
|
||||
fissure_spawn( var_0 );
|
||||
}
|
||||
|
||||
mammoth_angered_attack( var_0 )
|
||||
{
|
||||
self.melee_type = "mammoth_angered";
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
handle_badpath( var_0 )
|
||||
{
|
||||
self.badpath = 0;
|
||||
|
||||
if ( self.badpathcount > 3 )
|
||||
{
|
||||
if ( has_room_to_burrow() && !is_enemy_vanguard( var_0 ) )
|
||||
{
|
||||
self.badpathcount = 0;
|
||||
self.burrow_now = 1;
|
||||
self notify( "alien_main_loop_restart" );
|
||||
}
|
||||
else
|
||||
maps\mp\agents\alien\_alien_think::handle_badpath( var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
watch_for_immediate_abilities()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_mammoth_approach" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( fissure_spawn_timer_expired() || should_do_new_phase() || isdefined( self.enemy ) && should_burrow( self.enemy ) )
|
||||
{
|
||||
self notify( "stop_mammoth_approach" );
|
||||
return;
|
||||
}
|
||||
|
||||
wait 1.0;
|
||||
}
|
||||
}
|
1041
maps/mp/agents/alien/_alien_melee.gsc
Normal file
1041
maps/mp/agents/alien/_alien_melee.gsc
Normal file
File diff suppressed because it is too large
Load Diff
66
maps/mp/agents/alien/_alien_minion.gsc
Normal file
66
maps/mp/agents/alien/_alien_minion.gsc
Normal file
@ -0,0 +1,66 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
minion_init()
|
||||
{
|
||||
thread minion_chatter_monitor();
|
||||
}
|
||||
|
||||
minion_chatter_monitor()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 = randomfloatrange( 8.0, 15.0 );
|
||||
wait( var_0 );
|
||||
self playsoundonmovingent( "alien_minion_idle" );
|
||||
}
|
||||
}
|
||||
|
||||
minion_approach( var_0, var_1 )
|
||||
{
|
||||
self.attacking_player = 1;
|
||||
self.bypass_max_attacker_counter = 0;
|
||||
var_2 = 0.0;
|
||||
var_3 = randomfloat( 1.0 ) < var_2;
|
||||
|
||||
if ( var_3 )
|
||||
return maps\mp\agents\alien\_alien_think::go_for_swipe( var_0 );
|
||||
|
||||
self playsoundonmovingent( "alien_minion_alert" );
|
||||
var_4 = maps\mp\agents\alien\_alien_think::approach_enemy( 80, var_0, 3 );
|
||||
return "explode";
|
||||
}
|
||||
|
||||
explode_attack( var_0 )
|
||||
{
|
||||
self.melee_type = "explode";
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
explode( var_0 )
|
||||
{
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
|
||||
self playsoundonmovingent( "alien_minion_attack" );
|
||||
playfxontag( level._effect["alien_minion_preexplode"], self, "tag_origin" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
var_1 = 1.25;
|
||||
self setanimstate( "minion_explode", 0, var_1 );
|
||||
wait( getanimlength( self getanimentry( "minion_explode", 0 ) ) * ( 1 / var_1 ) );
|
||||
self suicide();
|
||||
}
|
||||
|
||||
load_minion_fx()
|
||||
{
|
||||
level._effect["alien_minion_explode"] = loadfx( "vfx/gameplay/alien/vfx_alien_minion_explode" );
|
||||
level._effect["alien_minion_preexplode"] = loadfx( "vfx/gameplay/alien/vfx_alien_minion_preexplosion" );
|
||||
}
|
||||
|
||||
minion_explode_on_death( var_0 )
|
||||
{
|
||||
common_scripts\utility::waitframe();
|
||||
playfx( level._effect["alien_minion_explode"], var_0 + ( 0, 0, 32 ) );
|
||||
playsoundatpos( var_0, "alien_minion_explode" );
|
||||
radiusdamage( var_0, 200, level.alien_types["minion"].attributes["explode_max_damage"], level.alien_types["minion"].attributes["explode_min_damage"], undefined, "MOD_EXPLOSIVE", "alien_minion_explosion" );
|
||||
}
|
855
maps/mp/agents/alien/_alien_move.gsc
Normal file
855
maps/mp/agents/alien/_alien_move.gsc
Normal file
@ -0,0 +1,855 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
entermove();
|
||||
startmove();
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
entermove()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
self.playing_pain_animation = 0;
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self scragentsetanimmode( "code_move" );
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
if ( candostartmove() )
|
||||
{
|
||||
switch ( getstartmovetype() )
|
||||
{
|
||||
case "run-start":
|
||||
dorunstart();
|
||||
break;
|
||||
case "walk-start":
|
||||
dowalkstart();
|
||||
break;
|
||||
case "leap-to-run":
|
||||
doleaptorunstart();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
self.playing_pain_animation = 0;
|
||||
cancelallbut( undefined );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self.previousanimstate = "move";
|
||||
}
|
||||
|
||||
setupmovement()
|
||||
{
|
||||
self.enablestop = 1;
|
||||
thread waitformovemodechange();
|
||||
thread waitforjumpsoon();
|
||||
thread waitforsharpturn();
|
||||
thread waitforstop();
|
||||
thread waitforstuck();
|
||||
|
||||
if ( candodge() )
|
||||
{
|
||||
thread waitfornearmiss();
|
||||
thread waitfordodgechance();
|
||||
}
|
||||
}
|
||||
|
||||
continuemovement()
|
||||
{
|
||||
setupmovement();
|
||||
|
||||
if ( self.oriented )
|
||||
{
|
||||
var_0 = self getlookaheaddir();
|
||||
var_1 = anglestoup( self.angles );
|
||||
var_2 = vectorcross( var_1, var_0 );
|
||||
var_0 = vectorcross( var_2, var_1 );
|
||||
var_3 = ( 0, 0, 0 ) - var_2;
|
||||
var_4 = axistoangles( var_0, var_3, var_1 );
|
||||
self scragentsetorientmode( "face angle abs", var_4 );
|
||||
self scragentsetanimmode( "code_move_slide" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self scragentsetanimmode( "code_move" );
|
||||
}
|
||||
|
||||
self scragentsetanimscale( self.xyanimscale, 1.0 );
|
||||
setmoveanim( self.movemode );
|
||||
}
|
||||
|
||||
waitformovemodechange()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_runwalk" );
|
||||
var_0 = self.movemode;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( var_0 != self.movemode )
|
||||
{
|
||||
setmoveanim( self.movemode );
|
||||
var_0 = self.movemode;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
waitforsharpturn()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_sharpturn" );
|
||||
self waittill( "path_dir_change", var_0 );
|
||||
var_1 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_0 );
|
||||
|
||||
if ( var_1 == 4 )
|
||||
{
|
||||
thread waitforsharpturn();
|
||||
return;
|
||||
}
|
||||
|
||||
var_2 = !should_do_sharp_turn();
|
||||
|
||||
if ( var_2 )
|
||||
var_1 = 0;
|
||||
|
||||
var_3 = "run_turn";
|
||||
var_4 = self getanimentry( var_3, var_1 );
|
||||
var_5 = var_2 || candoturnanim( var_4 );
|
||||
|
||||
if ( !var_5 )
|
||||
{
|
||||
thread waitforsharpturn();
|
||||
return;
|
||||
}
|
||||
|
||||
cancelallbut( "sharpturn" );
|
||||
self.blockgoalpos = 1;
|
||||
self.enablestop = 0;
|
||||
|
||||
if ( var_2 )
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_3, var_1, self.moveplaybackrate, var_3, "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self.blockgoalpos = 0;
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforstop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_stop" );
|
||||
self waittill( "stop_soon" );
|
||||
|
||||
if ( !shoulddostopanim() || self.movemode == "walk" )
|
||||
thread waitforstop();
|
||||
else
|
||||
{
|
||||
var_0 = self getpathgoalpos();
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
var_1 = var_0 - self.origin;
|
||||
var_2 = getstopendfacedir( var_0 );
|
||||
var_3 = getstopanimstate();
|
||||
|
||||
if ( should_move_straight_ahead() )
|
||||
var_4 = 0;
|
||||
else
|
||||
var_4 = getstopanimindex( var_3, var_2 );
|
||||
|
||||
var_5 = self getanimentry( var_3, var_4 );
|
||||
var_6 = getmovedelta( var_5 );
|
||||
var_7 = getangledelta( var_5 );
|
||||
|
||||
if ( length( var_1 ) + 48 < length( var_6 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
var_8 = getstopdata( var_0 );
|
||||
var_9 = calcanimstartpos( var_8.pos, var_8.angles[1], var_6, var_7 );
|
||||
var_10 = maps\mp\agents\_scriptedagents::droppostoground( var_9 );
|
||||
|
||||
if ( !isdefined( var_10 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_8.pos, var_10 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
cancelallbut( "stop", "sharpturn" );
|
||||
thread waitforpathset( "alienmove_endwait_pathsetwhilestopping", "alienmove_endwait_stop" );
|
||||
var_11 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_0 - self.origin, var_6 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", vectortoangles( var_1 ) );
|
||||
self scragentsetanimscale( var_11.xy, var_11.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_3, var_4, var_3, "end" );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
|
||||
if ( should_move_straight_ahead() )
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
|
||||
|
||||
var_0 = self getpathgoalpos();
|
||||
|
||||
if ( distancesquared( self.origin, var_0 ) < 400.0 )
|
||||
{
|
||||
self scragentsetanimmode( "code_move_slide" );
|
||||
self setanimstate( "idle" );
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
startmove();
|
||||
continuemovement();
|
||||
}
|
||||
}
|
||||
|
||||
getstopendfacedir( var_0 )
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
return self.enemy.origin - var_0;
|
||||
|
||||
return var_0 - self.origin;
|
||||
}
|
||||
|
||||
getstopanimstate()
|
||||
{
|
||||
switch ( self.movemode )
|
||||
{
|
||||
case "jog":
|
||||
case "run":
|
||||
return "run_stop";
|
||||
case "walk":
|
||||
return "walk_stop";
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
getstopanimindex( var_0, var_1 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "walk_stop":
|
||||
return 0;
|
||||
case "run_stop":
|
||||
return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
waitforpathset( var_0, var_1 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( var_0 );
|
||||
var_2 = self scragentgetgoalpos();
|
||||
self waittill( "path_set" );
|
||||
var_3 = self scragentgetgoalpos();
|
||||
|
||||
if ( distancesquared( var_2, var_3 ) < 1 )
|
||||
{
|
||||
thread waitforpathset( var_0, var_1 );
|
||||
return;
|
||||
}
|
||||
|
||||
self notify( var_1 );
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforjumpsoon()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_jumpsoon" );
|
||||
self waittill( "traverse_soon" );
|
||||
cancelallbut( "jumpsoon" );
|
||||
var_0 = self getnegotiationstartnode();
|
||||
var_1 = self getnegotiationendnode();
|
||||
var_2 = var_1.origin - var_0.origin;
|
||||
var_3 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_1.origin - var_0.origin );
|
||||
|
||||
if ( !shoulddoleaparrivalanim( var_0, var_3 ) )
|
||||
continuemovement();
|
||||
else
|
||||
{
|
||||
var_4 = "jump_launch_arrival";
|
||||
var_5 = self getanimentry( var_4, var_3 );
|
||||
var_6 = getmovedelta( var_5 );
|
||||
var_7 = getangledelta( var_5 );
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_0.origin ) && !self.oriented )
|
||||
{
|
||||
continuemovement();
|
||||
return;
|
||||
}
|
||||
|
||||
thread waitforpathset( "alienmove_endwait_pathsetwhilejumping", "alienmove_endwait_jumpsoon" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
var_8 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_0.origin - self.origin, var_6 );
|
||||
self scragentsetanimscale( var_8.xy, var_8.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_4, var_3, self.moveplaybackrate, "jump_launch_arrival", "anim_will_finish" );
|
||||
var_9 = var_2;
|
||||
var_10 = anglestoup( self.angles );
|
||||
var_11 = vectorcross( var_10, var_9 );
|
||||
var_9 = vectorcross( var_11, var_10 );
|
||||
var_12 = ( 0, 0, 0 ) - var_11;
|
||||
var_13 = axistoangles( var_9, var_12, var_10 );
|
||||
self scragentsetorientmode( "face angle abs", var_13 );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
var_0 = self getnegotiationstartnode();
|
||||
|
||||
if ( isdefined( var_0 ) && distancesquared( self.origin, var_0.origin ) < 400.0 || self.oriented )
|
||||
{
|
||||
self scragentsetanimmode( "code_move_slide" );
|
||||
return;
|
||||
}
|
||||
|
||||
continuemovement();
|
||||
}
|
||||
}
|
||||
|
||||
setmoveanim( var_0 )
|
||||
{
|
||||
if ( var_0 == "run" )
|
||||
{
|
||||
var_1 = self getanimentrycount( "run" );
|
||||
var_2 = [ 20, 80 ];
|
||||
var_3 = maps\mp\alien\_utility::getrandomindex( var_2 );
|
||||
self setanimstate( "run", var_3, self.moveplaybackrate );
|
||||
}
|
||||
else if ( var_0 == "jog" )
|
||||
self setanimstate( "jog", undefined, self.moveplaybackrate );
|
||||
else if ( var_0 == "walk" )
|
||||
self setanimstate( "walk", undefined, self.moveplaybackrate );
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
cancelallbut( var_0, var_1 )
|
||||
{
|
||||
var_2 = [ "runwalk", "sharpturn", "stop", "pathsetwhilestopping", "jumpsoon", "pathsetwhilejumping", "pathset", "nearmiss", "dodgechance", "stuck" ];
|
||||
var_3 = isdefined( var_0 );
|
||||
var_4 = isdefined( var_1 );
|
||||
|
||||
foreach ( var_6 in var_2 )
|
||||
{
|
||||
if ( var_3 && var_6 == var_0 )
|
||||
continue;
|
||||
|
||||
if ( var_4 && var_6 == var_1 )
|
||||
continue;
|
||||
|
||||
self notify( "alienmove_endwait_" + var_6 );
|
||||
}
|
||||
}
|
||||
|
||||
getstopdata( var_0 )
|
||||
{
|
||||
var_1 = spawnstruct();
|
||||
|
||||
if ( isdefined( self.node ) )
|
||||
{
|
||||
var_1.pos = self.node.origin;
|
||||
var_1.angles = self.node.angles;
|
||||
}
|
||||
else if ( isdefined( self.enemy ) )
|
||||
{
|
||||
var_1.pos = var_0;
|
||||
var_1.angles = vectortoangles( self.enemy.origin - var_0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1.pos = var_0;
|
||||
var_1.angles = self.angles;
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
calcanimstartpos( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = var_1 - var_3;
|
||||
var_5 = ( 0, var_4, 0 );
|
||||
var_6 = anglestoforward( var_5 );
|
||||
var_7 = anglestoright( var_5 );
|
||||
var_8 = var_6 * var_2[0];
|
||||
var_9 = var_7 * var_2[1];
|
||||
return var_0 - var_8 + var_9;
|
||||
}
|
||||
|
||||
onflashbanged()
|
||||
{
|
||||
dostumble();
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( isdefined( level.dlc_can_do_pain_override_func ) )
|
||||
{
|
||||
var_10 = [[ level.dlc_can_do_pain_override_func ]]( "move" );
|
||||
|
||||
if ( !var_10 )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( maps\mp\alien\_utility::is_pain_available( var_1, var_4 ) )
|
||||
dostumble( var_3, var_7, var_8, var_2, var_4, var_1 );
|
||||
}
|
||||
|
||||
dostumble( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( self.playing_pain_animation )
|
||||
return;
|
||||
|
||||
cancelallbut( undefined );
|
||||
self.statelocked = 1;
|
||||
self.playing_pain_animation = 1;
|
||||
var_6 = var_0 & level.idflags_stun;
|
||||
|
||||
if ( var_4 == "MOD_MELEE" || var_6 )
|
||||
{
|
||||
var_7 = "pain_pushback";
|
||||
var_8 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "push_back", var_1 );
|
||||
var_9 = "pain_pushback";
|
||||
}
|
||||
else
|
||||
{
|
||||
var_7 = maps\mp\agents\alien\_alien_anim_utils::getpainanimstate( "run_stumble", var_3, var_6 );
|
||||
var_8 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "run", var_1, var_2 );
|
||||
var_9 = "run_stumble";
|
||||
}
|
||||
|
||||
var_10 = self getanimentry( var_7, var_8 );
|
||||
maps\mp\alien\_utility::always_play_pain_sound( var_10 );
|
||||
maps\mp\alien\_utility::register_pain( var_10 );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_7, var_8, self.moveplaybackrate, var_9, "code_move" );
|
||||
self.playing_pain_animation = 0;
|
||||
self.statelocked = 0;
|
||||
|
||||
if ( shouldstartmove() )
|
||||
startmove();
|
||||
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitfornearmiss( var_0 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_nearmiss" );
|
||||
var_1 = 0.5;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
common_scripts\utility::waittill_any( "bulletwhizby", "damage" );
|
||||
|
||||
if ( randomfloat( 1.0 ) < var_1 )
|
||||
continue;
|
||||
|
||||
if ( !self.playing_pain_animation )
|
||||
dododge();
|
||||
}
|
||||
}
|
||||
|
||||
waitfordodgechance()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_dodgechance" );
|
||||
var_0 = 0.0;
|
||||
var_1 = randomintrange( 1000, 2000 );
|
||||
var_2 = gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.1;
|
||||
|
||||
if ( isalive( self.enemy ) )
|
||||
{
|
||||
var_3 = gettime();
|
||||
var_4 = vectornormalize( self.origin - self.enemy.origin );
|
||||
var_5 = anglestoforward( self.enemy.angles );
|
||||
|
||||
if ( vectordot( var_4, var_5 ) < 0.985 )
|
||||
{
|
||||
var_0 = 0.0;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_0 = var_0 + ( var_3 - var_2 );
|
||||
|
||||
if ( distancesquared( self.origin, self.enemy.origin ) > 640000.0 )
|
||||
continue;
|
||||
|
||||
var_6 = var_4 * -1.0;
|
||||
var_7 = anglestoforward( self.angles );
|
||||
|
||||
if ( vectordot( var_6, var_7 ) < 0.766 )
|
||||
continue;
|
||||
|
||||
if ( var_0 >= var_1 && !self.playing_pain_animation )
|
||||
{
|
||||
dododge( "dodgechance" );
|
||||
var_0 = 0.0;
|
||||
var_1 = randomintrange( 1000, 2000 );
|
||||
}
|
||||
|
||||
var_2 = var_3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
candodge()
|
||||
{
|
||||
switch ( maps\mp\alien\_utility::get_alien_type() )
|
||||
{
|
||||
case "seeder":
|
||||
case "mammoth":
|
||||
case "spitter":
|
||||
case "elite":
|
||||
return 0;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
dododge( var_0 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
var_1 = 1000;
|
||||
|
||||
if ( isdefined( self.last_dodge_time ) && gettime() - self.last_dodge_time < var_1 )
|
||||
return;
|
||||
|
||||
if ( isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 65536.0 )
|
||||
return;
|
||||
|
||||
var_2 = get_primary_dodge_anim_state();
|
||||
|
||||
if ( common_scripts\utility::cointoss() )
|
||||
{
|
||||
if ( !trydodge( var_2 + "_left", var_0 ) )
|
||||
trydodge( var_2 + "_right", var_0 );
|
||||
}
|
||||
else if ( !trydodge( var_2 + "_right", var_0 ) )
|
||||
trydodge( var_2 + "_left", var_0 );
|
||||
}
|
||||
|
||||
get_primary_dodge_anim_state()
|
||||
{
|
||||
switch ( self.movemode )
|
||||
{
|
||||
case "jog":
|
||||
return "jog_dodge";
|
||||
default:
|
||||
return "run_dodge";
|
||||
}
|
||||
}
|
||||
|
||||
trydodge( var_0, var_1 )
|
||||
{
|
||||
var_2 = 0.5;
|
||||
var_3 = maps\mp\agents\_scriptedagents::getrandomanimentry( var_0 );
|
||||
var_4 = self getanimentry( var_0, var_3 );
|
||||
var_5 = maps\mp\agents\_scriptedagents::getsafeanimmovedeltapercentage( var_4 );
|
||||
var_5 = min( var_5, self.xyanimscale );
|
||||
|
||||
if ( var_5 < var_2 )
|
||||
return 0;
|
||||
|
||||
self.last_dodge_time = gettime();
|
||||
cancelallbut( var_1 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self scragentsetanimscale( var_5, 1.0 );
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( var_0, var_0, "end" );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
continuemovement();
|
||||
return 1;
|
||||
}
|
||||
|
||||
waitforstuck()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_stuck" );
|
||||
var_0 = 2000.0;
|
||||
var_1 = gettime() + var_0;
|
||||
var_2 = self.origin;
|
||||
var_3 = 1.0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = gettime();
|
||||
var_5 = length( self.origin - var_2 );
|
||||
|
||||
if ( var_5 > var_3 )
|
||||
var_1 = var_4 + var_0;
|
||||
|
||||
if ( var_1 <= var_4 )
|
||||
{
|
||||
stucklerp();
|
||||
var_1 = var_4 + var_0;
|
||||
break;
|
||||
}
|
||||
|
||||
var_2 = self.origin;
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
stucklerp()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_stuck" );
|
||||
self endon( "death" );
|
||||
var_0 = 0.2;
|
||||
cancelallbut( "stuck" );
|
||||
var_1 = self getanimentry();
|
||||
var_2 = getanimlength( var_1 );
|
||||
var_3 = length( getmovedelta( var_1 ) );
|
||||
var_4 = var_0 / var_2 * var_3;
|
||||
var_5 = self getlookaheaddir();
|
||||
var_6 = self.origin + var_5 * var_4;
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetorientmode( "face angle abs", vectortoangles( var_5 ) );
|
||||
self scragentdoanimlerp( self.origin, var_6, var_0 );
|
||||
wait( var_0 );
|
||||
self setorigin( self.origin );
|
||||
}
|
||||
|
||||
dowalkstart()
|
||||
{
|
||||
var_0 = "walk_start";
|
||||
var_1 = maps\mp\agents\_scriptedagents::getrandomanimentry( var_0 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.blockgoalpos = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
dorunstart()
|
||||
{
|
||||
var_0 = self getnegotiationstartnode();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_1 = var_0.origin;
|
||||
else
|
||||
var_1 = self getpathgoalpos();
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return;
|
||||
|
||||
if ( distancesquared( var_1, self.origin ) < 10000 )
|
||||
return;
|
||||
|
||||
var_2 = self getlookaheaddir();
|
||||
var_3 = self getvelocity();
|
||||
|
||||
if ( lengthsquared( var_3 ) > 16 )
|
||||
{
|
||||
var_4 = anglestoup( self.angles );
|
||||
|
||||
if ( vectordot( var_4, ( 0, 0, 1 ) ) < 0.707 )
|
||||
{
|
||||
var_5 = vectordot( var_4, var_2 );
|
||||
|
||||
if ( var_5 > 0.707 || var_5 < -0.707 )
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dostartmoveanim( "run_start" );
|
||||
}
|
||||
|
||||
doleaptorunstart()
|
||||
{
|
||||
dostartmoveanim( "leap_to_run_start" );
|
||||
}
|
||||
|
||||
should_move_straight_ahead()
|
||||
{
|
||||
switch ( maps\mp\alien\_utility::get_alien_type() )
|
||||
{
|
||||
case "seeder":
|
||||
case "spitter":
|
||||
case "minion":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
should_do_sharp_turn()
|
||||
{
|
||||
switch ( maps\mp\alien\_utility::get_alien_type() )
|
||||
{
|
||||
case "seeder":
|
||||
case "mammoth":
|
||||
case "spitter":
|
||||
case "minion":
|
||||
case "elite":
|
||||
return 0;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
dostartmoveanim( var_0 )
|
||||
{
|
||||
if ( should_move_straight_ahead() )
|
||||
{
|
||||
var_1 = 0;
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
|
||||
}
|
||||
else
|
||||
var_1 = getstartmoveangleindex();
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.blockgoalpos = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
candostartmove()
|
||||
{
|
||||
if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && ( !isdefined( self.disableexits ) || self.disableexits == 0 ) )
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
getstartmovetype()
|
||||
{
|
||||
var_0 = self.previousanimstate;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "traverse_jump":
|
||||
return "leap-to-run";
|
||||
default:
|
||||
switch ( self.movemode )
|
||||
{
|
||||
case "run":
|
||||
return "run-start";
|
||||
case "walk":
|
||||
return "walk-start";
|
||||
default:
|
||||
return "run-start";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shoulddostopanim()
|
||||
{
|
||||
return isdefined( self.enablestop ) && self.enablestop == 1;
|
||||
}
|
||||
|
||||
shoulddoleaparrivalanim( var_0, var_1 )
|
||||
{
|
||||
if ( var_0.type == "Jump" || var_0.type == "Jump Attack" )
|
||||
return 1;
|
||||
else if ( traversalstartfromidle( var_0.animscript ) )
|
||||
return 1;
|
||||
else if ( incominganglestraightahead( maps\mp\alien\_utility::get_alien_type(), var_1 ) )
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
incominganglestraightahead( var_0, var_1 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "mammoth":
|
||||
case "elite":
|
||||
return var_1 == 4;
|
||||
default:
|
||||
return var_1 == 3 || var_1 == 4 || var_1 == 5;
|
||||
}
|
||||
}
|
||||
|
||||
traversalstartfromidle( var_0 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "alien_climb_up_ledge_18_idle":
|
||||
case "alien_climb_up_ledge_18_run":
|
||||
case "climb_up_end_jump_side_r":
|
||||
case "climb_up_end_jump_side_l":
|
||||
case "alien_climb_up_over_56":
|
||||
case "alien_climb_up":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
candoturnanim( var_0 )
|
||||
{
|
||||
var_1 = 16;
|
||||
var_2 = 10;
|
||||
var_3 = ( 0, 0, 16 );
|
||||
|
||||
if ( !isdefined( self getpathgoalpos() ) )
|
||||
return 0;
|
||||
|
||||
var_4 = getnotetracktimes( var_0, "code_move" );
|
||||
var_5 = var_4[0];
|
||||
var_6 = getmovedelta( var_0, 0, var_5 );
|
||||
var_7 = self localtoworldcoords( var_6 );
|
||||
var_7 = getgroundposition( var_7, self.radius );
|
||||
|
||||
if ( !isdefined( var_7 ) )
|
||||
return 0;
|
||||
|
||||
var_8 = self aiphysicstracepassed( self.origin + var_3, var_7 + var_3, self.radius - var_2, self.height - var_1 );
|
||||
|
||||
if ( var_8 )
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
shouldstartmove()
|
||||
{
|
||||
var_0 = getstartmoveangleindex();
|
||||
return var_0 < 3 || var_0 > 5;
|
||||
}
|
||||
|
||||
getstartmoveangleindex()
|
||||
{
|
||||
return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( self getlookaheaddir() );
|
||||
}
|
1083
maps/mp/agents/alien/_alien_seeder.gsc
Normal file
1083
maps/mp/agents/alien/_alien_seeder.gsc
Normal file
File diff suppressed because it is too large
Load Diff
780
maps/mp/agents/alien/_alien_spitter.gsc
Normal file
780
maps/mp/agents/alien/_alien_spitter.gsc
Normal file
@ -0,0 +1,780 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
load_spitter_fx()
|
||||
{
|
||||
level._effect["spit_AOE"] = loadfx( "vfx/gameplay/alien/vfx_alien_spitter_gas_cloud" );
|
||||
level._effect["spit_AOE_small"] = loadfx( "vfx/gameplay/alien/vfx_alien_spitter_gas_cloud_64" );
|
||||
}
|
||||
|
||||
spitter_init()
|
||||
{
|
||||
self.gas_cloud_available = 1;
|
||||
}
|
||||
|
||||
spitter_death()
|
||||
{
|
||||
release_spit_node();
|
||||
}
|
||||
|
||||
is_escape_sequence_active()
|
||||
{
|
||||
return common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" );
|
||||
}
|
||||
|
||||
get_max_spit_distance_squared()
|
||||
{
|
||||
if ( is_escape_sequence_active() )
|
||||
return 3240000;
|
||||
|
||||
return 1440000;
|
||||
}
|
||||
|
||||
get_lookahead_percentage()
|
||||
{
|
||||
if ( is_escape_sequence_active() )
|
||||
return 1.0;
|
||||
|
||||
return 0.5;
|
||||
}
|
||||
|
||||
spit_projectile( var_0 )
|
||||
{
|
||||
if ( self.spit_type == "gas_cloud" )
|
||||
level.spitter_last_cloud_time = gettime();
|
||||
|
||||
self.melee_type = "spit";
|
||||
self.spit_target = var_0;
|
||||
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
||||
}
|
||||
|
||||
spit_attack( var_0 )
|
||||
{
|
||||
self endon( "melee_pain_interrupt" );
|
||||
var_1 = isdefined( var_0 ) && isdefined( var_0.code_classname ) && var_0.code_classname == "script_vehicle";
|
||||
|
||||
if ( var_1 )
|
||||
var_2 = var_0;
|
||||
else
|
||||
var_2 = self.spit_target;
|
||||
|
||||
var_2 endon( "death" );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_2 );
|
||||
|
||||
if ( isalive( var_2 ) )
|
||||
{
|
||||
self.spit_target = var_2;
|
||||
|
||||
if ( var_1 )
|
||||
{
|
||||
var_3 = 5;
|
||||
var_4 = vectornormalize( anglestoforward( var_2.angles ) );
|
||||
var_5 = length( var_2 vehicle_getvelocity() ) * var_3;
|
||||
var_6 = var_4 * var_5;
|
||||
self.spit_target_location = var_2.origin + var_6 + ( 0, 0, 32 );
|
||||
}
|
||||
else
|
||||
self.spit_target_location = var_2.origin;
|
||||
|
||||
self.looktarget = var_2;
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
|
||||
|
||||
if ( isdefined( self.current_spit_node ) && !maps\mp\alien\_utility::is_normal_upright( anglestoup( self.current_spit_node.angles ) ) )
|
||||
{
|
||||
var_7 = anglestoup( self.current_spit_node.angles );
|
||||
var_8 = anglestoforward( self.angles );
|
||||
var_9 = vectorcross( var_7, var_8 );
|
||||
var_8 = vectorcross( var_9, var_7 );
|
||||
var_10 = ( 0, 0, 0 ) - var_9;
|
||||
var_11 = axistoangles( var_8, var_10, var_7 );
|
||||
self scragentsetorientmode( "face angle abs", var_11 );
|
||||
}
|
||||
else if ( isdefined( self.enemy ) && var_2 == self.enemy )
|
||||
self scragentsetorientmode( "face enemy" );
|
||||
else
|
||||
{
|
||||
var_8 = vectornormalize( var_2.origin - self.origin );
|
||||
|
||||
if ( isdefined( self.current_spit_node ) )
|
||||
var_7 = anglestoup( self.current_spit_node.angles );
|
||||
else
|
||||
var_7 = anglestoup( self.angles );
|
||||
|
||||
var_9 = vectorcross( var_7, var_8 );
|
||||
var_8 = vectorcross( var_9, var_7 );
|
||||
var_10 = ( 0, 0, 0 ) - var_9;
|
||||
var_11 = axistoangles( var_8, var_10, var_7 );
|
||||
self scragentsetorientmode( "face angle abs", var_11 );
|
||||
}
|
||||
|
||||
if ( self.oriented )
|
||||
self scragentsetanimmode( "anim angle delta" );
|
||||
else
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
|
||||
play_spit_anim();
|
||||
}
|
||||
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
self.looktarget = undefined;
|
||||
self.spit_target = undefined;
|
||||
self.spit_target_location = undefined;
|
||||
self.spit_type = undefined;
|
||||
}
|
||||
|
||||
play_spit_anim()
|
||||
{
|
||||
switch ( self.spit_type )
|
||||
{
|
||||
case "close_range":
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( "close_spit_attack", "spit_attack", "end", ::handleattacknotetracks );
|
||||
break;
|
||||
case "gas_cloud":
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( "gas_spit_attack", "spit_attack", "end", ::handleattacknotetracks );
|
||||
break;
|
||||
case "long_range":
|
||||
var_0 = randomintrange( 2, 3 );
|
||||
|
||||
for ( var_1 = 0; var_1 < var_0; var_1++ )
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( "long_range_spit_attack", "spit_attack", "end", ::handleattacknotetracks );
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
get_best_spit_target( var_0 )
|
||||
{
|
||||
if ( common_scripts\utility::cointoss() && maps\mp\alien\_utility::get_alien_type() != "seeder" )
|
||||
{
|
||||
var_1 = get_grief_targets();
|
||||
|
||||
foreach ( var_3 in var_1 )
|
||||
{
|
||||
if ( is_valid_spit_target( var_3, 0 ) )
|
||||
return var_3;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
if ( isalive( var_0 ) && is_valid_spit_target( var_0, 0 ) )
|
||||
return var_0;
|
||||
}
|
||||
|
||||
var_5 = get_current_possible_targets();
|
||||
var_6 = 4;
|
||||
var_7 = 0;
|
||||
|
||||
foreach ( var_9 in var_5 )
|
||||
{
|
||||
if ( !isalive( var_9 ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_0 ) && var_9 == var_0 )
|
||||
continue;
|
||||
|
||||
if ( is_valid_spit_target( var_9, 1 ) )
|
||||
return var_9;
|
||||
|
||||
var_7++;
|
||||
|
||||
if ( var_7 >= var_6 )
|
||||
{
|
||||
common_scripts\utility::waitframe();
|
||||
var_7 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
get_grief_targets()
|
||||
{
|
||||
var_0 = [];
|
||||
|
||||
if ( !can_spit_gas_cloud() || is_pet() )
|
||||
return var_0;
|
||||
|
||||
foreach ( var_2 in level.players )
|
||||
{
|
||||
if ( !isalive( var_2 ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_2.inlaststand ) && var_2.inlaststand )
|
||||
var_0[var_0.size] = var_2;
|
||||
}
|
||||
|
||||
if ( isdefined( level.drill ) && isdefined( level.drill.state ) && level.drill.state == "offline" )
|
||||
var_0[var_0.size] = level.drill;
|
||||
|
||||
return common_scripts\utility::array_randomize( var_0 );
|
||||
}
|
||||
|
||||
is_valid_spit_target( var_0, var_1 )
|
||||
{
|
||||
if ( !isalive( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( var_1 && isplayer( var_0 ) && !has_attacker_space( var_0 ) )
|
||||
return 0;
|
||||
|
||||
var_2 = get_max_spit_distance_squared();
|
||||
var_3 = distance2dsquared( self.origin, var_0.origin );
|
||||
|
||||
if ( var_3 > var_2 )
|
||||
return 0;
|
||||
|
||||
self.looktarget = var_0;
|
||||
|
||||
if ( !isalive( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( ( isplayer( var_0 ) || issentient( var_0 ) ) && !isdefined( var_0.usingremote ) )
|
||||
var_4 = var_0 geteye();
|
||||
else
|
||||
var_4 = var_0.origin;
|
||||
|
||||
var_5 = self gettagorigin( "TAG_BREATH" );
|
||||
return bullettracepassed( var_5, var_4, 0, self );
|
||||
}
|
||||
|
||||
get_spit_fire_pos( var_0 )
|
||||
{
|
||||
return self gettagorigin( "TAG_BREATH" );
|
||||
}
|
||||
|
||||
has_attacker_space( var_0 )
|
||||
{
|
||||
var_1 = level.maxalienattackerdifficultyvalue - level.alien_types[self.alien_type].attributes["attacker_difficulty"];
|
||||
var_2 = maps\mp\agents\alien\_alien_think::get_current_attacker_value( var_0 );
|
||||
return var_2 <= var_1;
|
||||
}
|
||||
|
||||
handleattacknotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( isdefined( level.dlc_attacknotetrack_override_func ) )
|
||||
{
|
||||
self [[ level.dlc_attacknotetrack_override_func ]]( var_0, var_1, var_2, var_3 );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( var_0 == "spit" )
|
||||
return fire_spit_projectile();
|
||||
}
|
||||
|
||||
fire_spit_projectile()
|
||||
{
|
||||
if ( !isdefined( self.spit_target ) && !isdefined( self.spit_target_location ) )
|
||||
return;
|
||||
|
||||
var_0 = isalive( self.spit_target );
|
||||
var_1 = isdefined( self.spit_target.code_classname ) && self.spit_target.code_classname == "script_vehicle";
|
||||
|
||||
if ( var_0 && !var_1 )
|
||||
var_2 = self.spit_target.origin;
|
||||
else
|
||||
var_2 = self.spit_target_location;
|
||||
|
||||
if ( self.spit_type == "gas_cloud" )
|
||||
spit_gas_cloud_projectile( var_2 );
|
||||
else if ( var_0 )
|
||||
{
|
||||
var_3 = 1400;
|
||||
var_2 = get_lookahead_target_location( var_3, self.spit_target, 0 );
|
||||
|
||||
if ( !bullettracepassed( var_2, get_spit_fire_pos( var_2 ), 0, self ) )
|
||||
var_2 = get_lookahead_target_location( var_3, self.spit_target, 1 );
|
||||
|
||||
spit_basic_projectile( var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
get_lookahead_target_location( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( !isplayer( var_1 ) )
|
||||
return var_1.origin;
|
||||
|
||||
var_3 = get_lookahead_percentage();
|
||||
|
||||
if ( var_2 && !isdefined( var_1.usingremote ) )
|
||||
var_4 = var_1 geteye();
|
||||
else
|
||||
var_4 = var_1.origin;
|
||||
|
||||
var_5 = distance( self.origin, var_4 );
|
||||
var_6 = var_5 / var_0;
|
||||
var_7 = var_1 getvelocity();
|
||||
return var_4 + var_7 * var_3 * var_6;
|
||||
}
|
||||
|
||||
can_spit_gas_cloud()
|
||||
{
|
||||
if ( !self.gas_cloud_available )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( self.enemy ) && isdefined( self.enemy.no_gas_cloud_attack ) && self.enemy.no_gas_cloud_attack )
|
||||
return 0;
|
||||
|
||||
var_0 = ( gettime() - level.spitter_last_cloud_time ) * 0.001;
|
||||
return level.spitter_gas_cloud_count < 3 && var_0 > 3.33;
|
||||
}
|
||||
|
||||
spit_basic_projectile( var_0 )
|
||||
{
|
||||
var_1 = get_spit_fire_pos( var_0 );
|
||||
var_2 = magicbullet( "alienspit_mp", var_1, var_0, self );
|
||||
var_2.owner = self;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_2 thread spit_basic_projectile_impact_monitor( self );
|
||||
}
|
||||
|
||||
spit_basic_projectile_impact_monitor( var_0 )
|
||||
{
|
||||
self waittill( "explode", var_1 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return;
|
||||
|
||||
playfx( level._effect["spit_AOE_small"], var_1 + ( 0, 0, 8 ), ( 0, 0, 1 ), ( 1, 0, 0 ) );
|
||||
}
|
||||
|
||||
spit_gas_cloud_projectile( var_0 )
|
||||
{
|
||||
var_1 = get_spit_fire_pos( var_0 );
|
||||
var_2 = magicbullet( "alienspit_gas_mp", var_1, var_0, self );
|
||||
var_2.owner = self;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_2 thread spit_gas_cloud_projectile_impact_monitor( self );
|
||||
|
||||
thread gas_cloud_available_timer();
|
||||
}
|
||||
|
||||
gas_cloud_available_timer()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.gas_cloud_available = 0;
|
||||
var_0 = randomfloatrange( 10.0, 15.0 );
|
||||
wait( var_0 );
|
||||
self.gas_cloud_available = 1;
|
||||
}
|
||||
|
||||
spit_gas_cloud_projectile_impact_monitor( var_0 )
|
||||
{
|
||||
self waittill( "explode", var_1 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return;
|
||||
|
||||
var_2 = spawn( "trigger_radius", var_1, 0, 150, 128 );
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
return;
|
||||
|
||||
level.spitter_gas_cloud_count++;
|
||||
var_2.onplayer = 1;
|
||||
playfx( level._effect["spit_AOE"], var_1 + ( 0, 0, 8 ), ( 0, 0, 1 ), ( 1, 0, 0 ) );
|
||||
thread spit_aoe_cloud_damage( var_1, var_2 );
|
||||
level notify( "spitter_spit", var_1 );
|
||||
wait 10.0;
|
||||
var_2 delete();
|
||||
level.spitter_gas_cloud_count--;
|
||||
}
|
||||
|
||||
spit_aoe_cloud_damage( var_0, var_1 )
|
||||
{
|
||||
var_1 endon( "death" );
|
||||
wait 2.0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_1 waittill( "trigger", var_2 );
|
||||
|
||||
if ( !isplayer( var_2 ) )
|
||||
continue;
|
||||
|
||||
if ( !isalive( var_2 ) )
|
||||
continue;
|
||||
|
||||
disorient_player( var_2 );
|
||||
damage_player( var_2, var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
damage_player( var_0, var_1 )
|
||||
{
|
||||
var_2 = 0.5;
|
||||
var_3 = gettime();
|
||||
|
||||
if ( !isdefined( var_0.last_spitter_gas_damage_time ) )
|
||||
var_4 = var_2;
|
||||
else if ( var_0.last_spitter_gas_damage_time + var_2 * 1000.0 > var_3 )
|
||||
return;
|
||||
else
|
||||
var_4 = min( var_2, ( var_3 - var_0.last_spitter_gas_damage_time ) * 0.001 );
|
||||
|
||||
var_5 = var_0 maps\mp\alien\_perk_utility::perk_getgasdamagescalar();
|
||||
var_6 = int( 12.0 * var_4 * var_5 );
|
||||
|
||||
if ( var_6 > 0 )
|
||||
var_0 thread [[ level.callbackplayerdamage ]]( var_1, var_1, var_6, 0, "MOD_SUICIDE", "alienspit_gas_mp", var_1.origin, ( 0, 0, 0 ), "none", 0 );
|
||||
|
||||
var_0.last_spitter_gas_damage_time = var_3;
|
||||
}
|
||||
|
||||
disorient_player( var_0 )
|
||||
{
|
||||
if ( maps\mp\alien\_utility::is_chaos_mode() && var_0 maps\mp\alien\_perk_utility::perk_getgasdamagescalar() == 0 )
|
||||
return;
|
||||
else if ( !var_0 maps\mp\alien\_perk_utility::has_perk( "perk_medic", [ 1, 2, 3, 4 ] ) )
|
||||
{
|
||||
if ( isdefined( level.shell_shock_override ) )
|
||||
var_0 [[ level.shell_shock_override ]]( 0.5 );
|
||||
else
|
||||
var_0 shellshock( "alien_spitter_gas_cloud", 0.5 );
|
||||
}
|
||||
}
|
||||
|
||||
get_rl_toward( var_0 )
|
||||
{
|
||||
var_1 = vectortoangles( var_0.origin - self.origin );
|
||||
var_2 = anglestoright( var_1 );
|
||||
|
||||
if ( common_scripts\utility::cointoss() )
|
||||
var_2 = var_2 * -1;
|
||||
|
||||
return var_2;
|
||||
}
|
||||
|
||||
spitter_combat( var_0 )
|
||||
{
|
||||
self endon( "bad_path" );
|
||||
self endon( "death" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_1 = find_spitter_attack_node( self.enemy );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
move_to_spitter_attack_node( var_1 );
|
||||
spitter_attack( self.enemy );
|
||||
continue;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
release_spit_node()
|
||||
{
|
||||
if ( isdefined( self.current_spit_node ) )
|
||||
{
|
||||
self scragentrelinquishclaimednode( self.current_spit_node );
|
||||
self.current_spit_node.claimed = 0;
|
||||
self.current_spit_node = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
claim_spit_node( var_0 )
|
||||
{
|
||||
self.current_spit_node = var_0;
|
||||
var_0.claimed = 1;
|
||||
self scragentclaimnode( var_0 );
|
||||
}
|
||||
|
||||
move_to_spitter_attack_node( var_0 )
|
||||
{
|
||||
self endon( "player_proximity_during_move" );
|
||||
release_spit_node();
|
||||
claim_spit_node( var_0 );
|
||||
self scragentsetgoalnode( var_0 );
|
||||
self scragentsetgoalradius( 64 );
|
||||
thread enemy_proximity_during_move_monitor();
|
||||
self waittill( "goal_reached" );
|
||||
}
|
||||
|
||||
enemy_proximity_during_move_monitor()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "goal_reached" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_normal_upright( anglestoup( self.angles ) ) )
|
||||
continue;
|
||||
|
||||
if ( !maps\mp\agents\alien\_alien_think::melee_okay() )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.valid_moving_spit_attack_time ) && gettime() < self.valid_moving_spit_attack_time )
|
||||
continue;
|
||||
|
||||
var_0 = find_player_within_distance( 40000.0 );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
break;
|
||||
}
|
||||
|
||||
release_spit_node();
|
||||
self notify( "player_proximity_during_move" );
|
||||
self scragentsetgoalentity( var_0 );
|
||||
self scragentsetgoalradius( 2048.0 );
|
||||
self waittill( "goal_reached" );
|
||||
}
|
||||
|
||||
get_possible_spitter_attack_nodes( var_0 )
|
||||
{
|
||||
if ( maps\mp\alien\_utility::get_alien_type() == "seeder" )
|
||||
var_1 = getnodesinradius( var_0.origin, 768, 128, 512, "jump attack" );
|
||||
else
|
||||
var_1 = getnodesinradius( var_0.origin, 1000, 300, 512, "jump attack" );
|
||||
|
||||
var_2 = [];
|
||||
|
||||
foreach ( var_4 in var_1 )
|
||||
{
|
||||
if ( isdefined( var_4.claimed ) && var_4.claimed )
|
||||
continue;
|
||||
|
||||
var_2[var_2.size] = var_4;
|
||||
}
|
||||
|
||||
return var_2;
|
||||
}
|
||||
|
||||
is_pet()
|
||||
{
|
||||
return isdefined( self.pet ) && self.pet;
|
||||
}
|
||||
|
||||
get_current_possible_targets()
|
||||
{
|
||||
if ( is_pet() )
|
||||
return level.agentarray;
|
||||
else
|
||||
return level.players;
|
||||
}
|
||||
|
||||
find_spitter_attack_node( var_0 )
|
||||
{
|
||||
var_1 = [];
|
||||
|
||||
if ( is_escape_sequence_active() && isdefined( level.escape_spitter_target_node ) )
|
||||
{
|
||||
var_1 = get_possible_spitter_attack_nodes( level.escape_spitter_target_node );
|
||||
|
||||
if ( var_1.size > 0 )
|
||||
var_0 = level.escape_spitter_target_node;
|
||||
}
|
||||
|
||||
if ( var_1.size == 0 && isdefined( var_0 ) )
|
||||
var_1 = get_possible_spitter_attack_nodes( var_0 );
|
||||
|
||||
if ( var_1.size == 0 )
|
||||
{
|
||||
var_2 = get_current_possible_targets();
|
||||
|
||||
foreach ( var_4 in var_2 )
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( !isalive( var_4 ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_0 ) && var_4 == var_0 )
|
||||
continue;
|
||||
|
||||
var_1 = get_possible_spitter_attack_nodes( var_4 );
|
||||
|
||||
if ( var_1.size > 0 )
|
||||
{
|
||||
var_0 = var_4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_1.size == 0 )
|
||||
var_1 = get_possible_spitter_attack_nodes( self );
|
||||
|
||||
if ( var_1.size == 0 )
|
||||
return undefined;
|
||||
|
||||
var_6 = [];
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_6["dist_from_enemy_weight"] = 8.0;
|
||||
var_6["enemy_los_weight"] = 6.0;
|
||||
var_6["height_weight"] = 4.0;
|
||||
var_7 = get_rl_toward( var_0 );
|
||||
var_0 endon( "death" );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_6["dist_from_enemy_weight"] = 0.0;
|
||||
var_6["enemy_los_weight"] = 0.0;
|
||||
var_6["height_weight"] = 0.0;
|
||||
var_7 = get_central_enemies_direction();
|
||||
}
|
||||
|
||||
var_6["direction"] = "override";
|
||||
var_6["direction_override"] = var_7;
|
||||
var_6["direction_weight"] = 1.0;
|
||||
var_6["min_height"] = 64.0;
|
||||
var_6["max_height"] = 400.0;
|
||||
var_6["enemy_los"] = 1;
|
||||
var_6["min_dist_from_enemy"] = 300.0;
|
||||
var_6["max_dist_from_enemy"] = 800.0;
|
||||
var_6["desired_dist_from_enemy"] = 600.0;
|
||||
var_6["min_dist_from_all_enemies"] = 300.0;
|
||||
var_6["min_dist_from_all_enemies_weight"] = 5.0;
|
||||
var_6["not_recently_used_weight"] = 10.0;
|
||||
var_6["recently_used_time_limit"] = 30.0;
|
||||
var_6["random_weight"] = 1.0;
|
||||
var_8 = maps\mp\agents\alien\_alien_think::get_retreat_node_rated( var_0, var_6, var_1 );
|
||||
return var_8;
|
||||
}
|
||||
|
||||
get_central_enemies_direction()
|
||||
{
|
||||
var_0 = get_current_possible_targets();
|
||||
|
||||
if ( var_0.size == 0 )
|
||||
return self.origin + anglestoforward( self.angles ) * 100;
|
||||
|
||||
var_1 = ( 0, 0, 0 );
|
||||
|
||||
foreach ( var_3 in var_0 )
|
||||
var_1 = var_1 + var_3.origin;
|
||||
|
||||
var_1 = var_1 / var_0.size;
|
||||
return var_1 - self.origin;
|
||||
}
|
||||
|
||||
spitter_attack( var_0 )
|
||||
{
|
||||
self endon( "spitter_node_move_requested" );
|
||||
|
||||
if ( !isdefined( self.current_spit_node ) )
|
||||
{
|
||||
choose_spit_type( "close_range" );
|
||||
spit_projectile( var_0 );
|
||||
self.valid_moving_spit_attack_time = gettime() + randomfloatrange( 1.5, 3.0 ) * 1000.0;
|
||||
return;
|
||||
}
|
||||
|
||||
set_up_attack_node_watchers();
|
||||
|
||||
if ( !is_escape_sequence_active() )
|
||||
wait( randomfloatrange( 1.5, 3.0 ) * 0.5 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_1 = undefined;
|
||||
var_2 = 0.0;
|
||||
|
||||
while ( !isdefined( var_1 ) )
|
||||
{
|
||||
var_2 = var_2 + 0.2;
|
||||
|
||||
if ( var_2 >= 1.0 )
|
||||
return;
|
||||
|
||||
wait 0.2;
|
||||
|
||||
if ( isdefined( var_0 ) && isdefined( var_0.code_classname ) && var_0.code_classname == "script_vehicle" )
|
||||
{
|
||||
var_1 = var_0;
|
||||
continue;
|
||||
}
|
||||
|
||||
var_1 = get_best_spit_target( var_0 );
|
||||
}
|
||||
|
||||
choose_spit_type( "long_range" );
|
||||
spit_projectile( var_1 );
|
||||
wait( randomfloatrange( 1.5, 3.0 ) );
|
||||
}
|
||||
}
|
||||
|
||||
choose_spit_type( var_0 )
|
||||
{
|
||||
if ( !is_pet() && can_spit_gas_cloud() )
|
||||
self.spit_type = "gas_cloud";
|
||||
else
|
||||
self.spit_type = var_0;
|
||||
}
|
||||
|
||||
set_up_attack_node_watchers()
|
||||
{
|
||||
thread spitter_node_duration_monitor( 10 );
|
||||
thread spitter_node_attacked_monitor( 0.1 );
|
||||
|
||||
if ( !is_pet() )
|
||||
thread spitter_node_player_proximity( 90000.0 );
|
||||
}
|
||||
|
||||
spitter_node_duration_monitor( var_0 )
|
||||
{
|
||||
self endon( "spitter_node_move_requested" );
|
||||
self endon( "death" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
wait( var_0 );
|
||||
self notify( "spitter_node_move_requested" );
|
||||
}
|
||||
|
||||
spitter_node_attacked_monitor( var_0 )
|
||||
{
|
||||
self endon( "spitter_node_move_requested" );
|
||||
self endon( "death" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
self waittill( "damage" );
|
||||
wait( var_0 );
|
||||
self notify( "spitter_node_move_requested" );
|
||||
}
|
||||
|
||||
spitter_node_player_proximity( var_0 )
|
||||
{
|
||||
self endon( "spitter_node_move_requested" );
|
||||
self endon( "death" );
|
||||
self endon( "alien_main_loop_restart" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_1 = find_player_within_distance( var_0 );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
break;
|
||||
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
self notify( "spitter_node_move_requested" );
|
||||
}
|
||||
|
||||
find_player_within_distance( var_0 )
|
||||
{
|
||||
foreach ( var_2 in level.players )
|
||||
{
|
||||
if ( !isalive( var_2 ) )
|
||||
continue;
|
||||
|
||||
var_3 = distance2dsquared( self.origin, var_2.origin );
|
||||
|
||||
if ( var_3 < var_0 )
|
||||
return var_2;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
2490
maps/mp/agents/alien/_alien_think.gsc
Normal file
2490
maps/mp/agents/alien/_alien_think.gsc
Normal file
File diff suppressed because it is too large
Load Diff
583
maps/mp/agents/alien/_alien_traverse.gsc
Normal file
583
maps/mp/agents/alien/_alien_traverse.gsc
Normal file
@ -0,0 +1,583 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self.blockgoalpos = 1;
|
||||
var_0 = self getnegotiationstartnode();
|
||||
var_1 = self getnegotiationendnode();
|
||||
|
||||
if ( var_0.type == "Jump" || var_0.type == "Jump Attack" )
|
||||
{
|
||||
var_2 = self getnegotiationnextnode();
|
||||
|
||||
if ( isdefined( var_0.target ) && isdefined( var_1.targetname ) && var_0.target == var_1.targetname )
|
||||
{
|
||||
self.traversetype = "canned";
|
||||
dotraverse( var_0, var_1 );
|
||||
return;
|
||||
}
|
||||
|
||||
var_3 = find_attackable_enemy_at_node( var_1 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
self.traversetype = "jump_attack";
|
||||
self.leapendpos = var_1.origin;
|
||||
maps\mp\agents\alien\_alien_melee::melee_leap( var_3 );
|
||||
return;
|
||||
}
|
||||
|
||||
self.traversetype = "jump";
|
||||
jump( var_0, var_1, var_2 );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.traversetype = "canned";
|
||||
dotraverse( var_0, var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
find_attackable_enemy_at_node( var_0 )
|
||||
{
|
||||
if ( maps\mp\alien\_utility::get_alien_type() == "spitter" || maps\mp\alien\_utility::get_alien_type() == "seeder" )
|
||||
return undefined;
|
||||
|
||||
var_1 = 16384;
|
||||
var_2 = 0.707;
|
||||
|
||||
foreach ( var_4 in level.players )
|
||||
{
|
||||
if ( distancesquared( var_4.origin, var_0.origin ) > var_1 )
|
||||
continue;
|
||||
|
||||
var_5 = vectornormalize( var_0.origin - var_4.origin );
|
||||
var_6 = anglestoforward( var_4.angles );
|
||||
var_7 = vectordot( var_5, var_6 );
|
||||
|
||||
if ( var_7 > var_2 )
|
||||
return var_4;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
|
||||
if ( self.traversetype == "jump" )
|
||||
self.previousanimstate = "traverse_jump";
|
||||
else if ( self.traversetype == "jump_attack" )
|
||||
self.previousanimstate = "traverse_jump_attack";
|
||||
else
|
||||
self.previousanimstate = "traverse_canned";
|
||||
|
||||
self.traversetype = undefined;
|
||||
}
|
||||
|
||||
jump( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = undefined;
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
var_3 = var_2.origin;
|
||||
|
||||
if ( isdefined( level.dlc_alien_jump_override ) )
|
||||
{
|
||||
[[ level.dlc_alien_jump_override ]]( var_0, var_1, var_2, var_3 );
|
||||
return;
|
||||
}
|
||||
|
||||
maps\mp\agents\alien\_alien_jump::jump( var_0.origin, var_0.angles, var_1.origin, var_1.angles, var_3, undefined, var_1.script_noteworthy );
|
||||
}
|
||||
|
||||
dotraverse( var_0, var_1 )
|
||||
{
|
||||
var_2 = level.alienanimdata.cannedtraverseanims[var_0.animscript];
|
||||
var_3 = var_2["animState"];
|
||||
self.startnode = var_0;
|
||||
self.endnode = var_1;
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetorientmode( "face angle abs", var_0.angles );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
|
||||
if ( isdefined( var_2["traverseSound"] ) )
|
||||
thread maps\mp\_utility::play_sound_on_tag( var_2["traverseSound"] );
|
||||
|
||||
if ( isdefined( var_2["traverseAnimScale"] ) )
|
||||
self scragentsetanimscale( var_2["traverseAnimScale"], var_2["traverseAnimScale"] );
|
||||
|
||||
switch ( var_3 )
|
||||
{
|
||||
case "traverse_climb_up":
|
||||
alienclimbup( var_0, var_1, "traverse_climb_up", self getanimentry( "traverse_climb_up", 4 ) );
|
||||
break;
|
||||
case "traverse_climb_up_over_56":
|
||||
alienclimbup( var_0, var_1, "traverse_climb_up_over_56" );
|
||||
break;
|
||||
case "traverse_climb_up_ledge_18_run":
|
||||
alienclimbup( var_0, var_1, "traverse_climb_up_ledge_18_run" );
|
||||
break;
|
||||
case "traverse_climb_up_ledge_18_idle":
|
||||
alienclimbup( var_0, var_1, "traverse_climb_up_ledge_18_idle" );
|
||||
break;
|
||||
case "climb_up_end_jump_side_l":
|
||||
alienclimbup( var_0, var_1, "climb_up_end_jump_side_l" );
|
||||
break;
|
||||
case "climb_up_end_jump_side_r":
|
||||
alienclimbup( var_0, var_1, "climb_up_end_jump_side_r" );
|
||||
break;
|
||||
case "traverse_climb_down":
|
||||
alienclimbdown( var_0, var_1, "traverse_climb_down" );
|
||||
break;
|
||||
case "traverse_climb_over_56_down":
|
||||
alienclimbdown( var_0, var_1, "traverse_climb_over_56_down" );
|
||||
break;
|
||||
case "run":
|
||||
alienwallrun( var_0, var_1, "run" );
|
||||
break;
|
||||
default:
|
||||
alienregulartraversal( var_0, var_3, var_2["animIndexArray"], var_2["endInOriented"], var_2["flexHeightEndAtTraverseEnd"] );
|
||||
break;
|
||||
}
|
||||
|
||||
self.startnode = undefined;
|
||||
self.endnode = undefined;
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
}
|
||||
|
||||
alienregulartraversal( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = var_2[randomint( var_2.size )];
|
||||
var_6 = self getanimentry( var_1, var_5 );
|
||||
var_7 = needflexibleheightsupport( var_6 );
|
||||
var_8 = getanimlength( var_6 );
|
||||
traverseanimlerp( var_6, var_0 );
|
||||
|
||||
if ( animhasnotetrack( var_6, "highest_point" ) )
|
||||
self.apextraversaldeathvector = vectornormalize( self.startnode.origin - self.endnode.origin );
|
||||
|
||||
var_9 = getent( var_0.target, "targetname" );
|
||||
|
||||
if ( isdefined( var_9 ) )
|
||||
var_9 thread runscriptabletraverse( var_8 );
|
||||
|
||||
if ( var_7.need_support )
|
||||
dotraversalwithflexibleheight( var_1, var_5, var_6, var_7.start_notetrack, var_7.end_notetrack, var_4, ::alientraversenotetrackhandler );
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, var_5, "canned_traverse", "end", ::alientraversenotetrackhandler );
|
||||
|
||||
endregulartraversal( var_3 );
|
||||
}
|
||||
|
||||
runscriptabletraverse( var_0 )
|
||||
{
|
||||
self notify( "stop_previous_traversal" );
|
||||
self endon( "stop_previous_traversal" );
|
||||
self setscriptablepartstate( 0, 1 );
|
||||
wait( var_0 );
|
||||
self setscriptablepartstate( 0, 0 );
|
||||
}
|
||||
|
||||
endregulartraversal( var_0 )
|
||||
{
|
||||
if ( var_0 )
|
||||
{
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self.oriented = 1;
|
||||
self.ignoreme = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self.oriented = 0;
|
||||
self.ignoreme = 0;
|
||||
}
|
||||
}
|
||||
|
||||
needflexibleheightsupport( var_0 )
|
||||
{
|
||||
var_1 = spawnstruct();
|
||||
|
||||
if ( animhasnotetrack( var_0, "traverse_up" ) )
|
||||
{
|
||||
var_1.need_support = 1;
|
||||
var_1.start_notetrack = "traverse_up";
|
||||
var_1.end_notetrack = "traverse_up_end";
|
||||
return var_1;
|
||||
}
|
||||
|
||||
if ( animhasnotetrack( var_0, "traverse_drop" ) )
|
||||
{
|
||||
var_1.need_support = 1;
|
||||
var_1.start_notetrack = "traverse_drop";
|
||||
var_1.end_notetrack = "traverse_drop_end";
|
||||
return var_1;
|
||||
}
|
||||
|
||||
var_1.need_support = 0;
|
||||
return var_1;
|
||||
}
|
||||
|
||||
dotraversalwithflexibleheight( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
||||
{
|
||||
var_7 = "canned_traverse";
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_1, var_7, var_3, var_6 );
|
||||
|
||||
if ( var_5 )
|
||||
{
|
||||
var_8 = self.endnode.origin;
|
||||
var_9 = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_8 = common_scripts\utility::getstruct( self.endnode.target, "targetname" );
|
||||
var_8 = var_8.origin;
|
||||
var_10 = getnotetracktimes( var_2, "highest_point" );
|
||||
var_9 = var_10[0];
|
||||
}
|
||||
|
||||
dotraversalwithflexibleheight_internal( var_0, var_1, var_7, var_2, var_3, var_4, var_8, var_9, var_6 );
|
||||
}
|
||||
|
||||
dotraversalwithflexibleheight_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
var_9 = abs( self.origin[2] - var_6[2] );
|
||||
var_10 = getnotetracktimes( var_3, var_4 );
|
||||
var_11 = var_10[0];
|
||||
var_12 = getnotetracktimes( var_3, var_5 );
|
||||
var_13 = var_12[0];
|
||||
var_14 = getmovedelta( var_3, var_11, var_7 );
|
||||
var_15 = abs( var_14[2] );
|
||||
var_16 = getmovedelta( var_3, var_11, var_13 );
|
||||
var_17 = abs( var_16[2] );
|
||||
var_18 = var_15 - var_17;
|
||||
|
||||
if ( var_9 <= var_18 )
|
||||
var_19 = 1;
|
||||
else
|
||||
var_19 = ( var_9 - var_18 ) / var_17;
|
||||
|
||||
var_20 = 1 / var_19;
|
||||
self scragentsetanimscale( 1.0, var_19 );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, var_20, var_2, var_5, var_8 );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_1, var_2, "end", var_8 );
|
||||
self.apextraversaldeathvector = undefined;
|
||||
}
|
||||
|
||||
alientraversenotetrackhandler( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "apply_physics":
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
break;
|
||||
case "highest_point":
|
||||
if ( isdefined( self.apextraversaldeathvector ) )
|
||||
self.apextraversaldeathvector = self.apextraversaldeathvector * -1;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
alienclimbup( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = self getanimentry( var_2, 0 );
|
||||
var_5 = self getanimentry( var_2, 1 );
|
||||
var_6 = self getanimentry( var_2, 2 );
|
||||
var_7 = self getanimentry( var_2, 3 );
|
||||
var_8 = var_1.origin[2] - var_0.origin[2];
|
||||
var_9 = getmovedelta( var_4, 0, 1 )[2];
|
||||
var_10 = getmovedelta( var_5, 0, 1 )[2];
|
||||
var_11 = getmovedelta( var_6, 0, 1 )[2];
|
||||
var_12 = getmovedelta( var_7, 0, 1 )[2];
|
||||
var_13 = undefined;
|
||||
var_14 = getnotetracktimes( var_4, "climb_up_teleport" )[0];
|
||||
var_15 = getmovedelta( var_4, 0, var_14 );
|
||||
var_16 = getmovedelta( var_4, var_14, 1 );
|
||||
var_17 = var_16[2];
|
||||
|
||||
if ( var_8 < var_9 + var_12 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
var_18 = var_8 - ( var_9 + var_12 );
|
||||
var_19 = 0;
|
||||
var_20 = 0;
|
||||
|
||||
if ( var_18 > 0 )
|
||||
{
|
||||
var_19 = var_18 - var_10 > 0;
|
||||
var_20 = max( 0, floor( ( var_18 - var_19 * var_10 ) / var_11 ) );
|
||||
}
|
||||
|
||||
var_21 = var_19 * var_10 + var_20 * var_11 + var_17;
|
||||
var_22 = var_8 - var_12 - ( var_9 - var_17 );
|
||||
var_23 = var_22 / var_21;
|
||||
var_24 = 0;
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_13 = getmovedelta( var_3, 0, 1 )[2];
|
||||
var_25 = var_13 - var_12;
|
||||
var_24 = var_22 - var_21 > var_25;
|
||||
var_23 = ( var_22 - var_24 * var_25 ) / var_21;
|
||||
}
|
||||
|
||||
var_26 = var_7;
|
||||
|
||||
if ( var_24 )
|
||||
var_26 = var_3;
|
||||
|
||||
var_27 = getnotetracktimes( var_26, "stop_teleport" )[0];
|
||||
var_28 = getmovedelta( var_26, 0, var_27 )[2];
|
||||
var_29 = getmovedelta( var_26, var_27, 1 );
|
||||
var_30 = length( var_29 * ( 1, 1, 0 ) );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
traverseclimbuplerp( var_4, var_0 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "canned_traverse", "climb_up_teleport" );
|
||||
self scragentsetanimscale( 1, var_23 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "canned_traverse", "end" );
|
||||
self scragentsetanimscale( 1, var_23 );
|
||||
|
||||
if ( var_19 )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 1, "canned_traverse", "finish" );
|
||||
|
||||
for ( var_31 = 0; var_31 < var_20; var_31++ )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 2, "canned_traverse", "end" );
|
||||
|
||||
var_32 = var_1.origin[2] - self.origin[2] - var_29[2];
|
||||
var_23 = 1.0;
|
||||
|
||||
if ( var_32 > var_28 )
|
||||
var_23 = var_32 / var_28;
|
||||
|
||||
self scragentsetanimscale( 1, var_23 );
|
||||
|
||||
if ( var_24 )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 4, "canned_traverse", "stop_teleport", ::alientraversenotetrackhandler );
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 3, "canned_traverse", "stop_teleport", ::alientraversenotetrackhandler );
|
||||
|
||||
var_33 = distance2d( self.origin, var_1.origin );
|
||||
var_34 = var_33 / var_30;
|
||||
self scragentsetanimscale( var_34, 1 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "canned_traverse", "end" );
|
||||
}
|
||||
|
||||
alienclimbdown( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = self getanimentry( var_2, 0 );
|
||||
var_4 = self getanimentry( var_2, 1 );
|
||||
var_5 = self getanimentry( var_2, 2 );
|
||||
var_6 = self getanimentry( var_2, 3 );
|
||||
var_7 = self getanimentry( var_2, 4 );
|
||||
var_8 = var_0.origin[2] - var_1.origin[2];
|
||||
var_9 = -1 * getmovedelta( var_3, 0, 1 )[2];
|
||||
var_10 = -1 * getmovedelta( var_5, 0, 1 )[2];
|
||||
var_11 = -1 * getmovedelta( var_4, 0, 1 )[2];
|
||||
var_12 = -1 * getmovedelta( var_6, 0, 1 )[2];
|
||||
var_13 = -1 * getmovedelta( var_7, 0, 1 )[2];
|
||||
|
||||
if ( var_8 < var_9 + var_12 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
var_14 = var_6;
|
||||
var_15 = var_12;
|
||||
var_16 = 0;
|
||||
|
||||
if ( candojumpforend( var_0, var_1, var_3, var_7 ) )
|
||||
{
|
||||
var_14 = var_7;
|
||||
var_15 = var_13;
|
||||
var_16 = 1;
|
||||
}
|
||||
|
||||
var_17 = var_8 - ( var_9 + var_15 );
|
||||
var_18 = 0;
|
||||
var_19 = 0;
|
||||
|
||||
if ( var_17 > 0 )
|
||||
{
|
||||
var_18 = var_17 - var_10 > 0;
|
||||
var_19 = max( 0, floor( ( var_17 - var_18 * var_10 ) / var_11 ) );
|
||||
}
|
||||
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
traverseclimbdownlerp( var_3, var_0 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "canned_traverse", "end" );
|
||||
var_20 = var_18 * var_10 + var_19 * var_11;
|
||||
|
||||
if ( var_20 > 0 )
|
||||
{
|
||||
var_21 = abs( var_17 / var_20 );
|
||||
self scragentsetanimscale( 1, var_21 );
|
||||
}
|
||||
|
||||
for ( var_22 = 0; var_22 < var_19; var_22++ )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "traverse_climb_down_loop", 0, "traverse_climb_down_loop", "end" );
|
||||
|
||||
if ( var_18 )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "traverse_climb_down_slide", 0, "traverse_climb_down_slide", "end" );
|
||||
|
||||
var_23 = getnotetracktimes( var_14, "climb_down_teleport" )[0];
|
||||
var_24 = getnotetracktimes( var_14, "stop_teleport" )[0];
|
||||
var_25 = -1 * getmovedelta( var_14, var_23, var_24 )[2];
|
||||
var_26 = abs( self.origin[2] - var_1.origin[2] - abs( getmovedelta( var_14, var_24, 1 )[2] ) );
|
||||
var_21 = var_26 / var_25;
|
||||
self scragentsetanimscale( 1, var_21 );
|
||||
|
||||
if ( var_16 )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 4, "canned_traverse", "stop_teleport" );
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 3, "canned_traverse", "stop_teleport" );
|
||||
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "canned_traverse", "end" );
|
||||
}
|
||||
|
||||
traverseanimlerp( var_0, var_1 )
|
||||
{
|
||||
var_2 = maps\mp\agents\alien\_alien_anim_utils::getlerptime( var_0 );
|
||||
var_3 = maps\mp\agents\alien\_alien_anim_utils::getposinspaceatanimtime( var_0, var_1.origin, var_1.angles, var_2 );
|
||||
thread maps\mp\agents\alien\_alien_anim_utils::dolerp( var_3, var_2 );
|
||||
}
|
||||
|
||||
traverseclimbdownlerp( var_0, var_1 )
|
||||
{
|
||||
var_2 = -30;
|
||||
var_3 = 60;
|
||||
dotraverseclimblerp( var_0, var_1, var_2, var_3, 1 );
|
||||
}
|
||||
|
||||
traverseclimbuplerp( var_0, var_1 )
|
||||
{
|
||||
var_2 = 0;
|
||||
var_3 = 50;
|
||||
dotraverseclimblerp( var_0, var_1, var_2, var_3, 0 );
|
||||
}
|
||||
|
||||
dotraverseclimblerp( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = maps\mp\agents\alien\_alien_anim_utils::getlerptime( var_0 );
|
||||
var_6 = maps\mp\agents\alien\_alien_anim_utils::getposinspaceatanimtime( var_0, var_1.origin, var_1.angles, var_5 );
|
||||
|
||||
if ( var_4 )
|
||||
var_7 = ( var_6 - var_1.origin ) * ( 1, 1, 0 );
|
||||
else
|
||||
var_7 = ( var_1.origin - var_6 ) * ( 1, 1, 0 );
|
||||
|
||||
var_8 = vectornormalize( var_7 );
|
||||
var_8 = var_8 * var_3;
|
||||
var_9 = maps\mp\agents\alien\_alien_anim_utils::getposinspaceatanimtime( var_0, var_1.origin, var_1.angles, getanimlength( var_0 ) );
|
||||
var_10 = aligntoverticaledge( var_9, var_2, var_8 );
|
||||
var_11 = var_10 - var_9;
|
||||
var_6 = var_6 + var_11;
|
||||
thread maps\mp\agents\alien\_alien_anim_utils::dolerp( var_6, var_5 );
|
||||
}
|
||||
|
||||
aligntoverticaledge( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = 3.0;
|
||||
var_0 = var_0 + var_2;
|
||||
var_0 = var_0 + ( 0, 0, var_1 );
|
||||
var_4 = var_0 - var_2 * var_3;
|
||||
var_5 = bullettrace( var_0, var_4, 0 );
|
||||
var_0 = var_5["position"];
|
||||
var_0 = var_0 + ( 0, 0, -1 * var_1 );
|
||||
return var_0;
|
||||
}
|
||||
|
||||
candojumpforend( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = 10;
|
||||
var_5 = ( 0, 0, 10 );
|
||||
var_6 = 5;
|
||||
var_7 = self.height;
|
||||
var_8 = getmovedelta( var_2, 0, 1 );
|
||||
var_9 = length2d( var_8 );
|
||||
var_10 = var_8[2] * -1;
|
||||
var_11 = getmovedelta( var_3, 0, 1 );
|
||||
var_12 = length2d( var_11 );
|
||||
var_13 = var_11[2] * -1;
|
||||
var_14 = vectornormalize( ( var_1.origin - var_0.origin ) * ( 1, 1, 0 ) );
|
||||
var_15 = var_0.origin + var_14 * var_9 - ( 0, 0, var_10 );
|
||||
var_16 = physicstrace( var_15, var_15 + ( 0, 0, -2000 ) );
|
||||
var_17 = var_15 - var_16[2];
|
||||
|
||||
if ( var_17 < var_13 )
|
||||
return 0;
|
||||
|
||||
var_18 = var_16 + ( 0, 0, var_13 );
|
||||
var_19 = var_16 + var_14 * var_12;
|
||||
var_20 = var_18 + var_14 * var_4;
|
||||
var_21 = var_19 + var_5;
|
||||
return self aiphysicstracepassed( var_20, var_21, var_6, var_7, 0 );
|
||||
}
|
||||
|
||||
alienwallrun( var_0, var_1, var_2 )
|
||||
{
|
||||
self.oriented = 1;
|
||||
var_3 = var_1.origin - var_0.origin;
|
||||
var_4 = anglestoup( var_1.angles );
|
||||
var_5 = vectornormalize( var_3 );
|
||||
var_6 = vectorcross( var_4, var_5 );
|
||||
var_5 = vectorcross( var_6, var_4 );
|
||||
var_7 = ( 0, 0, 0 ) - var_6;
|
||||
var_8 = axistoangles( var_5, var_7, var_4 );
|
||||
self scragentsetorientmode( "face angle abs", var_8 );
|
||||
var_9 = self getanimentry( var_2, 0 );
|
||||
var_10 = getanimlength( var_9 );
|
||||
var_11 = getmovedelta( var_9 );
|
||||
var_12 = length( var_11 );
|
||||
var_13 = length( var_1.origin - self.origin );
|
||||
var_14 = var_10 * ( var_13 / var_12 );
|
||||
self scragentdoanimlerp( self.origin, var_1.origin, var_14 );
|
||||
self setanimstate( var_2, 0 );
|
||||
wait( var_14 );
|
||||
alienwallrun_waitforangles( var_8 );
|
||||
}
|
||||
|
||||
alienwallrun_anglesalmostequal( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( abs( angleclamp180( var_1[0] - var_0[0] ) > var_2 ) )
|
||||
return 0;
|
||||
|
||||
if ( abs( angleclamp180( var_1[1] - var_0[1] ) > var_2 ) )
|
||||
return 0;
|
||||
|
||||
if ( abs( angleclamp180( var_1[2] - var_0[2] ) > var_2 ) )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
alienwallrun_waitforangles( var_0 )
|
||||
{
|
||||
var_1 = 360;
|
||||
|
||||
for ( var_2 = 0.5; var_2 > 0; var_2 = var_2 - 0.05 )
|
||||
{
|
||||
if ( alienwallrun_anglesalmostequal( self.angles, var_0, 1 ) )
|
||||
break;
|
||||
|
||||
var_3 = anglesdelta( var_0, self.angles );
|
||||
|
||||
if ( var_3 < 5 || var_3 >= var_1 )
|
||||
break;
|
||||
|
||||
var_1 = var_3;
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
726
maps/mp/agents/alien/alien_ancestor/_alien_ancestor.gsc
Normal file
726
maps/mp/agents/alien/alien_ancestor/_alien_ancestor.gsc
Normal file
@ -0,0 +1,726 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
level.agent_funcs["ancestor"] = [];
|
||||
level.agent_funcs["ancestor"]["spawn"] = ::onspawn;
|
||||
level.agent_funcs["ancestor"]["on_killed"] = ::onkilled;
|
||||
level.agent_funcs["ancestor"]["on_damaged"] = ::ondamaged;
|
||||
level.agent_funcs["ancestor"]["on_damaged_finished"] = ::ondamagedfinished;
|
||||
level.custom_alien_attribute_table_init = ::init_attributes;
|
||||
level.drop_ims_when_grabbed_func = ::drop_ims_when_grabbed;
|
||||
level.shield_down_extension_dur = [ 5, 3, 2 ];
|
||||
load_ancestor_fx();
|
||||
|
||||
if ( !isdefined( level.active_ancestors ) )
|
||||
level.active_ancestors = [];
|
||||
}
|
||||
|
||||
init_attributes()
|
||||
{
|
||||
var_0 = "ancestor";
|
||||
level.alien_types[var_0] = spawnstruct();
|
||||
level.alien_types[var_0].attributes = [];
|
||||
level.alien_types[var_0].attributes["emissive"] = getdefinitionvalue( 21.0 );
|
||||
level.alien_types[var_0].attributes["max_emissive"] = getdefinitionvalue( 22.0 );
|
||||
level.alien_types[var_0].attributes["view_height"] = getdefinitionvalue( 23 );
|
||||
level.alien_types[var_0].attributes["anim_scale"] = getdefinitionvalue( 20.0 );
|
||||
level.alien_types[var_0].attributes["model"] = getdefinitionvalue( "2" );
|
||||
level.alien_types[var_0].attributes["starting_health"] = getdefinitionvalue( 24 );
|
||||
level.alien_types[var_0].attributes["health_scalar_1p"] = getdefinitionvalue( 70.0 );
|
||||
level.alien_types[var_0].attributes["health_scalar_2p"] = getdefinitionvalue( 71.0 );
|
||||
level.alien_types[var_0].attributes["health_scalar_3p"] = getdefinitionvalue( 72.0 );
|
||||
level.alien_types[var_0].attributes["attacker_difficulty"] = getdefinitionvalue( 80 );
|
||||
level.alien_types[var_0].attributes["min_cumulative_pain_threshold"] = getdefinitionvalue( 81 );
|
||||
level.alien_types[var_0].attributes["min_cumulative_pain_buffer_time"] = getdefinitionvalue( 82.0 );
|
||||
level.alien_types[var_0].attributes["pain_interval"] = getdefinitionvalue( 83.0 );
|
||||
}
|
||||
|
||||
load_ancestor_fx()
|
||||
{
|
||||
level._effect["ancestor_shield"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_ff_01" );
|
||||
level._effect["ancestor_shield_collapse"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_ff_collapse_01" );
|
||||
level._effect["ancestor_shield_raise"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_ff_raise_01" );
|
||||
level._effect["ancestor_hover"] = loadfx( "vfx/gameplay/alien/vfx_alien_anc_hover" );
|
||||
level._effect["ancestor_choke_ring"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_ring" );
|
||||
level._effect["ancestor_choke_grab"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_grab" );
|
||||
level._effect["ancestor_death_nuke"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancestor_blast_child_01" );
|
||||
level._effect["blackhole_exp"] = loadfx( "vfx/gameplay/alien/vfx_alien_blackhole_exp" );
|
||||
level._effect["ancestor_choke_pv"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_pv_1" );
|
||||
level._effect["ancestor_choke_3pv"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_3p" );
|
||||
level._effect["ancestor_spawn_flash"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_spawn_flash" );
|
||||
}
|
||||
|
||||
getdefinitionvalue( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_1 ) )
|
||||
var_1 = 2;
|
||||
|
||||
var_2 = tablelookup( "mp/alien/alien_ancestor_definition.csv", 0, var_0, var_1 );
|
||||
|
||||
if ( !isstring( var_0 ) )
|
||||
{
|
||||
if ( !issubstr( var_2, "." ) )
|
||||
var_2 = int( var_2 );
|
||||
else
|
||||
var_2 = float( var_2 );
|
||||
}
|
||||
|
||||
return var_2;
|
||||
}
|
||||
|
||||
addancestoragent( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = maps\mp\agents\_agent_common::connectnewagent( "ancestor", var_0 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
var_3 thread [[ var_3 maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]( var_1, var_2 );
|
||||
|
||||
return var_3;
|
||||
}
|
||||
|
||||
onspawn( var_0, var_1 )
|
||||
{
|
||||
setancestormodel();
|
||||
self.onenteranimstate = ::onenterstate;
|
||||
self spawnagent( var_0, var_1, "alien_ancestor_last_animclass", 32, 120 );
|
||||
level notify( "spawned_agent", self );
|
||||
assignattributes();
|
||||
setscriptfields( var_0 );
|
||||
self scragentsetclipmode( "agent" );
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self scragentusemodelcollisionbounds();
|
||||
self takeallweapons();
|
||||
level.active_ancestors = common_scripts\utility::array_add( level.active_ancestors, self );
|
||||
level notify( "dlc_vo_notify", "last_vo", "ancestor_inbound" );
|
||||
thread ancestor_shield();
|
||||
thread ancestor_spawnfx();
|
||||
maps\mp\agents\alien\_alien_think::cleardamagehistory();
|
||||
thread maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::main();
|
||||
self.headicon = maps\mp\_entityheadicons::setheadicon( "allies", "waypoint_ancestor_health_10", ( 0, 0, 182 ), 10, 10, undefined, undefined, 0, 1, 0, 0 );
|
||||
}
|
||||
|
||||
setancestormodel()
|
||||
{
|
||||
var_0 = level.alien_types["ancestor"].attributes["model"];
|
||||
self setmodel( var_0 );
|
||||
self show();
|
||||
self motionblurhqenable();
|
||||
}
|
||||
|
||||
ancestor_spawnfx()
|
||||
{
|
||||
wait 0.1;
|
||||
playfxontag( level._effect["ancestor_spawn_flash"], self, "j_spinelower" );
|
||||
}
|
||||
|
||||
ancestor_shield()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
thread drop_shield_until_damaged();
|
||||
thread listen_for_shield_disable();
|
||||
self.shield_state = 1;
|
||||
self.shield_radius_sq = 50176;
|
||||
self.shield = spawn( "script_model", self.origin + ( 0, 0, 100 ) );
|
||||
self.shield setmodel( "alien_shield_bubble_ancestor_col" );
|
||||
self.shield linkto( self, "tag_origin", ( 0, 0, 100 ), ( -90, 0, 0 ) );
|
||||
thread listen_for_shield_damage();
|
||||
wait 1.0;
|
||||
self.shield_down_time_end = gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
raise_shield();
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_true( self.should_lower_shield ) && !maps\mp\alien\_utility::is_true( self.force_shield_down ) )
|
||||
self waittill( "lower_shield" );
|
||||
|
||||
self.shield_down_time_extension_cnt = 0;
|
||||
lower_shield();
|
||||
|
||||
while ( isdefined( self.shield_down_time_end ) && gettime() < self.shield_down_time_end || maps\mp\alien\_utility::is_true( self.force_shield_down ) )
|
||||
wait 0.05;
|
||||
|
||||
self.shield_down_time_end = undefined;
|
||||
self.shield_down_time_extension_cnt = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
listen_for_shield_damage()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
|
||||
if ( !isdefined( self.shield ) )
|
||||
return;
|
||||
|
||||
self.shield setcandamage( 1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self.shield waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
|
||||
if ( isdefined( var_9 ) && var_9 == "iw6_aliendlc42_mp" )
|
||||
{
|
||||
self notify( "ancestor_disable_shield_weapon" );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( var_9 ) && var_9 == "iw6_aliendlc43_mp" )
|
||||
self notify( "ancestor_disable_shield_grenade" );
|
||||
}
|
||||
}
|
||||
|
||||
raise_shield()
|
||||
{
|
||||
self.shield playsound( "anc_shield_up" );
|
||||
self.shield playloopsound( "anc_shield_lp" );
|
||||
self.shield_state = 2;
|
||||
self.shield show();
|
||||
self.shield solid();
|
||||
wait 0.1;
|
||||
playfxontag( level._effect["ancestor_shield_raise"], self.shield, "tag_origin" );
|
||||
wait 1;
|
||||
playfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
|
||||
wait 0.2;
|
||||
self.shield_state = 1;
|
||||
}
|
||||
|
||||
lower_shield()
|
||||
{
|
||||
self.shield stoploopsound( "anc_shield_lp" );
|
||||
self.shield playsound( "anc_shield_down" );
|
||||
self.shield_state = 3;
|
||||
stopfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
|
||||
playfxontag( level._effect["ancestor_shield_collapse"], self.shield, "tag_origin" );
|
||||
self.shield notsolid();
|
||||
wait 0.2;
|
||||
self.shield hide();
|
||||
self.shield_state = 0;
|
||||
level notify( "dlc_vo_notify", "ancestor_shield_down" );
|
||||
self.should_lower_shield = 0;
|
||||
}
|
||||
|
||||
listen_for_shield_disable()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 = common_scripts\utility::waittill_any_return( "ancestor_disable_shield_weapon", "ancestor_disable_shield_grenade", "ancestor_disable_shield_blast", "ancestor_disable_shield_grab" );
|
||||
var_1 = 0;
|
||||
|
||||
if ( var_0 == "ancestor_disable_shield_weapon" )
|
||||
var_1 = 7;
|
||||
else if ( var_0 == "ancestor_disable_shield_grenade" )
|
||||
var_1 = 9;
|
||||
else if ( var_0 == "ancestor_disable_shield_blast" )
|
||||
var_1 = 1.8;
|
||||
else if ( var_0 == "ancestor_disable_shield_grab" )
|
||||
var_1 = 1.8;
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_true( self.force_shield_down ) && ( var_0 == "ancestor_disable_shield_blast" || var_0 == "ancestor_disable_shield_grab" ) )
|
||||
continue;
|
||||
|
||||
if ( self.shield_state == 1 || self.shield_state == 2 )
|
||||
self.should_lower_shield = 1;
|
||||
|
||||
var_2 = int( gettime() + var_1 * 1000 );
|
||||
|
||||
if ( !isdefined( self.shield_down_time_end ) || var_2 > self.shield_down_time_end )
|
||||
self.shield_down_time_end = var_2;
|
||||
|
||||
self notify( "lower_shield" );
|
||||
}
|
||||
}
|
||||
|
||||
drop_shield_until_damaged()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
var_0 = 0.15;
|
||||
var_1 = ( self.maxhealth - 20000 ) * var_0;
|
||||
var_2 = 20;
|
||||
|
||||
if ( isdefined( level.ancestor_shield_up_override ) )
|
||||
var_2 = level.ancestor_shield_up_override;
|
||||
|
||||
wait 5;
|
||||
self.force_shield_down = 1;
|
||||
var_3 = self.health;
|
||||
var_4 = var_3 - var_1;
|
||||
self notify( "lower_shield" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage" );
|
||||
var_3 = self.health;
|
||||
|
||||
if ( var_3 > var_4 )
|
||||
continue;
|
||||
|
||||
var_4 = var_3 - var_1;
|
||||
self.force_shield_down = 0;
|
||||
wait( var_2 );
|
||||
self notify( "lower_shield" );
|
||||
self.force_shield_down = 1;
|
||||
}
|
||||
}
|
||||
|
||||
ancestor_hover()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
wait 5;
|
||||
playfxontag( level._effect["ancestor_hover"], self, "j_mainroot" );
|
||||
}
|
||||
|
||||
isshieldup()
|
||||
{
|
||||
return isdefined( self.shield_state ) && self.shield_state == 1;
|
||||
}
|
||||
|
||||
isshielddown()
|
||||
{
|
||||
return isdefined( self.shield_state ) && self.shield_state == 0;
|
||||
}
|
||||
|
||||
extend_shield_down_time( var_0 )
|
||||
{
|
||||
if ( isshielddown() )
|
||||
{
|
||||
self.shield_down_time_extension_cnt++;
|
||||
|
||||
if ( !isdefined( self.shield_down_time_end ) )
|
||||
self.shield_down_time_end = gettime();
|
||||
|
||||
var_1 = self.shield_down_time_end + var_0;
|
||||
self.shield_down_time_end = var_1;
|
||||
}
|
||||
}
|
||||
|
||||
ensure_shield_stays_down_until_time( var_0 )
|
||||
{
|
||||
if ( isshielddown() )
|
||||
{
|
||||
if ( isdefined( self.shield_down_time_end ) && var_0 > self.shield_down_time_end )
|
||||
self.shield_down_time_end = var_0;
|
||||
}
|
||||
}
|
||||
|
||||
assignattributes()
|
||||
{
|
||||
self.alien_type = "ancestor";
|
||||
self.moveplaybackrate = 1.0;
|
||||
self.defaultmoveplaybackrate = self.moveplaybackrate;
|
||||
self.animplaybackrate = self.moveplaybackrate;
|
||||
self.xyanimscale = level.alien_types[self.alien_type].attributes["anim_scale"];
|
||||
self.defaultemissive = level.alien_types[self.alien_type].attributes["emissive"];
|
||||
self.maxemissive = level.alien_types[self.alien_type].attributes["max_emissive"];
|
||||
thread setinitialemissive();
|
||||
self scragentsetviewheight( level.alien_types[self.alien_type].attributes["view_height"] );
|
||||
var_0 = gethealthscalar();
|
||||
self.health = int( level.alien_types["ancestor"].attributes["starting_health"] * var_0 + 20000 );
|
||||
self.maxhealth = int( level.alien_types["ancestor"].attributes["starting_health"] * var_0 + 20000 );
|
||||
self scragentsetmaxturnspeed( 0.05 );
|
||||
|
||||
if ( !threatbiasgroupexists( "ancestors" ) )
|
||||
{
|
||||
createthreatbiasgroup( "ancestors" );
|
||||
setthreatbias( "players", "ancestors", 10000 );
|
||||
}
|
||||
|
||||
self setthreatbiasgroup( "ancestors" );
|
||||
maps\mp\alien\_utility::ent_flag_init( "activate_shield_health_check" );
|
||||
}
|
||||
|
||||
setinitialemissive()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
wait 1;
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, self.defaultemissive );
|
||||
}
|
||||
|
||||
setscriptfields( var_0 )
|
||||
{
|
||||
self.species = "alien";
|
||||
self.radius = 32;
|
||||
self.height = 120;
|
||||
maps\mp\agents\_agent_utility::activateagent();
|
||||
self.spawntime = gettime();
|
||||
self.spawnorigin = var_0;
|
||||
self.is_moving = 1;
|
||||
self.movemode = "walk";
|
||||
self.trajectoryactive = 0;
|
||||
}
|
||||
|
||||
gethealthscalar()
|
||||
{
|
||||
switch ( level.players.size )
|
||||
{
|
||||
case 1:
|
||||
return level.alien_types["ancestor"].attributes["health_scalar_1p"];
|
||||
case 2:
|
||||
return level.alien_types["ancestor"].attributes["health_scalar_2p"];
|
||||
case 3:
|
||||
return level.alien_types["ancestor"].attributes["health_scalar_3p"];
|
||||
}
|
||||
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
handleshielddamage( var_0 )
|
||||
{
|
||||
if ( isshieldup() )
|
||||
{
|
||||
if ( var_0 != "iw6_aliendlc42_mp" && var_0 != "iw6_aliendlc43_mp" )
|
||||
level notify( "dlc_vo_notify", "ancestor_shield_up" );
|
||||
}
|
||||
else if ( isshielddown() && ( var_0 == "iw6_aliendlc43_mp" || var_0 == "iw6_aliendlc42_mp" ) )
|
||||
{
|
||||
var_1 = self.shield_down_time_extension_cnt;
|
||||
|
||||
if ( var_1 < level.shield_down_extension_dur.size )
|
||||
{
|
||||
var_2 = level.shield_down_extension_dur[var_1] * 1000;
|
||||
extend_shield_down_time( var_2 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handleshieldstateforattack( var_0 )
|
||||
{
|
||||
var_1 = undefined;
|
||||
var_2 = undefined;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "grab":
|
||||
var_2 = "ancestor_disable_shield_grab";
|
||||
var_1 = 1800.0;
|
||||
break;
|
||||
case "blast":
|
||||
var_2 = "ancestor_disable_shield_blast";
|
||||
var_1 = 1800.0;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isshieldup() )
|
||||
self notify( var_2 );
|
||||
else if ( isshielddown() )
|
||||
{
|
||||
var_3 = gettime() + var_1;
|
||||
ensure_shield_stays_down_until_time( var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
ondamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( !maps\mp\alien\_damage::is_alien_agent_damage_allowed( var_0, var_1, var_5, var_4 ) )
|
||||
return 0;
|
||||
|
||||
if ( var_2 <= 0 )
|
||||
return 0;
|
||||
|
||||
if ( isshieldup() )
|
||||
{
|
||||
var_10 = "hitalienarmor";
|
||||
var_2 = 0;
|
||||
}
|
||||
else if ( isdefined( var_8 ) && ( var_8 == "head" || var_8 == "neck" ) )
|
||||
{
|
||||
var_2 = var_2 * 1.2;
|
||||
var_10 = "hitaliensoft";
|
||||
}
|
||||
else
|
||||
var_10 = "standard";
|
||||
|
||||
handleshielddamage( var_5 );
|
||||
|
||||
if ( var_5 == "iw6_alienminigun_mp" || var_5 == "iw6_alienminigun1_mp" || var_5 == "iw6_alienminigun2_mp" || var_5 == "iw6_alienminigun3_mp" )
|
||||
var_2 = 27.5;
|
||||
else if ( var_5 == "iw6_alienminigun4_mp" )
|
||||
var_2 = 37.5;
|
||||
|
||||
if ( var_5 == "iw6_alienmk32_mp" || var_5 == "iw6_alienmk321_mp" || var_5 == "iw6_alienmk322_mp" || var_5 == "iw6_alienmk323_mp" || var_5 == "iw6_alienmk324_mp" )
|
||||
var_2 = var_2 * 0.5;
|
||||
|
||||
if ( var_5 == "alien_manned_minigun_turret_mp" || var_5 == "alien_manned_minigun_turret1_mp" || var_5 == "alien_manned_minigun_turret2_mp" || var_5 == "alien_manned_minigun_turret3_mp" || var_5 == "alien_manned_minigun_turret4_mp" )
|
||||
var_2 = var_2 * 0.5;
|
||||
|
||||
if ( var_5 == "alien_manned_gl_turret_mp" || var_5 == "alien_manned_gl_turret1_mp" || var_5 == "alien_manned_gl_turret2_mp" || var_5 == "alien_manned_gl_turret3_mp" || var_5 == "alien_manned_gl_turret4_mp" )
|
||||
var_2 = var_2 * 0.5;
|
||||
|
||||
if ( var_5 == "iw6_arkalienvks_mp_alienvksscope" )
|
||||
var_2 = var_2 * 1.15;
|
||||
|
||||
if ( var_5 == "iw6_alienrgm_mp" )
|
||||
var_2 = var_2 * 1.15;
|
||||
|
||||
if ( isdefined( level.custom_scale_alien_damage_func ) )
|
||||
var_2 = [[ level.custom_scale_alien_damage_func ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
|
||||
if ( var_5 == "alienthrowingknife_mp" )
|
||||
{
|
||||
if ( isdefined( level.achievement_you_wish_cb ) && isplayer( var_1 ) )
|
||||
var_1 [[ level.achievement_you_wish_cb ]]();
|
||||
|
||||
var_2 = 0;
|
||||
var_0 delete();
|
||||
}
|
||||
else
|
||||
var_2 = maps\mp\alien\_damage::set_alien_damage_by_weapon_type( var_4, var_5, var_2 );
|
||||
|
||||
if ( isplayer( var_1 ) && !maps\mp\alien\_utility::is_trap( var_0 ) )
|
||||
{
|
||||
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_perks( var_1, var_2, var_4, var_5 );
|
||||
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_weapon_type( var_1, var_2, var_4, var_5, var_8 );
|
||||
}
|
||||
|
||||
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_prestige( var_1, var_2 );
|
||||
var_2 = int( var_2 );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
|
||||
var_1.owner thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_10 );
|
||||
else
|
||||
var_1 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_10 );
|
||||
}
|
||||
|
||||
if ( var_2 <= 0 )
|
||||
return 0;
|
||||
|
||||
if ( getrealhealth() - var_2 <= 0 )
|
||||
{
|
||||
if ( isdefined( self.entityheadicons ) )
|
||||
{
|
||||
foreach ( var_12 in self.entityheadicons )
|
||||
{
|
||||
if ( !isdefined( var_12 ) )
|
||||
continue;
|
||||
|
||||
var_12 destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
level thread maps\mp\alien\_challenge_function::update_alien_damage_challenge( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, self );
|
||||
return self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
|
||||
ondamagedfinished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
var_3 = var_3 | level.idflags_no_knockback;
|
||||
self finishagentdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, 0.0, 0 );
|
||||
|
||||
if ( !isdefined( self.ancestor_destroyed ) )
|
||||
self.ancestor_attacker = var_1;
|
||||
|
||||
var_10 = getrealhealth();
|
||||
|
||||
if ( var_10 <= 0 )
|
||||
return;
|
||||
|
||||
var_11 = maps\mp\alien\_utility::is_trap( var_0 );
|
||||
maps\mp\agents\alien\_alien_think::registerdamage( var_2 );
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
if ( isplayer( var_1 ) || isdefined( var_1.owner ) && isplayer( var_1.owner ) )
|
||||
{
|
||||
if ( !var_11 )
|
||||
var_1 maps\mp\alien\_damage::check_for_special_damage( self, var_5, var_4 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( self.currentanimstate == "move" )
|
||||
{
|
||||
var_12 = maps\mp\agents\alien\_alien_think::belowcumulativepainthreshold( var_1, var_5 );
|
||||
|
||||
if ( !var_12 )
|
||||
{
|
||||
maps\mp\agents\alien\_alien_think::cleardamagehistory();
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_move::ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
}
|
||||
|
||||
var_13 = int( getrealmaxhealth() * 0.1 );
|
||||
var_14 = int( var_10 / var_13 ) + 1;
|
||||
|
||||
if ( !isdefined( self.current_headicon ) )
|
||||
self.current_headicon = var_14;
|
||||
|
||||
if ( var_14 == self.current_headicon )
|
||||
return;
|
||||
|
||||
var_15 = maps\mp\_entityheadicons::setheadicon( "allies", "waypoint_ancestor_health_" + var_14, ( 0, 0, 182 ), 10, 10, undefined, undefined, 0, 1, 0, 0 );
|
||||
self.current_headicon = var_14;
|
||||
}
|
||||
|
||||
getrealmaxhealth()
|
||||
{
|
||||
return self.maxhealth - 20000;
|
||||
}
|
||||
|
||||
getrealhealth()
|
||||
{
|
||||
return self.health - 20000;
|
||||
}
|
||||
|
||||
onkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
var_9 = common_scripts\utility::flag_exist( "cortex_started" ) && common_scripts\utility::flag( "cortex_started" );
|
||||
|
||||
if ( isdefined( self.shield ) )
|
||||
{
|
||||
stopfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
|
||||
self.shield stoploopsound( "anc_shield_lp" );
|
||||
self.shield delete();
|
||||
}
|
||||
|
||||
if ( maps\mp\alien\_utility::is_true( self.killed_by_script ) )
|
||||
return;
|
||||
|
||||
maps\mp\alien\_challenge_function::update_alien_death_challenges( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
level maps\mp\alien\_achievement_dlc4::update_timing_is_everything();
|
||||
|
||||
if ( isdefined( self.ancestor_attacker ) && isplayer( self.ancestor_attacker ) )
|
||||
{
|
||||
level.alienbbdata["aliens_killed"]++;
|
||||
maps\mp\alien\_death::record_player_kills( self.ancestor_attacker );
|
||||
}
|
||||
|
||||
var_10 = maps\mp\alien\_gamescore::get_reward_point_for_kill();
|
||||
|
||||
foreach ( var_12 in level.players )
|
||||
{
|
||||
maps\mp\alien\_gamescore::givekillreward( var_12, 3500, "large" );
|
||||
|
||||
if ( !var_9 )
|
||||
maps\mp\alien\_gamescore::calculate_player_encounter_scores( var_12, [ "ancestor_bonus" ] );
|
||||
|
||||
if ( !isdefined( var_12.ancestor_kills ) )
|
||||
var_12.ancestor_kills = 0;
|
||||
|
||||
var_12.ancestor_kills++;
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_casual_mode() )
|
||||
{
|
||||
if ( isdefined( var_12.ancestor_kills ) && var_12.ancestor_kills == 3 )
|
||||
var_12 maps\mp\alien\_persistence::give_player_tokens( 1, 0 );
|
||||
|
||||
if ( isdefined( var_12.ancestor_kills ) && var_12.ancestor_kills == 5 )
|
||||
var_12 maps\mp\alien\_persistence::give_player_tokens( 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_hardcore_mode() )
|
||||
maps\mp\mp_alien_last_progression::give_players_skill_points( 1 );
|
||||
|
||||
if ( var_9 )
|
||||
{
|
||||
if ( isdefined( level.add_cortex_charge_func ) )
|
||||
[[ level.add_cortex_charge_func ]]( 10, 1 );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
playdeath()
|
||||
{
|
||||
self notify( "ancestor_destroyed" );
|
||||
|
||||
if ( isdefined( self.shield ) )
|
||||
{
|
||||
stopfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
|
||||
self.shield stoploopsound( "anc_shield_lp" );
|
||||
self.shield delete();
|
||||
}
|
||||
|
||||
level.active_ancestors = common_scripts\utility::array_remove( level.active_ancestors, self );
|
||||
level notify( "dlc_vo_notify", "last_vo", "ancestor_killed" );
|
||||
|
||||
if ( isdefined( level.dead_ancestors ) )
|
||||
level.dead_ancestors++;
|
||||
|
||||
level notify( "ancestor_died" );
|
||||
var_0 = 24;
|
||||
var_1 = 30;
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_normal_upright( anglestoup( self.angles ) ) )
|
||||
maps\mp\alien\_death::move_away_from_surface( anglestoup( self.angles ), var_0 );
|
||||
|
||||
if ( isdefined( self.apextraversaldeathvector ) )
|
||||
maps\mp\alien\_death::move_away_from_surface( self.apextraversaldeathvector, var_1 );
|
||||
|
||||
self.ancestor_destroyed = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "death", undefined, "death_anim", "end", ::handledeathnotetracks );
|
||||
self suicide();
|
||||
}
|
||||
|
||||
ancestor_death_nuke_fx()
|
||||
{
|
||||
playfx( level._effect["ancestor_death_nuke"], self.origin + ( 0, 0, 60 ) );
|
||||
wait 0.5;
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( isdefined( level.shell_shock_override ) )
|
||||
var_1 [[ level.shell_shock_override ]]( 0.5 );
|
||||
else
|
||||
var_1 shellshock( "alien_spitter_gas_cloud", 0.5 );
|
||||
|
||||
var_1 playrumbleonentity( "grenade_rumble" );
|
||||
}
|
||||
}
|
||||
|
||||
handledeathnotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "death_end":
|
||||
thread ancestor_death_nuke_fx();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
drop_ims_when_grabbed( var_0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
onenterstate( var_0, var_1 )
|
||||
{
|
||||
onexitanimstate( var_0, var_1 );
|
||||
self.currentanimstate = var_1;
|
||||
|
||||
switch ( var_1 )
|
||||
{
|
||||
case "idle":
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_idle::main();
|
||||
break;
|
||||
case "melee":
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_melee::main();
|
||||
break;
|
||||
case "move":
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_move::main();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onexitanimstate( var_0, var_1 )
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "melee":
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_melee::endscript();
|
||||
break;
|
||||
}
|
||||
}
|
39
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_idle.gsc
Normal file
39
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_idle.gsc
Normal file
@ -0,0 +1,39 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
for (;;)
|
||||
play_idle();
|
||||
}
|
||||
|
||||
play_idle()
|
||||
{
|
||||
face_target();
|
||||
var_0 = get_idle_anim_state();
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, undefined, "idle", "end" );
|
||||
}
|
||||
|
||||
get_idle_anim_state()
|
||||
{
|
||||
if ( maps\mp\agents\alien\alien_ancestor\_alien_ancestor::isshieldup() )
|
||||
return "idle";
|
||||
|
||||
return "idle_vulnerable";
|
||||
}
|
||||
|
||||
face_target()
|
||||
{
|
||||
var_0 = undefined;
|
||||
var_1 = 1600;
|
||||
|
||||
if ( isalive( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < var_1 * var_1 )
|
||||
var_0 = self.enemy;
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
|
||||
}
|
937
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_melee.gsc
Normal file
937
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_melee.gsc
Normal file
@ -0,0 +1,937 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "death" );
|
||||
var_0 = gettime();
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
if ( self.melee_type != "death" && self.is_moving )
|
||||
{
|
||||
self.is_moving = 0;
|
||||
var_1 = self.origin + anglestoforward( self.angles ) * 500;
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_move::playstopanimation( var_1, 0 );
|
||||
}
|
||||
|
||||
switch ( self.melee_type )
|
||||
{
|
||||
case "blast":
|
||||
blast_attack();
|
||||
break;
|
||||
case "forced_blast":
|
||||
forced_blast_attack();
|
||||
break;
|
||||
case "forced_grab":
|
||||
forced_grab_attack();
|
||||
break;
|
||||
case "grab":
|
||||
grab_attack();
|
||||
break;
|
||||
case "spawn":
|
||||
spawn_aliens();
|
||||
break;
|
||||
case "death":
|
||||
death();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( var_0 == gettime() )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "melee_complete" );
|
||||
}
|
||||
|
||||
endscript()
|
||||
{
|
||||
if ( self.grab_target_disabled )
|
||||
handle_post_grab_targets();
|
||||
}
|
||||
|
||||
forced_blast_attack()
|
||||
{
|
||||
if ( !isdefined( self.forced_blast_position ) )
|
||||
return;
|
||||
|
||||
var_0 = self.forced_blast_position - self.origin;
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_0 );
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::handleshieldstateforattack( "blast" );
|
||||
self.looktarget = undefined;
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
play_blast_anim();
|
||||
self.forced_blast_position = undefined;
|
||||
}
|
||||
|
||||
blast_attack()
|
||||
{
|
||||
var_0 = self.blast_target;
|
||||
var_0 endon( "death" );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
|
||||
|
||||
if ( isalive( var_0 ) )
|
||||
{
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::handleshieldstateforattack( "blast" );
|
||||
self.looktarget = var_0;
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
|
||||
self scragentsetorientmode( "face enemy" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
play_blast_anim();
|
||||
}
|
||||
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
self.looktarget = undefined;
|
||||
self.blast_target = undefined;
|
||||
self.blast_target_location = undefined;
|
||||
}
|
||||
|
||||
play_blast_anim()
|
||||
{
|
||||
self.blast_anim_index = randomint( self getanimentrycount( "attack_blast" ) );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_blast", self.blast_anim_index, "attack_melee", "end", ::handleattacknotetracks );
|
||||
self.last_blast_time = gettime();
|
||||
}
|
||||
|
||||
fire_blast_projectile()
|
||||
{
|
||||
if ( !isdefined( self.blast_target ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.blast_target.usingremote ) )
|
||||
var_0 = self.blast_target geteye();
|
||||
else
|
||||
var_0 = self.blast_target.origin + ( 0, 0, 32 );
|
||||
|
||||
var_1 = get_blast_fire_pos( var_0 );
|
||||
var_2 = magicbullet( "alien_ancestor_mp", var_1, var_0, self );
|
||||
var_2.owner = self;
|
||||
|
||||
if ( !isdefined( self.blast_target.usingremote ) )
|
||||
var_3 = self.blast_target geteye() - self.blast_target.origin;
|
||||
else
|
||||
var_3 = ( 0, 0, 32 );
|
||||
|
||||
var_2 missile_settargetent( self.blast_target, var_3 );
|
||||
var_2 missile_setflightmodedirect();
|
||||
|
||||
if ( isdefined( var_2 ) )
|
||||
{
|
||||
var_2 thread blast_tracking_monitor( self );
|
||||
var_2 thread blast_projectile_proximity_monitor( self );
|
||||
var_2 thread blast_projectile_impact_monitor( self );
|
||||
}
|
||||
}
|
||||
|
||||
fire_forced_blast_projectile()
|
||||
{
|
||||
if ( !isdefined( self.forced_blast_position ) )
|
||||
return;
|
||||
|
||||
var_0 = get_blast_fire_pos( self.forced_blast_position );
|
||||
var_1 = magicbullet( "alien_ancestor_mp", var_0, self.forced_blast_position, self );
|
||||
var_1.owner = self;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
var_1 thread blast_projectile_impact_monitor( self );
|
||||
}
|
||||
|
||||
blast_tracking_monitor( var_0 )
|
||||
{
|
||||
self endon( "explode" );
|
||||
var_1 = var_0.blast_target;
|
||||
var_1 endon( "death" );
|
||||
var_2 = 16384;
|
||||
var_3 = gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( var_1 ) && distancesquared( self.origin, var_1.origin ) < var_2 )
|
||||
break;
|
||||
|
||||
if ( gettime() - var_3 > 2000 )
|
||||
{
|
||||
var_4 = anglestoforward( self.angles );
|
||||
|
||||
foreach ( var_6 in level.players )
|
||||
{
|
||||
if ( var_6 == var_1 || !isalive( var_6 ) )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( self.origin, var_6.origin ) > 160000 )
|
||||
continue;
|
||||
|
||||
var_7 = vectornormalize( var_6.origin - self.origin );
|
||||
|
||||
if ( vectordot( var_4, var_7 ) > 0.5 )
|
||||
{
|
||||
var_1 = var_6;
|
||||
|
||||
if ( !isdefined( var_1.usingremote ) )
|
||||
var_8 = var_1 geteye() - var_1.origin;
|
||||
else
|
||||
var_8 = ( 0, 0, 32 );
|
||||
|
||||
self missile_settargetent( var_1, var_8 );
|
||||
var_3 = gettime();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
break;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self missile_cleartarget();
|
||||
}
|
||||
|
||||
blast_projectile_impact_monitor( var_0 )
|
||||
{
|
||||
self waittill( "explode", var_1 );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return;
|
||||
|
||||
playfx( level._effect["blackhole_exp"], var_1 );
|
||||
playsoundatpos( var_1, "anc_orb_imp" );
|
||||
}
|
||||
|
||||
blast_projectile_proximity_monitor( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_1 = 10000;
|
||||
var_2 = 90;
|
||||
var_3 = 40;
|
||||
var_4 = 256;
|
||||
var_5 = undefined;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
foreach ( var_7 in level.players )
|
||||
{
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
var_8 = distancesquared( self.origin, var_7.origin );
|
||||
|
||||
if ( var_8 < var_1 )
|
||||
{
|
||||
if ( !isdefined( var_5 ) )
|
||||
var_5 = var_8;
|
||||
|
||||
if ( var_5 < var_8 )
|
||||
{
|
||||
self notify( "explode", self.origin );
|
||||
common_scripts\utility::waitframe();
|
||||
var_9 = var_2;
|
||||
var_10 = var_3;
|
||||
radiusdamage( self.origin, var_4, var_9, var_10, var_0, "MOD_EXPLOSIVE", "alien_ancestor_mp" );
|
||||
common_scripts\utility::waitframe();
|
||||
self delete();
|
||||
return;
|
||||
}
|
||||
else
|
||||
var_5 = var_8;
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
get_blast_fire_pos( var_0 )
|
||||
{
|
||||
if ( self.blast_anim_index == 0 )
|
||||
var_1 = "TAG_WEAPON_RIGHT";
|
||||
else
|
||||
var_1 = "TAG_WEAPON_LEFT";
|
||||
|
||||
return self gettagorigin( var_1 );
|
||||
}
|
||||
|
||||
forced_grab_attack()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( !isdefined( self.forced_grab_position ) )
|
||||
return;
|
||||
|
||||
var_0 = self.forced_grab_position - self.origin;
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_0 );
|
||||
var_1 = "attack_grab";
|
||||
var_2 = "attack_melee";
|
||||
var_3 = "end";
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, 0, var_2, var_3 );
|
||||
play_variable_grab_anim( var_1, 1, 0.2 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, 2, var_2, var_3 );
|
||||
self notify( "forced_grab_damage_start" );
|
||||
play_variable_grab_anim( var_1, 3, 3 );
|
||||
self notify( "forced_grab_damage_end" );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, 4, var_2, var_3 );
|
||||
self.forced_grab_position = undefined;
|
||||
}
|
||||
|
||||
play_variable_grab_anim( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = self getanimentry( "attack_grab", var_1 );
|
||||
var_4 = getanimlength( var_3 );
|
||||
self setanimstate( var_0, var_1 );
|
||||
var_5 = min( var_4, var_2 );
|
||||
wait( var_5 );
|
||||
}
|
||||
|
||||
grab_attack()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( self.grab_target );
|
||||
thread monitor_grab_status();
|
||||
self scragentsetorientmode( "face enemy" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self.grab_status = 0;
|
||||
activate_grab_zones();
|
||||
play_initial_grab_anims();
|
||||
|
||||
if ( is_grab_active() )
|
||||
self.grab_status = 2;
|
||||
|
||||
while ( is_grab_active() )
|
||||
wait 0.05;
|
||||
|
||||
if ( self.grab_status == 3 )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_grab", 4, "attack_melee", "end", ::handleattacknotetracks );
|
||||
else if ( self.grab_status == 4 )
|
||||
{
|
||||
handle_post_grab_targets();
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_grab", 5, "attack_melee", "end" );
|
||||
}
|
||||
|
||||
self.last_grab_time = gettime();
|
||||
}
|
||||
|
||||
play_initial_grab_anims()
|
||||
{
|
||||
self endon( "grab_finished" );
|
||||
var_0 = "attack_grab";
|
||||
var_1 = "attack_melee";
|
||||
var_2 = "end";
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, 0, var_1, var_2 );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::handleshieldstateforattack( "grab" );
|
||||
play_variable_grab_anim( var_0, 1, 0.9 );
|
||||
self.current_grab_victims = get_player_victims();
|
||||
|
||||
if ( self.current_grab_victims.size > 0 )
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, 2, var_1, var_2, ::handleattacknotetracks );
|
||||
else
|
||||
{
|
||||
self.grab_status = 6;
|
||||
self notify( "grab_finished" );
|
||||
}
|
||||
}
|
||||
|
||||
get_player_victims()
|
||||
{
|
||||
var_0 = [];
|
||||
|
||||
foreach ( var_2 in level.players )
|
||||
{
|
||||
if ( var_2 isusingturret() || maps\mp\alien\_utility::is_true( var_2.is_using_remote_turret ) )
|
||||
continue;
|
||||
|
||||
if ( maps\mp\alien\_utility::is_true( var_2.is_grabbed ) )
|
||||
continue;
|
||||
|
||||
foreach ( var_4 in self.grab_damage_zone_locations )
|
||||
{
|
||||
if ( distancesquared( var_4, var_2.origin ) < 15625 )
|
||||
var_0[var_0.size] = var_2;
|
||||
}
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
activate_grab_zones()
|
||||
{
|
||||
var_0 = get_possible_grab_victims( self.grab_target );
|
||||
self.grab_damage_zone_locations = [];
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
thread play_choke_ring_fx( var_2 );
|
||||
self.grab_damage_zone_locations[self.grab_damage_zone_locations.size] = var_2.origin;
|
||||
}
|
||||
}
|
||||
|
||||
is_grab_active()
|
||||
{
|
||||
return self.grab_status == 0 || self.grab_status == 1 || self.grab_status == 2;
|
||||
}
|
||||
|
||||
start_grab()
|
||||
{
|
||||
if ( self.current_grab_victims.size > 0 )
|
||||
{
|
||||
self.grab_status = 1;
|
||||
do_grab_attack( self.current_grab_victims );
|
||||
}
|
||||
}
|
||||
|
||||
get_possible_grab_victims( var_0 )
|
||||
{
|
||||
var_1 = 0.5;
|
||||
var_2 = 589824;
|
||||
var_3 = anglestoforward( self.angles );
|
||||
var_4 = [];
|
||||
var_5 = gettime();
|
||||
|
||||
foreach ( var_7 in level.players )
|
||||
{
|
||||
if ( var_7.inlaststand )
|
||||
continue;
|
||||
|
||||
if ( var_7.ignoreme )
|
||||
continue;
|
||||
|
||||
if ( var_7 isusingturret() || maps\mp\alien\_utility::is_true( var_7.is_using_remote_turret ) )
|
||||
continue;
|
||||
|
||||
if ( maps\mp\alien\_utility::is_true( var_7.is_grabbed ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_7.next_valid_grab_time ) && var_7.next_valid_grab_time > var_5 )
|
||||
continue;
|
||||
|
||||
var_8 = vectornormalize( var_7.origin - self.origin );
|
||||
|
||||
if ( vectordot( var_3, var_8 ) > var_1 )
|
||||
{
|
||||
if ( distancesquared( var_7.origin, self.origin ) < var_2 )
|
||||
{
|
||||
if ( bullettracepassed( self gettagorigin( "TAG_EYE" ), var_7 gettagorigin( "TAG_EYE" ), 0, self.shield ) )
|
||||
var_4[var_4.size] = var_7;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
play_choke_ring_fx( var_0 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
self endon( "grab_finished" );
|
||||
wait 0.9;
|
||||
playsoundatpos( var_0.origin, "anc_choke_ring" );
|
||||
var_1 = spawnfx( level._effect["ancestor_choke_ring"], var_0.origin );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
triggerfx( var_1 );
|
||||
wait 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_grab_status()
|
||||
{
|
||||
self endon( "grab_finished" );
|
||||
var_0 = 600;
|
||||
|
||||
if ( level.players.size == 4 )
|
||||
var_0 = 900;
|
||||
else if ( level.players.size == 3 )
|
||||
var_0 = 800;
|
||||
else if ( level.players.size == 2 )
|
||||
var_0 = 700;
|
||||
else if ( level.players.size == 1 )
|
||||
var_0 = 600;
|
||||
|
||||
var_1 = self.health - var_0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_2 = common_scripts\utility::waittill_any_return( "damage", "death", "ancestor_destroyed" );
|
||||
|
||||
if ( var_2 == "death" || var_2 == "ancestor_destroyed" )
|
||||
{
|
||||
self.grab_status = 5;
|
||||
break;
|
||||
}
|
||||
else if ( self.health < var_1 )
|
||||
{
|
||||
self.grab_status = 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
self notify( "grab_finished" );
|
||||
}
|
||||
|
||||
grab_timeout_monitor()
|
||||
{
|
||||
self endon( "grab_finished" );
|
||||
wait 4;
|
||||
self.grab_status = 3;
|
||||
self notify( "grab_finished" );
|
||||
}
|
||||
|
||||
do_grab_attack( var_0 )
|
||||
{
|
||||
self endon( "grab_finished" );
|
||||
level endon( "game_ended" );
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
self.grab_lift_entities = [];
|
||||
thread grab_timeout_monitor();
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
setup_grab_target( var_2 );
|
||||
childthread process_grab_target( var_2 );
|
||||
}
|
||||
|
||||
while ( self.grab_status == 0 || self.grab_status == 1 )
|
||||
wait 0.05;
|
||||
|
||||
for (;;)
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_grab", 3, "attack_melee", "end" );
|
||||
}
|
||||
|
||||
setup_grab_target( var_0 )
|
||||
{
|
||||
var_0 notify( "force_cancel_placement" );
|
||||
var_0 notify( "dpad_cancel" );
|
||||
self.grab_target_disabled = 1;
|
||||
var_0 disableusability();
|
||||
var_0 freezecontrols( 1 );
|
||||
var_0 disableweapons();
|
||||
var_0.turn_off_class_skill_activation = 1;
|
||||
var_0.player_action_disabled = 1;
|
||||
var_0.next_valid_grab_time = gettime() + 100000;
|
||||
var_0.is_grabbed = 1;
|
||||
var_0 notify( "grabbed" );
|
||||
var_0 playlocalsound( "anc_choke" );
|
||||
level notify( "dlc_vo_notify", "ancestor_close" );
|
||||
var_1 = spawn( "script_model", var_0.origin );
|
||||
var_1 setmodel( "tag_origin" );
|
||||
self.grab_lift_entities[self.grab_lift_entities.size] = var_1;
|
||||
thread lift_grab_player( var_1, var_0 );
|
||||
thread grab_detect_migration( self );
|
||||
}
|
||||
|
||||
lift_grab_player( var_0, var_1 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
self endon( "killanimscript" );
|
||||
var_2 = 100;
|
||||
var_3 = 1.0;
|
||||
var_4 = var_0.origin;
|
||||
var_5 = var_0.origin + ( 0, 0, var_2 );
|
||||
var_6 = 0.2;
|
||||
var_7 = playerphysicstrace( var_4, var_5 );
|
||||
playfxontagforclients( level._effect["ancestor_choke_pv"], var_1, "tag_origin", var_1 );
|
||||
playfxontag( level._effect["ancestor_choke_3pv"], var_1, "tag_origin" );
|
||||
var_1 thread grab_detect_stuck();
|
||||
var_1 thread grab_detect_migration( self );
|
||||
var_8 = ( self geteye() - var_7 ) * ( 1, 1, 0 );
|
||||
var_0.angles = vectortoangles( var_8 );
|
||||
var_0.origin = var_7;
|
||||
var_1 playerlinktoblend( var_0 );
|
||||
var_1 _meth_842D();
|
||||
var_9 = 72;
|
||||
var_10 = 32;
|
||||
|
||||
if ( capsuletracepassed( var_0.origin, var_10, var_9 ) )
|
||||
var_0 scriptmodelplayanimdeltamotion( "alien_ancestor_player_attack_grab" );
|
||||
}
|
||||
|
||||
process_grab_target( var_0 )
|
||||
{
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
var_1 = 18.75;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 1.0;
|
||||
|
||||
if ( !isdefined( var_0 ) || !isdefined( self ) || !isalive( self ) )
|
||||
return;
|
||||
|
||||
var_0 dodamage( var_1, self.origin, self, self );
|
||||
}
|
||||
}
|
||||
|
||||
handle_post_grab_targets()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( level.gameended )
|
||||
return;
|
||||
|
||||
var_0 = -400;
|
||||
|
||||
foreach ( var_2 in self.current_grab_victims )
|
||||
{
|
||||
if ( !isalive( var_2 ) )
|
||||
continue;
|
||||
|
||||
var_2.turn_off_class_skill_activation = undefined;
|
||||
var_2.player_action_disabled = undefined;
|
||||
|
||||
if ( !maps\mp\alien\_utility::is_true( var_2.iscarrying ) )
|
||||
var_2 enableweapons();
|
||||
|
||||
var_2 freezecontrols( 0 );
|
||||
|
||||
if ( !isdefined( var_2.inlaststand ) || !var_2.inlaststand )
|
||||
var_2 enableusability();
|
||||
|
||||
var_2 unlink();
|
||||
var_2.is_grabbed = 0;
|
||||
var_2 notify( "grab_finished" );
|
||||
var_2.next_valid_grab_time = gettime() + 5000;
|
||||
|
||||
if ( isdefined( var_2.imslist ) )
|
||||
{
|
||||
foreach ( var_4 in var_2.imslist )
|
||||
{
|
||||
if ( isdefined( var_4.carriedby ) && var_4.carriedby == var_2 )
|
||||
var_4 delete();
|
||||
}
|
||||
}
|
||||
|
||||
if ( self.grab_status == 3 )
|
||||
{
|
||||
var_6 = anglestoforward( var_2.angles ) * var_0;
|
||||
var_2 setvelocity( var_6 );
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( var_9 in self.grab_lift_entities )
|
||||
{
|
||||
if ( isdefined( var_9 ) )
|
||||
var_9 delete();
|
||||
}
|
||||
|
||||
self.grab_target_disabled = 0;
|
||||
self.grab_lift_entities = [];
|
||||
self.current_grab_victims = [];
|
||||
}
|
||||
|
||||
grab_detect_stuck()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
var_0 = self.origin;
|
||||
var_1 = 0;
|
||||
var_2 = common_scripts\utility::waittill_any_return( "unresolved_collision", "grab_finished" );
|
||||
|
||||
if ( var_2 == "unresolved_collision" )
|
||||
var_1 = 1;
|
||||
else if ( var_2 == "grab_finished" )
|
||||
{
|
||||
var_3 = self.origin;
|
||||
wait 0.5;
|
||||
|
||||
if ( self.origin == var_3 )
|
||||
var_1 = 1;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
|
||||
if ( var_1 )
|
||||
self setorigin( var_0 );
|
||||
}
|
||||
|
||||
grab_detect_migration( var_0 )
|
||||
{
|
||||
self endon( "grab_finished" );
|
||||
level waittill( "host_migration_end" );
|
||||
wait 1.0;
|
||||
var_0 handle_post_grab_targets();
|
||||
}
|
||||
|
||||
spawn_aliens()
|
||||
{
|
||||
self.num_spawns = get_default_ancestor_spawns();
|
||||
|
||||
if ( !ancestor_spawn_find_spawn_loc() )
|
||||
self.spawn_locations[self.spawn_locations.size] = self.origin;
|
||||
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "spawn_alien", 0, "spawn_alien", "end", ::handleattacknotetracks );
|
||||
|
||||
foreach ( var_1 in self.minions )
|
||||
{
|
||||
if ( isalive( var_1 ) )
|
||||
var_1 thread set_minion_stationary( self.enemy );
|
||||
}
|
||||
|
||||
thread watch_for_death_during_spawn();
|
||||
var_3 = undefined;
|
||||
|
||||
if ( isdefined( self.enemy ) )
|
||||
var_3 = get_direct_minions_anim_index();
|
||||
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "direct_minions", var_3, "direct_minions", "end", ::handleattacknotetracks );
|
||||
self.last_spawn_time = gettime();
|
||||
}
|
||||
|
||||
get_direct_minions_anim_index()
|
||||
{
|
||||
var_0 = 0.906;
|
||||
var_1 = 0.5;
|
||||
var_2 = anglestoforward( self.angles );
|
||||
var_3 = anglestoright( self.angles );
|
||||
var_4 = vectornormalize( self.enemy.origin - self.origin );
|
||||
var_5 = vectordot( var_2, var_4 );
|
||||
|
||||
if ( var_5 < var_1 )
|
||||
{
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( self.enemy );
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( var_5 > var_0 )
|
||||
return 1;
|
||||
|
||||
if ( vectordot( var_3, var_4 ) > 0.0 )
|
||||
return 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
watch_for_death_during_spawn()
|
||||
{
|
||||
self endon( "minion_released" );
|
||||
common_scripts\utility::waittill_any( "death", "ancestor_destroyed" );
|
||||
release_minions();
|
||||
}
|
||||
|
||||
release_minions()
|
||||
{
|
||||
foreach ( var_1 in self.minions )
|
||||
var_1 notify( "minion_released" );
|
||||
|
||||
self notify( "minion_released" );
|
||||
}
|
||||
|
||||
set_minion_stationary( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
while ( self.trajectoryactive || isdefined( self.alien_scripted ) && self.alien_scripted )
|
||||
wait 0.05;
|
||||
|
||||
self scragentsetscripted( 1 );
|
||||
maps\mp\alien\_utility::enable_alien_scripted();
|
||||
thread maps\mp\agents\alien\_alien_idle::main();
|
||||
var_1 = 10;
|
||||
thread minion_player_proximity_monitor();
|
||||
var_2 = common_scripts\utility::waittill_any_timeout( var_1, "damage", "minion_released", "player_proximity" );
|
||||
self notify( "minion_activated" );
|
||||
set_minion_enemy( var_0 );
|
||||
}
|
||||
|
||||
minion_player_proximity_monitor()
|
||||
{
|
||||
self endon( "minion_activated" );
|
||||
self endon( "death" );
|
||||
var_0 = 90000;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.2;
|
||||
|
||||
foreach ( var_2 in level.players )
|
||||
{
|
||||
if ( !isalive( var_2 ) )
|
||||
continue;
|
||||
|
||||
if ( var_2.inlaststand )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( var_2.origin, self.origin ) < var_0 )
|
||||
{
|
||||
self notify( "player_proximity" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set_minion_enemy( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_1 = 10;
|
||||
self.favoriteenemy = var_0;
|
||||
self scragentsetscripted( 0 );
|
||||
maps\mp\alien\_utility::disable_alien_scripted();
|
||||
|
||||
if ( isalive( var_0 ) )
|
||||
var_0 common_scripts\utility::waittill_any_timeout( var_1, "death" );
|
||||
else
|
||||
wait( var_1 );
|
||||
|
||||
self.favoriteenemy = undefined;
|
||||
}
|
||||
|
||||
get_default_ancestor_spawns()
|
||||
{
|
||||
switch ( level.players.size )
|
||||
{
|
||||
case 1:
|
||||
return 2;
|
||||
case 2:
|
||||
return 2;
|
||||
case 3:
|
||||
return 3;
|
||||
case 4:
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
ancestor_spawn_find_spawn_loc()
|
||||
{
|
||||
var_0 = anglestoforward( self.angles );
|
||||
var_1 = anglestoright( self.angles );
|
||||
self.spawn_locations = [];
|
||||
var_2 = self.origin + var_0 * 56.0;
|
||||
var_2 = maps\mp\agents\_scriptedagents::droppostoground( var_2 );
|
||||
|
||||
if ( isdefined( var_2 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_2, 12.0 ) )
|
||||
self.spawn_locations[self.spawn_locations.size] = var_2;
|
||||
|
||||
var_3 = self.origin + var_1 * 56.0;
|
||||
var_3 = maps\mp\agents\_scriptedagents::droppostoground( var_3 );
|
||||
|
||||
if ( isdefined( var_3 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_3, 12.0 ) )
|
||||
self.spawn_locations[self.spawn_locations.size] = var_3;
|
||||
|
||||
var_4 = self.origin + var_1 * -56.0;
|
||||
var_4 = maps\mp\agents\_scriptedagents::droppostoground( var_4 );
|
||||
|
||||
if ( isdefined( var_4 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_4, 12.0 ) )
|
||||
self.spawn_locations[self.spawn_locations.size] = var_4;
|
||||
|
||||
if ( self.spawn_locations.size > 0 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
release_reserved_space_on_death()
|
||||
{
|
||||
self notify( "reserved_space_death_monitor" );
|
||||
self endon( "reserved_space_death_monitor" );
|
||||
common_scripts\utility::waittill_any( "death", "ancestor_destroyed" );
|
||||
empty_reserved_space();
|
||||
}
|
||||
|
||||
empty_reserved_space()
|
||||
{
|
||||
if ( isdefined( self.reserved_space ) && self.reserved_space > 0 )
|
||||
{
|
||||
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.reserved_space );
|
||||
self.reserved_space = 0;
|
||||
}
|
||||
}
|
||||
|
||||
do_ancestor_spawns()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "ancestor_destroyed" );
|
||||
thread release_reserved_space_on_death();
|
||||
self.minions = [];
|
||||
var_0 = spawn_of_type( self.num_spawns, "brute" );
|
||||
var_1 = self.num_spawns - var_0;
|
||||
|
||||
if ( var_1 > 0 )
|
||||
spawn_of_type( var_1, "goon" );
|
||||
}
|
||||
|
||||
spawn_of_type( var_0, var_1 )
|
||||
{
|
||||
var_2 = int( maps\mp\alien\_spawn_director::reserve_custom_spawn_space( var_0, 1, var_1 ) );
|
||||
|
||||
for ( self.reserved_space = var_2; self.reserved_space > 0; self.minions = common_scripts\utility::array_combine( self.minions, do_spawn( var_3, self.spawn_locations, var_1 ) ) )
|
||||
var_3 = min( self.reserved_space, self.spawn_locations.size );
|
||||
|
||||
return var_2;
|
||||
}
|
||||
|
||||
do_spawn( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = spawnstruct();
|
||||
var_3.angles = self.angles;
|
||||
var_4 = level.cycle_data.spawn_node_info["chen_test"].vignetteinfo[var_2];
|
||||
var_5 = ( 0, 0, -100 );
|
||||
var_6 = [];
|
||||
|
||||
for ( var_7 = 0; var_7 < var_0; var_7++ )
|
||||
{
|
||||
var_8 = var_7 % var_1.size;
|
||||
var_3.origin = var_1[var_8] + var_5;
|
||||
var_9 = maps\mp\alien\_spawn_director::process_custom_spawn( var_2, var_3, var_4 );
|
||||
|
||||
if ( isdefined( var_9 ) )
|
||||
var_6[var_6.size] = var_9;
|
||||
|
||||
self.reserved_space--;
|
||||
wait( randomfloatrange( 0.01, 0.14 ) );
|
||||
}
|
||||
|
||||
return var_6;
|
||||
}
|
||||
|
||||
handleattacknotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( isdefined( level.dlc_attacknotetrack_override_func ) )
|
||||
{
|
||||
self [[ level.dlc_attacknotetrack_override_func ]]( var_0, var_1, var_2, var_3 );
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "ball_projectile_start":
|
||||
if ( isdefined( self.forced_blast_position ) )
|
||||
fire_forced_blast_projectile();
|
||||
else
|
||||
fire_blast_projectile();
|
||||
|
||||
break;
|
||||
case "throw_player":
|
||||
handle_post_grab_targets();
|
||||
break;
|
||||
case "summon":
|
||||
do_ancestor_spawns();
|
||||
break;
|
||||
case "grab_player":
|
||||
thread start_grab();
|
||||
break;
|
||||
case "attack_direct":
|
||||
release_minions();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
death()
|
||||
{
|
||||
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::playdeath();
|
||||
}
|
547
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_move.gsc
Normal file
547
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_move.gsc
Normal file
@ -0,0 +1,547 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
entermove();
|
||||
startmove();
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
entermove()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
self.playing_pain_animation = 0;
|
||||
self.is_moving = 1;
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self scragentsetanimmode( "code_move" );
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
if ( candostartmove() )
|
||||
{
|
||||
switch ( getstartmovetype() )
|
||||
{
|
||||
case "run-start":
|
||||
dorunstart();
|
||||
break;
|
||||
case "walk-start":
|
||||
dowalkstart();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
self.playing_pain_animation = 0;
|
||||
cancelallbut( undefined );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self.previousanimstate = "move";
|
||||
}
|
||||
|
||||
setupmovement()
|
||||
{
|
||||
self.enablestop = 1;
|
||||
thread waitformovemodechange();
|
||||
thread waitforsharpturn();
|
||||
thread waitforstop();
|
||||
thread waitforstuck();
|
||||
}
|
||||
|
||||
continuemovement()
|
||||
{
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self scragentsetanimmode( "code_move" );
|
||||
self scragentsetanimscale( self.xyanimscale, 1.0 );
|
||||
setupmovement();
|
||||
setmoveanim( self.movemode );
|
||||
}
|
||||
|
||||
waitformovemodechange()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_runwalk" );
|
||||
var_0 = self.movemode;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( var_0 != self.movemode )
|
||||
{
|
||||
setmoveanim( self.movemode );
|
||||
var_0 = self.movemode;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
waitforsharpturn()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_sharpturn" );
|
||||
self waittill( "path_dir_change", var_0 );
|
||||
var_1 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_0 );
|
||||
|
||||
if ( var_1 == 4 )
|
||||
{
|
||||
thread waitforsharpturn();
|
||||
return;
|
||||
}
|
||||
|
||||
var_2 = 0;
|
||||
|
||||
if ( var_2 )
|
||||
var_1 = 0;
|
||||
|
||||
var_3 = "run_turn";
|
||||
var_4 = self getanimentry( var_3, var_1 );
|
||||
var_5 = var_2 || candoturnanim( var_4 );
|
||||
|
||||
if ( !var_5 )
|
||||
{
|
||||
thread waitforsharpturn();
|
||||
return;
|
||||
}
|
||||
|
||||
cancelallbut( "sharpturn" );
|
||||
self.blockgoalpos = 1;
|
||||
self.enablestop = 0;
|
||||
|
||||
if ( var_2 )
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_3, var_1, self.moveplaybackrate, var_3, "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self.blockgoalpos = 0;
|
||||
thread continuemovement();
|
||||
}
|
||||
|
||||
waitforstop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_stop" );
|
||||
self waittill( "stop_soon" );
|
||||
|
||||
if ( !shoulddostopanim() )
|
||||
thread waitforstop();
|
||||
else
|
||||
{
|
||||
var_0 = self getpathgoalpos();
|
||||
playstopanimation( var_0, 1 );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
|
||||
var_0 = self getpathgoalpos();
|
||||
|
||||
if ( distancesquared( self.origin, var_0 ) < 400.0 )
|
||||
{
|
||||
self.is_moving = 0;
|
||||
self scragentsetanimmode( "code_move_slide" );
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
startmove();
|
||||
continuemovement();
|
||||
}
|
||||
}
|
||||
|
||||
shouldrestartstop()
|
||||
{
|
||||
return self.currentanimstate == "move";
|
||||
}
|
||||
|
||||
playstopanimation( var_0, var_1 )
|
||||
{
|
||||
var_2 = shouldrestartstop();
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
if ( shouldrestartstop() )
|
||||
thread waitforstop();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var_3 = var_0 - self.origin;
|
||||
var_4 = getstopendfacedir( var_0 );
|
||||
var_5 = getstopanimstate();
|
||||
var_6 = getstopanimindex( var_5, var_4 );
|
||||
var_7 = self getanimentry( var_5, var_6 );
|
||||
var_8 = getmovedelta( var_7 );
|
||||
var_9 = getangledelta( var_7 );
|
||||
|
||||
if ( length( var_3 ) + 48 < length( var_8 ) )
|
||||
{
|
||||
if ( var_2 )
|
||||
thread waitforstop();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var_10 = getstopdata( var_0 );
|
||||
var_11 = calcanimstartpos( var_10.pos, var_10.angles[1], var_8, var_9 );
|
||||
var_12 = maps\mp\agents\_scriptedagents::droppostoground( var_11 );
|
||||
|
||||
if ( !isdefined( var_12 ) )
|
||||
{
|
||||
if ( var_2 )
|
||||
thread waitforstop();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_10.pos, var_12 ) )
|
||||
{
|
||||
if ( var_2 )
|
||||
thread waitforstop();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( var_2 )
|
||||
{
|
||||
cancelallbut( "stop", "sharpturn" );
|
||||
thread waitforpathset( "alienmove_endwait_pathsetwhilestopping", "alienmove_endwait_stop" );
|
||||
}
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", vectortoangles( var_3 ) );
|
||||
|
||||
if ( var_1 )
|
||||
{
|
||||
var_13 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_0 - self.origin, var_8 );
|
||||
self scragentsetanimscale( var_13.xy, var_13.z );
|
||||
}
|
||||
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_5, var_6, var_5, "end" );
|
||||
self scragentsetanimscale( 1.0, 1.0 );
|
||||
}
|
||||
|
||||
getstopendfacedir( var_0 )
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
return self.enemy.origin - var_0;
|
||||
|
||||
return var_0 - self.origin;
|
||||
}
|
||||
|
||||
getstopanimstate()
|
||||
{
|
||||
switch ( self.movemode )
|
||||
{
|
||||
case "jog":
|
||||
case "run":
|
||||
return "run_stop";
|
||||
case "walk":
|
||||
return "walk_stop";
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
getstopanimindex( var_0, var_1 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "walk_stop":
|
||||
return 0;
|
||||
case "run_stop":
|
||||
return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
waitforpathset( var_0, var_1 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( var_0 );
|
||||
var_2 = self scragentgetgoalpos();
|
||||
self waittill( "path_set" );
|
||||
var_3 = self scragentgetgoalpos();
|
||||
|
||||
if ( distancesquared( var_2, var_3 ) < 1 )
|
||||
{
|
||||
thread waitforpathset( var_0, var_1 );
|
||||
return;
|
||||
}
|
||||
|
||||
self notify( var_1 );
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
setmoveanim( var_0 )
|
||||
{
|
||||
if ( var_0 == "run" )
|
||||
{
|
||||
var_1 = self getanimentrycount( "run" );
|
||||
var_2 = [ 20, 80 ];
|
||||
var_3 = maps\mp\alien\_utility::getrandomindex( var_2 );
|
||||
self setanimstate( "run", var_3, self.moveplaybackrate );
|
||||
}
|
||||
else if ( var_0 == "walk" )
|
||||
{
|
||||
var_4 = undefined;
|
||||
self setanimstate( "walk", var_4, self.moveplaybackrate );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
cancelallbut( var_0, var_1 )
|
||||
{
|
||||
var_2 = [ "runwalk", "sharpturn", "stop", "pathsetwhilestopping", "jumpsoon", "pathsetwhilejumping", "pathset", "nearmiss", "dodgechance", "stuck" ];
|
||||
var_3 = isdefined( var_0 );
|
||||
var_4 = isdefined( var_1 );
|
||||
|
||||
foreach ( var_6 in var_2 )
|
||||
{
|
||||
if ( var_3 && var_6 == var_0 )
|
||||
continue;
|
||||
|
||||
if ( var_4 && var_6 == var_1 )
|
||||
continue;
|
||||
|
||||
self notify( "alienmove_endwait_" + var_6 );
|
||||
}
|
||||
}
|
||||
|
||||
getstopdata( var_0 )
|
||||
{
|
||||
var_1 = spawnstruct();
|
||||
|
||||
if ( isdefined( self.node ) )
|
||||
{
|
||||
var_1.pos = self.node.origin;
|
||||
var_1.angles = self.node.angles;
|
||||
}
|
||||
else if ( isdefined( self.enemy ) )
|
||||
{
|
||||
var_1.pos = var_0;
|
||||
var_1.angles = vectortoangles( self.enemy.origin - var_0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1.pos = var_0;
|
||||
var_1.angles = self.angles;
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
calcanimstartpos( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = var_1 - var_3;
|
||||
var_5 = ( 0, var_4, 0 );
|
||||
var_6 = anglestoforward( var_5 );
|
||||
var_7 = anglestoright( var_5 );
|
||||
var_8 = var_6 * var_2[0];
|
||||
var_9 = var_7 * var_2[1];
|
||||
return var_0 - var_8 + var_9;
|
||||
}
|
||||
|
||||
onflashbanged()
|
||||
{
|
||||
dostumble();
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( maps\mp\alien\_utility::is_pain_available( var_1, var_4 ) )
|
||||
dostumble( var_3, var_7, var_8, var_2, var_4, var_1 );
|
||||
}
|
||||
|
||||
dostumble( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( self.playing_pain_animation )
|
||||
return;
|
||||
|
||||
cancelallbut( undefined );
|
||||
self.statelocked = 1;
|
||||
self.playing_pain_animation = 1;
|
||||
var_6 = "move_pain";
|
||||
var_7 = randomint( self getanimentrycount( var_6 ) );
|
||||
var_8 = self getanimentry( var_6, var_7 );
|
||||
maps\mp\alien\_utility::always_play_pain_sound( var_8 );
|
||||
maps\mp\alien\_utility::register_pain( var_8 );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_6, var_7, self.moveplaybackrate, var_6, "code_move" );
|
||||
self.playing_pain_animation = 0;
|
||||
self.statelocked = 0;
|
||||
|
||||
if ( shouldstartmove() )
|
||||
startmove();
|
||||
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforstuck()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_stuck" );
|
||||
var_0 = 2000.0;
|
||||
var_1 = gettime() + var_0;
|
||||
var_2 = self.origin;
|
||||
var_3 = 1.0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_4 = gettime();
|
||||
var_5 = length( self.origin - var_2 );
|
||||
|
||||
if ( var_5 > var_3 )
|
||||
var_1 = var_4 + var_0;
|
||||
|
||||
if ( var_1 <= var_4 )
|
||||
{
|
||||
stucklerp();
|
||||
var_1 = var_4 + var_0;
|
||||
break;
|
||||
}
|
||||
|
||||
var_2 = self.origin;
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
stucklerp()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "alienmove_endwait_stuck" );
|
||||
self endon( "death" );
|
||||
var_0 = 0.2;
|
||||
cancelallbut( "stuck" );
|
||||
var_1 = self getanimentry();
|
||||
var_2 = getanimlength( var_1 );
|
||||
var_3 = length( getmovedelta( var_1 ) );
|
||||
var_4 = var_0 / var_2 * var_3;
|
||||
var_5 = self getlookaheaddir();
|
||||
var_6 = self.origin + var_5 * var_4;
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetorientmode( "face angle abs", vectortoangles( var_5 ) );
|
||||
self scragentdoanimlerp( self.origin, var_6, var_0 );
|
||||
wait( var_0 );
|
||||
self setorigin( self.origin );
|
||||
}
|
||||
|
||||
dowalkstart()
|
||||
{
|
||||
var_0 = "walk_start";
|
||||
var_1 = maps\mp\agents\_scriptedagents::getrandomanimentry( var_0 );
|
||||
var_2 = self getlookaheaddir();
|
||||
|
||||
if ( isdefined( self.pathnode ) )
|
||||
var_2 = vectornormalize( self.pathnode.origin - self.origin );
|
||||
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_2 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.blockgoalpos = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
dorunstart()
|
||||
{
|
||||
var_0 = self getnegotiationstartnode();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_1 = var_0.origin;
|
||||
else
|
||||
var_1 = self getpathgoalpos();
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return;
|
||||
|
||||
if ( distancesquared( var_1, self.origin ) < 10000 )
|
||||
return;
|
||||
|
||||
dostartmoveanim( "run_start" );
|
||||
}
|
||||
|
||||
dostartmoveanim( var_0 )
|
||||
{
|
||||
var_1 = 0;
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.blockgoalpos = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
candostartmove()
|
||||
{
|
||||
if ( !isdefined( self.skipstartmove ) )
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
getstartmovetype()
|
||||
{
|
||||
switch ( self.movemode )
|
||||
{
|
||||
case "run":
|
||||
return "run-start";
|
||||
case "walk":
|
||||
return "walk-start";
|
||||
default:
|
||||
return "run-start";
|
||||
}
|
||||
}
|
||||
|
||||
shoulddostopanim()
|
||||
{
|
||||
return isdefined( self.enablestop ) && self.enablestop == 1;
|
||||
}
|
||||
|
||||
candoturnanim( var_0 )
|
||||
{
|
||||
var_1 = 16;
|
||||
var_2 = 10;
|
||||
var_3 = ( 0, 0, 16 );
|
||||
|
||||
if ( !isdefined( self getpathgoalpos() ) )
|
||||
return 0;
|
||||
|
||||
var_4 = getnotetracktimes( var_0, "code_move" );
|
||||
var_5 = var_4[0];
|
||||
var_6 = getmovedelta( var_0, 0, var_5 );
|
||||
var_7 = self localtoworldcoords( var_6 );
|
||||
var_7 = getgroundposition( var_7, self.radius );
|
||||
|
||||
if ( !isdefined( var_7 ) )
|
||||
return 0;
|
||||
|
||||
var_8 = self aiphysicstracepassed( self.origin + var_3, var_7 + var_3, self.radius - var_2, self.height - var_1 );
|
||||
|
||||
if ( var_8 )
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
shouldstartmove()
|
||||
{
|
||||
var_0 = getstartmoveangleindex();
|
||||
return var_0 < 3 || var_0 > 5;
|
||||
}
|
||||
|
||||
getstartmoveangleindex()
|
||||
{
|
||||
return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( self getlookaheaddir() );
|
||||
}
|
454
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_think.gsc
Normal file
454
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_think.gsc
Normal file
@ -0,0 +1,454 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "death" );
|
||||
common_scripts\utility::waitframe();
|
||||
thread watch_for_badpath();
|
||||
thread health_monitor();
|
||||
initialize_path();
|
||||
initialize_attacks();
|
||||
self.ancestor_scripted_active = 0;
|
||||
|
||||
for (;;)
|
||||
main_loop();
|
||||
}
|
||||
|
||||
initialize_path()
|
||||
{
|
||||
var_0 = getnodearray( "ancestor_path_start", "script_noteworthy" );
|
||||
self.pathnode = common_scripts\utility::getclosest( self.origin, var_0, 512 );
|
||||
self.following_path = 0;
|
||||
}
|
||||
|
||||
initialize_attacks()
|
||||
{
|
||||
var_0 = gettime();
|
||||
self.last_spawn_time = var_0;
|
||||
self.last_blast_time = var_0;
|
||||
self.last_attack_time = var_0;
|
||||
self.last_grab_time = var_0;
|
||||
self.grab_lift_entities = [];
|
||||
self.current_grab_victims = [];
|
||||
self.grab_target_disabled = 0;
|
||||
}
|
||||
|
||||
has_died()
|
||||
{
|
||||
return maps\mp\agents\alien\alien_ancestor\_alien_ancestor::getrealhealth() < 0;
|
||||
}
|
||||
|
||||
health_monitor()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( has_died() )
|
||||
break;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
death_attack( self.enemy );
|
||||
}
|
||||
|
||||
main_loop()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
self.looktarget = undefined;
|
||||
var_0 = self.enemy;
|
||||
|
||||
if ( isdefined( self.alien_scripted ) && self.alien_scripted == 1 )
|
||||
{
|
||||
self.ancestor_scripted_active = 1;
|
||||
self.following_path = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.ancestor_scripted_active = 0;
|
||||
|
||||
if ( self.badpath )
|
||||
badpath( var_0 );
|
||||
else
|
||||
update_loop();
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
badpath( var_0 )
|
||||
{
|
||||
self.badpathcount = 0;
|
||||
self.badpath = 0;
|
||||
}
|
||||
|
||||
update_loop()
|
||||
{
|
||||
if ( has_died() )
|
||||
return;
|
||||
|
||||
self.looktarget = self.enemy;
|
||||
var_0 = should_i_attack( self.enemy );
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
ancestor_attack( var_0, self.enemy );
|
||||
else if ( !self.following_path )
|
||||
thread follow_path();
|
||||
}
|
||||
|
||||
should_i_attack( var_0 )
|
||||
{
|
||||
if ( self.statelocked )
|
||||
return undefined;
|
||||
|
||||
if ( should_force_blast() )
|
||||
return "forced_blast";
|
||||
|
||||
if ( should_force_grab() )
|
||||
return "forced_grab";
|
||||
|
||||
if ( gettime() - self.last_attack_time < 2000 )
|
||||
return undefined;
|
||||
|
||||
if ( should_shield( var_0 ) )
|
||||
return "shield";
|
||||
else if ( should_grab( var_0 ) )
|
||||
return "grab";
|
||||
else if ( should_blast( var_0 ) )
|
||||
return "blast";
|
||||
|
||||
if ( should_spawn( var_0 ) )
|
||||
return "spawn";
|
||||
else if ( should_direct( var_0 ) )
|
||||
return "direct";
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
follow_path()
|
||||
{
|
||||
if ( !isdefined( self.pathnode ) )
|
||||
return;
|
||||
|
||||
if ( distancesquared( self.origin, self.pathnode.origin ) < 1024.0 )
|
||||
{
|
||||
if ( isdefined( self.pathnode.target ) )
|
||||
self.pathnode = getnode( self.pathnode.target, "targetname" );
|
||||
else
|
||||
self.pathnode = undefined;
|
||||
}
|
||||
|
||||
if ( !isdefined( self.pathnode ) )
|
||||
{
|
||||
self notify( "Path ended" );
|
||||
return;
|
||||
}
|
||||
|
||||
self.following_path = 1;
|
||||
self scragentsetgoalradius( 32.0 );
|
||||
self scragentsetgoalnode( self.pathnode );
|
||||
|
||||
if ( self.currentanimstate == "move" )
|
||||
{
|
||||
var_0 = vectornormalize( self.pathnode.origin - self.origin );
|
||||
self notify( "path_dir_change", var_0 );
|
||||
}
|
||||
|
||||
self waittill( "goal_reached" );
|
||||
|
||||
if ( isdefined( self.pathnode.script_noteworthy ) )
|
||||
self notify( self.pathnode.script_noteworthy );
|
||||
|
||||
self.following_path = 0;
|
||||
}
|
||||
|
||||
assign_path_node( var_0 )
|
||||
{
|
||||
self.pathnode = var_0;
|
||||
self.following_path = 0;
|
||||
}
|
||||
|
||||
should_shield( var_0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
should_spawn( var_0 )
|
||||
{
|
||||
if ( gettime() - self.last_spawn_time < 30000 )
|
||||
return 0;
|
||||
|
||||
if ( maps\mp\alien\_spawn_director::can_spawn_type( "brute" ) )
|
||||
return 1;
|
||||
|
||||
return maps\mp\alien\_spawn_director::can_spawn_type( "goon" );
|
||||
}
|
||||
|
||||
should_direct( var_0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
should_blast( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
return 0;
|
||||
|
||||
if ( var_0.classname == "script_model" && !bullettracepassed( self gettagorigin( "TAG_EYE" ), var_0.origin, 0, self.shield ) )
|
||||
return 0;
|
||||
else if ( !bullettracepassed( self gettagorigin( "TAG_EYE" ), var_0 gettagorigin( "TAG_EYE" ), 0, self.shield ) )
|
||||
return 0;
|
||||
|
||||
return gettime() - self.last_blast_time > 6000;
|
||||
}
|
||||
|
||||
should_force_blast()
|
||||
{
|
||||
return isdefined( self.forced_blast_position );
|
||||
}
|
||||
|
||||
should_force_grab()
|
||||
{
|
||||
return isdefined( self.forced_grab_position );
|
||||
}
|
||||
|
||||
should_grab( var_0 )
|
||||
{
|
||||
if ( gettime() - self.last_grab_time < 4000 )
|
||||
return 0;
|
||||
|
||||
self.grab_target = undefined;
|
||||
var_1 = 0;
|
||||
var_2 = anglestoforward( self.angles );
|
||||
var_3 = 0.707;
|
||||
var_4 = gettime();
|
||||
|
||||
foreach ( var_6 in level.players )
|
||||
{
|
||||
if ( var_6.inlaststand )
|
||||
continue;
|
||||
|
||||
if ( var_6.ignoreme )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_6.next_valid_grab_time ) && var_6.next_valid_grab_time > var_4 )
|
||||
continue;
|
||||
|
||||
var_7 = vectornormalize( var_6.origin - self.origin );
|
||||
|
||||
if ( vectordot( var_2, var_7 ) < var_3 )
|
||||
continue;
|
||||
|
||||
var_8 = distancesquared( var_6.origin, self.origin );
|
||||
|
||||
if ( var_8 > 589824 )
|
||||
continue;
|
||||
|
||||
if ( !bullettracepassed( self gettagorigin( "TAG_EYE" ), var_6 gettagorigin( "TAG_EYE" ), 0, self.shield ) )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( self.grab_target ) || var_8 < var_1 )
|
||||
{
|
||||
self.grab_target = var_6;
|
||||
var_1 = var_8;
|
||||
}
|
||||
}
|
||||
|
||||
return isdefined( self.grab_target );
|
||||
}
|
||||
|
||||
blast( var_0 )
|
||||
{
|
||||
self.blast_target = var_0;
|
||||
attack_enemy( "blast", var_0 );
|
||||
}
|
||||
|
||||
forced_blast( var_0 )
|
||||
{
|
||||
attack_enemy( "forced_blast", var_0 );
|
||||
}
|
||||
|
||||
forced_grab( var_0 )
|
||||
{
|
||||
attack_enemy( "forced_grab", var_0 );
|
||||
}
|
||||
|
||||
grab( var_0 )
|
||||
{
|
||||
attack_enemy( "grab", var_0 );
|
||||
}
|
||||
|
||||
spawn_attack( var_0 )
|
||||
{
|
||||
attack_enemy( "spawn", var_0 );
|
||||
}
|
||||
|
||||
death_attack( var_0 )
|
||||
{
|
||||
attack_enemy( "death", var_0 );
|
||||
}
|
||||
|
||||
ancestor_attack( var_0, var_1 )
|
||||
{
|
||||
self notify( "start_attack" );
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "blast":
|
||||
blast( var_1 );
|
||||
break;
|
||||
case "forced_blast":
|
||||
forced_blast( var_1 );
|
||||
break;
|
||||
case "forced_grab":
|
||||
forced_grab( var_1 );
|
||||
break;
|
||||
case "grab":
|
||||
grab( var_1 );
|
||||
break;
|
||||
case "spawn":
|
||||
spawn_attack( var_1 );
|
||||
break;
|
||||
case "death":
|
||||
death_attack( var_1 );
|
||||
break;
|
||||
default:
|
||||
wait 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
attack_enemy( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_1 ) )
|
||||
{
|
||||
foreach ( var_3 in level.players )
|
||||
{
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_1 = var_3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
self.melee_type = var_0;
|
||||
self scragentbeginmelee( var_1 );
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 4096.0 );
|
||||
self waittill( "melee_complete" );
|
||||
self.last_attack_time = gettime();
|
||||
}
|
||||
else
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
force_blast_attack( var_0 )
|
||||
{
|
||||
self.forced_blast_position = var_0;
|
||||
}
|
||||
|
||||
force_grab_attack( var_0 )
|
||||
{
|
||||
self.forced_grab_position = var_0;
|
||||
}
|
||||
|
||||
noncombat()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
watch_for_badpath()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.badpath = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "bad_path", var_0, var_1 );
|
||||
self.badpath = 1;
|
||||
|
||||
if ( !isdefined( self.badpathcount ) || isdefined( self.badpathtime ) && gettime() > self.badpathtime + 2000 )
|
||||
self.badpathcount = 0;
|
||||
|
||||
self.badpathtime = gettime();
|
||||
self.badpathcount++;
|
||||
badpath( undefined );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
ancestor_enter_scripted()
|
||||
{
|
||||
maps\mp\alien\_utility::enable_alien_scripted();
|
||||
|
||||
while ( !maps\mp\alien\_utility::is_true( self.ancestor_scripted_active ) )
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
ancestor_path_to_node( var_0 )
|
||||
{
|
||||
var_1 = getnode( var_0, "targetname" );
|
||||
|
||||
if ( !isdefined( var_1 ) )
|
||||
return;
|
||||
|
||||
self.pathnode = var_1;
|
||||
self scragentsetgoalradius( 28 );
|
||||
self scragentsetgoalnode( self.pathnode );
|
||||
self waittill( "goal_reached" );
|
||||
}
|
||||
|
||||
ancestor_do_forced_grab( var_0 )
|
||||
{
|
||||
var_0 = getent( var_0, "targetname" );
|
||||
self scragentsetorientmode( "face angle abs", var_0.angles );
|
||||
force_grab_attack( var_0.origin );
|
||||
self scragentsetgoalradius( 64 );
|
||||
self scragentsetgoalnode( self.pathnode );
|
||||
maps\mp\alien\_utility::disable_alien_scripted();
|
||||
self waittill( "forced_grab_damage_start" );
|
||||
ancestor_enter_scripted();
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
ancestor_play_traversal( var_0, var_1 )
|
||||
{
|
||||
self scragentsetscripted( 1 );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( anglestoforward( var_0 ) );
|
||||
wait 0.5;
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
self scragentsetorientmode( "face angle abs", var_0 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( var_1, "traverse", "end" );
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 28.0 );
|
||||
self scragentsetscripted( 0 );
|
||||
}
|
||||
|
||||
ancestor_align_to_angles( var_0 )
|
||||
{
|
||||
var_1 = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_2 = vectordot( anglestoforward( self.angles ), anglestoforward( var_0 ) );
|
||||
|
||||
if ( var_2 < 0.95 )
|
||||
{
|
||||
var_1++;
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( anglestoforward( var_0 ) );
|
||||
}
|
||||
else
|
||||
return;
|
||||
|
||||
if ( var_1 >= 5 )
|
||||
return;
|
||||
}
|
||||
}
|
1146
maps/mp/agents/alien/alien_kraken/_alien_kraken.gsc
Normal file
1146
maps/mp/agents/alien/alien_kraken/_alien_kraken.gsc
Normal file
File diff suppressed because it is too large
Load Diff
79
maps/mp/agents/alien/alien_kraken/_alien_kraken_idle.gsc
Normal file
79
maps/mp/agents/alien/alien_kraken/_alien_kraken_idle.gsc
Normal file
@ -0,0 +1,79 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
init_alien_idle();
|
||||
|
||||
if ( !isdefined( level.fx_water_loop_running ) )
|
||||
{
|
||||
level.fx_water_loop_running = 1;
|
||||
thread play_water_fx_loop();
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.stage ) || self.posturing || self.smashing )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
play_idle();
|
||||
}
|
||||
}
|
||||
|
||||
init_alien_idle()
|
||||
{
|
||||
self.idle_anim_counter = 0;
|
||||
}
|
||||
|
||||
play_idle()
|
||||
{
|
||||
var_0 = selectidleanimstate();
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, undefined, "idle", "end" );
|
||||
}
|
||||
|
||||
play_water_fx_loop()
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 = [ "water_fx1", "water_fx2", "water_fx3", "water_fx4" ];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.01;
|
||||
|
||||
if ( common_scripts\utility::flag( "fx_kraken_water" ) )
|
||||
{
|
||||
wait( randomfloatrange( 0.8, 3.3 ) );
|
||||
self setscriptablepartstate( "body", "normal" );
|
||||
wait 0.1;
|
||||
var_1 = common_scripts\utility::random( var_0 );
|
||||
self setscriptablepartstate( "body", var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( common_scripts\utility::flag( "fx_kraken_water" ) )
|
||||
self setscriptablepartstate( "body", "normal" );
|
||||
}
|
||||
|
||||
end_water_fx_loop()
|
||||
{
|
||||
self waittill( "heat" );
|
||||
wait 0.1;
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
}
|
||||
|
||||
selectidleanimstate()
|
||||
{
|
||||
var_0 = "idle_";
|
||||
|
||||
if ( isdefined( self.anim_state_modifier ) )
|
||||
var_0 = var_0 + ( self.anim_state_modifier + "_" );
|
||||
|
||||
var_1 = var_0 + level.alien_types["kraken"].attributes[self.stage]["ship_side"];
|
||||
return var_1;
|
||||
}
|
825
maps/mp/agents/alien/alien_kraken/_alien_kraken_melee.gsc
Normal file
825
maps/mp/agents/alien/alien_kraken/_alien_kraken_melee.gsc
Normal file
@ -0,0 +1,825 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
var_0 = gettime();
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
switch ( self.melee_type )
|
||||
{
|
||||
case "emerge":
|
||||
emerge();
|
||||
break;
|
||||
case "submerge":
|
||||
submerge();
|
||||
break;
|
||||
case "charge":
|
||||
charge();
|
||||
break;
|
||||
case "heat":
|
||||
heat();
|
||||
break;
|
||||
case "smash":
|
||||
smash();
|
||||
break;
|
||||
case "posture":
|
||||
posture();
|
||||
break;
|
||||
case "death":
|
||||
death();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( var_0 == gettime() )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "melee_complete" );
|
||||
}
|
||||
|
||||
endscript()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
charge()
|
||||
{
|
||||
level notify( "dlc_vo_notify", "kraken_vo", "kraken_weak" );
|
||||
common_scripts\utility::flag_clear( "fx_kraken_water" );
|
||||
|
||||
foreach ( var_1 in self.tentacles )
|
||||
var_1 thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::retract();
|
||||
|
||||
var_3 = getsideanimstate( "charge_" );
|
||||
var_4 = "charge_complete";
|
||||
thread play_kraken_charge_sfx();
|
||||
playanim( var_3, 0 );
|
||||
var_5 = level.alien_types[self.alien_type].attributes[self.stage]["charge_phase_duration"] * 1000.0;
|
||||
var_6 = gettime() + var_5;
|
||||
thread playloopanim( var_3, var_4 );
|
||||
self setscriptablepartstate( "body", "heat_charge_body_fx_01" );
|
||||
thread maps\mp\agents\alien\alien_kraken\_alien_kraken::play_kraken_eyeglow1_fx();
|
||||
|
||||
while ( gettime() < var_6 )
|
||||
wait 0.05;
|
||||
|
||||
self.damage_multiplier = maps\mp\agents\alien\alien_kraken\_alien_kraken::getkrakendamagemultiplier();
|
||||
self.kraken_heated = 1;
|
||||
self notify( var_4 );
|
||||
}
|
||||
|
||||
play_kraken_charge_sfx()
|
||||
{
|
||||
wait 4;
|
||||
level.kraken playloopsound( "kraken_charge_loop_sfx" );
|
||||
}
|
||||
|
||||
stop_kraken_charge_sfx()
|
||||
{
|
||||
wait 5;
|
||||
level.kraken stoploopsound( "kraken_charge_loop_sfx" );
|
||||
}
|
||||
|
||||
playloopanim( var_0, var_1 )
|
||||
{
|
||||
self endon( var_1 );
|
||||
self endon( "end_loop_anim" );
|
||||
|
||||
for (;;)
|
||||
playanim( var_0, 1 );
|
||||
}
|
||||
|
||||
playheatanims( var_0 )
|
||||
{
|
||||
var_1 = getsideanimstate( "heat_" );
|
||||
playanim( var_1, 0 );
|
||||
playloopanim( var_1, var_0 );
|
||||
}
|
||||
|
||||
heat()
|
||||
{
|
||||
common_scripts\utility::flag_clear( "fx_kraken_water" );
|
||||
var_0 = level.alien_types[self.alien_type].attributes[self.stage]["heated_phase_health_threshold"];
|
||||
var_1 = level.alien_types[self.alien_type].attributes[self.stage]["heated_phase_damage_per_second"];
|
||||
var_2 = getent( "heated_deck_01", "targetname" );
|
||||
var_3 = getent( "heated_deck_vfx_01", "targetname" );
|
||||
var_4 = "heat_complete";
|
||||
thread stop_kraken_charge_sfx();
|
||||
thread playheatanims( var_4 );
|
||||
thread warn_heat();
|
||||
|
||||
foreach ( var_6 in self.tentacles )
|
||||
{
|
||||
var_6 maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::teleportside( self.stage );
|
||||
var_6 thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::heat();
|
||||
}
|
||||
|
||||
var_4 = "heat_complete";
|
||||
var_8 = getsideanimstate( "heat_" );
|
||||
playanim( var_8, 0 );
|
||||
thread playloopanim( var_8, var_4 );
|
||||
maps\mp\agents\alien\alien_kraken\_alien_kraken::waitforextendedtentacles();
|
||||
maps\mp\agents\alien\alien_kraken\_alien_kraken::setupheatedsmashvolume();
|
||||
thread heatedsmashmonitor( var_4, var_8 );
|
||||
var_9 = gettime();
|
||||
thread heat_deck_fx( var_4 );
|
||||
|
||||
while ( maps\mp\agents\alien\alien_kraken\_alien_kraken::gethealthratio() > var_0 )
|
||||
{
|
||||
var_10 = gettime();
|
||||
|
||||
if ( var_10 - var_9 > 1000.0 )
|
||||
{
|
||||
var_11 = ( var_10 - var_9 ) / 1000.0 * var_1;
|
||||
var_12 = [];
|
||||
|
||||
foreach ( var_14 in level.kraken_safe_spot_volumes )
|
||||
{
|
||||
var_15 = var_14 getistouchingentities( level.players );
|
||||
var_12 = common_scripts\utility::array_combine( var_12, var_15 );
|
||||
}
|
||||
|
||||
foreach ( var_18 in level.players )
|
||||
{
|
||||
if ( common_scripts\utility::array_contains( var_12, var_18 ) )
|
||||
continue;
|
||||
|
||||
var_18 dodamage( var_11, var_18.origin, self, self );
|
||||
}
|
||||
|
||||
var_9 = var_10;
|
||||
}
|
||||
|
||||
common_scripts\utility::waitframe();
|
||||
}
|
||||
|
||||
maps\mp\agents\alien\alien_kraken\_alien_kraken::waitforidletentacles();
|
||||
|
||||
foreach ( var_6 in self.tentacles )
|
||||
var_6 notify( var_4 );
|
||||
|
||||
self notify( var_4 );
|
||||
thread reset_deck_fx( var_2, var_3 );
|
||||
thread maps\mp\agents\alien\alien_kraken\_alien_kraken::stop_kraken_eyeglow1_fx();
|
||||
}
|
||||
|
||||
warn_heat()
|
||||
{
|
||||
wait 12;
|
||||
level notify( "dlc_vo_notify", "kraken_vo", "warn_metal" );
|
||||
}
|
||||
|
||||
reset_deck_fx( var_0, var_1 )
|
||||
{
|
||||
var_0 setscriptablepartstate( "deck", "heated_deck_anim_out" );
|
||||
wait 1.0;
|
||||
var_1 setscriptablepartstate( "deck_steam", "normal" );
|
||||
}
|
||||
|
||||
heat_deck_fx( var_0 )
|
||||
{
|
||||
self endon( var_0 );
|
||||
var_1 = getent( "heated_deck_01", "targetname" );
|
||||
var_2 = getent( "heated_deck_vfx_01", "targetname" );
|
||||
var_1 setscriptablepartstate( "deck", "heated_deck_anim_in" );
|
||||
wait 1.0;
|
||||
thread heat_deck_sfx( var_0 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_2 setscriptablepartstate( "deck_steam", "hot_1" );
|
||||
wait 2.0;
|
||||
var_2 setscriptablepartstate( "deck_steam", "hot_2" );
|
||||
wait 2.0;
|
||||
}
|
||||
}
|
||||
|
||||
heat_deck_sfx( var_0 )
|
||||
{
|
||||
var_1 = common_scripts\utility::play_loopsound_in_space( "krk_heat_loop", ( -868, 7058, 1154 ) );
|
||||
wait 0.02;
|
||||
var_2 = common_scripts\utility::play_loopsound_in_space( "krk_heat_loop", ( 261, 8411, 1154 ) );
|
||||
wait 0.02;
|
||||
var_3 = common_scripts\utility::play_loopsound_in_space( "krk_heat_loop", ( -788, 8388, 1154 ) );
|
||||
wait 0.02;
|
||||
var_4 = common_scripts\utility::play_loopsound_in_space( "krk_heat_loop", ( 330, 6988, 1154 ) );
|
||||
self waittill( var_0 );
|
||||
var_1 delete();
|
||||
wait 0.02;
|
||||
var_2 delete();
|
||||
wait 0.02;
|
||||
var_3 delete();
|
||||
wait 0.02;
|
||||
var_4 delete();
|
||||
}
|
||||
|
||||
smash()
|
||||
{
|
||||
common_scripts\utility::flag_set( "fx_kraken_water" );
|
||||
var_0 = "smash";
|
||||
|
||||
if ( isdefined( level.kraken.anim_state_modifier ) )
|
||||
var_0 = var_0 + ( "_" + level.kraken.anim_state_modifier );
|
||||
|
||||
level notify( "dlc_vo_notify", "warn_kraken_attack" );
|
||||
self.tentacles[self.smash_tentacle_name] thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::smash( self.smash_trigger );
|
||||
|
||||
if ( !self.posturing && !self.smashing )
|
||||
{
|
||||
var_1 = self getanimentrycount( var_0 );
|
||||
var_2 = randomint( var_1 );
|
||||
thread smashanimmonitor( var_0, var_2 );
|
||||
playanim( var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
smashanimmonitor( var_0, var_1 )
|
||||
{
|
||||
self notify( "smash_anim_monitor_start" );
|
||||
self endon( "smash_anim_monitor_start" );
|
||||
self.smashing = 1;
|
||||
var_2 = self getanimentry( var_0, var_1 );
|
||||
var_3 = getanimlength( var_2 );
|
||||
wait( var_3 );
|
||||
self.smashing = 0;
|
||||
}
|
||||
|
||||
heatedsmashmonitor( var_0, var_1 )
|
||||
{
|
||||
self endon( var_0 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "smash_trigger_hit", var_2, var_3 );
|
||||
attemptheatedsmashattack( var_2, var_3, var_0, var_1 );
|
||||
}
|
||||
}
|
||||
|
||||
attemptheatedsmashattack( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self.tentacles[var_1] thread runtentacleheatsmash( var_0, var_2 );
|
||||
|
||||
if ( level.alien_types["kraken"].attributes[self.stage]["ship_side"] == "port" )
|
||||
{
|
||||
self notify( "end_loop_anim" );
|
||||
playanim( "heat_smash" );
|
||||
thread playloopanim( var_3, var_2 );
|
||||
}
|
||||
}
|
||||
|
||||
runtentacleheatsmash( var_0, var_1 )
|
||||
{
|
||||
self endon( var_1 );
|
||||
maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::heatsmash( var_0 );
|
||||
}
|
||||
|
||||
playanim( var_0, var_1, var_2 )
|
||||
{
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_1, var_0, "end", var_2 );
|
||||
}
|
||||
|
||||
posture()
|
||||
{
|
||||
common_scripts\utility::flag_set( "fx_kraken_water" );
|
||||
thread playpostureanim();
|
||||
}
|
||||
|
||||
handleposturenotes( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "kra_posture":
|
||||
thread performroar();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
playpostureanim( var_0 )
|
||||
{
|
||||
self notify( "posture_anim_monitor_start" );
|
||||
self endon( "posture_anim_monitor_start" );
|
||||
self.posturing = 1;
|
||||
playanim( "posture", undefined, ::handleposturenotes );
|
||||
self.posturing = 0;
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 1.0 );
|
||||
}
|
||||
|
||||
death()
|
||||
{
|
||||
thread kraken_death_music();
|
||||
|
||||
foreach ( var_1 in self.tentacles )
|
||||
var_1 thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::death();
|
||||
|
||||
playanim( "death", 0, ::handledeathnotetracks );
|
||||
}
|
||||
|
||||
kraken_death_music()
|
||||
{
|
||||
wait 1;
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( common_scripts\utility::flag( "alien_music_playing" ) )
|
||||
{
|
||||
var_1 stoplocalsound( "mp_suspense_01" );
|
||||
var_1 stoplocalsound( "mp_suspense_02" );
|
||||
var_1 stoplocalsound( "mp_suspense_03" );
|
||||
var_1 stoplocalsound( "mp_suspense_04" );
|
||||
var_1 stoplocalsound( "mp_suspense_05" );
|
||||
var_1 stoplocalsound( "mp_suspense_06" );
|
||||
var_1 stoplocalsound( "mus_alien_newwave" );
|
||||
var_1 stoplocalsound( "mus_alien_queen" );
|
||||
common_scripts\utility::flag_clear( "alien_music_playing" );
|
||||
}
|
||||
|
||||
if ( !common_scripts\utility::flag( "exfil_music_playing" ) )
|
||||
level thread maps\mp\alien\_music_and_dialog::play_alien_music( "mus_alien_dlc2_kraken_death" );
|
||||
}
|
||||
}
|
||||
|
||||
handledeathnotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "fx_cleardeck_d":
|
||||
thread playeyedeathfx();
|
||||
maps\mp\alien\_utility::set_alien_emissive( 1.0, 1.0 );
|
||||
playfxontag( level._effect["kraken_blood_roar_emitter"], self, "TAG_EYE_throat" );
|
||||
break;
|
||||
case "fx_roar_d":
|
||||
playfxontag( level._effect["kraken_blood_roar_gurgle"], self, "TAG_EYE_throat" );
|
||||
break;
|
||||
case "fx_cough":
|
||||
break;
|
||||
case "fx_startfall":
|
||||
maps\mp\alien\_utility::set_alien_emissive( 2.0, 0.0 );
|
||||
break;
|
||||
case "fx_jawhit":
|
||||
break;
|
||||
case "fx_headhit":
|
||||
thread stopeyedeathfx();
|
||||
break;
|
||||
case "fx_startslide":
|
||||
break;
|
||||
case "tnt_lc_dth":
|
||||
level.kraken thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_lc_dth", "j_tentacle_08_ru", 16 );
|
||||
break;
|
||||
case "tnt_rc_dth":
|
||||
level.kraken thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_rc_dth", "j_tentacle_08_lu", 7 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
playeyedeathfx()
|
||||
{
|
||||
wait 0.1;
|
||||
playfxontag( level._effect["kraken_eye_glow_01"], level.kraken, "tag_eye" );
|
||||
wait 0.1;
|
||||
playfxontag( level._effect["kraken_back_glow_01"], level.kraken, "j_spineback_up" );
|
||||
}
|
||||
|
||||
stopeyedeathfx()
|
||||
{
|
||||
stopfxontag( level._effect["kraken_eye_glow_01"], level.kraken, "tag_eye" );
|
||||
wait 0.1;
|
||||
stopfxontag( level._effect["kraken_back_glow_01"], level.kraken, "j_spineback_up" );
|
||||
}
|
||||
|
||||
emerge()
|
||||
{
|
||||
common_scripts\utility::flag_set( "fx_kraken_water" );
|
||||
var_0 = level.alien_types[self.alien_type].attributes[self.stage]["emerge_teleport_position"];
|
||||
var_1 = common_scripts\utility::getstruct( var_0, "targetname" );
|
||||
self setorigin( var_1.origin );
|
||||
self setplayerangles( var_1.angles );
|
||||
self scragentsetorientmode( "face angle abs", var_1.angles, var_1.angles );
|
||||
self show();
|
||||
|
||||
if ( self.stage == "stage_1" )
|
||||
{
|
||||
level notify( "dlc_vo_notify", "kraken_intro" );
|
||||
playintroanim();
|
||||
}
|
||||
else
|
||||
{
|
||||
level notify( "kraken_emerge_phase" );
|
||||
playemergeanim();
|
||||
}
|
||||
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 4096 );
|
||||
}
|
||||
|
||||
playintroanim()
|
||||
{
|
||||
var_0 = "intro";
|
||||
playanim( var_0, 0, ::handleemergenotetracks );
|
||||
}
|
||||
|
||||
playemergeanim()
|
||||
{
|
||||
foreach ( var_1 in self.tentacles )
|
||||
thread extendtentacle( var_1, 1 );
|
||||
|
||||
var_3 = "emerge_" + level.alien_types["kraken"].attributes[self.stage]["ship_side"];
|
||||
thread play_emerge_music();
|
||||
playanim( var_3, 0, ::handlereemergenotetracks );
|
||||
}
|
||||
|
||||
handlereemergenotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "fx_cleardeck_star":
|
||||
case "fx_cleardeck_port":
|
||||
thread playjawwaterfx();
|
||||
thread playhelmetwaterfx();
|
||||
thread playpincerswaterfx();
|
||||
break;
|
||||
case "fx_roar_star":
|
||||
case "fx_roar_port":
|
||||
thread posture_emissive();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
play_emerge_music()
|
||||
{
|
||||
wait 1;
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( common_scripts\utility::flag( "alien_music_playing" ) )
|
||||
{
|
||||
var_1 stoplocalsound( "mp_suspense_01" );
|
||||
var_1 stoplocalsound( "mp_suspense_02" );
|
||||
var_1 stoplocalsound( "mp_suspense_03" );
|
||||
var_1 stoplocalsound( "mp_suspense_04" );
|
||||
var_1 stoplocalsound( "mp_suspense_05" );
|
||||
var_1 stoplocalsound( "mp_suspense_06" );
|
||||
var_1 stoplocalsound( "mus_alien_newwave" );
|
||||
var_1 stoplocalsound( "mus_alien_queen" );
|
||||
common_scripts\utility::flag_clear( "alien_music_playing" );
|
||||
}
|
||||
|
||||
level thread maps\mp\alien\_music_and_dialog::play_alien_music( "mus_alien_dlc2_kraken_reemerge" );
|
||||
}
|
||||
}
|
||||
|
||||
posture_emissive()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.85, 1.0 );
|
||||
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( isalive( var_1 ) )
|
||||
{
|
||||
var_1 shellshock( "alien_kraken_emp", 3.0 );
|
||||
earthquake( 0.75, 1.0, var_1.origin, 100 );
|
||||
}
|
||||
}
|
||||
|
||||
wait 3.0;
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 1.0 );
|
||||
}
|
||||
|
||||
handleemergenotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "fx_cleardeck":
|
||||
thread playpincerswaterfx();
|
||||
break;
|
||||
case "fx_breakright":
|
||||
break;
|
||||
case "fx_startsweepleft":
|
||||
playfxontag( level._effect["kraken_water_sweep_rt_emitter"], self, "TAG_EYE_SweepRight004" );
|
||||
playfxontag( level._effect["kraken_water_sweep_rt_emitter"], self, "TAG_EYE_SweepRight005" );
|
||||
break;
|
||||
case "fx_breakleft":
|
||||
break;
|
||||
case "fx_startsweepmiddle":
|
||||
playfxontag( level._effect["kraken_water_spray_emitter"], self, "TAG_EYE" );
|
||||
break;
|
||||
case "fx_breakmiddle":
|
||||
playfxontag( level._effect["kraken_water_roar_emitter1"], self, "TAG_EYE_breakMiddle" );
|
||||
break;
|
||||
case "fx_roar":
|
||||
thread emerge_shock();
|
||||
break;
|
||||
case "intro_ten_emerge_start":
|
||||
foreach ( var_5 in self.tentacles )
|
||||
{
|
||||
var_5 show();
|
||||
thread extendtentacle( var_5, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
emerge_shock()
|
||||
{
|
||||
wait 1.5;
|
||||
performroar();
|
||||
}
|
||||
|
||||
playjawwaterfx()
|
||||
{
|
||||
playfxontag( level._effect["kraken_water_stream_emitter"], self, "j_jaw_fx_front_lf" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_emitter"], self, "j_jaw_fx_front_rt" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_emitter"], self, "j_jaw_fx_side_lf" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_emitter"], self, "j_jaw_fx_side_rt" );
|
||||
}
|
||||
|
||||
playhelmetwaterfx()
|
||||
{
|
||||
playfxontag( level._effect["kraken_water_stream_e_lite"], self, "TAG_EYE_helmet_lf_001" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_e_lite"], self, "TAG_EYE_helmet_lf_003" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_e_lite"], self, "TAG_EYE_helmet_lf_005" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_e_lite"], self, "TAG_EYE_helmet_rt_002" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_e_lite"], self, "TAG_EYE_helmet_rt_004" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_e_lite"], self, "TAG_EYE_helmet_rt_005" );
|
||||
}
|
||||
|
||||
playpincerswaterfx()
|
||||
{
|
||||
playfxontag( level._effect["kraken_water_stream_pincers"], self, "J_Jaw_Leg_R_01" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_pincers"], self, "J_Jaw_Leg_L_01" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_pincers"], self, "J_Jaw_Leg_R_02" );
|
||||
wait 0.02;
|
||||
playfxontag( level._effect["kraken_water_stream_pincers"], self, "J_Jaw_Leg_L_02" );
|
||||
wait 0.02;
|
||||
}
|
||||
|
||||
extendtentacle( var_0, var_1 )
|
||||
{
|
||||
if ( var_1 )
|
||||
{
|
||||
var_0 maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::teleportside( self.stage );
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
var_0 maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::emerge( self.stage );
|
||||
}
|
||||
|
||||
submerge()
|
||||
{
|
||||
common_scripts\utility::flag_set( "fx_kraken_water" );
|
||||
var_0 = getsideanimstate( "emp_attack_" );
|
||||
|
||||
foreach ( var_2 in self.tentacles )
|
||||
var_2 thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::emp();
|
||||
|
||||
level notify( "dlc_vo_notify", "kraken_vo", "warn_emp" );
|
||||
playanim( var_0, 0, ::handleempnotetracks );
|
||||
thread performempdamage();
|
||||
var_4 = level.alien_types[self.alien_type].attributes[self.stage]["emp_loop_duration"] * 1000.0;
|
||||
var_5 = gettime() + var_4;
|
||||
var_6 = "emp_loop_complete";
|
||||
thread playloopanim( var_0, var_6 );
|
||||
|
||||
while ( gettime() < var_5 )
|
||||
wait 0.05;
|
||||
|
||||
self notify( var_6 );
|
||||
thread kraken_submerge_music();
|
||||
playanim( var_0, 2 );
|
||||
level notify( "dlc_vo_notify", "kraken_vo", "kraken_gone" );
|
||||
self hide();
|
||||
wait( level.alien_types[self.alien_type].attributes[self.stage]["transition_submerge_time"] );
|
||||
}
|
||||
|
||||
performroar()
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 = self gettagorigin( "tag_breath" );
|
||||
|
||||
foreach ( var_2 in level.players )
|
||||
{
|
||||
if ( isalive( var_2 ) && bullettracepassed( var_0, var_2 geteye(), 0, undefined ) )
|
||||
{
|
||||
var_2 shellshock( "alien_kraken_emp", 3.0 );
|
||||
earthquake( 0.5, 1.0, var_2.origin, 100 );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
kraken_submerge_music()
|
||||
{
|
||||
foreach ( var_1 in level.players )
|
||||
{
|
||||
if ( common_scripts\utility::flag( "alien_music_playing" ) )
|
||||
{
|
||||
var_1 stoplocalsound( "mp_suspense_01" );
|
||||
var_1 stoplocalsound( "mp_suspense_02" );
|
||||
var_1 stoplocalsound( "mp_suspense_03" );
|
||||
var_1 stoplocalsound( "mp_suspense_04" );
|
||||
var_1 stoplocalsound( "mp_suspense_05" );
|
||||
var_1 stoplocalsound( "mp_suspense_06" );
|
||||
var_1 stoplocalsound( "mus_alien_newwave" );
|
||||
var_1 stoplocalsound( "mus_alien_queen" );
|
||||
common_scripts\utility::flag_clear( "alien_music_playing" );
|
||||
}
|
||||
|
||||
level thread maps\mp\alien\_music_and_dialog::play_alien_music( "mus_alien_dlc2_kraken_submerge" );
|
||||
}
|
||||
}
|
||||
|
||||
performempdamage()
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 = level.alien_types[self.alien_type].attributes[self.stage]["emp_damage_location"];
|
||||
var_1 = common_scripts\utility::getstruct( var_0, "targetname" );
|
||||
var_2 = level.alien_types[self.alien_type].attributes[self.stage]["emp_damage"];
|
||||
var_3 = level.alien_types[self.alien_type].attributes[self.stage]["emp_shock_duration"];
|
||||
self.emp_traces_this_frame = 0;
|
||||
|
||||
foreach ( var_5 in level.players )
|
||||
{
|
||||
if ( !isalive( var_5 ) )
|
||||
continue;
|
||||
|
||||
registeremptrace();
|
||||
|
||||
if ( !isalive( var_5 ) )
|
||||
continue;
|
||||
|
||||
if ( bullettracepassed( var_1.origin, var_5 geteye(), 0, undefined ) )
|
||||
{
|
||||
var_5 dodamage( var_2, self.origin, self, self, "MOD_MELEE" );
|
||||
var_5 shellshock( "alien_kraken_emp", var_3 );
|
||||
var_5 playlocalsound( "kraken_emp_hit" );
|
||||
thread doempdisables( var_5 );
|
||||
earthquake( 0.55, 1.0, var_5.origin, 100 );
|
||||
playfxontagforclients( level._effect["player_emp_scrn_fx"], var_5, "tag_eye", var_5 );
|
||||
}
|
||||
|
||||
if ( !isdefined( var_5.crafted_items ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_5.crafted_items["alien_crafting_hypno_trap"] ) )
|
||||
empattempttodestroydeployable( var_5.crafted_items["alien_crafting_hypno_trap"], var_1.origin );
|
||||
|
||||
if ( isdefined( var_5.crafted_items["alien_crafting_tesla_trap"] ) )
|
||||
empattempttodestroydeployable( var_5.crafted_items["alien_crafting_tesla_trap"], var_1.origin );
|
||||
}
|
||||
|
||||
empprocessdeployablesarray( level.turrets, var_1.origin );
|
||||
empprocessdeployablesarray( level.placedims, var_1.origin );
|
||||
empprocessdeployablesarray( level.balldrones, var_1.origin );
|
||||
|
||||
if ( isdefined( level.alien_types[self.alien_type].attributes[self.stage]["emp_notify"] ) )
|
||||
self notify( level.alien_types[self.alien_type].attributes[self.stage]["emp_notify"] );
|
||||
}
|
||||
|
||||
performempdamage_on_smash( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_1 = [];
|
||||
|
||||
foreach ( var_3 in level.players )
|
||||
{
|
||||
if ( !isalive( var_3 ) )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( var_3.crafted_items ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( var_3.crafted_items["alien_crafting_hypno_trap"] ) )
|
||||
{
|
||||
var_4 = var_3.crafted_items["alien_crafting_hypno_trap"];
|
||||
|
||||
if ( !isarray( var_4 ) )
|
||||
var_1 = common_scripts\utility::add_to_array( var_1, var_4 );
|
||||
else
|
||||
var_1 = common_scripts\utility::array_combine( var_1, var_4 );
|
||||
}
|
||||
|
||||
if ( isdefined( var_3.crafted_items["alien_crafting_tesla_trap"] ) )
|
||||
{
|
||||
var_4 = var_3.crafted_items["alien_crafting_tesla_trap"];
|
||||
|
||||
if ( !isarray( var_4 ) )
|
||||
var_1 = common_scripts\utility::add_to_array( var_1, var_4 );
|
||||
else
|
||||
var_1 = common_scripts\utility::array_combine( var_1, var_4 );
|
||||
}
|
||||
}
|
||||
|
||||
var_1 = common_scripts\utility::array_combine( var_1, level.turrets );
|
||||
var_1 = common_scripts\utility::array_combine( var_1, level.placedims );
|
||||
var_1 = common_scripts\utility::array_combine( var_1, level.balldrones );
|
||||
|
||||
if ( var_1.size > 0 )
|
||||
empsmash_processdeployablesarray( var_1, var_0 );
|
||||
}
|
||||
|
||||
empsmash_processdeployablesarray( var_0, var_1 )
|
||||
{
|
||||
foreach ( var_3 in var_0 )
|
||||
{
|
||||
if ( isdefined( var_3 ) && isdefined( var_3.origin ) )
|
||||
{
|
||||
if ( distance2dsquared( var_3.origin, var_1 ) < 40000 )
|
||||
{
|
||||
if ( !isdefined( var_3.carriedby ) )
|
||||
var_3 notify( "death" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
doempdisables( var_0 )
|
||||
{
|
||||
var_0 endon( "disconnect" );
|
||||
var_1 = level.alien_types[self.alien_type].attributes[self.stage]["emp_disable_duration"];
|
||||
var_0.turn_off_class_skill_activation = 1;
|
||||
var_0.player_action_disabled = 1;
|
||||
var_0 setclientomnvar( "ui_alien_quick_shop_disabled", 1 );
|
||||
wait( var_1 );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return;
|
||||
|
||||
var_0.turn_off_class_skill_activation = undefined;
|
||||
var_0.player_action_disabled = undefined;
|
||||
var_0 setclientomnvar( "ui_alien_quick_shop_disabled", 0 );
|
||||
}
|
||||
|
||||
empprocessdeployablesarray( var_0, var_1 )
|
||||
{
|
||||
foreach ( var_3 in var_0 )
|
||||
empattempttodestroydeployable( var_3, var_1 );
|
||||
}
|
||||
|
||||
empattempttodestroydeployable( var_0, var_1 )
|
||||
{
|
||||
registeremptrace();
|
||||
|
||||
if ( isdefined( var_0 ) && !isdefined( var_0.carriedby ) && bullettracepassed( var_1, var_0.origin + ( 0, 0, 20 ), 0, var_0 ) )
|
||||
var_0 notify( "death" );
|
||||
}
|
||||
|
||||
registeremptrace()
|
||||
{
|
||||
var_0 = 1;
|
||||
|
||||
if ( self.emp_traces_this_frame >= var_0 )
|
||||
{
|
||||
wait 0.05;
|
||||
self.emp_traces_this_frame = 0;
|
||||
}
|
||||
|
||||
self.emp_traces_this_frame++;
|
||||
}
|
||||
|
||||
empdestroydeployables( var_0, var_1 )
|
||||
{
|
||||
foreach ( var_3 in var_0 )
|
||||
{
|
||||
if ( bullettracepassed( var_1, var_3.origin, 0, var_3 ) )
|
||||
var_3 dodamage( 1000000, var_1, self, self, "MOD_EXPLOSIVE" );
|
||||
}
|
||||
}
|
||||
|
||||
getsideanimstate( var_0 )
|
||||
{
|
||||
var_1 = level.alien_types["kraken"].attributes[self.stage]["ship_side"];
|
||||
return var_0 + var_1;
|
||||
}
|
||||
|
||||
handleempnotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "kra_scream_int":
|
||||
if ( level.alien_types["kraken"].attributes[self.stage]["ship_side"] == "port" )
|
||||
common_scripts\utility::exploder( 3 );
|
||||
else
|
||||
common_scripts\utility::exploder( 4 );
|
||||
|
||||
break;
|
||||
case "kra_scream":
|
||||
}
|
||||
}
|
332
maps/mp/agents/alien/alien_kraken/_alien_kraken_tentacle.gsc
Normal file
332
maps/mp/agents/alien/alien_kraken/_alien_kraken_tentacle.gsc
Normal file
@ -0,0 +1,332 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
initkrakententacle()
|
||||
{
|
||||
level.agent_funcs["kraken_tentacle"] = [];
|
||||
level.agent_funcs["kraken_tentacle"]["spawn"] = ::alienkrakententaclespawn;
|
||||
level.agent_funcs["kraken_tentacle"]["on_killed"] = ::alienkrakententaclekilled;
|
||||
level.agent_funcs["kraken_tentacle"]["on_damaged"] = ::alienkrakententacledamaged;
|
||||
level.agent_funcs["kraken_tentacle"]["on_damaged_finished"] = ::alienkrakententacledamagefinished;
|
||||
}
|
||||
|
||||
getcurrenttentaclelocationstruct( var_0, var_1 )
|
||||
{
|
||||
var_2 = level.alien_types["kraken"].attributes[var_1]["ship_side"] + "_location";
|
||||
var_3 = level.alien_types["kraken"].attributes[var_0][var_2];
|
||||
var_4 = common_scripts\utility::getstruct( var_3, "targetname" );
|
||||
return var_4;
|
||||
}
|
||||
|
||||
alienkrakententaclespawn( var_0 )
|
||||
{
|
||||
var_1 = maps\mp\agents\_agent_common::connectnewagent( "kraken_tentacle", "axis" );
|
||||
var_1.feral_occludes = 1;
|
||||
var_1 settentaclemodel();
|
||||
var_1.tentacle_name = var_0;
|
||||
var_1.extended = 0;
|
||||
var_1.onenteranimstate = ::onentertentaclestate;
|
||||
var_2 = getcurrenttentaclelocationstruct( var_0, level.kraken.stage );
|
||||
var_1 spawnagent( var_2.origin, var_2.angles, "alien_kraken_tentacle_animclass" );
|
||||
var_1 assigntentacleattributes();
|
||||
var_1 settentaclescriptfields( var_2.origin );
|
||||
var_1 scragentsetclipmode( "agent" );
|
||||
var_1 scragentsetphysicsmode( "noclip" );
|
||||
var_1 takeallweapons();
|
||||
var_1.health = 100;
|
||||
var_1.maxhealth = 100;
|
||||
var_1.ignoreme = 1;
|
||||
var_1.alien_type = "tentacle";
|
||||
var_1 scragentusemodelcollisionbounds();
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 20000 );
|
||||
return var_1;
|
||||
}
|
||||
|
||||
enemychangemonitor()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "enemy" );
|
||||
self.looktarget = self.enemy;
|
||||
}
|
||||
}
|
||||
|
||||
isspawning()
|
||||
{
|
||||
return isdefined( self.spawning );
|
||||
}
|
||||
|
||||
issmashing()
|
||||
{
|
||||
return isdefined( self.performing_melee );
|
||||
}
|
||||
|
||||
isextended()
|
||||
{
|
||||
return self.extended;
|
||||
}
|
||||
|
||||
teleportside( var_0 )
|
||||
{
|
||||
var_1 = getcurrenttentaclelocationstruct( self.tentacle_name, var_0 );
|
||||
self setorigin( var_1.origin, 0 );
|
||||
self setplayerangles( var_1.angles );
|
||||
self scragentsetorientmode( "face angle abs", var_1.angles, var_1.angles );
|
||||
self scragentsetgoalpos( var_1.origin );
|
||||
self scragentsetgoalradius( 20000 );
|
||||
}
|
||||
|
||||
emerge( var_0 )
|
||||
{
|
||||
self.melee_type = "emerge";
|
||||
performmeleeattack( self.enemy );
|
||||
self.extended = 1;
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
}
|
||||
|
||||
retract()
|
||||
{
|
||||
self.melee_type = "retract";
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
performmeleeattack( self.enemy );
|
||||
self.extended = 0;
|
||||
}
|
||||
|
||||
heat()
|
||||
{
|
||||
self.melee_type = "heat";
|
||||
thread play_tentacle_heatfx();
|
||||
performmeleeattack( self.enemy );
|
||||
}
|
||||
|
||||
play_tentacle_heatfx()
|
||||
{
|
||||
thread end_tentacle_heat_fx();
|
||||
self endon( "death" );
|
||||
self endon( "heat_complete" );
|
||||
self setmodel( "alien_squid_tentacle_heat_phase" );
|
||||
wait 17.0;
|
||||
maps\mp\alien\_utility::set_alien_emissive( 4.0, 1.0 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 1.4;
|
||||
self setscriptablepartstate( "tentacle", "heat_discharge_fx_01" );
|
||||
wait 1.4;
|
||||
self setscriptablepartstate( "tentacle", "heat_discharge_fx_02" );
|
||||
}
|
||||
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
}
|
||||
|
||||
end_tentacle_heat_fx()
|
||||
{
|
||||
self endon( "death" );
|
||||
common_scripts\utility::waittill_any( "heat_complete", "kraken_phase_interrupt" );
|
||||
wait 0.1;
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 1.0 );
|
||||
self setmodel( "alien_squid_tentacle" );
|
||||
}
|
||||
|
||||
death()
|
||||
{
|
||||
self.melee_type = "death";
|
||||
performmeleeattack( self.enemy );
|
||||
self hide();
|
||||
}
|
||||
|
||||
emp()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.melee_type = "emp";
|
||||
performmeleeattack( self.enemy );
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
}
|
||||
|
||||
smash( var_0 )
|
||||
{
|
||||
self.melee_type = "smash";
|
||||
self.smash_trigger = var_0;
|
||||
self.performing_melee = 1;
|
||||
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
|
||||
performmeleeattack( self.enemy );
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
self.smash_trigger = undefined;
|
||||
}
|
||||
|
||||
getsmashanimlength()
|
||||
{
|
||||
if ( level.kraken.phase == "heat" )
|
||||
var_0 = "heat_smash";
|
||||
else
|
||||
var_0 = "smash";
|
||||
|
||||
return maps\mp\agents\alien\alien_kraken\_alien_tentacle_melee::getsmashanimlength( var_0 );
|
||||
}
|
||||
|
||||
heatsmash( var_0 )
|
||||
{
|
||||
self.melee_type = "heat_smash";
|
||||
self.smash_trigger = var_0;
|
||||
self.performing_melee = 1;
|
||||
performmeleeattack( self.enemy );
|
||||
self.smash_trigger = undefined;
|
||||
}
|
||||
|
||||
spawnattack( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self.melee_type = "spawn";
|
||||
self.spawning = 1;
|
||||
self.wave_name = var_0;
|
||||
performmeleeattack( self.enemy );
|
||||
}
|
||||
|
||||
settentaclemodel()
|
||||
{
|
||||
var_0 = level.alien_types["kraken"].attributes["tentacle_model"];
|
||||
self setmodel( var_0 );
|
||||
self show();
|
||||
self motionblurhqenable();
|
||||
}
|
||||
|
||||
assigntentacleattributes()
|
||||
{
|
||||
self.moveplaybackrate = 1.0;
|
||||
self.defaultmoveplaybackrate = self.moveplaybackrate;
|
||||
self.animplaybackrate = self.moveplaybackrate;
|
||||
self.xyanimscale = 0.0;
|
||||
self.defaultemissive = 0.0;
|
||||
self.maxemissive = level.alien_types["kraken"].attributes["max_emissive"];
|
||||
thread setinitialemissive();
|
||||
self scragentsetviewheight( level.alien_types["kraken"].attributes["view_height"] );
|
||||
}
|
||||
|
||||
settentaclescriptfields( var_0 )
|
||||
{
|
||||
self.species = "alien";
|
||||
self.enablestop = 1;
|
||||
maps\mp\agents\_agent_utility::activateagent();
|
||||
self.spawntime = gettime();
|
||||
self.attacking_player = 0;
|
||||
self.spawnorigin = var_0;
|
||||
}
|
||||
|
||||
setinitialemissive()
|
||||
{
|
||||
self endon( "death" );
|
||||
wait 1;
|
||||
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
||||
}
|
||||
|
||||
performmeleeattack( var_0 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
var_0 = maps\mp\agents\alien\alien_kraken\_alien_kraken::findanenemy();
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return;
|
||||
}
|
||||
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 64 );
|
||||
self scragentbeginmelee( var_0 );
|
||||
self waittill( "melee_complete" );
|
||||
}
|
||||
|
||||
onentertentaclestate( var_0, var_1 )
|
||||
{
|
||||
onexitanimstate( var_0, var_1 );
|
||||
self.currentanimstate = var_1;
|
||||
|
||||
switch ( var_1 )
|
||||
{
|
||||
case "idle":
|
||||
maps\mp\agents\alien\alien_kraken\_alien_tentacle_idle::main();
|
||||
break;
|
||||
case "melee":
|
||||
maps\mp\agents\alien\alien_kraken\_alien_tentacle_melee::main();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onexitanimstate( var_0, var_1 )
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "melee":
|
||||
maps\mp\agents\alien\alien_kraken\_alien_tentacle_melee::endscript();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
alienkrakententacledamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
var_2 = int( var_2 * level.alien_types["kraken"].attributes["tentacle_damage_multiplier"] );
|
||||
|
||||
if ( isdefined( level.kraken ) )
|
||||
level.kraken maps\mp\agents\alien\alien_kraken\_alien_kraken::alienkrakendamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
else
|
||||
{
|
||||
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
|
||||
var_1.owner thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "hitaliensoft" );
|
||||
else
|
||||
var_1 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "hitaliensoft" );
|
||||
|
||||
if ( isdefined( level.miniboss.hp ) && !common_scripts\utility::flag( "boss_in_pain" ) )
|
||||
{
|
||||
level.miniboss.hp = level.miniboss.hp - var_2;
|
||||
level.miniboss notify( "miniboss_damaged" );
|
||||
return self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
alienkrakententacledamagefinished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
self finishagentdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, 0.0, 0 );
|
||||
}
|
||||
|
||||
alienkrakententaclekilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
alienminibosstentaclespawn()
|
||||
{
|
||||
maps\mp\agents\alien\alien_kraken\_alien_kraken::loadkrakenattributes();
|
||||
var_0 = maps\mp\agents\_agent_common::connectnewagent( "kraken_tentacle", "axis" );
|
||||
var_0.feral_occludes = 1;
|
||||
var_0 setmodel( "Alien_squid_tentacle_scale60" );
|
||||
var_0.tentacle_name = "miniboss";
|
||||
var_0.extended = 0;
|
||||
var_1 = spawn( "script_origin", ( -2250, 400, -2750 ) );
|
||||
var_1.angles = ( 0, 0, 0 );
|
||||
var_0 spawnagent( var_1.origin, var_1.angles, "alien_kraken_tentacle_animclass" );
|
||||
var_0 assigntentacleattributes();
|
||||
var_0 settentaclescriptfields( var_1.origin );
|
||||
var_0 scragentsetclipmode( "agent" );
|
||||
var_0 scragentsetphysicsmode( "noclip" );
|
||||
var_0 scragentsetorientmode( "face angle abs", var_0.angles );
|
||||
var_0 scragentsetanimmode( "anim deltas" );
|
||||
var_0 maps\mp\alien\_utility::enable_alien_scripted();
|
||||
var_0 scragentsetscripted( 1 );
|
||||
var_0 takeallweapons();
|
||||
var_0.health = 9999999;
|
||||
var_0.maxhealth = 9999999;
|
||||
var_0.ignoreme = 1;
|
||||
var_0 scragentusemodelcollisionbounds();
|
||||
return var_0;
|
||||
}
|
55
maps/mp/agents/alien/alien_kraken/_alien_tentacle_idle.gsc
Normal file
55
maps/mp/agents/alien/alien_kraken/_alien_tentacle_idle.gsc
Normal file
@ -0,0 +1,55 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
init_alien_idle();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !self.extended || !isdefined( level.kraken ) || !isdefined( level.kraken.stage ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
play_idle();
|
||||
}
|
||||
}
|
||||
|
||||
init_alien_idle()
|
||||
{
|
||||
self.idle_anim_counter = 0;
|
||||
}
|
||||
|
||||
play_idle()
|
||||
{
|
||||
var_0 = selectidleanimstate();
|
||||
var_1 = level.alien_types["kraken"].attributes[self.tentacle_name]["anim_index"];
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_1, "idle", "end" );
|
||||
|
||||
if ( !isheatedphaseactive() )
|
||||
self setscriptablepartstate( "tentacle", "normal" );
|
||||
}
|
||||
|
||||
selectidleanimstate()
|
||||
{
|
||||
if ( isheatedphaseactive() )
|
||||
var_0 = "heat_";
|
||||
else
|
||||
var_0 = "idle_";
|
||||
|
||||
if ( isdefined( level.kraken.anim_state_modifier ) )
|
||||
var_0 = var_0 + ( level.kraken.anim_state_modifier + "_" );
|
||||
|
||||
var_1 = var_0 + level.alien_types["kraken"].attributes[level.kraken.stage]["ship_side"];
|
||||
return var_1;
|
||||
}
|
||||
|
||||
isheatedphaseactive()
|
||||
{
|
||||
return level.kraken.phase == "heat";
|
||||
}
|
463
maps/mp/agents/alien/alien_kraken/_alien_tentacle_melee.gsc
Normal file
463
maps/mp/agents/alien/alien_kraken/_alien_tentacle_melee.gsc
Normal file
@ -0,0 +1,463 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
var_0 = gettime();
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
switch ( self.melee_type )
|
||||
{
|
||||
case "emerge":
|
||||
emerge();
|
||||
break;
|
||||
case "retract":
|
||||
retract();
|
||||
break;
|
||||
case "heat":
|
||||
heat();
|
||||
break;
|
||||
case "smash":
|
||||
smash();
|
||||
break;
|
||||
case "heat_smash":
|
||||
heat_smash();
|
||||
break;
|
||||
case "spawn":
|
||||
spawnattack();
|
||||
break;
|
||||
case "emp":
|
||||
emp();
|
||||
break;
|
||||
case "death":
|
||||
death();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( var_0 == gettime() )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "melee_complete" );
|
||||
}
|
||||
|
||||
endscript()
|
||||
{
|
||||
self.performing_melee = undefined;
|
||||
self.spawning = undefined;
|
||||
|
||||
if ( isdefined( self.spawn_count ) && self.spawn_count > 0 )
|
||||
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.spawn_count );
|
||||
}
|
||||
|
||||
emerge()
|
||||
{
|
||||
var_0 = getsideanimstate( "emerge_" );
|
||||
playanim( var_0 );
|
||||
}
|
||||
|
||||
handleheatenternotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "ten_hit":
|
||||
playheatenterquake();
|
||||
break;
|
||||
case "tnt_chrg_pt_l1":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_pt_l1", "tag_hole", 8 );
|
||||
break;
|
||||
case "tnt_chrg_pt_l2":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_pt_l2", "tag_hole", 5 );
|
||||
break;
|
||||
case "tnt_chrg_pt_r1":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_pt_r1", "tag_hole", 5 );
|
||||
break;
|
||||
case "tnt_chrg_pt_r2":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_pt_r2", "tag_hole", 8 );
|
||||
break;
|
||||
case "tnt_chrg_sb_l1":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_sb_l1", "tag_hole", 4.5 );
|
||||
break;
|
||||
case "tnt_chrg_sb_l2":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_sb_l2", "tag_hole", 2 );
|
||||
break;
|
||||
case "tnt_chrg_sb_r1":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_sb_r1", "tag_hole", 3.5 );
|
||||
break;
|
||||
case "tnt_chrg_sb_r2":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "tnt_chrg_sb_r2", "tag_hole", 4 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
playheatenterquake()
|
||||
{
|
||||
var_0 = 0.5;
|
||||
var_1 = 0.5;
|
||||
var_2 = 2500;
|
||||
var_3 = self gettagorigin( "TAG_HOLE" );
|
||||
earthquake( var_0, var_1, var_3, var_2 );
|
||||
}
|
||||
|
||||
retract()
|
||||
{
|
||||
var_0 = getsideanimstate( "retract_" );
|
||||
playanim( var_0 );
|
||||
}
|
||||
|
||||
emp()
|
||||
{
|
||||
var_0 = getsideanimstate( "emp_" );
|
||||
playanim( var_0 );
|
||||
}
|
||||
|
||||
death()
|
||||
{
|
||||
playanim( "death" );
|
||||
self suicide();
|
||||
}
|
||||
|
||||
heat()
|
||||
{
|
||||
self endon( "heat_complete" );
|
||||
var_0 = level.alien_types["kraken"].attributes[level.kraken.stage]["ship_side"];
|
||||
var_1 = getsideanimstate( "slam_" );
|
||||
playanim( var_1, undefined, ::handleheatenternotetracks );
|
||||
self.extended = 1;
|
||||
}
|
||||
|
||||
getsmashanimlength( var_0 )
|
||||
{
|
||||
var_1 = getsmashanimname( var_0 );
|
||||
var_2 = level.alien_types["kraken"].attributes[self.tentacle_name]["anim_index"];
|
||||
var_3 = self getanimentry( var_1, var_2 );
|
||||
return getanimlength( var_3 );
|
||||
}
|
||||
|
||||
getsmashanimname( var_0 )
|
||||
{
|
||||
var_0 = var_0 + "_";
|
||||
|
||||
if ( isdefined( level.kraken.anim_state_modifier ) )
|
||||
var_0 = var_0 + ( level.kraken.anim_state_modifier + "_" );
|
||||
|
||||
var_1 = getsideanimstate( var_0 );
|
||||
return var_1;
|
||||
}
|
||||
|
||||
smash()
|
||||
{
|
||||
var_0 = getsmashanimname( "smash" );
|
||||
dosmash( var_0 );
|
||||
}
|
||||
|
||||
getsmashtriggerorigin()
|
||||
{
|
||||
if ( !isdefined( self.smash_trigger ) || !isdefined( self.smash_trigger.target ) )
|
||||
return undefined;
|
||||
|
||||
var_0 = common_scripts\utility::getstruct( self.smash_trigger.target, "targetname" );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
return var_0.origin;
|
||||
}
|
||||
|
||||
smashlerp( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "smash_complete" );
|
||||
var_3 = 1.0;
|
||||
var_4 = getanimlength( var_0 );
|
||||
|
||||
if ( !errorchecksmashlerp( var_0, var_1, var_4, var_3 ) )
|
||||
return;
|
||||
|
||||
var_5 = gettime();
|
||||
self waittill( "start_smash_lerp" );
|
||||
performsmashlerp( var_2, var_0, var_5, var_4, var_3 );
|
||||
self waittill( "start_smash_reverse_lerp" );
|
||||
performsmashlerp( var_2 * -1, var_0, var_5, var_4, var_3 );
|
||||
}
|
||||
|
||||
errorchecksmashlerp( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = 1.0;
|
||||
return var_2 >= var_3 * 2 + var_4;
|
||||
}
|
||||
|
||||
getsmashanimdelta( var_0, var_1, var_2 )
|
||||
{
|
||||
var_3 = getmovedelta( var_0, var_1, var_2 );
|
||||
return rotatevector( var_3, self.angles );
|
||||
}
|
||||
|
||||
performsmashlerp( var_0, var_1, var_2, var_3, var_4 )
|
||||
{
|
||||
var_5 = ( gettime() - var_2 ) * 0.001;
|
||||
var_6 = var_5 / var_3;
|
||||
var_7 = ( var_5 + var_4 ) / var_3;
|
||||
|
||||
if ( var_6 >= 1.0 )
|
||||
return;
|
||||
|
||||
var_7 = clamp( var_7, var_6, 1.0 );
|
||||
var_8 = getsmashanimdelta( var_1, var_6, var_7 );
|
||||
self scragentdoanimlerp( self.origin, self.origin + var_0 + var_8, var_4 );
|
||||
wait( var_4 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
}
|
||||
|
||||
getclosestsmashtarget( var_0 )
|
||||
{
|
||||
var_1 = undefined;
|
||||
var_2 = 1410065408;
|
||||
var_3 = self.smash_trigger getistouchingentities( level.players );
|
||||
|
||||
foreach ( var_5 in var_3 )
|
||||
{
|
||||
var_6 = distance2dsquared( var_5.origin, var_0 );
|
||||
|
||||
if ( var_6 < var_2 )
|
||||
{
|
||||
var_1 = var_5;
|
||||
var_2 = var_6;
|
||||
}
|
||||
}
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
heat_smash()
|
||||
{
|
||||
var_0 = getsmashanimname( "heat_smash" );
|
||||
dosmash( var_0 );
|
||||
}
|
||||
|
||||
dosmash( var_0 )
|
||||
{
|
||||
var_1 = getsmashtriggerorigin();
|
||||
var_2 = self.origin;
|
||||
|
||||
if ( isdefined( var_1 ) )
|
||||
{
|
||||
var_3 = getclosestsmashtarget( var_1 );
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_4 = 400;
|
||||
var_5 = ( var_3.origin - var_1 ) * ( 1, 1, 0 );
|
||||
var_6 = length( var_5 );
|
||||
|
||||
if ( var_6 > var_4 )
|
||||
var_5 = vectornormalize( var_5 ) * var_4;
|
||||
|
||||
var_7 = level.alien_types["kraken"].attributes[self.tentacle_name]["anim_index"];
|
||||
var_8 = self getanimentry( var_0, var_7 );
|
||||
var_9 = self getanimentryname( var_0, var_7 );
|
||||
thread smashlerp( var_8, var_9, var_5 );
|
||||
}
|
||||
}
|
||||
|
||||
playanim( var_0, undefined, ::handlesmashnotetracks );
|
||||
self setorigin( var_2, 0 );
|
||||
self notify( "smash_complete" );
|
||||
}
|
||||
|
||||
handlesmashnotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "smash":
|
||||
smashdamage();
|
||||
break;
|
||||
case "heat_smash":
|
||||
smashdamage();
|
||||
thread heat_smash_fx();
|
||||
break;
|
||||
case "pre_smash":
|
||||
smashplayersback();
|
||||
break;
|
||||
case "smash_sfx":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "kraken_tent_smash", "tag_hole", 6 );
|
||||
break;
|
||||
case "lerp":
|
||||
self notify( "start_smash_lerp" );
|
||||
break;
|
||||
case "reverse_lerp":
|
||||
self notify( "start_smash_reverse_lerp" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
smashdamage()
|
||||
{
|
||||
var_0 = 0.5;
|
||||
var_1 = 0.5;
|
||||
var_2 = self gettagorigin( "TAG_HOLE" );
|
||||
var_3 = level.alien_types["kraken"].attributes[level.kraken.stage]["smash_radius"];
|
||||
radiusdamage( var_2, var_3, level.alien_types["kraken"].attributes[level.kraken.stage]["smash_inner_damage"], level.alien_types["kraken"].attributes[level.kraken.stage]["smash_outer_damage"], level.kraken, "MOD_MELEE" );
|
||||
}
|
||||
|
||||
heat_smash_fx()
|
||||
{
|
||||
var_0 = self gettagorigin( "TAG_HOLE" );
|
||||
playfx( level._effect["tentacle_hit_heat"], var_0 );
|
||||
}
|
||||
|
||||
smashplayersback()
|
||||
{
|
||||
var_0 = 1500.0;
|
||||
var_1 = 122500;
|
||||
var_2 = 1750;
|
||||
var_3 = 1.0;
|
||||
var_4 = 0.75;
|
||||
var_5 = self gettagorigin( "TAG_HOLE" );
|
||||
var_6 = level.alien_types["kraken"].attributes[level.kraken.stage]["smash_radius"];
|
||||
earthquake( var_3, var_4, var_5, var_6 * 4 );
|
||||
|
||||
foreach ( var_8 in level.players )
|
||||
{
|
||||
if ( distance2dsquared( var_8.origin, var_5 ) > var_1 )
|
||||
continue;
|
||||
|
||||
var_9 = var_8 getvelocity();
|
||||
var_10 = vectornormalize( ( var_8.origin - var_5 ) * ( 1, 1, 0 ) ) * var_2;
|
||||
var_11 = ( var_9 + var_10 ) * ( 1, 1, 0 );
|
||||
var_12 = length( var_11 );
|
||||
|
||||
if ( var_12 >= var_0 )
|
||||
var_11 = vectornormalize( var_11 ) * var_0;
|
||||
|
||||
var_8 setvelocity( var_11 );
|
||||
var_8 shellshock( "alien_kraken_emp", 2.0 );
|
||||
}
|
||||
|
||||
thread maps\mp\agents\alien\alien_kraken\_alien_kraken_melee::performempdamage_on_smash( var_5 );
|
||||
}
|
||||
|
||||
spawnattack()
|
||||
{
|
||||
buildspawnwave();
|
||||
self.spawn_count = int( maps\mp\alien\_spawn_director::reserve_custom_spawn_space( self.current_spawn_wave.size, 1 ) );
|
||||
|
||||
if ( self.spawn_count == 0 )
|
||||
return;
|
||||
|
||||
self.current_spawn_index = 0;
|
||||
var_0 = getsideanimstate( "spawn_" );
|
||||
var_1 = "spawn_complete";
|
||||
playanim( var_0, var_1, ::spawnnotetrackhandler );
|
||||
}
|
||||
|
||||
buildspawnwave()
|
||||
{
|
||||
var_0 = level.kraken_spawn_waves[self.wave_name];
|
||||
self.current_spawn_wave = [];
|
||||
|
||||
foreach ( var_2 in var_0 )
|
||||
{
|
||||
var_3 = strtok( var_2, "-" );
|
||||
var_4 = int( var_3[1] );
|
||||
|
||||
if ( var_3.size > 2 && int( var_3[2] ) > var_4 )
|
||||
{
|
||||
var_5 = int( var_3[2] );
|
||||
var_6 = randomintrange( var_4, var_5 );
|
||||
}
|
||||
else
|
||||
var_6 = var_4;
|
||||
|
||||
for ( var_7 = 0; var_7 < var_6; var_7++ )
|
||||
self.current_spawn_wave[self.current_spawn_wave.size] = var_3[0];
|
||||
}
|
||||
}
|
||||
|
||||
spawnnotetrackhandler( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "ten_spawn":
|
||||
if ( self.spawn_count > 0 )
|
||||
{
|
||||
var_4 = getspawnpoint();
|
||||
var_5 = self.current_spawn_wave[self.current_spawn_index];
|
||||
var_6 = getspawnaniminfo();
|
||||
maps\mp\alien\_spawn_director::process_custom_spawn( var_5, var_4, var_6 );
|
||||
self.spawn_count--;
|
||||
self.current_spawn_index++;
|
||||
var_4 delete();
|
||||
}
|
||||
|
||||
break;
|
||||
case "spawn_sfx1":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "krk_tnt_spwn01", "tag_hole", 7.5 );
|
||||
break;
|
||||
case "spawn_sfx2":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "krk_tnt_spwn02", "tag_hole", 7.5 );
|
||||
break;
|
||||
case "spawn_sfx3":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "krk_tnt_spwn03", "tag_hole", 7.5 );
|
||||
break;
|
||||
case "spawn_sfx4":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "krk_tnt_spwn04", "tag_hole", 7.5 );
|
||||
break;
|
||||
case "spawn_sfx5":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "krk_tnt_spwn05", "tag_hole", 7.5 );
|
||||
break;
|
||||
case "spawn_sfx6":
|
||||
thread maps\mp\mp_alien_beacon::beacon_play_sound_on_moving_tag( "krk_tnt_spwn06", "tag_hole", 7.5 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
play_tentacle_vomit_spawn_fx()
|
||||
{
|
||||
self endon( "death" );
|
||||
playfxontag( level._effect["tentacle_vomit"], self, "tag_hole" );
|
||||
}
|
||||
|
||||
getspawnaniminfo()
|
||||
{
|
||||
var_0 = ";";
|
||||
var_1 = "flexible_height_spawn";
|
||||
var_2 = 0;
|
||||
var_3 = "NONE";
|
||||
var_4 = "end";
|
||||
var_5 = "queen_dirt_1";
|
||||
return var_1 + var_0 + var_2 + var_0 + var_1 + var_0 + var_4 + var_0 + var_3 + var_0 + var_3 + var_0 + var_3 + var_0 + var_5;
|
||||
}
|
||||
|
||||
getspawnpoint()
|
||||
{
|
||||
var_0 = "Tag_hole";
|
||||
var_1 = self gettagorigin( var_0 );
|
||||
var_2 = ( 0, 0, 0 );
|
||||
var_3 = spawn( "script_origin", var_1 );
|
||||
var_3.angles = var_2;
|
||||
return var_3;
|
||||
}
|
||||
|
||||
getsideanimstate( var_0 )
|
||||
{
|
||||
var_1 = level.alien_types["kraken"].attributes[level.kraken.stage]["ship_side"];
|
||||
return var_0 + var_1;
|
||||
}
|
||||
|
||||
playanim( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( isdefined( var_1 ) )
|
||||
self endon( var_1 );
|
||||
|
||||
var_4 = level.alien_types["kraken"].attributes[self.tentacle_name]["anim_index"];
|
||||
|
||||
if ( !isdefined( var_3 ) || var_3 )
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, var_4, var_0, "end", var_2 );
|
||||
}
|
251
maps/mp/agents/alien/alien_spider/_alien_spider_idle.gsc
Normal file
251
maps/mp/agents/alien/alien_spider/_alien_spider_idle.gsc
Normal file
@ -0,0 +1,251 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
init_alien_idle();
|
||||
thread wait_for_downed_state();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.stage ) || self.vulnerable )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( try_move_idle() )
|
||||
continue;
|
||||
|
||||
play_idle();
|
||||
}
|
||||
}
|
||||
|
||||
init_alien_idle()
|
||||
{
|
||||
self.idle_anim_counter = 0;
|
||||
}
|
||||
|
||||
play_idle()
|
||||
{
|
||||
self endon( "vulnerable" );
|
||||
facetarget();
|
||||
var_0 = selectidleanimstate();
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, undefined, var_0, "end", maps\mp\agents\alien\alien_spider\_alien_spider::handlespidernotetracks );
|
||||
}
|
||||
|
||||
gettarget()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
if ( isalive( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < 2560000 )
|
||||
var_0 = self.enemy;
|
||||
else if ( isdefined( self.owner ) )
|
||||
var_0 = self.owner;
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
facetarget()
|
||||
{
|
||||
var_0 = gettarget();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
|
||||
}
|
||||
|
||||
selectidleanimstate()
|
||||
{
|
||||
var_0 = getdesiredanimstate();
|
||||
|
||||
if ( isdefined( self.anim_state_modifier ) )
|
||||
var_0 = self.anim_state_modifier + var_0;
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
getdesiredanimstate()
|
||||
{
|
||||
if ( self.idle_anim_counter < 2 + randomintrange( 0, 1 ) )
|
||||
{
|
||||
var_0 = "idle_default";
|
||||
self.idle_anim_counter = self.idle_anim_counter + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_0 = "idle";
|
||||
self.idle_anim_counter = 0;
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
is_moving()
|
||||
{
|
||||
return isdefined( self.idle_move_data ) && self.idle_move_data.active;
|
||||
}
|
||||
|
||||
try_move_idle()
|
||||
{
|
||||
if ( !isdefined( self.idle_move_data ) )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( self.disable_idle_move ) && self.disable_idle_move )
|
||||
return 0;
|
||||
|
||||
if ( maps\mp\agents\alien\alien_spider\_alien_spider::candoelevatedeggattack() )
|
||||
return 0;
|
||||
|
||||
if ( gettime() < self.idle_move_data.next_valid_move_time )
|
||||
return 0;
|
||||
|
||||
if ( !common_scripts\utility::cointoss() )
|
||||
return 0;
|
||||
|
||||
perform_move( 0 );
|
||||
self.idle_move_data.next_valid_move_time = gettime() + 15000;
|
||||
return 1;
|
||||
}
|
||||
|
||||
init_idle_move()
|
||||
{
|
||||
var_0 = spawnstruct();
|
||||
var_0.next_valid_move_time = gettime() + 15000;
|
||||
var_0.active = 0;
|
||||
var_0.last_position_index = -1;
|
||||
var_1 = level.alien_types[self.alien_type].attributes["movement_radius"];
|
||||
var_2 = anglestoforward( self.angles );
|
||||
var_3 = anglestoright( self.angles );
|
||||
var_0.valid_positions[0] = self.origin;
|
||||
var_0.valid_positions[1] = self.origin + var_2 * var_1;
|
||||
var_0.valid_positions[2] = self.origin - var_2 * var_1;
|
||||
var_0.valid_positions[3] = self.origin + var_3 * var_1;
|
||||
var_0.valid_positions[4] = self.origin - var_3 * var_1;
|
||||
self.idle_move_data = var_0;
|
||||
}
|
||||
|
||||
perform_move( var_0 )
|
||||
{
|
||||
if ( var_0 )
|
||||
var_1 = 0;
|
||||
else
|
||||
var_1 = get_move_target_position_index();
|
||||
|
||||
var_2 = self.idle_move_data.valid_positions[var_1];
|
||||
var_3 = 25.0;
|
||||
|
||||
if ( distance2dsquared( var_2, self.origin ) < var_3 )
|
||||
return;
|
||||
|
||||
self.idle_move_data.active = 1;
|
||||
var_4 = get_move_target_facing( var_2 );
|
||||
play_move_anim( var_4["animIndex"], var_4["direction"], var_2, var_0 );
|
||||
self.idle_move_data.last_position_index = var_1;
|
||||
clean_up_move();
|
||||
}
|
||||
|
||||
clean_up_move()
|
||||
{
|
||||
self.idle_move_data.active = 0;
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetgoalradius( 4096 );
|
||||
}
|
||||
|
||||
play_move_anim( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self endon( "move_anim_timeout" );
|
||||
self endon( "vulnerable" );
|
||||
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_1 );
|
||||
var_4 = self getanimentry( "idle_move", var_0 );
|
||||
var_5 = length( getmovedelta( var_4 ) );
|
||||
var_6 = length( var_2 - self.origin );
|
||||
self.xyanimscale = var_6 / var_5;
|
||||
|
||||
if ( !var_3 )
|
||||
self.xyanimscale = min( self.xyanimscale, 1.0 );
|
||||
|
||||
self.statelocked = 1;
|
||||
self scragentsetanimscale( self.xyanimscale, 1.0 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", vectortoangles( var_1 ) );
|
||||
thread move_anim_timeout();
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "idle_move", var_0, "idle_move", "end", maps\mp\agents\alien\alien_spider\_alien_spider::handlespidernotetracks );
|
||||
self.statelocked = 0;
|
||||
self notify( "move_anim_complete" );
|
||||
}
|
||||
|
||||
move_anim_timeout()
|
||||
{
|
||||
self endon( "move_anim_complete" );
|
||||
self endon( "vulnerable" );
|
||||
var_0 = 10.0;
|
||||
wait( var_0 );
|
||||
self notify( "move_anim_timeout" );
|
||||
}
|
||||
|
||||
get_move_target_position_index()
|
||||
{
|
||||
var_0 = self.idle_move_data.valid_positions.size;
|
||||
|
||||
if ( self.idle_move_data.last_position_index != -1 )
|
||||
var_0--;
|
||||
|
||||
var_1 = randomint( var_0 );
|
||||
|
||||
if ( self.idle_move_data.last_position_index != -1 && var_1 >= self.idle_move_data.last_position_index )
|
||||
var_1++;
|
||||
|
||||
return var_1;
|
||||
}
|
||||
|
||||
get_move_target_facing( var_0 )
|
||||
{
|
||||
var_1 = vectornormalize( var_0 - self.origin );
|
||||
var_2 = maps\mp\agents\alien\_alien_anim_utils::getprojectiondata( anglestoforward( self.angles ), var_1, anglestoup( self.angles ) );
|
||||
|
||||
if ( var_2.rotatedyaw < 45 )
|
||||
{
|
||||
var_3["direction"] = vectornormalize( var_0 - self.origin );
|
||||
var_3["animIndex"] = 0;
|
||||
}
|
||||
else if ( var_2.rotatedyaw > 135 )
|
||||
{
|
||||
var_3["direction"] = vectornormalize( self.origin - var_0 );
|
||||
var_3["animIndex"] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( var_2.projintooutright > 0 )
|
||||
{
|
||||
var_4 = vectornormalize( var_0 - self.origin );
|
||||
var_3["animIndex"] = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_4 = vectornormalize( self.origin - var_0 );
|
||||
var_3["animIndex"] = 3;
|
||||
}
|
||||
|
||||
var_3["direction"] = vectorcross( ( 0, 0, 1 ), var_4 );
|
||||
}
|
||||
|
||||
return var_3;
|
||||
}
|
||||
|
||||
wait_for_downed_state()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self waittill( "vulnerable" );
|
||||
|
||||
if ( isdefined( self.idle_move_data ) && self.idle_move_data.active )
|
||||
clean_up_move();
|
||||
|
||||
self.statelocked = 1;
|
||||
self.idle_downed = 1;
|
||||
maps\mp\agents\alien\alien_spider\_alien_spider_melee::downed_state();
|
||||
self.idle_downed = 0;
|
||||
self.statelocked = 0;
|
||||
}
|
1989
maps/mp/agents/alien/alien_spider/_alien_spider_melee.gsc
Normal file
1989
maps/mp/agents/alien/alien_spider/_alien_spider_melee.gsc
Normal file
File diff suppressed because it is too large
Load Diff
260
maps/mp/agents/dog/_dog_idle.gsc
Normal file
260
maps/mp/agents/dog/_dog_idle.gsc
Normal file
@ -0,0 +1,260 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self.animsubstate = "none";
|
||||
settimeofnextsound();
|
||||
self.timeofnextsound = self.timeofnextsound + 2000;
|
||||
self.bidlehitreaction = 0;
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
updatestate();
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
if ( isdefined( self.prevturnrate ) )
|
||||
{
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
updatestate()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "cancelidleloop" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 = self.animsubstate;
|
||||
var_1 = determinestate();
|
||||
|
||||
if ( var_1 != self.animsubstate )
|
||||
enterstate( var_1 );
|
||||
|
||||
updateangle();
|
||||
|
||||
switch ( self.animsubstate )
|
||||
{
|
||||
case "idle_combat":
|
||||
wait 0.2;
|
||||
break;
|
||||
case "idle_noncombat":
|
||||
if ( var_0 == "none" )
|
||||
{
|
||||
if ( self.movemode == "run" || self.movemode == "sprint" )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_fast", "anml_dog_pants_mp_fast" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_med", "anml_dog_pants_mp_med" ) );
|
||||
}
|
||||
else if ( gettime() > self.timeofnextsound )
|
||||
{
|
||||
if ( randomint( 10 ) < 4 )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_whine", "anml_dog_whine" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_med", "anml_dog_pants_mp_med" ) );
|
||||
|
||||
settimeofnextsound();
|
||||
}
|
||||
|
||||
wait 0.5;
|
||||
break;
|
||||
default:
|
||||
wait 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
determinestate()
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
return "idle_combat";
|
||||
else
|
||||
return "idle_noncombat";
|
||||
}
|
||||
|
||||
enterstate( var_0 )
|
||||
{
|
||||
exitstate( self.animsubstate );
|
||||
self.animsubstate = var_0;
|
||||
playidleanim();
|
||||
}
|
||||
|
||||
exitstate( var_0 )
|
||||
{
|
||||
if ( isdefined( self.prevturnrate ) )
|
||||
{
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
playidleanim()
|
||||
{
|
||||
if ( self.animsubstate == "idle_combat" )
|
||||
self setanimstate( "attack_idle" );
|
||||
else
|
||||
self setanimstate( "casual_idle" );
|
||||
}
|
||||
|
||||
updateangle()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
if ( isdefined( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < 1048576 )
|
||||
var_0 = self.enemy;
|
||||
else if ( isdefined( self.owner ) && distancesquared( self.owner.origin, self.origin ) > 576 )
|
||||
var_0 = self.owner;
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_1 = var_0.origin - self.origin;
|
||||
var_2 = vectortoangles( var_1 );
|
||||
|
||||
if ( abs( angleclamp180( var_2[1] - self.angles[1] ) ) > 1 )
|
||||
turntoangle( var_2[1] );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
return isdefined( self.enemy ) && maps\mp\_utility::isreallyalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
}
|
||||
|
||||
getturnanimstate( var_0 )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
if ( var_0 < -135 || var_0 > 135 )
|
||||
return "attack_turn_180";
|
||||
else if ( var_0 < 0 )
|
||||
return "attack_turn_right_90";
|
||||
else
|
||||
return "attack_turn_left_90";
|
||||
}
|
||||
else if ( var_0 < -135 || var_0 > 135 )
|
||||
return "casual_turn_180";
|
||||
else if ( var_0 < 0 )
|
||||
return "casual_turn_right_90";
|
||||
else
|
||||
return "casual_turn_left_90";
|
||||
}
|
||||
|
||||
turntoangle( var_0 )
|
||||
{
|
||||
var_1 = self.angles[1];
|
||||
var_2 = angleclamp180( var_0 - var_1 );
|
||||
|
||||
if ( -0.5 < var_2 && var_2 < 0.5 )
|
||||
return;
|
||||
|
||||
if ( -10 < var_2 && var_2 < 10 )
|
||||
{
|
||||
rotatetoangle( var_0, 2 );
|
||||
return;
|
||||
}
|
||||
|
||||
var_3 = getturnanimstate( var_2 );
|
||||
var_4 = self getanimentry( var_3, 0 );
|
||||
var_5 = getanimlength( var_4 );
|
||||
var_6 = getangledelta3d( var_4 );
|
||||
self scragentsetanimmode( "anim angle delta" );
|
||||
|
||||
if ( animhasnotetrack( var_4, "turn_begin" ) && animhasnotetrack( var_4, "turn_end" ) )
|
||||
{
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_3, 0, "turn_in_place" );
|
||||
var_7 = getnotetracktimes( var_4, "turn_begin" );
|
||||
var_8 = getnotetracktimes( var_4, "turn_end" );
|
||||
var_9 = ( var_8[0] - var_7[0] ) * var_5;
|
||||
var_10 = angleclamp180( var_2 - var_6[1] );
|
||||
var_11 = abs( var_10 ) / var_9 / 20;
|
||||
var_11 = var_11 * 3.14159 / 180;
|
||||
var_12 = ( 0, angleclamp180( self.angles[1] + var_10 ), 0 );
|
||||
self.prevturnrate = self scragentgetmaxturnspeed();
|
||||
self scragentsetmaxturnspeed( var_11 );
|
||||
self scragentsetorientmode( "face angle abs", var_12 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "turn_in_place", "turn_end" );
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "turn_in_place", "end" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.prevturnrate = self scragentgetmaxturnspeed();
|
||||
var_11 = abs( angleclamp180( var_2 - var_6[1] ) ) / var_5 / 20;
|
||||
var_11 = var_11 * 3.14159 / 180;
|
||||
self scragentsetmaxturnspeed( var_11 );
|
||||
var_12 = ( 0, angleclamp180( var_0 - var_6[1] ), 0 );
|
||||
self scragentsetorientmode( "face angle abs", var_12 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_3, 0, "turn_in_place" );
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
}
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
playidleanim();
|
||||
}
|
||||
|
||||
rotatetoangle( var_0, var_1 )
|
||||
{
|
||||
if ( abs( angleclamp180( var_0 - self.angles[1] ) ) <= var_1 )
|
||||
return;
|
||||
|
||||
var_2 = ( 0, var_0, 0 );
|
||||
self scragentsetorientmode( "face angle abs", var_2 );
|
||||
|
||||
while ( angleclamp180( var_0 - self.angles[1] ) > var_1 )
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
settimeofnextsound()
|
||||
{
|
||||
self.timeofnextsound = gettime() + 8000 + randomint( 5000 );
|
||||
}
|
||||
|
||||
dohitreaction( var_0 )
|
||||
{
|
||||
self.blockgoalpos = 1;
|
||||
self.statelocked = 1;
|
||||
self.bidlehitreaction = 1;
|
||||
var_1 = angleclamp180( var_0 - self.angles[1] );
|
||||
|
||||
if ( var_1 > 0 )
|
||||
var_2 = 1;
|
||||
else
|
||||
var_2 = 0;
|
||||
|
||||
self notify( "cancelidleloop" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "stand_pain", var_2, "stand_pain" );
|
||||
self.blockgoalpos = 0;
|
||||
self.statelocked = 0;
|
||||
self.bidlehitreaction = 0;
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.animsubstate = "none";
|
||||
thread updatestate();
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( self.bidlehitreaction )
|
||||
return;
|
||||
|
||||
var_10 = vectortoangles( var_7 );
|
||||
var_11 = var_10[1] - 180;
|
||||
dohitreaction( var_11 );
|
||||
}
|
||||
|
||||
onflashbanged( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
if ( self.bidlehitreaction )
|
||||
return;
|
||||
|
||||
dohitreaction( self.angles[1] + 180 );
|
||||
}
|
330
maps/mp/agents/dog/_dog_melee.gsc
Normal file
330
maps/mp/agents/dog/_dog_melee.gsc
Normal file
@ -0,0 +1,330 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self.curmeleetarget endon( "disconnect" );
|
||||
var_0 = self.curmeleetarget.origin - self.origin;
|
||||
var_1 = length( var_0 );
|
||||
var_2 = 1;
|
||||
|
||||
if ( var_1 < self.attackoffset )
|
||||
{
|
||||
var_3 = self.origin;
|
||||
var_2 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_0 = var_0 / var_1;
|
||||
var_3 = self.curmeleetarget.origin - var_0 * self.attackoffset;
|
||||
}
|
||||
|
||||
var_4 = 0;
|
||||
var_5 = self.origin + ( 0, 0, 30 );
|
||||
var_6 = self.curmeleetarget.origin + ( 0, 0, 30 );
|
||||
var_7 = physicstrace( var_5, var_6 );
|
||||
|
||||
if ( distancesquared( var_7, var_6 ) > 1 )
|
||||
meleefailed();
|
||||
else
|
||||
{
|
||||
if ( var_2 )
|
||||
var_8 = maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_3 );
|
||||
else
|
||||
var_8 = 1;
|
||||
|
||||
var_9 = undefined;
|
||||
|
||||
if ( !var_8 )
|
||||
var_10 = 0;
|
||||
else
|
||||
{
|
||||
var_9 = shoulddoextendedkill( self.curmeleetarget );
|
||||
var_10 = isdefined( var_9 );
|
||||
}
|
||||
|
||||
self.blockgoalpos = 1;
|
||||
|
||||
if ( var_10 )
|
||||
{
|
||||
doextendedkill( var_9 );
|
||||
return;
|
||||
}
|
||||
|
||||
dostandardkill( var_3, var_8 );
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
getmeleeanimstate()
|
||||
{
|
||||
return "attack_run_and_jump";
|
||||
}
|
||||
|
||||
shoulddoextendedkill( var_0 )
|
||||
{
|
||||
if ( !self.enableextendedkill )
|
||||
return undefined;
|
||||
|
||||
var_1 = 4;
|
||||
|
||||
if ( !maps\mp\_utility::isgameparticipant( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
if ( isprotectedbyriotshield( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
if ( var_0 maps\mp\_utility::isjuggernaut() )
|
||||
return undefined;
|
||||
|
||||
var_2 = self.origin - var_0.origin;
|
||||
|
||||
if ( abs( var_2[2] ) > var_1 )
|
||||
return undefined;
|
||||
|
||||
var_3 = vectornormalize( ( var_2[0], var_2[1], 0 ) );
|
||||
var_4 = anglestoforward( var_0.angles );
|
||||
var_5 = vectordot( var_4, var_3 );
|
||||
|
||||
if ( var_5 > 0.707 )
|
||||
{
|
||||
var_6 = 0;
|
||||
var_7 = rotatevector( ( 1, 0, 0 ), var_0.angles );
|
||||
}
|
||||
else if ( var_5 < -0.707 )
|
||||
{
|
||||
var_6 = 1;
|
||||
var_7 = rotatevector( ( -1, 0, 0 ), var_0.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_8 = maps\mp\agents\dog\_dog_think::cross2d( var_2, var_4 );
|
||||
|
||||
if ( var_8 > 0 )
|
||||
{
|
||||
var_6 = 3;
|
||||
var_7 = rotatevector( ( 0, -1, 0 ), var_0.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_6 = 2;
|
||||
var_7 = rotatevector( ( 0, 1, 0 ), var_0.angles );
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_6 == 1 )
|
||||
var_9 = 128;
|
||||
else
|
||||
var_9 = 96;
|
||||
|
||||
var_10 = var_0.origin - var_9 * var_7;
|
||||
var_11 = maps\mp\agents\_scriptedagents::droppostoground( var_10 );
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
return undefined;
|
||||
|
||||
if ( abs( var_11[2] - var_10[2] ) > var_1 )
|
||||
return undefined;
|
||||
|
||||
if ( !self aiphysicstracepassed( var_0.origin + ( 0, 0, 4 ), var_11 + ( 0, 0, 4 ), self.radius, self.height ) )
|
||||
return undefined;
|
||||
|
||||
return var_6;
|
||||
}
|
||||
|
||||
doextendedkill( var_0 )
|
||||
{
|
||||
var_1 = "attack_extended";
|
||||
domeleedamage( self.curmeleetarget, self.curmeleetarget.health, "MOD_MELEE_DOG" );
|
||||
var_2 = self getanimentry( var_1, var_0 );
|
||||
thread extendedkill_sticktovictim( var_2, self.curmeleetarget.origin, self.curmeleetarget.angles );
|
||||
|
||||
if ( var_0 == 1 )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "mp_wolf_attack_quick_back_npc", "mp_dog_attack_quick_back_npc" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "mp_wolf_attack_short_npc", "mp_dog_attack_short_npc" ) );
|
||||
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, var_0, "attack", "end" );
|
||||
self notify( "kill_stick" );
|
||||
self.curmeleetarget = undefined;
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self unlink();
|
||||
}
|
||||
|
||||
extendedkill_sticktovictim( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "kill_stick" );
|
||||
wait 0.05;
|
||||
|
||||
if ( isalive( self.curmeleetarget ) )
|
||||
return;
|
||||
|
||||
var_3 = self.curmeleetarget getcorpseentity();
|
||||
self linkto( var_3 );
|
||||
self scragentdoanimrelative( var_0, var_1, var_2 );
|
||||
}
|
||||
|
||||
dostandardkill( var_0, var_1 )
|
||||
{
|
||||
var_2 = getmeleeanimstate();
|
||||
var_3 = 0;
|
||||
|
||||
if ( !var_1 )
|
||||
{
|
||||
if ( self agentcanseesentient( self.curmeleetarget ) )
|
||||
{
|
||||
var_4 = maps\mp\agents\_scriptedagents::droppostoground( self.curmeleetarget.origin );
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
{
|
||||
var_3 = 1;
|
||||
var_0 = var_4;
|
||||
}
|
||||
else
|
||||
{
|
||||
meleefailed();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
meleefailed();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
self.lastmeleefailedmypos = undefined;
|
||||
self.lastmeleefailedpos = undefined;
|
||||
var_5 = self getanimentry( var_2, 0 );
|
||||
var_6 = getanimlength( var_5 );
|
||||
var_7 = getnotetracktimes( var_5, "dog_melee" );
|
||||
|
||||
if ( var_7.size > 0 )
|
||||
var_8 = var_7[0] * var_6;
|
||||
else
|
||||
var_8 = var_6;
|
||||
|
||||
self scragentdoanimlerp( self.origin, var_0, var_8 );
|
||||
thread updatelerppos( self.curmeleetarget, var_8, var_1 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "attack", "dog_melee" );
|
||||
self notify( "cancel_updatelerppos" );
|
||||
var_9 = 0;
|
||||
|
||||
if ( isdefined( self.curmeleetarget ) )
|
||||
var_9 = self.curmeleetarget.health;
|
||||
|
||||
if ( isdefined( self.meleedamage ) )
|
||||
var_9 = self.meleedamage;
|
||||
|
||||
if ( isdefined( self.curmeleetarget ) )
|
||||
domeleedamage( self.curmeleetarget, var_9, "MOD_IMPACT" );
|
||||
|
||||
self.curmeleetarget = undefined;
|
||||
|
||||
if ( var_3 )
|
||||
self scragentsetanimscale( 0, 1 );
|
||||
else
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "attack", "end" );
|
||||
}
|
||||
|
||||
updatelerppos( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "death" );
|
||||
self endon( "cancel_updatelerppos" );
|
||||
var_0 endon( "disconnect" );
|
||||
var_0 endon( "death" );
|
||||
var_3 = var_1;
|
||||
var_4 = 0.05;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait( var_4 );
|
||||
var_3 = var_3 - var_4;
|
||||
|
||||
if ( var_3 <= 0 )
|
||||
break;
|
||||
|
||||
var_5 = getupdatedattackpos( var_0, var_2 );
|
||||
|
||||
if ( !isdefined( var_5 ) )
|
||||
break;
|
||||
|
||||
self scragentdoanimlerp( self.origin, var_5, var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
getupdatedattackpos( var_0, var_1 )
|
||||
{
|
||||
if ( !var_1 )
|
||||
{
|
||||
var_2 = maps\mp\agents\_scriptedagents::droppostoground( var_0.origin );
|
||||
return var_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_3 = var_0.origin - self.origin;
|
||||
var_4 = length( var_3 );
|
||||
|
||||
if ( var_4 < self.attackoffset )
|
||||
return self.origin;
|
||||
else
|
||||
{
|
||||
var_3 = var_3 / var_4;
|
||||
var_5 = var_0.origin - var_3 * self.attackoffset;
|
||||
|
||||
if ( maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_5 ) )
|
||||
return var_5;
|
||||
else
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isprotectedbyriotshield( var_0 )
|
||||
{
|
||||
if ( isdefined( var_0.hasriotshield ) && var_0.hasriotshield )
|
||||
{
|
||||
var_1 = self.origin - var_0.origin;
|
||||
var_2 = vectornormalize( ( var_1[0], var_1[1], 0 ) );
|
||||
var_3 = anglestoforward( var_0.angles );
|
||||
var_4 = vectordot( var_3, var_1 );
|
||||
|
||||
if ( var_0.hasriotshieldequipped )
|
||||
{
|
||||
if ( var_4 > 0.766 )
|
||||
return 1;
|
||||
}
|
||||
else if ( var_4 < -0.766 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
domeleedamage( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isprotectedbyriotshield( var_0 ) )
|
||||
return;
|
||||
|
||||
var_0 dodamage( var_1, self.origin, self, self, var_2 );
|
||||
}
|
||||
|
||||
meleefailed()
|
||||
{
|
||||
self.lastmeleefailedmypos = self.origin;
|
||||
self.lastmeleefailedpos = self.curmeleetarget.origin;
|
||||
}
|
433
maps/mp/agents/dog/_dog_move.gsc
Normal file
433
maps/mp/agents/dog/_dog_move.gsc
Normal file
@ -0,0 +1,433 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self.blockgoalpos = 0;
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
startmove();
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
cancelallbut( undefined );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
}
|
||||
|
||||
setupmovement()
|
||||
{
|
||||
thread waitforrunwalkchange();
|
||||
thread waitforsharpturn();
|
||||
thread waitforstop();
|
||||
}
|
||||
|
||||
continuemovement()
|
||||
{
|
||||
setupmovement();
|
||||
self scragentsetanimmode( "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
setmoveanim( self.movemode );
|
||||
}
|
||||
|
||||
setmoveanim( var_0 )
|
||||
{
|
||||
self setanimstate( var_0 );
|
||||
}
|
||||
|
||||
waitforrunwalkchange()
|
||||
{
|
||||
self endon( "dogmove_endwait_runwalk" );
|
||||
var_0 = self.movemode;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( var_0 != self.movemode )
|
||||
{
|
||||
setmoveanim( self.movemode );
|
||||
var_0 = self.movemode;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
dosharpturn( var_0 )
|
||||
{
|
||||
var_1 = vectortoangles( var_0 );
|
||||
var_2 = angleclamp180( var_1[1] - self.angles[1] );
|
||||
var_3 = maps\mp\agents\_scriptedagents::getangleindex( var_2 );
|
||||
|
||||
if ( var_3 == 4 )
|
||||
{
|
||||
continuemovement();
|
||||
return;
|
||||
}
|
||||
|
||||
var_4 = "sharp_turn";
|
||||
var_5 = self getanimentry( var_4, var_3 );
|
||||
var_6 = getangledelta( var_5 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", ( 0, angleclamp180( var_1[1] - var_6 ), 0 ) );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_4, var_3, "sharp_turn" );
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforsharpturn()
|
||||
{
|
||||
self endon( "dogmove_endwait_sharpturn" );
|
||||
self waittill( "path_dir_change", var_0 );
|
||||
cancelallbut( "sharpturn" );
|
||||
dosharpturn( var_0 );
|
||||
}
|
||||
|
||||
waitforstop()
|
||||
{
|
||||
self endon( "dogmove_endwait_stop" );
|
||||
self waittill( "stop_soon" );
|
||||
|
||||
if ( isdefined( self.barrivalsenabled ) && !self.barrivalsenabled )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
var_0 = getstopanimstate();
|
||||
var_1 = self getanimentry( var_0.state, var_0.index );
|
||||
var_2 = getmovedelta( var_1 );
|
||||
var_3 = getangledelta( var_1 );
|
||||
var_4 = self getpathgoalpos();
|
||||
var_5 = var_4 - self.origin;
|
||||
|
||||
if ( length( var_5 ) + 12 < length( var_2 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
var_6 = getstopdata();
|
||||
var_7 = calcanimstartpos( var_6.pos, var_6.angles[1], var_2, var_3 );
|
||||
var_8 = maps\mp\agents\_scriptedagents::droppostoground( var_7 );
|
||||
|
||||
if ( !isdefined( var_8 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_6.pos, var_8 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
cancelallbut( "stop" );
|
||||
thread waitforpathsetwhilestopping();
|
||||
thread waitforsharpturnwhilestopping();
|
||||
|
||||
if ( distancesquared( var_7, self.origin ) > 4 )
|
||||
{
|
||||
self scragentsetwaypoint( var_7 );
|
||||
thread waitforblockedwhilestopping();
|
||||
self waittill( "waypoint_reached" );
|
||||
self notify( "dogmove_endwait_blockedwhilestopping" );
|
||||
}
|
||||
|
||||
var_9 = var_4 - self.origin;
|
||||
var_10 = vectortoangles( var_9 );
|
||||
var_11 = ( 0, var_10[1] - var_3, 0 );
|
||||
var_12 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_4 - self.origin, var_2 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", var_11, ( 0, var_10[1], 0 ) );
|
||||
self scragentsetanimscale( var_12.xy, var_12.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0.state, var_0.index, "move_stop" );
|
||||
self scragentsetgoalpos( self.origin );
|
||||
}
|
||||
|
||||
waitforpathsetwhilestopping()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_pathsetwhilestopping" );
|
||||
var_0 = self scragentgetgoalpos();
|
||||
self waittill( "path_set" );
|
||||
var_1 = self scragentgetgoalpos();
|
||||
|
||||
if ( distancesquared( var_0, var_1 ) < 1 )
|
||||
{
|
||||
thread waitforpathsetwhilestopping();
|
||||
return;
|
||||
}
|
||||
|
||||
self notify( "dogmove_endwait_stop" );
|
||||
self notify( "dogmove_endwait_sharpturnwhilestopping" );
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforsharpturnwhilestopping()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_sharpturnwhilestopping" );
|
||||
self waittill( "path_dir_change", var_0 );
|
||||
self notify( "dogmove_endwait_pathsetwhilestopping" );
|
||||
self notify( "dogmove_endwait_stop" );
|
||||
dosharpturn( var_0 );
|
||||
}
|
||||
|
||||
waitforblockedwhilestopping()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_blockedwhilestopping" );
|
||||
self waittill( "path_blocked" );
|
||||
self notify( "dogmove_endwait_stop" );
|
||||
self scragentsetwaypoint( undefined );
|
||||
}
|
||||
|
||||
waitforstopearly()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_stopearly" );
|
||||
var_0 = self getanimentry( "move_stop_4", 0 );
|
||||
var_1 = getmovedelta( var_0 );
|
||||
var_2 = length( var_1 );
|
||||
var_3 = self.preferredoffsetfromowner + var_2;
|
||||
var_4 = var_3 * var_3;
|
||||
|
||||
if ( distancesquared( self.origin, self.owner.origin ) <= var_4 )
|
||||
return;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
break;
|
||||
|
||||
if ( distancesquared( self.origin, self.owner.origin ) < var_4 )
|
||||
{
|
||||
var_5 = self localtoworldcoords( var_1 );
|
||||
self scragentsetgoalpos( var_5 );
|
||||
break;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
cancelallbut( var_0 )
|
||||
{
|
||||
var_1 = [ "runwalk", "sharpturn", "stop", "pathsetwhilestopping", "blockedwhilestopping", "sharpturnwhilestopping", "stopearly" ];
|
||||
var_2 = isdefined( var_0 );
|
||||
|
||||
foreach ( var_4 in var_1 )
|
||||
{
|
||||
if ( var_2 && var_4 == var_0 )
|
||||
continue;
|
||||
|
||||
self notify( "dogmove_endwait_" + var_4 );
|
||||
}
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
var_0 = self getnegotiationstartnode();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_1 = var_0.origin;
|
||||
else
|
||||
var_1 = self getpathgoalpos();
|
||||
|
||||
if ( distancesquared( var_1, self.origin ) < 10000 )
|
||||
return;
|
||||
|
||||
var_2 = self getlookaheaddir();
|
||||
var_3 = vectortoangles( var_2 );
|
||||
var_4 = self getvelocity();
|
||||
|
||||
if ( length2dsquared( var_4 ) > 16 )
|
||||
{
|
||||
var_4 = vectornormalize( var_4 );
|
||||
|
||||
if ( vectordot( var_4, var_2 ) > 0.707 )
|
||||
return;
|
||||
}
|
||||
|
||||
var_5 = angleclamp180( var_3[1] - self.angles[1] );
|
||||
var_6 = maps\mp\agents\_scriptedagents::getangleindex( var_5 );
|
||||
var_7 = self getanimentry( "move_start", var_6 );
|
||||
var_8 = getmovedelta( var_7 );
|
||||
var_9 = rotatevector( var_8, self.angles ) + self.origin;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_9 ) )
|
||||
return;
|
||||
|
||||
var_10 = getangledelta3d( var_7 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
|
||||
if ( 3 <= var_6 && var_6 <= 5 )
|
||||
self scragentsetorientmode( "face angle abs", ( 0, angleclamp180( var_3[1] - var_10[1] ), 0 ) );
|
||||
else
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
self.blockgoalpos = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "move_start", var_6, "move_start" );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
getstopdata()
|
||||
{
|
||||
var_0 = spawnstruct();
|
||||
|
||||
if ( isdefined( self.node ) )
|
||||
{
|
||||
var_0.pos = self.node.origin;
|
||||
var_0.angles = self.node.angles;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1 = self getpathgoalpos();
|
||||
var_0.pos = var_1;
|
||||
var_0.angles = vectortoangles( self getlookaheaddir() );
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
getstopanimstate( var_0 )
|
||||
{
|
||||
if ( isdefined( self.node ) )
|
||||
{
|
||||
var_1 = self.node.angles[1] - self.angles[1];
|
||||
var_2 = maps\mp\agents\_scriptedagents::getangleindex( var_1 );
|
||||
}
|
||||
else
|
||||
var_2 = 4;
|
||||
|
||||
var_3 = spawnstruct();
|
||||
var_3.state = "move_stop";
|
||||
var_3.index = var_2;
|
||||
return var_3;
|
||||
}
|
||||
|
||||
calcanimstartpos( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = var_1 - var_3;
|
||||
var_5 = ( 0, var_4, 0 );
|
||||
var_6 = anglestoforward( var_5 );
|
||||
var_7 = anglestoright( var_5 );
|
||||
var_8 = var_6 * var_2[0];
|
||||
var_9 = var_7 * var_2[1];
|
||||
return var_0 - var_8 + var_9;
|
||||
}
|
||||
|
||||
dog_addlean()
|
||||
{
|
||||
var_0 = clamp( self.leanamount / 25.0, -1, 1 );
|
||||
|
||||
if ( var_0 > 0 )
|
||||
return;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
handlefootstepnotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( 1 )
|
||||
return 0;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "footstep_back_right_large":
|
||||
case "footstep_back_left_large":
|
||||
case "footstep_front_right_large":
|
||||
case "footstep_front_left_large":
|
||||
case "footstep_back_right_small":
|
||||
case "footstep_back_left_small":
|
||||
case "footstep_front_right_small":
|
||||
case "footstep_front_left_small":
|
||||
var_4 = undefined;
|
||||
|
||||
if ( isdefined( self.surfacetype ) )
|
||||
{
|
||||
var_4 = self.surfacetype;
|
||||
self.lastsurfacetype = var_4;
|
||||
}
|
||||
else if ( isdefined( self.lastsurfacetype ) )
|
||||
var_4 = self.lastsurfacetype;
|
||||
else
|
||||
var_4 = "dirt";
|
||||
|
||||
if ( var_4 != "dirt" && var_4 != "concrete" && var_4 != "wood" && var_4 != "metal" )
|
||||
var_4 = "dirt";
|
||||
|
||||
if ( var_4 == "concrete" )
|
||||
var_4 = "cement";
|
||||
|
||||
if ( self.aistate == "traverse" )
|
||||
var_5 = "land";
|
||||
else if ( self.movemode == "sprint" )
|
||||
var_5 = "sprint";
|
||||
else if ( self.movemode == "fastwalk" )
|
||||
var_5 = "walk";
|
||||
else
|
||||
var_5 = "run";
|
||||
|
||||
self playsoundonmovingent( "dogstep_" + var_5 + "_" + var_4 );
|
||||
|
||||
if ( issubstr( var_0, "front_left" ) )
|
||||
{
|
||||
var_6 = "anml_dog_mvmt_accent";
|
||||
var_7 = "anml_dog_mvmt_vest";
|
||||
|
||||
if ( var_5 == "walk" )
|
||||
var_8 = "_npc";
|
||||
else
|
||||
var_8 = "_run_npc";
|
||||
|
||||
self playsoundonmovingent( var_6 + var_8 );
|
||||
self playsoundonmovingent( var_7 + var_8 );
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
dohitreaction( var_0 )
|
||||
{
|
||||
cancelallbut( undefined );
|
||||
self.blockgoalpos = 1;
|
||||
self.statelocked = 1;
|
||||
var_1 = angleclamp180( var_0 - self.angles[1] );
|
||||
|
||||
if ( var_1 > 0 )
|
||||
var_2 = 1;
|
||||
else
|
||||
var_2 = 0;
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "run_pain", var_2, "run_pain" );
|
||||
self.blockgoalpos = 0;
|
||||
self.statelocked = 0;
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( self.statelocked )
|
||||
return;
|
||||
|
||||
var_10 = vectortoangles( var_7 );
|
||||
var_11 = var_10[1] - 180;
|
||||
dohitreaction( var_11 );
|
||||
}
|
||||
|
||||
onflashbanged( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
if ( self.statelocked )
|
||||
return;
|
||||
|
||||
dohitreaction( self.angles[1] + 180 );
|
||||
}
|
898
maps/mp/agents/dog/_dog_think.gsc
Normal file
898
maps/mp/agents/dog/_dog_think.gsc
Normal file
@ -0,0 +1,898 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setupdogstate();
|
||||
thread think();
|
||||
thread watchownerdamage();
|
||||
thread watchownerdeath();
|
||||
thread watchownerteamchange();
|
||||
thread waitforbadpath();
|
||||
thread waitforpathset();
|
||||
}
|
||||
|
||||
setupdogstate()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
self.ownerradiussq = 20736;
|
||||
self.meleeradiussq = 16384;
|
||||
self.attackoffset = 25 + self.radius;
|
||||
self.attackradiussq = 202500;
|
||||
self.warningradiussq = 302500;
|
||||
self.warningzheight = 96.0;
|
||||
self.attackzheight = 54;
|
||||
self.attackzheightdown = -64;
|
||||
self.ownerdamagedradiussq = 2250000;
|
||||
self.dogdamagedradiussq = 2250000;
|
||||
self.keeppursuingtargetradiussq = 1000000;
|
||||
self.preferredoffsetfromowner = 76;
|
||||
self.minoffsetfromowner = 50;
|
||||
self.forceattack = 0;
|
||||
self.ignoreclosefoliage = 1;
|
||||
self.movemode = "run";
|
||||
self.enableextendedkill = 1;
|
||||
self.attackstate = "idle";
|
||||
self.movestate = "idle";
|
||||
self.bhasbadpath = 0;
|
||||
self.timeoflastdamage = 0;
|
||||
self.allowcrouch = 1;
|
||||
self scragentsetgoalradius( 24 );
|
||||
}
|
||||
|
||||
init()
|
||||
{
|
||||
self.animcbs = spawnstruct();
|
||||
self.animcbs.onenter = [];
|
||||
self.animcbs.onenter["idle"] = maps\mp\agents\dog\_dog_idle::main;
|
||||
self.animcbs.onenter["move"] = maps\mp\agents\dog\_dog_move::main;
|
||||
self.animcbs.onenter["traverse"] = maps\mp\agents\dog\_dog_traverse::main;
|
||||
self.animcbs.onenter["melee"] = maps\mp\agents\dog\_dog_melee::main;
|
||||
self.animcbs.onexit = [];
|
||||
self.animcbs.onexit["idle"] = maps\mp\agents\dog\_dog_idle::end_script;
|
||||
self.animcbs.onexit["move"] = maps\mp\agents\dog\_dog_move::end_script;
|
||||
self.animcbs.onexit["melee"] = maps\mp\agents\dog\_dog_melee::end_script;
|
||||
self.animcbs.onexit["traverse"] = maps\mp\agents\dog\_dog_traverse::end_script;
|
||||
self.watchattackstatefunc = ::watchattackstate;
|
||||
self.aistate = "idle";
|
||||
self.movemode = "fastwalk";
|
||||
self.radius = 15;
|
||||
self.height = 40;
|
||||
}
|
||||
|
||||
onenteranimstate( var_0, var_1 )
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
|
||||
if ( !isdefined( self.animcbs.onenter[var_1] ) )
|
||||
return;
|
||||
|
||||
if ( var_0 == var_1 && var_1 != "traverse" )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.animcbs.onexit[var_0] ) )
|
||||
self [[ self.animcbs.onexit[var_0] ]]();
|
||||
|
||||
exitaistate( self.aistate );
|
||||
self.aistate = var_1;
|
||||
enteraistate( var_1 );
|
||||
self [[ self.animcbs.onenter[var_1] ]]();
|
||||
}
|
||||
|
||||
think()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( isdefined( self.owner ) )
|
||||
{
|
||||
self endon( "owner_disconnect" );
|
||||
thread destroyonownerdisconnect( self.owner );
|
||||
}
|
||||
|
||||
self thread [[ self.watchattackstatefunc ]]();
|
||||
thread monitorflash();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate != "melee" && !self.statelocked && readytomeleetarget() && !didpastmeleefail() )
|
||||
self scragentbeginmelee( self.curmeleetarget );
|
||||
|
||||
switch ( self.aistate )
|
||||
{
|
||||
case "idle":
|
||||
updateidle();
|
||||
break;
|
||||
case "move":
|
||||
updatemove();
|
||||
break;
|
||||
case "melee":
|
||||
updatemelee();
|
||||
break;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
didpastpursuitfail( var_0 )
|
||||
{
|
||||
if ( isdefined( self.curmeleetarget ) && var_0 != self.curmeleetarget )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( self.lastpursuitfailedpos ) || !isdefined( self.lastpursuitfailedmypos ) )
|
||||
return 0;
|
||||
|
||||
if ( distance2dsquared( var_0.origin, self.lastpursuitfailedpos ) > 4 )
|
||||
return 0;
|
||||
|
||||
if ( self.blastpursuitfailedposbad )
|
||||
return 1;
|
||||
|
||||
if ( distancesquared( self.origin, self.lastpursuitfailedmypos ) > 4096 && gettime() - self.lastpursuitfailedtime > 2000 )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
didpastmeleefail()
|
||||
{
|
||||
if ( isdefined( self.lastmeleefailedpos ) && isdefined( self.lastmeleefailedmypos ) && distance2dsquared( self.curmeleetarget.origin, self.lastmeleefailedpos ) < 4 && distancesquared( self.origin, self.lastmeleefailedmypos ) < 2500 )
|
||||
return 1;
|
||||
|
||||
if ( wanttoattacktargetbutcant( 0 ) )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enteraistate( var_0 )
|
||||
{
|
||||
exitaistate( self.aistate );
|
||||
self.aistate = var_0;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "idle":
|
||||
self.movestate = "idle";
|
||||
self.bhasbadpath = 0;
|
||||
break;
|
||||
case "move":
|
||||
self.movestate = "follow";
|
||||
break;
|
||||
case "melee":
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
exitaistate( var_0 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "move":
|
||||
self.ownerprevpos = undefined;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
updateidle()
|
||||
{
|
||||
updatemovestate();
|
||||
}
|
||||
|
||||
updatemove()
|
||||
{
|
||||
updatemovestate();
|
||||
}
|
||||
|
||||
updatemelee()
|
||||
{
|
||||
self scragentsetgoalpos( self.origin );
|
||||
}
|
||||
|
||||
updatemovestate()
|
||||
{
|
||||
if ( self.blockgoalpos )
|
||||
return;
|
||||
|
||||
self.prevmovestate = self.movestate;
|
||||
var_0 = undefined;
|
||||
var_1 = 0;
|
||||
var_2 = 0;
|
||||
var_3 = 500;
|
||||
|
||||
if ( self.bhasbadpath && gettime() - self.lastbadpathtime < var_3 )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_1 = 1;
|
||||
}
|
||||
else
|
||||
self.movestate = getmovestate();
|
||||
|
||||
if ( self.movestate == "pursuit" )
|
||||
{
|
||||
var_0 = getattackpoint( self.enemy );
|
||||
var_4 = 0;
|
||||
|
||||
if ( isdefined( self.lastbadpathtime ) && gettime() - self.lastbadpathtime < 3000 )
|
||||
{
|
||||
if ( distance2dsquared( var_0, self.lastbadpathgoal ) < 16 )
|
||||
var_4 = 1;
|
||||
else if ( isdefined( self.lastbadpathmovestate ) && self.lastbadpathmovestate == "pursuit" && distance2dsquared( self.lastbadpathultimategoal, self.enemy.origin ) < 16 )
|
||||
var_4 = 1;
|
||||
}
|
||||
|
||||
if ( var_4 )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_2 = 1;
|
||||
}
|
||||
else if ( wanttoattacktargetbutcant( 1 ) )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_2 = 1;
|
||||
}
|
||||
else if ( didpastpursuitfail( self.enemy ) )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_2 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
setpastpursuitfailed( var_2 );
|
||||
|
||||
if ( self.movestate == "follow" )
|
||||
{
|
||||
self.curmeleetarget = undefined;
|
||||
self.movemode = getfollowmovemode( self.movemode );
|
||||
self.barrivalsenabled = 1;
|
||||
var_5 = self getpathgoalpos();
|
||||
|
||||
if ( !isdefined( var_5 ) )
|
||||
var_5 = self.origin;
|
||||
|
||||
if ( self.owner.sessionstate == "spectator" )
|
||||
return;
|
||||
|
||||
if ( gettime() - self.timeoflastdamage < 5000 )
|
||||
var_1 = 1;
|
||||
|
||||
var_6 = self.owner getstance();
|
||||
|
||||
if ( !isdefined( self.owner.prevstance ) && isdefined( self.owner ) )
|
||||
self.owner.prevstance = var_6;
|
||||
|
||||
var_7 = !isdefined( self.ownerprevpos ) || distance2dsquared( self.ownerprevpos, self.owner.origin ) > 100;
|
||||
|
||||
if ( var_7 )
|
||||
self.ownerprevpos = self.owner.origin;
|
||||
|
||||
var_8 = distance2dsquared( var_5, self.owner.origin );
|
||||
|
||||
if ( var_1 || var_8 > self.ownerradiussq && var_7 || self.owner.prevstance != var_6 || self.prevmovestate != "idle" && self.prevmovestate != self.movestate )
|
||||
{
|
||||
self scragentsetgoalpos( findpointnearowner() );
|
||||
self.owner.prevstance = var_6;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( self.movestate == "pursuit" )
|
||||
{
|
||||
self.curmeleetarget = self.enemy;
|
||||
self.movemode = "sprint";
|
||||
self.barrivalsenabled = 0;
|
||||
self scragentsetgoalpos( var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
getmovestate( var_0 )
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
{
|
||||
if ( isdefined( self.favoriteenemy ) && self.enemy == self.favoriteenemy )
|
||||
return "pursuit";
|
||||
|
||||
if ( abs( self.origin[2] - self.enemy.origin[2] ) < self.warningzheight && distance2dsquared( self.enemy.origin, self.origin ) < self.attackradiussq )
|
||||
return "pursuit";
|
||||
|
||||
if ( isdefined( self.curmeleetarget ) && self.curmeleetarget == self.enemy )
|
||||
{
|
||||
if ( distance2dsquared( self.curmeleetarget.origin, self.origin ) < self.keeppursuingtargetradiussq )
|
||||
return "pursuit";
|
||||
}
|
||||
}
|
||||
|
||||
return "follow";
|
||||
}
|
||||
|
||||
setpastpursuitfailed( var_0 )
|
||||
{
|
||||
if ( var_0 )
|
||||
{
|
||||
if ( !isdefined( self.lastpursuitfailedpos ) )
|
||||
{
|
||||
self.lastpursuitfailedpos = self.enemy.origin;
|
||||
self.lastpursuitfailedmypos = self.origin;
|
||||
var_1 = maps\mp\agents\_scriptedagents::droppostoground( self.enemy.origin );
|
||||
self.blastpursuitfailedposbad = !isdefined( var_1 );
|
||||
self.lastpursuitfailedtime = gettime();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self.lastpursuitfailedpos = undefined;
|
||||
self.lastpursuitfailedmypos = undefined;
|
||||
self.blastpursuitfailedposbad = undefined;
|
||||
self.lastpursuitfailedtime = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
waitforbadpath()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "bad_path", var_0 );
|
||||
self.bhasbadpath = 1;
|
||||
self.lastbadpathtime = gettime();
|
||||
self.lastbadpathgoal = var_0;
|
||||
self.lastbadpathmovestate = self.movestate;
|
||||
|
||||
if ( self.movestate == "follow" && isdefined( self.owner ) )
|
||||
{
|
||||
self.lastbadpathultimategoal = self.owner.origin;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( self.movestate == "pursuit" && isdefined( self.enemy ) )
|
||||
self.lastbadpathultimategoal = self.enemy.origin;
|
||||
}
|
||||
}
|
||||
|
||||
waitforpathset()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "path_set" );
|
||||
self.bhasbadpath = 0;
|
||||
}
|
||||
}
|
||||
|
||||
getfollowmovemode( var_0 )
|
||||
{
|
||||
var_1 = 40000;
|
||||
var_2 = 65536;
|
||||
var_3 = self getpathgoalpos();
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_4 = distancesquared( var_3, self.origin );
|
||||
|
||||
if ( var_0 == "run" || var_0 == "sprint" )
|
||||
{
|
||||
if ( var_4 < var_1 )
|
||||
return "fastwalk";
|
||||
else if ( var_0 == "sprint" )
|
||||
return "run";
|
||||
}
|
||||
else if ( var_0 == "fastwalk" )
|
||||
{
|
||||
if ( var_4 > var_2 )
|
||||
return "run";
|
||||
}
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
iswithinattackheight( var_0 )
|
||||
{
|
||||
var_1 = var_0[2] - self.origin[2];
|
||||
return var_1 <= self.attackzheight && var_1 >= self.attackzheightdown;
|
||||
}
|
||||
|
||||
wanttoattacktargetbutcant( var_0 )
|
||||
{
|
||||
if ( !isdefined( self.curmeleetarget ) )
|
||||
return 0;
|
||||
|
||||
return !iswithinattackheight( self.curmeleetarget.origin ) && distance2dsquared( self.origin, self.curmeleetarget.origin ) < self.meleeradiussq * 0.75 * 0.75 && ( !var_0 || self agentcanseesentient( self.curmeleetarget ) );
|
||||
}
|
||||
|
||||
readytomeleetarget()
|
||||
{
|
||||
if ( !isdefined( self.curmeleetarget ) )
|
||||
return 0;
|
||||
|
||||
if ( !maps\mp\_utility::isreallyalive( self.curmeleetarget ) )
|
||||
return 0;
|
||||
|
||||
if ( self.aistate == "traverse" )
|
||||
return 0;
|
||||
|
||||
if ( distance2dsquared( self.origin, self.curmeleetarget.origin ) > self.meleeradiussq )
|
||||
return 0;
|
||||
|
||||
if ( !iswithinattackheight( self.curmeleetarget.origin ) )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
wantstogrowlattarget()
|
||||
{
|
||||
if ( !isdefined( self.enemy ) )
|
||||
return 0;
|
||||
|
||||
if ( abs( self.origin[2] - self.enemy.origin[2] ) <= self.warningzheight || self agentcanseesentient( self.enemy ) )
|
||||
{
|
||||
var_0 = distance2dsquared( self.origin, self.enemy.origin );
|
||||
|
||||
if ( var_0 < self.warningradiussq )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
getattackpoint( var_0 )
|
||||
{
|
||||
var_1 = var_0.origin - self.origin;
|
||||
var_1 = vectornormalize( var_1 );
|
||||
var_2 = self getpathgoalpos();
|
||||
var_3 = self.attackoffset + 4;
|
||||
|
||||
if ( isdefined( var_2 ) && distance2dsquared( var_2, var_0.origin ) < var_3 * var_3 && maps\mp\agents\_scriptedagents::canmovepointtopoint( var_0.origin, var_2 ) )
|
||||
return var_2;
|
||||
|
||||
var_4 = var_0.origin - var_1 * self.attackoffset;
|
||||
var_4 = maps\mp\agents\_scriptedagents::droppostoground( var_4 );
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
return var_0.origin;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_0.origin, var_4 ) )
|
||||
{
|
||||
var_5 = anglestoforward( var_0.angles );
|
||||
var_4 = var_0.origin + var_5 * self.attackoffset;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_0.origin, var_4 ) )
|
||||
return var_0.origin;
|
||||
}
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
cross2d( var_0, var_1 )
|
||||
{
|
||||
return var_0[0] * var_1[1] - var_1[0] * var_0[1];
|
||||
}
|
||||
|
||||
findpointnearowner()
|
||||
{
|
||||
var_0 = vectornormalize( self.origin - self.owner.origin );
|
||||
var_1 = anglestoforward( self.owner.angles );
|
||||
var_1 = ( var_1[0], var_1[1], 0 );
|
||||
var_1 = vectornormalize( var_1 );
|
||||
var_2 = cross2d( var_0, var_1 );
|
||||
var_3 = getclosestnodeinsight( self.owner.origin );
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
return self.origin;
|
||||
|
||||
var_4 = getlinkednodes( var_3 );
|
||||
var_5 = 5;
|
||||
var_6 = 10;
|
||||
var_7 = 15;
|
||||
var_8 = -15;
|
||||
var_9 = gettime() - self.timeoflastdamage < 5000;
|
||||
var_10 = 0;
|
||||
var_11 = undefined;
|
||||
var_4[var_4.size] = var_3;
|
||||
|
||||
foreach ( var_13 in var_4 )
|
||||
{
|
||||
var_14 = 0;
|
||||
var_15 = var_13.origin - self.owner.origin;
|
||||
var_16 = length( var_15 );
|
||||
|
||||
if ( var_16 >= self.preferredoffsetfromowner )
|
||||
var_14 = var_14 + var_5;
|
||||
else if ( var_16 < self.minoffsetfromowner )
|
||||
{
|
||||
var_17 = 1 - ( self.minoffsetfromowner - var_16 ) / self.minoffsetfromowner;
|
||||
var_14 = var_14 + var_5 * var_17 * var_17;
|
||||
}
|
||||
else
|
||||
var_14 = var_14 + var_5 * var_16 / self.preferredoffsetfromowner;
|
||||
|
||||
if ( var_16 == 0 )
|
||||
var_16 = 1;
|
||||
|
||||
var_15 = var_15 / var_16;
|
||||
var_18 = vectordot( var_1, var_15 );
|
||||
var_19 = self.owner getstance();
|
||||
|
||||
switch ( var_19 )
|
||||
{
|
||||
case "stand":
|
||||
if ( var_18 < cos( 35 ) && var_18 > cos( 45 ) )
|
||||
var_14 = var_14 + var_6;
|
||||
|
||||
break;
|
||||
case "crouch":
|
||||
if ( var_18 < cos( 75 ) && var_18 > cos( 90 ) )
|
||||
var_14 = var_14 + var_6;
|
||||
|
||||
break;
|
||||
case "prone":
|
||||
if ( var_18 < cos( 125 ) && var_18 > cos( 135 ) )
|
||||
var_14 = var_14 + var_6;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
var_20 = cross2d( var_15, var_1 );
|
||||
|
||||
if ( var_20 * var_2 > 0 )
|
||||
var_14 = var_14 + var_7;
|
||||
|
||||
if ( var_9 )
|
||||
{
|
||||
var_21 = vectordot( self.damagedownertome, var_15 );
|
||||
var_14 = var_14 + var_21 * var_8;
|
||||
}
|
||||
|
||||
if ( var_14 > var_10 )
|
||||
{
|
||||
var_10 = var_14;
|
||||
var_11 = var_13;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
return self.origin;
|
||||
|
||||
var_23 = var_11.origin - self.owner.origin;
|
||||
var_24 = length( var_23 );
|
||||
|
||||
if ( var_24 > self.preferredoffsetfromowner )
|
||||
{
|
||||
var_25 = var_3.origin - self.owner.origin;
|
||||
|
||||
if ( vectordot( var_25, var_23 / var_24 ) < 0 )
|
||||
var_26 = var_11.origin;
|
||||
else
|
||||
{
|
||||
var_27 = vectornormalize( var_11.origin - var_3.origin );
|
||||
var_26 = var_3.origin + var_27 * self.preferredoffsetfromowner;
|
||||
}
|
||||
}
|
||||
else
|
||||
var_26 = var_11.origin;
|
||||
|
||||
var_26 = maps\mp\agents\_scriptedagents::droppostoground( var_26 );
|
||||
|
||||
if ( !isdefined( var_26 ) )
|
||||
return self.origin;
|
||||
|
||||
if ( self.bhasbadpath && distance2dsquared( var_26, self.lastbadpathgoal ) < 4 )
|
||||
return self.origin;
|
||||
|
||||
return var_26;
|
||||
}
|
||||
|
||||
destroyonownerdisconnect( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 common_scripts\utility::waittill_any( "disconnect", "joined_team" );
|
||||
self notify( "owner_disconnect" );
|
||||
|
||||
if ( maps\mp\gametypes\_hostmigration::waittillhostmigrationdone() )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "killanimscript" );
|
||||
|
||||
if ( isdefined( self.animcbs.onexit[self.aistate] ) )
|
||||
self [[ self.animcbs.onexit[self.aistate] ]]();
|
||||
|
||||
self suicide();
|
||||
}
|
||||
|
||||
watchattackstate()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate == "melee" )
|
||||
{
|
||||
if ( self.attackstate != "melee" )
|
||||
{
|
||||
self.attackstate = "melee";
|
||||
setsoundstate( undefined );
|
||||
}
|
||||
}
|
||||
else if ( self.movestate == "pursuit" )
|
||||
{
|
||||
if ( self.attackstate != "attacking" )
|
||||
{
|
||||
self.attackstate = "attacking";
|
||||
setsoundstate( "bark", "attacking" );
|
||||
}
|
||||
}
|
||||
else if ( self.attackstate != "warning" )
|
||||
{
|
||||
if ( wantstogrowlattarget() )
|
||||
{
|
||||
self.attackstate = "warning";
|
||||
setsoundstate( "growl", "warning" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.attackstate = self.aistate;
|
||||
setsoundstate( "pant" );
|
||||
}
|
||||
}
|
||||
else if ( !wantstogrowlattarget() )
|
||||
{
|
||||
self.attackstate = self.aistate;
|
||||
setsoundstate( "pant" );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
setsoundstate( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
self notify( "end_dog_sound" );
|
||||
self.soundstate = undefined;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !isdefined( self.soundstate ) || self.soundstate != var_0 )
|
||||
{
|
||||
self notify( "end_dog_sound" );
|
||||
self.soundstate = var_0;
|
||||
|
||||
if ( var_0 == "bark" )
|
||||
thread playbark( var_1 );
|
||||
else if ( var_0 == "growl" )
|
||||
thread playgrowl( var_1 );
|
||||
else if ( var_0 == "pant" )
|
||||
thread playpanting();
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playbark( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
|
||||
if ( !isdefined( self.barking_sound ) )
|
||||
{
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_bark", "anml_dog_bark" ) );
|
||||
self.barking_sound = 1;
|
||||
thread watchbarking();
|
||||
}
|
||||
}
|
||||
|
||||
watchbarking()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
wait( randomintrange( 5, 10 ) );
|
||||
self.barking_sound = undefined;
|
||||
}
|
||||
|
||||
playgrowl( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
|
||||
if ( isdefined( self.lastgrowlplayedtime ) && gettime() - self.lastgrowlplayedtime < 3000 )
|
||||
wait 3;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self.lastgrowlplayedtime = gettime();
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_growl", "anml_dog_growl" ) );
|
||||
wait( randomintrange( 3, 6 ) );
|
||||
}
|
||||
}
|
||||
|
||||
playpanting( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
|
||||
if ( isdefined( self.lastpantplayedtime ) && gettime() - self.lastpantplayedtime < 3000 )
|
||||
wait 3;
|
||||
|
||||
self.lastpantplayedtime = gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate == "idle" )
|
||||
{
|
||||
wait 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
self.lastpantplayedtime = gettime();
|
||||
|
||||
if ( self.movemode == "run" || self.movemode == "sprint" )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_fast", "anml_dog_pants_mp_fast" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_med", "anml_dog_pants_mp_med" ) );
|
||||
|
||||
wait( randomintrange( 6, 8 ) );
|
||||
}
|
||||
}
|
||||
|
||||
watchownerdamage()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
self.owner waittill( "damage", var_0, var_1 );
|
||||
|
||||
if ( isplayer( var_1 ) && var_1 != self.owner )
|
||||
{
|
||||
if ( self.attackstate == "attacking" )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( self.owner.origin, self.origin ) > self.ownerdamagedradiussq )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( self.owner.origin, var_1.origin ) > self.ownerdamagedradiussq )
|
||||
continue;
|
||||
|
||||
self.favoriteenemy = var_1;
|
||||
self.forceattack = 1;
|
||||
thread watchfavoriteenemydeath();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchownerdeath()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
self.owner waittill( "death" );
|
||||
|
||||
switch ( level.gametype )
|
||||
{
|
||||
case "sd":
|
||||
maps\mp\agents\_agent_utility::killdog();
|
||||
break;
|
||||
case "sr":
|
||||
var_0 = level common_scripts\utility::waittill_any_return( "sr_player_eliminated", "sr_player_respawned" );
|
||||
|
||||
if ( isdefined( var_0 ) && var_0 == "sr_player_eliminated" )
|
||||
maps\mp\agents\_agent_utility::killdog();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchownerteamchange()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
var_0 = self.owner common_scripts\utility::waittill_any_return_no_endon_death( "joined_team", "joined_spectators" );
|
||||
|
||||
if ( isdefined( var_0 ) && ( var_0 == "joined_team" || var_0 == "joined_spectators" ) )
|
||||
maps\mp\agents\_agent_utility::killdog();
|
||||
}
|
||||
}
|
||||
|
||||
watchfavoriteenemydeath()
|
||||
{
|
||||
self notify( "watchFavoriteEnemyDeath" );
|
||||
self endon( "watchFavoriteEnemyDeath" );
|
||||
self endon( "death" );
|
||||
self.favoriteenemy common_scripts\utility::waittill_any_timeout( 5.0, "death", "disconnect" );
|
||||
self.favoriteenemy = undefined;
|
||||
self.forceattack = 0;
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
self.timeoflastdamage = gettime();
|
||||
|
||||
if ( isdefined( self.owner ) )
|
||||
self.damagedownertome = vectornormalize( self.origin - self.owner.origin );
|
||||
|
||||
if ( shouldplayhitreaction( var_2, var_5, var_4 ) )
|
||||
{
|
||||
switch ( self.aistate )
|
||||
{
|
||||
case "idle":
|
||||
thread maps\mp\agents\dog\_dog_idle::ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
break;
|
||||
case "move":
|
||||
thread maps\mp\agents\dog\_dog_move::ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shouldplayhitreaction( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isdefined( var_1 ) && weaponclass( var_1 ) == "sniper" )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_2 ) && isexplosivedamagemod( var_2 ) && var_0 >= 10 )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_2 ) && var_2 == "MOD_MELEE" )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_1 ) && var_1 == "concussion_grenade_mp" )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
monitorflash()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "flashbang", var_0, var_1, var_2, var_3, var_4, var_5 );
|
||||
|
||||
if ( isdefined( var_3 ) && var_3 == self.owner )
|
||||
continue;
|
||||
|
||||
switch ( self.aistate )
|
||||
{
|
||||
case "idle":
|
||||
maps\mp\agents\dog\_dog_idle::onflashbanged();
|
||||
break;
|
||||
case "move":
|
||||
maps\mp\agents\dog\_dog_move::onflashbanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
205
maps/mp/agents/dog/_dog_traverse.gsc
Normal file
205
maps/mp/agents/dog/_dog_traverse.gsc
Normal file
@ -0,0 +1,205 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( !isdefined( level.dogtraverseanims ) )
|
||||
initdogtraverseanims();
|
||||
|
||||
var_0 = self getnegotiationstartnode();
|
||||
var_1 = self getnegotiationendnode();
|
||||
var_2 = undefined;
|
||||
var_2 = level.dogtraverseanims[var_0.animscript];
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
return;
|
||||
|
||||
self.blockgoalpos = 1;
|
||||
var_3 = var_1.origin - var_0.origin;
|
||||
var_4 = ( var_3[0], var_3[1], 0 );
|
||||
var_5 = vectortoangles( var_4 );
|
||||
self scragentsetorientmode( "face angle abs", var_5 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
var_6 = self getanimentry( var_2, 0 );
|
||||
var_7 = getnotetracktimes( var_6, "code_move" );
|
||||
|
||||
if ( var_7.size > 0 )
|
||||
var_8 = getmovedelta( var_6, 0, var_7[0] );
|
||||
else
|
||||
var_8 = getmovedelta( var_6, 0, 1 );
|
||||
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_3, var_8 );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
|
||||
if ( var_3[2] > 0 )
|
||||
{
|
||||
if ( var_8[2] > 0 )
|
||||
{
|
||||
var_10 = getnotetracktimes( var_6, "traverse_jump_start" );
|
||||
|
||||
if ( var_10.size > 0 )
|
||||
{
|
||||
var_11 = 1;
|
||||
var_12 = 1;
|
||||
|
||||
if ( length2dsquared( var_4 ) < 0.64 * length2dsquared( var_8 ) )
|
||||
var_11 = 0.4;
|
||||
|
||||
if ( var_3[2] < 0.75 * var_8[2] )
|
||||
var_12 = 0.5;
|
||||
|
||||
self scragentsetanimscale( var_11, var_12 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse", "traverse_jump_start" );
|
||||
var_13 = getnotetracktimes( var_6, "traverse_jump_end" );
|
||||
var_14 = getmovedelta( var_6, 0, var_10[0] );
|
||||
var_15 = getmovedelta( var_6, 0, var_13[0] );
|
||||
var_11 = 1;
|
||||
var_12 = 1;
|
||||
var_16 = var_1.origin - self.origin;
|
||||
var_17 = var_8 - var_14;
|
||||
|
||||
if ( length2dsquared( var_16 ) < 0.5625 * length2dsquared( var_17 ) )
|
||||
var_11 = 0.75;
|
||||
|
||||
if ( var_16[2] < 0.75 * var_17[2] )
|
||||
var_12 = 0.75;
|
||||
|
||||
var_18 = var_8 - var_15;
|
||||
var_19 = ( var_18[0] * var_11, var_18[1] * var_11, var_18[2] * var_12 );
|
||||
var_20 = rotatevector( var_19, var_5 );
|
||||
var_21 = var_1.origin - var_20;
|
||||
var_22 = var_15 - var_14;
|
||||
var_23 = rotatevector( var_22, var_5 );
|
||||
var_24 = var_21 - self.origin;
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_24, var_23, 1 );
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "traverse_jump_end" );
|
||||
self scragentsetanimscale( var_11, var_12 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
return;
|
||||
}
|
||||
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_25 = getnotetracktimes( var_6, "gravity on" );
|
||||
|
||||
if ( var_25.size > 0 )
|
||||
{
|
||||
var_26 = var_0 gettargetentpos();
|
||||
|
||||
if ( isdefined( var_26 ) )
|
||||
{
|
||||
var_27 = var_26 - self.origin;
|
||||
var_28 = var_1.origin - var_26;
|
||||
var_29 = getmovedelta( var_6, 0, var_25[0] );
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_27, var_29 );
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse", "gravity on" );
|
||||
var_30 = getmovedelta( var_6, var_25[0], 1 );
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_28, var_30 );
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var_31 = getanimlength( var_6 );
|
||||
self scragentdoanimlerp( var_0.origin, var_1.origin, var_31 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var_25 = getnotetracktimes( var_6, "gravity on" );
|
||||
|
||||
if ( var_25.size > 0 )
|
||||
{
|
||||
self scragentsetanimscale( var_9.xy, 1 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse", "gravity on" );
|
||||
var_32 = getmovedelta( var_6, 0, var_25[0] );
|
||||
var_33 = var_32[2] - var_8[2];
|
||||
|
||||
if ( abs( var_33 ) > 0 )
|
||||
{
|
||||
var_34 = self.origin[2] - var_1.origin[2];
|
||||
var_12 = var_34 / var_33;
|
||||
self scragentsetanimscale( var_9.xy, var_12 );
|
||||
var_35 = clamp( 2 / var_12, 0.5, 1 );
|
||||
var_36 = var_2 + "_norestart";
|
||||
self setanimstate( var_36, 0, var_35 );
|
||||
}
|
||||
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
var_35 = clamp( 2 / var_9.z, 0.5, 1 );
|
||||
var_13 = getnotetracktimes( var_6, "traverse_jump_end" );
|
||||
|
||||
if ( var_13.size > 0 )
|
||||
{
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_2, 0, var_35, "traverse", "traverse_jump_end" );
|
||||
var_36 = var_2 + "_norestart";
|
||||
self setanimstate( var_36, 0, 1 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
}
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse" );
|
||||
}
|
||||
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
gettargetentpos()
|
||||
{
|
||||
if ( isdefined( self.targetentpos ) )
|
||||
return self.targetentpos;
|
||||
|
||||
var_0 = getent( self.target, "targetname" );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
self.targetentpos = var_0.origin;
|
||||
var_0 delete();
|
||||
return self.targetentpos;
|
||||
}
|
||||
|
||||
initdogtraverseanims()
|
||||
{
|
||||
level.dogtraverseanims = [];
|
||||
level.dogtraverseanims["hjk_tree_hop"] = "traverse_jump_over_24";
|
||||
level.dogtraverseanims["jump_across_72"] = "traverse_jump_over_24";
|
||||
level.dogtraverseanims["wall_hop"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_2"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["wall_over_40"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["wall_over"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_divethrough_36"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_over_40"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_over_quick"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["jump_up_80"] = "traverse_jump_up_70";
|
||||
level.dogtraverseanims["jump_standing_80"] = "traverse_jump_up_70";
|
||||
level.dogtraverseanims["jump_down_80"] = "traverse_jump_down_70";
|
||||
level.dogtraverseanims["jump_up_40"] = "traverse_jump_up_40";
|
||||
level.dogtraverseanims["jump_down_40"] = "traverse_jump_down_40";
|
||||
level.dogtraverseanims["step_up"] = "traverse_jump_up_24";
|
||||
level.dogtraverseanims["step_up_24"] = "traverse_jump_up_24";
|
||||
level.dogtraverseanims["step_down"] = "traverse_jump_down_24";
|
||||
level.dogtraverseanims["jump_down"] = "traverse_jump_down_24";
|
||||
level.dogtraverseanims["jump_across"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["jump_across_100"] = "traverse_jump_over_36";
|
||||
}
|
278
maps/mp/alien/_achievement.gsc
Normal file
278
maps/mp/alien/_achievement.gsc
Normal file
@ -0,0 +1,278 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
init_player_achievement()
|
||||
{
|
||||
self.achievement_list = [];
|
||||
|
||||
if ( isdefined( level.achievement_registration_func ) )
|
||||
[[ level.achievement_registration_func ]]();
|
||||
|
||||
if ( maps\mp\alien\_utility::is_true( level.include_default_achievements ) )
|
||||
register_default_achievements();
|
||||
}
|
||||
|
||||
register_default_achievements()
|
||||
{
|
||||
register_achievement( "KILL_WITH_TRAP", 50, ::default_init, ::should_update_kill_with_trap, ::equal_to_goal );
|
||||
register_achievement( "ESCAPE_ALL_PLAYERS", 4, ::default_init, ::default_should_update, ::at_least_goal );
|
||||
register_achievement( "ESCAPE_IN_TIME", 90000, ::default_init, ::default_should_update, ::at_least_goal );
|
||||
register_achievement( "ESCAPE_1ST_TIME", 1, ::default_init, ::default_should_update, ::at_least_goal );
|
||||
register_achievement( "ESCAPE_ALL_CHALLENGE", 1, ::default_init, ::should_update_all_challenge, ::at_least_goal );
|
||||
register_achievement( "ESCAPE_WITH_NERF_ON", 1, ::default_init, ::default_should_update, ::at_least_goal );
|
||||
register_achievement( "REACH_CITY", 1, ::default_init, ::default_should_update, ::at_least_goal );
|
||||
register_achievement( "REACH_CABIN", 1, ::default_init, ::default_should_update, ::at_least_goal );
|
||||
register_achievement( "SCAVENGE_ITEM", 40, ::default_init, ::default_should_update, ::equal_to_goal );
|
||||
}
|
||||
|
||||
register_achievement( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
var_6 = spawnstruct();
|
||||
var_6 [[ var_2 ]]( var_1, var_3, var_4, var_5 );
|
||||
self.achievement_list[var_0] = var_6;
|
||||
}
|
||||
|
||||
default_init( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
self.progress = 0;
|
||||
self.goal = var_0;
|
||||
self.should_update_func = var_1;
|
||||
self.is_goal_reached_func = var_2;
|
||||
self.achievement_completed = 0;
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
self.complete_in_casual = var_3;
|
||||
}
|
||||
|
||||
default_should_update( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
update_progress( var_0 )
|
||||
{
|
||||
self.progress = self.progress + var_0;
|
||||
}
|
||||
|
||||
at_least_goal()
|
||||
{
|
||||
return self.progress >= self.goal;
|
||||
}
|
||||
|
||||
equal_to_goal()
|
||||
{
|
||||
return self.progress == self.goal;
|
||||
}
|
||||
|
||||
is_completed()
|
||||
{
|
||||
return self.achievement_completed;
|
||||
}
|
||||
|
||||
can_complete_in_causal()
|
||||
{
|
||||
return maps\mp\alien\_utility::is_true( self.complete_in_casual );
|
||||
}
|
||||
|
||||
mark_completed()
|
||||
{
|
||||
self.achievement_completed = 1;
|
||||
}
|
||||
|
||||
is_valid_achievement( var_0 )
|
||||
{
|
||||
return isdefined( var_0 );
|
||||
}
|
||||
|
||||
update_achievement( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 )
|
||||
{
|
||||
var_12 = self.achievement_list[var_0];
|
||||
|
||||
if ( !is_valid_achievement( var_12 ) )
|
||||
return;
|
||||
|
||||
if ( var_12 is_completed() )
|
||||
return;
|
||||
|
||||
if ( maps\mp\alien\_utility::is_casual_mode() && !var_12 can_complete_in_causal() )
|
||||
return;
|
||||
|
||||
if ( var_12 [[ var_12.should_update_func ]]( var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 ) )
|
||||
{
|
||||
var_12 update_progress( var_1 );
|
||||
|
||||
if ( var_12 [[ var_12.is_goal_reached_func ]]() )
|
||||
{
|
||||
self giveachievement( var_0 );
|
||||
var_12 mark_completed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update_alien_kill_achievements( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
if ( isdefined( level.update_alien_kill_achievements_func ) )
|
||||
[[ level.update_alien_kill_achievements_func ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
|
||||
|
||||
if ( !isdefined( var_1 ) || !isplayer( var_1 ) )
|
||||
return;
|
||||
|
||||
var_1 update_achievement( "KILL_WITH_TRAP", 1, var_0 );
|
||||
}
|
||||
|
||||
should_update_kill_with_trap( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( maps\mp\alien\_utility::is_trap( var_0 ) )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
update_escape_achievements( var_0, var_1 )
|
||||
{
|
||||
var_2 = var_0.size;
|
||||
|
||||
foreach ( var_4 in var_0 )
|
||||
{
|
||||
var_5 = var_4 maps\mp\alien\_persistence::get_player_escaped();
|
||||
var_6 = var_4 maps\mp\alien\_prestige::get_num_nerf_selected();
|
||||
var_4 update_personal_escape_achievements( var_2, var_1, var_5, var_6 );
|
||||
}
|
||||
}
|
||||
|
||||
update_personal_escape_achievements( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
update_achievement( "ESCAPE_ALL_PLAYERS", var_0 );
|
||||
update_achievement( "ESCAPE_IN_TIME", var_1 );
|
||||
update_achievement( "ESCAPE_1ST_TIME", var_2 );
|
||||
update_achievement( "ESCAPE_ALL_CHALLENGE", 1 );
|
||||
update_achievement( "ESCAPE_WITH_NERF_ON", var_3 );
|
||||
}
|
||||
|
||||
should_update_all_challenge( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
return level.all_challenge_completed;
|
||||
}
|
||||
|
||||
update_blocker_hive_achievements( var_0 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "lodge_lung_3":
|
||||
update_achievement_all_players( "REACH_CITY", 1 );
|
||||
break;
|
||||
case "city_lung_5":
|
||||
update_achievement_all_players( "REACH_CABIN", 1 );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
update_achievement_all_players( var_0, var_1 )
|
||||
{
|
||||
foreach ( var_3 in level.players )
|
||||
var_3 update_achievement( var_0, var_1 );
|
||||
}
|
||||
|
||||
update_scavenge_achievement()
|
||||
{
|
||||
update_achievement( "SCAVENGE_ITEM", 1 );
|
||||
}
|
||||
|
||||
update_achievement_damage_weapon( var_0 )
|
||||
{
|
||||
if ( isdefined( level.update_achievement_damage_weapon_func ) )
|
||||
self [[ level.update_achievement_damage_weapon_func ]]( var_0 );
|
||||
}
|
||||
|
||||
eggallfoundforpack( var_0 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
level common_scripts\utility::waittill_any( "regular_hive_destroyed", "obelisk_destroyed", "outpost_encounter_completed" );
|
||||
var_1 = self getcoopplayerdata( "alienPlayerStats", "deaths" );
|
||||
var_2 = self getcoopplayerdatareservedint( "eggstra_state_flags" );
|
||||
var_3 = var_2 >> var_0 * 4 & 15;
|
||||
|
||||
if ( var_3 == 15 )
|
||||
{
|
||||
var_4 = self getcoopplayerdatareservedint( "eggstra_award_flags" );
|
||||
var_5 = 0;
|
||||
|
||||
if ( var_1 == 1015 && ( var_4 & 1 ) != 1 )
|
||||
{
|
||||
var_4 = var_4 | 1;
|
||||
var_5 = 1;
|
||||
}
|
||||
|
||||
if ( ( var_4 & 1 << var_0 ) == 0 )
|
||||
{
|
||||
var_4 = var_4 | 1 << var_0;
|
||||
var_5 = 1;
|
||||
self setclientomnvar( "ui_alien_eggstra_xp", 1 );
|
||||
thread maps\mp\alien\_persistence::wait_and_give_player_xp( 10000, 5.0 );
|
||||
}
|
||||
|
||||
if ( var_5 == 1 )
|
||||
self setcoopplayerdatareservedint( "eggstra_award_flags", var_4 );
|
||||
|
||||
update_mp_eggs_achievement( var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
update_mp_eggs_achievement( var_0 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case 0:
|
||||
update_achievement( "GOT_THEEGGSTRA_XP", 1 );
|
||||
break;
|
||||
case 1:
|
||||
update_achievement( "GOT_THEEGGSTRA_XP_DLC2", 1 );
|
||||
break;
|
||||
case 2:
|
||||
update_achievement( "GOT_THEEGGSTRA_XP_DLC3", 1 );
|
||||
break;
|
||||
case 3:
|
||||
update_achievement( "GOT_THEEGGSTRA_XP_DLC4", 1 );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
update_intel_achievement( var_0 )
|
||||
{
|
||||
var_0 = 0;
|
||||
var_1 = getdvar( "ui_mapname" );
|
||||
|
||||
if ( var_1 == "mp_alien_armory" )
|
||||
var_0 = 1;
|
||||
|
||||
if ( var_1 == "mp_alien_beacon" )
|
||||
var_0 = 2;
|
||||
|
||||
if ( var_1 == "mp_alien_dlc3" )
|
||||
var_0 = 3;
|
||||
|
||||
if ( var_1 == "mp_alien_last" )
|
||||
var_0 = 4;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case 1:
|
||||
update_achievement( "FOUND_ALL_INTELS", 1 );
|
||||
break;
|
||||
case 2:
|
||||
update_achievement( "FOUND_ALL_INTELS_MAYDAY", 1 );
|
||||
break;
|
||||
case 3:
|
||||
update_achievement( "AWAKENING_ALL_INTEL", 1 );
|
||||
break;
|
||||
case 4:
|
||||
update_achievement( "LAST_ALL_INTEL", 1 );
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
91
maps/mp/alien/_achievement_dlc.gsc
Normal file
91
maps/mp/alien/_achievement_dlc.gsc
Normal file
@ -0,0 +1,91 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
register_achievements_dlc()
|
||||
{
|
||||
maps\mp\alien\_achievement::register_achievement( "REACH_COMPOUND", 1, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, maps\mp\alien\_achievement::at_least_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "REACH_FACILITY", 1, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, maps\mp\alien\_achievement::at_least_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "KILLBOSS_1ST_TIME", 1, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, maps\mp\alien\_achievement::at_least_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "KILLBOSS_IN_TIME", 300000, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, ::less_than_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "KILL_WITH_SWEAPON", 50, maps\mp\alien\_achievement::default_init, ::should_update_kill_with_sweapon, maps\mp\alien\_achievement::equal_to_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "COMPLETE_ALL_CHALLENGE", 1, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::should_update_all_challenge, maps\mp\alien\_achievement::at_least_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "KILLBOSS_WITH_RELIC", 1, maps\mp\alien\_achievement::default_init, ::is_using_relic, maps\mp\alien\_achievement::at_least_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "KILL_PHANTOMS", 5, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, maps\mp\alien\_achievement::equal_to_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "KILL_RHINO_PISTOL", 1, maps\mp\alien\_achievement::default_init, ::should_update_kill_rhino_pistol, maps\mp\alien\_achievement::equal_to_goal );
|
||||
maps\mp\alien\_achievement::register_achievement( "FOUND_ALL_INTELS", 11, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, maps\mp\alien\_achievement::at_least_goal, 1 );
|
||||
maps\mp\alien\_achievement::register_achievement( "GOT_THEEGGSTRA_XP", 1, maps\mp\alien\_achievement::default_init, maps\mp\alien\_achievement::default_should_update, maps\mp\alien\_achievement::at_least_goal, 1 );
|
||||
thread maps\mp\alien\_pillage_intel::init_player_intel_total();
|
||||
}
|
||||
|
||||
less_than_goal()
|
||||
{
|
||||
return self.progress <= self.goal;
|
||||
}
|
||||
|
||||
update_alien_kill_achievements_dlc( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
||||
{
|
||||
if ( !isdefined( var_1 ) || !isplayer( var_1 ) )
|
||||
return;
|
||||
|
||||
var_1 maps\mp\alien\_achievement::update_achievement( "KILL_WITH_SWEAPON", 1, var_4 );
|
||||
|
||||
if ( isdefined( self.alien_type ) && self.alien_type == "locust" )
|
||||
var_1 maps\mp\alien\_achievement::update_achievement( "KILL_PHANTOMS", 1 );
|
||||
|
||||
if ( isdefined( var_4 ) && maps\mp\_utility::getweaponclass( var_4 ) == "weapon_pistol" && isdefined( self.shot_only_by_pistol ) )
|
||||
var_1 maps\mp\alien\_achievement::update_achievement( "KILL_RHINO_PISTOL", 1, self.alien_type, self.shot_only_by_pistol );
|
||||
}
|
||||
|
||||
should_update_kill_rhino_pistol( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( isdefined( var_0 ) && var_0 == "elite" && isdefined( var_1 ) && var_1 )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
should_update_kill_with_sweapon( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( var_0 == "iw6_aliendlc11_mp" )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
is_using_relic( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
return var_0 maps\mp\alien\_prestige::get_num_nerf_selected() != 0;
|
||||
}
|
||||
|
||||
update_boss_achievements( var_0, var_1 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "compound":
|
||||
maps\mp\alien\_achievement::update_achievement_all_players( "REACH_COMPOUND", 1 );
|
||||
break;
|
||||
case "facility":
|
||||
maps\mp\alien\_achievement::update_achievement_all_players( "REACH_FACILITY", 1 );
|
||||
break;
|
||||
case "final":
|
||||
maps\mp\alien\_achievement::update_achievement_all_players( "KILLBOSS_1ST_TIME", 1 );
|
||||
maps\mp\alien\_achievement::update_achievement_all_players( "KILLBOSS_IN_TIME", var_1 );
|
||||
maps\mp\alien\_achievement::update_achievement_all_players( "COMPLETE_ALL_CHALLENGE", 1 );
|
||||
|
||||
foreach ( var_3 in level.players )
|
||||
var_3 maps\mp\alien\_achievement::update_achievement( "KILLBOSS_WITH_RELIC", 1, var_3 );
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
update_achievement_damage_weapon_dlc( var_0 )
|
||||
{
|
||||
if ( maps\mp\_utility::getweaponclass( var_0 ) != "weapon_pistol" )
|
||||
self.shot_only_by_pistol = 0;
|
||||
|
||||
if ( ( !isdefined( self.shot_only_by_pistol ) || self.shot_only_by_pistol ) && maps\mp\_utility::getweaponclass( var_0 ) == "weapon_pistol" )
|
||||
self.shot_only_by_pistol = 1;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user