412 lines
11 KiB
Plaintext
412 lines
11 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init()
|
|
{
|
|
level._effect["ghost_spawn"] = loadfx( "vfx/moments/mp_pirate/vfx_pirate_ghost_vapor" );
|
|
level._effect["ghost_trail"] = loadfx( "vfx/moments/mp_pirate/vfx_pirate_ghost_vapor_trail" );
|
|
level._effect["ghost_blink"] = loadfx( "vfx/moments/mp_pirate/vfx_ghost_power_drain" );
|
|
}
|
|
|
|
setupcallbacks()
|
|
{
|
|
level.agent_funcs["pirate"] = level.agent_funcs["squadmate"];
|
|
level.agent_funcs["pirate"]["spawn"] = ::spawn_agent_ghost;
|
|
level.agent_funcs["pirate"]["think"] = ::squadmate_agent_think;
|
|
level.agent_funcs["pirate"]["on_killed"] = ::on_agent_squadmate_killed;
|
|
}
|
|
|
|
customcratefunc()
|
|
{
|
|
if ( !isdefined( game["player_holding_level_killstrek"] ) )
|
|
game["player_holding_level_killstrek"] = 0;
|
|
|
|
if ( !maps\mp\_utility::allowlevelkillstreaks() || game["player_holding_level_killstrek"] )
|
|
return;
|
|
|
|
maps\mp\killstreaks\_airdrop::addcratetype( "airdrop_assault", "pirate_ghostcrew", 85, maps\mp\killstreaks\_airdrop::killstreakcratethink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), &"MP_PIRATE_GHOSTCREW_USE" );
|
|
level thread watchforcrateuse();
|
|
}
|
|
|
|
watchforcrateuse()
|
|
{
|
|
for (;;)
|
|
{
|
|
level waittill( "createAirDropCrate", var_0 );
|
|
|
|
if ( isdefined( var_0 ) && isdefined( var_0.cratetype ) && var_0.cratetype == "pirate_ghostcrew" )
|
|
{
|
|
maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", "pirate_ghostcrew", 0 );
|
|
var_1 = wait_for_capture( var_0 );
|
|
|
|
if ( !var_1 )
|
|
{
|
|
maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", "pirate_ghostcrew", 85 );
|
|
continue;
|
|
}
|
|
|
|
game["player_holding_level_killstrek"] = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
wait_for_capture( var_0 )
|
|
{
|
|
var_1 = watch_for_air_drop_death( var_0 );
|
|
return !isdefined( var_1 );
|
|
}
|
|
|
|
watch_for_air_drop_death( var_0 )
|
|
{
|
|
var_0 endon( "captured" );
|
|
var_0 waittill( "death" );
|
|
waittillframeend;
|
|
return 1;
|
|
}
|
|
|
|
customkillstreakfunc()
|
|
{
|
|
level.killstreakfuncs["pirate_ghostcrew"] = ::tryuseagentkillstreak;
|
|
level.killstreakweildweapons["pirate_agent_mp"] = "pirate_ghostcrew";
|
|
}
|
|
|
|
cusombotkillstreakfunc()
|
|
{
|
|
maps\mp\bots\_bots_ks::bot_register_killstreak_func( "pirate_ghostcrew", maps\mp\bots\_bots_ks::bot_killstreak_simple_use );
|
|
}
|
|
|
|
tryuseagentkillstreak( var_0, var_1 )
|
|
{
|
|
setupcallbacks();
|
|
self.ghostcount = 0;
|
|
|
|
if ( spawnghost() )
|
|
{
|
|
thread playghostmusic();
|
|
thread delayedspawnghost();
|
|
thread maps\mp\_utility::teamplayercardsplash( "used_" + var_1, self );
|
|
return 1;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
createsquadmate( var_0 )
|
|
{
|
|
if ( maps\mp\agents\_agent_utility::getnumactiveagents( "squadmate" ) >= 5 )
|
|
{
|
|
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
|
|
return undefined;
|
|
}
|
|
|
|
if ( maps\mp\agents\_agent_utility::getnumownedactiveagents( self ) >= 2 )
|
|
{
|
|
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
|
|
return undefined;
|
|
}
|
|
|
|
var_1 = maps\mp\agents\_agent_utility::getvalidspawnpathnodenearplayer( 0, 1 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
return undefined;
|
|
|
|
var_2 = var_1.origin;
|
|
var_3 = vectortoangles( self.origin - var_1.origin );
|
|
var_4 = maps\mp\agents\_agents::add_humanoid_agent( "pirate", self.team, "reconAgent", var_2, var_3, self, 0, 0, "veteran" );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
|
|
return 0;
|
|
}
|
|
|
|
var_4.killstreaktype = "agent";
|
|
return var_4;
|
|
}
|
|
|
|
spawn_agent_ghost( 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( 200 );
|
|
|
|
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\_utility::giveperk( "specialty_blindeye", 0 );
|
|
maps\mp\gametypes\_class::giveloadout( self.team, self.class, 1 );
|
|
var_12 = isdefined( self.owner ) && isdefined( self.owner.ghostcount ) && self.owner.ghostcount % 2 != 0;
|
|
customizesquadmate( var_12 );
|
|
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" );
|
|
}
|
|
|
|
squadmate_agent_think()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
|
|
if ( isdefined( self.owner ) )
|
|
self endon( "owner_disconnect" );
|
|
|
|
for (;;)
|
|
{
|
|
self botsetflag( "cautious", 1 );
|
|
var_0 = self [[ maps\mp\agents\_agent_utility::agentfunc( "gametype_update" ) ]]();
|
|
|
|
if ( !var_0 )
|
|
{
|
|
if ( !maps\mp\bots\_bots_util::bot_is_guarding_player( self.owner ) )
|
|
maps\mp\bots\_bots_strategy::bot_guard_player( self.owner, 350 );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
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 gettagorigin( "j_mainroot" );
|
|
var_10 = anglestoforward( self.angles );
|
|
var_11 = self getcorpseentity();
|
|
|
|
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 );
|
|
|
|
if ( isdefined( self.hat ) )
|
|
self.hat delete();
|
|
|
|
playfx( common_scripts\utility::getfx( "ghost_spawn" ), var_9, var_10 );
|
|
var_11 playsound( "pir_ghost_death" );
|
|
var_11 delete();
|
|
}
|
|
|
|
customizesquadmate( var_0 )
|
|
{
|
|
if ( var_0 )
|
|
self setmodel( "pirate_ghost_2" );
|
|
else
|
|
self setmodel( "pirate_ghost_1" );
|
|
|
|
if ( isdefined( self.headmodel ) )
|
|
{
|
|
self detach( self.headmodel, "" );
|
|
self.headmodel = undefined;
|
|
}
|
|
|
|
self playsound( "pir_ghost_reappear" );
|
|
var_1 = self gettagorigin( "j_mainroot" );
|
|
playfx( common_scripts\utility::getfx( "ghost_spawn" ), var_1, anglestoforward( self.angles ) );
|
|
thread playtrailfx();
|
|
self takeallweapons();
|
|
|
|
if ( var_0 )
|
|
{
|
|
self giveweapon( "iw6_piratehook_mp" );
|
|
self switchtoweapon( "iw6_piratehook_mp" );
|
|
self botsetflag( "prefer_melee", 1 );
|
|
}
|
|
else
|
|
{
|
|
self giveweapon( "iw6_pirategun_mp_akimbo" );
|
|
self switchtoweapon( "iw6_pirategun_mp_akimbo" );
|
|
}
|
|
|
|
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 );
|
|
givehat();
|
|
self.health = 300;
|
|
self setsurfacetype( "snow" );
|
|
maps\mp\gametypes\_battlechatter_mp::disablebattlechatter( self );
|
|
thread watchblink2();
|
|
thread ghostplayvo( self.owner.ghostcount );
|
|
}
|
|
|
|
givehat()
|
|
{
|
|
var_0 = spawn( "script_model", self.origin );
|
|
var_0 setmodel( "pirate_hat_iw6_ghost" );
|
|
var_0 linkto( self, "j_head", ( 4, 0, 0 ), ( 90, 0, 0 ) );
|
|
self.hat = var_0;
|
|
}
|
|
|
|
playtrailfx()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
wait 0.25;
|
|
playfxontag( common_scripts\utility::getfx( "ghost_trail" ), self, "j_mainroot" );
|
|
}
|
|
|
|
playghostmusic()
|
|
{
|
|
playsoundatpos( ( 878.641, 1408.98, 203 ), "mus_drunk_sailor" );
|
|
}
|
|
|
|
spawnghost()
|
|
{
|
|
var_0 = createsquadmate( self );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
self.ghostcount++;
|
|
|
|
if ( self.ghostcount >= 10 )
|
|
level notify( "ghost_end" );
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
delayedspawnghost()
|
|
{
|
|
wait 0.5;
|
|
spawnghost();
|
|
}
|
|
|
|
ghostcloak()
|
|
{
|
|
self.iscloaked = 1;
|
|
var_0 = self gettagorigin( "j_mainroot" );
|
|
playfx( common_scripts\utility::getfx( "ghost_blink" ), var_0, anglestoforward( self.angles ) );
|
|
self playsound( "pir_ghost_disappear" );
|
|
self.oldmodel = self.model;
|
|
self setmodel( self.oldmodel + "_cloak" );
|
|
self.hat setmodel( "pirate_hat_iw6_ghost_cloak" );
|
|
}
|
|
|
|
ghostuncloak()
|
|
{
|
|
var_0 = self gettagorigin( "j_mainroot" );
|
|
playfx( common_scripts\utility::getfx( "ghost_blink" ), var_0, anglestoforward( self.angles ) );
|
|
self playsound( "pir_ghost_reappear" );
|
|
self setmodel( self.oldmodel );
|
|
self.hat setmodel( "pirate_hat_iw6_ghost" );
|
|
self.iscloaked = undefined;
|
|
}
|
|
|
|
watchblink2()
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage" );
|
|
|
|
if ( !isdefined( self.iscloaked ) )
|
|
ghostcloak();
|
|
|
|
thread ghostwaitforuncloak();
|
|
}
|
|
}
|
|
|
|
ghostwaitforuncloak()
|
|
{
|
|
self notify( "ghostDamageTimer" );
|
|
self endon( "ghostDamageTimer" );
|
|
self endon( "death" );
|
|
wait 4.0;
|
|
ghostuncloak();
|
|
}
|
|
|
|
ghostplayvo( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
var_1 = [ "mp_pirate_prt1_ghost", "mp_pirate_prt2_ghost", "mp_pirate_cpt_ghost" ];
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = randomint( 0, var_1.size );
|
|
else
|
|
var_0 = var_0 % var_1.size;
|
|
|
|
var_2 = var_1[var_0];
|
|
self.owner.ghostvotimestamp = gettime() + 1000;
|
|
|
|
while ( isdefined( self.owner ) )
|
|
{
|
|
self.owner waittill( "killed_enemy", var_3, var_4, var_5 );
|
|
|
|
if ( var_4 == "pirate_agent_mp" && gettime() > self.owner.ghostvotimestamp )
|
|
{
|
|
self.owner.ghostvotimestamp = gettime() + 2000;
|
|
self playsound( var_2 );
|
|
}
|
|
}
|
|
}
|