This commit is contained in:
2024-02-13 13:20:49 +01:00
commit 872504afef
1761 changed files with 871764 additions and 0 deletions

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

View 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
View 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";
}

View 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 );
}
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

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

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

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

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

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

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

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

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

View 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();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View 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 );
}

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

View 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" );
}

View 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" );
}

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

File diff suppressed because it is too large Load Diff

View 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 )
{
}

View 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";
}

View 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";
}
}

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

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

File diff suppressed because it is too large Load Diff

View 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" );
}

View 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() );
}

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

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

View 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 );
}

View 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();
}

View 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() );
}

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

File diff suppressed because it is too large Load Diff

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

View 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":
}
}

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

View 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";
}

View 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 );
}

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

File diff suppressed because it is too large Load Diff

View 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 );
}

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

View 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 );
}

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

View 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";
}