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

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