363 lines
9.6 KiB
Plaintext
363 lines
9.6 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init()
|
|
{
|
|
|
|
}
|
|
|
|
setupcallbacks()
|
|
{
|
|
level.agent_funcs["beastmen"] = level.agent_funcs["squadmate"];
|
|
level.agent_funcs["beastmen"]["spawn"] = ::spawn_agent_beast;
|
|
level.agent_funcs["beastmen"]["think"] = ::squadmate_agent_think;
|
|
level.agent_funcs["beastmen"]["on_killed"] = ::on_agent_squadmate_killed;
|
|
}
|
|
|
|
tryuseagentkillstreak( var_0, var_1 )
|
|
{
|
|
setupcallbacks();
|
|
self.beastcount = 0;
|
|
thread delayedspawnbeast( 5 );
|
|
return 1;
|
|
}
|
|
|
|
spawnbeast()
|
|
{
|
|
var_0 = createsquadmate();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
self.beastcount++;
|
|
|
|
if ( self.beastcount < 3 )
|
|
thread delayedspawnbeast( 0.5 );
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
delayedspawnbeast( var_0 )
|
|
{
|
|
self endon( "disconnect" );
|
|
level endon( "game_ended" );
|
|
wait( var_0 );
|
|
spawnbeast();
|
|
}
|
|
|
|
createsquadmate( var_0 )
|
|
{
|
|
var_1 = findspawnlocation();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_1 = var_0;
|
|
|
|
var_2 = vectortoangles( self.origin - var_1 );
|
|
var_3 = maps\mp\agents\_agents::add_humanoid_agent( "beastmen", self.team, "reconAgent", var_1, var_2, self, 0, 0, "veteran" );
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
{
|
|
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
|
|
return 0;
|
|
}
|
|
|
|
var_3.killstreaktype = "agent";
|
|
return var_3;
|
|
}
|
|
|
|
spawn_agent_beast( 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 );
|
|
maps\mp\bots\_bots_util::bot_set_personality( "cqb" );
|
|
|
|
if ( isdefined( var_5 ) )
|
|
maps\mp\bots\_bots_util::bot_set_difficulty( var_5 );
|
|
|
|
maps\mp\agents\_agents::initplayerclass();
|
|
maps\mp\agents\_agent_common::set_agent_health( 500 );
|
|
|
|
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 maps\mp\agents\_agents::destroyonownerdisconnect( self.owner );
|
|
|
|
thread maps\mp\_flashgrenades::monitorflash();
|
|
self enableanimstate( 0 );
|
|
self [[ level.onspawnplayer ]]();
|
|
maps\mp\gametypes\_class::giveloadout( self.team, self.class, 1 );
|
|
customizesquadmate();
|
|
thread maps\mp\bots\_bots::bot_think_watch_enemy( 1 );
|
|
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();
|
|
level notify( "spawned_agent_player", self );
|
|
level notify( "spawned_agent", self );
|
|
self notify( "spawned_player" );
|
|
self.environmentstate = "outdoors";
|
|
thread delaysoundfx( "zerosub_monster_breath_only_lp", 0.05 );
|
|
thread delaysoundfx( "zerosub_monster_steps_only_ext_lp", 0.1 );
|
|
thread delayplayfxontag( level._effect["vfx_yeti_snowcover_upflip"], "tag_origin", 0.05, 0.5 );
|
|
playeyefx();
|
|
thread watchbeastmovement();
|
|
thread watchkillstreakend();
|
|
}
|
|
|
|
squadmate_agent_think()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
|
|
if ( isdefined( self.owner ) )
|
|
self endon( "owner_disconnect" );
|
|
|
|
self botsetflag( "force_sprint", 1 );
|
|
}
|
|
|
|
on_agent_squadmate_killed( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
|
|
{
|
|
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 );
|
|
var_9 = self getcorpseentity();
|
|
playfx( level._effect["vfx_yeti_snowcover_dissolve"], self.origin );
|
|
self playsound( "mp_zerosub_monster_death" );
|
|
|
|
if ( var_3 == "MOD_MELEE" )
|
|
wait 0.75;
|
|
else
|
|
wait 0.5;
|
|
|
|
maps\mp\agents\_agent_utility::deactivateagent();
|
|
|
|
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_ks_beast_man" );
|
|
|
|
var_9 delete();
|
|
}
|
|
|
|
customizesquadmate()
|
|
{
|
|
self setmodel( "mp_fullbody_beast_man" );
|
|
|
|
if ( isdefined( self.headmodel ) )
|
|
{
|
|
self detach( self.headmodel, "" );
|
|
self.headmodel = undefined;
|
|
}
|
|
|
|
playfx( level._effect["vfx_yeti_snowcover_upflip"], self.origin );
|
|
var_0 = "iw6_knifeonlybeast_mp";
|
|
self takeallweapons();
|
|
self giveweapon( var_0 );
|
|
self switchtoweapon( var_0 );
|
|
self botsetflag( "prefer_melee", 1 );
|
|
maps\mp\_utility::giveperk( "specialty_spygame", 0 );
|
|
maps\mp\_utility::giveperk( "specialty_coldblooded", 0 );
|
|
maps\mp\_utility::giveperk( "specialty_noscopeoutline", 0 );
|
|
maps\mp\_utility::giveperk( "specialty_heartbreaker", 0 );
|
|
maps\mp\_utility::giveperk( "specialty_quieter", 0 );
|
|
thread watchremoveperks();
|
|
self.health = 500;
|
|
self.custommeleedamagetaken = 100;
|
|
self setsurfacetype( "snow" );
|
|
maps\mp\gametypes\_battlechatter_mp::disablebattlechatter( self );
|
|
}
|
|
|
|
watchremoveperks()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_over" );
|
|
self waittill( "starting_perks_unset" );
|
|
maps\mp\_utility::giveperk( "specialty_blindeye", 0 );
|
|
}
|
|
|
|
delaysoundfx( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
wait( var_1 );
|
|
self playloopsound( var_0 );
|
|
}
|
|
|
|
delayplayfxontag( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
wait( var_2 );
|
|
|
|
for (;;)
|
|
{
|
|
playfxontag( var_0, self, var_1 );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
wait( var_3 );
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
playeyefx()
|
|
{
|
|
var_0 = anglestoforward( self.angles ) * 30;
|
|
var_1 = anglestoright( self.angles ) * 7;
|
|
var_2 = ( 0, 0, 65 );
|
|
thread createeyefx( "left", self.origin + var_0 + var_1 + var_2 );
|
|
thread createeyefx( "right", self.origin + var_0 - var_1 + var_2 );
|
|
}
|
|
|
|
createeyefx( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
|
|
if ( var_0 == "left" )
|
|
{
|
|
self.lefteyeobj = spawn( "script_model", var_1 );
|
|
self.lefteyeobj setmodel( "tag_origin" );
|
|
self.lefteyeobj linkto( self );
|
|
self.lefteyeobj delayplayfxontag( level.zerosub_fx["beast"]["eyeglow"], "tag_origin", 0.05, 0.5 );
|
|
}
|
|
else
|
|
{
|
|
self.righteyeobj = spawn( "script_model", var_1 );
|
|
self.righteyeobj setmodel( "tag_origin" );
|
|
self.righteyeobj linkto( self );
|
|
self.righteyeobj delayplayfxontag( level.zerosub_fx["beast"]["eyeglow"], "tag_origin", 0.05, 0.5 );
|
|
}
|
|
}
|
|
|
|
watchbeastmovement()
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "frost_clear" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( !maps\mp\mp_zerosub::isoutside() )
|
|
{
|
|
if ( !level.beastallowedindoors )
|
|
{
|
|
var_0 = findspawnlocation( self.origin );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
self dodamage( 10000, self.origin );
|
|
wait 1;
|
|
level.zerosub_killstreak_user createsquadmate( var_0 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( self.environmentstate != "indoors" )
|
|
{
|
|
self.environmentstate = "indoors";
|
|
self stopsounds();
|
|
wait 0.3;
|
|
thread delaysoundfx( "zerosub_monster_breath_only_lp", 0.05 );
|
|
thread delaysoundfx( "zerosub_monster_steps_only_int_lp", 0.1 );
|
|
}
|
|
}
|
|
else if ( self.environmentstate != "outdoors" )
|
|
{
|
|
self.environmentstate = "outdoors";
|
|
self stopsounds();
|
|
wait 0.3;
|
|
thread delaysoundfx( "zerosub_monster_breath_only_lp", 0.05 );
|
|
thread delaysoundfx( "zerosub_monster_steps_only_ext_lp", 0.1 );
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
findspawnlocation( var_0 )
|
|
{
|
|
var_1 = undefined;
|
|
var_2 = common_scripts\utility::getstructarray( "zerosub_beast_spawn", "targetname" );
|
|
|
|
if ( !isdefined( var_2 ) || var_2.size == 0 )
|
|
return undefined;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_3 = undefined;
|
|
|
|
foreach ( var_5 in var_2 )
|
|
{
|
|
var_6 = distance2dsquared( var_0, var_5.origin );
|
|
|
|
if ( !isdefined( var_3 ) || var_3 < var_6 )
|
|
{
|
|
var_3 = var_6;
|
|
var_1 = var_5.origin;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var_8 = randomint( var_2.size );
|
|
var_1 = var_2[var_8].origin;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
watchkillstreakend()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
level waittill( "frost_clear" );
|
|
self dodamage( 10000, self.origin );
|
|
self.lefteyeobj delete();
|
|
self.righteyeobj delete();
|
|
}
|