iw6-scripts/maps/mp/agents/alien/_alien_agents.gsc
2024-02-13 13:20:49 +01:00

509 lines
16 KiB
Plaintext

// 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;
}