320 lines
8.2 KiB
Plaintext
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;
|
|
}
|
|
}
|