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

320 lines
8.2 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
spore_plant_init()
{
level.plant_warning_sent = 0;
level._effect["proj_spit_AOE"] = loadfx( "vfx/gameplay/alien/vfx_alien_fauna_gas" );
level._effect["spore_death_fx"] = loadfx( "vfx/gameplay/alien/vfx_alien_fauna_death" );
level._effect["spore_birth_fx"] = loadfx( "vfx/gameplay/alien/vfx_alien_seeder_spore_birth" );
scriptable_init();
}
scriptable_init()
{
level.alive_plants = [];
level.plants = getscriptablearray( "spore_plant_spawn", "targetname" );
foreach ( var_1 in level.plants )
var_1 thread scriptable_crate_spore_plant();
level thread run_plant_state_logic();
}
scriptable_crate_spore_plant()
{
self.plant_attacking = 0;
self setscriptablepartstate( 0, "inactive" );
self waittill( "grow_plant" );
self.trigger = spawn( "trigger_radius", self.origin, 0, 128, 128 );
wait 0.1;
self.elapsed_time = -1;
thread grow_then_idle();
thread run_plant_attack_on_damage_logic();
thread plant_radius_attack();
self.team = "axis";
self.alien_type = "spore_plant";
self.coll_model = spawn( "script_model", self.origin );
self.coll_model setmodel( "alien_spore_hitbox" );
self.coll_model.origin = self gettagorigin( "J_Spore_hitbox" );
self.coll_model.angles = self.angles;
self.coll_model.parent = self;
self.coll_model.team = self.team;
self.coll_model linkto( self, "J_Spore_hitbox" );
self.coll_model setcandamage( 1 );
self.coll_model setcanradiusdamage( 1 );
self.coll_model.alien_type = "seeder_spore";
level.alive_plants[level.alive_plants.size] = self;
level notify( "added_plant" );
}
remove_old_plants()
{
var_0 = 4;
if ( level.alive_plants.size > 8 )
{
var_1 = level.alive_plants.size - 8;
for ( var_2 = 0; var_2 < var_1; var_2++ )
{
var_3 = level.alive_plants[var_2];
if ( isdefined( var_3 ) )
{
level.alive_plants = common_scripts\utility::array_remove( level.alive_plants, var_3 );
var_3.plant_health = 0;
if ( isdefined( var_3.coll_model ) )
var_3.coll_model dodamage( 1, ( 0, 0, 0 ) );
}
wait 0.1;
}
}
}
run_plant_state_logic()
{
for (;;)
{
var_0 = 0;
level waittill( "drill_planted" );
var_1 = common_scripts\utility::get_array_of_closest( level.drill.origin, level.plants );
foreach ( var_3 in var_1 )
{
if ( distance2d( var_3.origin, level.drill.origin ) < 1024 )
{
if ( var_3 far_enough_from_players( 300 ) )
{
var_3 notify( "grow_plant" );
var_0++;
wait 1.25;
}
if ( var_0 >= get_num_to_spawn() )
break;
}
}
level thread remove_old_plants();
wait 0.1;
}
}
get_num_to_spawn()
{
var_0 = level.players.size;
switch ( var_0 )
{
case 1:
return 4;
case 2:
return 6;
case 3:
return 7;
case 4:
return 8;
default:
break;
}
return 0;
}
far_enough_from_players( var_0 )
{
var_1 = var_0 * var_0;
foreach ( var_3 in level.players )
{
if ( distance2dsquared( self.origin, var_3.origin ) < var_1 )
return 0;
}
return 1;
}
grow_then_idle()
{
self.plant_health = 100;
self setscriptablepartstate( 0, "grow" );
playfx( level._effect["spore_birth_fx"], self.origin, ( 0, 0, 1 ), ( 1, 0, 0 ) );
wait 3.0;
if ( self.plant_attacking != 1 && self.plant_health > 0 )
self setscriptablepartstate( 0, "idle" );
}
run_plant_attack_on_damage_logic()
{
while ( !isdefined( self.coll_model ) )
wait 0.1;
while ( self.plant_health > 0 )
{
self.coll_model waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( self.plant_health <= 0 )
continue;
if ( isdefined( var_1 ) && isdefined( var_1.team ) && var_1.team != self.team )
{
if ( isdefined( var_1 ) && isdefined( var_9 ) )
{
var_10 = var_1;
var_11 = "none";
var_12 = 0;
level thread maps\mp\alien\_challenge_function::update_alien_damage_challenge( var_10, var_1, var_0, var_8, var_4, var_9, var_3, var_2, var_11, var_12, self );
if ( weaponclass( var_9 ) == "spread" )
var_0 = var_0 * 4.0;
if ( var_9 == "aliensemtex_mp" && var_4 == "MOD_IMPACT" )
var_0 = 0;
}
self.plant_health = self.plant_health - var_0;
if ( self.gas_fx_playing == 0 )
thread plant_gas_fx();
if ( isdefined( var_1 ) && isplayer( var_1 ) )
{
var_1 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "standard" );
if ( self.plant_health <= 0 )
{
var_13 = 25;
maps\mp\alien\_gamescore::givekillreward( var_1, var_13, undefined, undefined );
}
}
}
wait 0.1;
}
thread stop_trigger_after_time( 3.0 );
self notify( "die" );
level.alive_plants = common_scripts\utility::array_remove( level.alive_plants, self );
playfx( level._effect["spore_death_fx"], self.origin, ( 1, 0, 0 ), ( 0, 0, 1 ) );
wait 0.1;
self setscriptablepartstate( 0, "remove" );
wait 0.1;
self.coll_model delete();
}
stop_trigger_after_time( var_0 )
{
self.gas_fx_playing = 1;
wait( var_0 );
self notify( "stop_trigger_logic" );
wait 0.1;
self.trigger delete();
}
plant_radius_attack()
{
self endon( "stop_trigger_logic" );
self.gassed_players = [];
self.gas_fx_playing = 0;
wait 1.0;
for (;;)
{
self.trigger waittill( "trigger", var_0 );
if ( !isplayer( var_0 ) )
continue;
if ( self.gas_fx_playing == 0 )
thread plant_gas_fx();
self.gassed_players = common_scripts\utility::array_removeundefined( self.gassed_players );
if ( is_in_array( self.gassed_players, var_0 ) )
continue;
thread gas_player( var_0 );
}
}
plant_gas_fx()
{
if ( self.plant_attacking == 0 )
thread plant_attack_anim();
self.gas_fx_playing = 1;
wait 3.0;
self.gas_fx_playing = 0;
}
plant_attack_anim()
{
self endon( "die" );
self setscriptablepartstate( 0, "idle_to_attack" );
self.plant_attacking = 1;
wait 1.0;
self setscriptablepartstate( 0, "attacking" );
wait 1.5;
self setscriptablepartstate( 0, "attack_to_idle" );
wait 1.0;
self setscriptablepartstate( 0, "idle" );
wait 2.0;
self.plant_attacking = 0;
}
is_in_array( var_0, var_1 )
{
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
{
if ( var_0[var_2] == var_1 )
return 1;
}
return 0;
}
gas_player( var_0 )
{
var_0 endon( "disconnect" );
if ( var_0 maps\mp\alien\_perk_utility::has_perk( "perk_medic", [ 3, 4 ] ) )
return;
if ( self.gas_fx_playing == 0 )
wait 2;
if ( isdefined( self.trigger ) && var_0 istouching( self.trigger ) )
{
self.gassed_players[self.gassed_players.size] = var_0;
thread gas_damage_player( var_0 );
var_0 visionsetpostapplyforplayer( "mp_alien_spore_plant", 1.0 );
var_0 playlocalsound( "spore_tinnitus" );
while ( isdefined( self.trigger ) && var_0 istouching( self.trigger ) && self.gas_fx_playing == 1 )
wait 0.1;
self.gassed_players = common_scripts\utility::array_remove( self.gassed_players, var_0 );
var_0 stoplocalsound( "spore_tinnitus" );
var_0 visionsetpostapplyforplayer( "", 1.0 );
}
}
gas_damage_player( var_0 )
{
var_0 endon( "disconnect" );
while ( is_in_array( self.gassed_players, var_0 ) )
{
if ( maps\mp\alien\_utility::is_casual_mode() )
var_0 dodamage( 2, self.origin, self, self );
else
var_0 dodamage( 1, self.origin, self, self );
wait 0.5;
}
}