mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-10 10:27:55 -05:00
519 lines
14 KiB
Plaintext
519 lines
14 KiB
Plaintext
#include clientscripts\_utility;
|
||
main()
|
||
{
|
||
}
|
||
init_mortars()
|
||
{
|
||
level._explosion_max_range = [];
|
||
level._explosion_min_range = [];
|
||
level._explosion_blast_radius = [];
|
||
level._explosion_quake_power = [];
|
||
level._explosion_quake_time = [];
|
||
level._explosion_quake_radius = [];
|
||
level._explosion_min_delay = [];
|
||
level._explosion_max_delay = [];
|
||
level._explosion_barrage_min_delay = [];
|
||
level._explosion_barrage_max_delay = [];
|
||
level._explosion_view_chance = [];
|
||
level._explosion_dust_range = [];
|
||
level._explosion_dust_name = [];
|
||
}
|
||
set_mortar_dust( mortar_name, dust_name, range )
|
||
{
|
||
if( !IsDefined( level._explosion_dust_range ) )
|
||
{
|
||
init_mortars();
|
||
}
|
||
level._explosion_dust_name[mortar_name] = dust_name;
|
||
if( !IsDefined( range ) )
|
||
{
|
||
range = 512;
|
||
}
|
||
level._explosion_dust_range[mortar_name] = range;
|
||
}
|
||
set_mortar_quake( mortar_name, quake_power, quake_time, quake_radius, set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_quake_power ) )
|
||
{
|
||
init_mortars();
|
||
}
|
||
if( IsDefined( set_default ) && set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_quake_power[mortar_name] ) )
|
||
{
|
||
level._explosion_quake_power[mortar_name] = quake_power;
|
||
}
|
||
if( !IsDefined( level._explosion_quake_power[mortar_name] ) )
|
||
{
|
||
level._explosion_quake_time[mortar_name] = quake_time;
|
||
}
|
||
if( !IsDefined( level._explosion_quake_radius[mortar_name] ) )
|
||
{
|
||
level._explosion_quake_radius[mortar_name] = quake_radius;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
level._explosion_quake_power[mortar_name] = quake_power;
|
||
level._explosion_quake_time[mortar_name] = quake_time;
|
||
level._explosion_quake_radius[mortar_name] = quake_radius;
|
||
}
|
||
}
|
||
set_mortar_range( mortar_name, min_range, max_range, set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_min_range ) )
|
||
{
|
||
init_mortars();
|
||
}
|
||
if( IsDefined( set_default ) && set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_min_range[mortar_name] ) )
|
||
{
|
||
level._explosion_min_range[mortar_name] = min_range;
|
||
}
|
||
if( !IsDefined( level._explosion_max_range[mortar_name] ) )
|
||
{
|
||
level._explosion_max_range[mortar_name] = max_range;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
level._explosion_min_range[mortar_name] = min_range;
|
||
level._explosion_max_range[mortar_name] = max_range;
|
||
}
|
||
}
|
||
set_mortar_delays( mortar_name, min_delay, max_delay, barrage_min_delay, barrage_max_delay, set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_min_delay ) )
|
||
{
|
||
init_mortars();
|
||
}
|
||
if( IsDefined( set_default ) && set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_min_delay[mortar_name] ) && IsDefined( min_delay ) )
|
||
{
|
||
level._explosion_min_delay[mortar_name] = min_delay;
|
||
}
|
||
if( !IsDefined( level._explosion_max_delay[mortar_name] ) && IsDefined( min_delay ) )
|
||
{
|
||
level._explosion_max_delay[mortar_name] = max_delay;
|
||
}
|
||
if( !IsDefined( level._explosion_barrage_min_delay[mortar_name] ) && IsDefined( barrage_min_delay ) )
|
||
{
|
||
level._explosion_barrage_min_delay[mortar_name] = barrage_min_delay;
|
||
}
|
||
if( !IsDefined( level._explosion_barrage_max_delay[mortar_name] ) && IsDefined( barrage_max_delay ) )
|
||
{
|
||
level._explosion_barrage_max_delay[mortar_name] = barrage_max_delay;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( IsDefined( min_delay ) )
|
||
{
|
||
level._explosion_min_delay[mortar_name] = min_delay;
|
||
}
|
||
if( IsDefined( min_delay ) )
|
||
{
|
||
level._explosion_max_delay[mortar_name] = max_delay;
|
||
}
|
||
if( IsDefined( barrage_min_delay ) )
|
||
{
|
||
level._explosion_barrage_min_delay[mortar_name] = barrage_min_delay;
|
||
}
|
||
if( IsDefined( barrage_max_delay ) )
|
||
{
|
||
level._explosion_barrage_max_delay[mortar_name] = barrage_max_delay;
|
||
}
|
||
}
|
||
}
|
||
set_mortar_chance( mortar_name, chance, set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_view_chance ) )
|
||
{
|
||
init_mortars();
|
||
}
|
||
assertex( chance <= 1, "_mortar::set_mortar_chance(), the chance parameter needs to be between 0 and 1" );
|
||
if( IsDefined( set_default ) && set_default )
|
||
{
|
||
if( !IsDefined( level._explosion_view_chance[mortar_name] ) )
|
||
{
|
||
level._explosion_view_chance[mortar_name] = chance;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
level._explosion_view_chance[mortar_name] = chance;
|
||
}
|
||
}
|
||
player_view_chance( view_chance, explosion_point )
|
||
{
|
||
chance = RandomFloat( 1 );
|
||
if( chance <= view_chance )
|
||
{
|
||
if( within_fov( self GetEye(), self GetPlayerAngles(), explosion_point, cos( 30 ) ) )
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
explosion_incoming( mortar_name, pos, soundnum )
|
||
{
|
||
if( !IsDefined( level._explosion_last_incoming ) )
|
||
{
|
||
level._explosion_last_incoming = -1;
|
||
}
|
||
soundnum = RandomInt( 4 ) + 1;
|
||
while( soundnum == level._explosion_last_incoming )
|
||
{
|
||
soundnum = RandomInt( 4 ) + 1;
|
||
}
|
||
level._explosion_last_incoming = soundnum;
|
||
if( level._effectType[mortar_name] == "mortar" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_incoming1", pos );
|
||
wait( 1.07 - 0.25 );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_incoming2", pos );
|
||
wait( 0.67 - 0.25 );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_incoming3", pos );
|
||
wait( 1.55 - 0.25 );
|
||
break;
|
||
default:
|
||
wait( 1.75 );
|
||
break;
|
||
}
|
||
}
|
||
else if( level._effectType[mortar_name] == "artillery" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_incoming4", pos );
|
||
wait( 1.07 - 0.25 );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_incoming4_new", pos );
|
||
wait( 0.67 - 0.25 );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_incoming1_new", pos );
|
||
wait( 1.55 - 0.25 );
|
||
break;
|
||
default:
|
||
wait( 1.75 );
|
||
break;
|
||
}
|
||
}
|
||
else if( level._effectType[mortar_name] == "bomb" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_incoming2_new", pos );
|
||
wait( 1.75 );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_incoming3_new", pos );
|
||
wait( 1.75 );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_incoming4_new", pos );
|
||
wait( 1.75 );
|
||
break;
|
||
default:
|
||
wait( 1.75 );
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
explosion_boom( mortar_name, explosion_origin, power, time, radius )
|
||
{
|
||
if( !IsDefined( power ) )
|
||
{
|
||
power = 0.15;
|
||
}
|
||
if( !IsDefined( time ) )
|
||
{
|
||
time = 2;
|
||
}
|
||
if( !IsDefined( radius ) )
|
||
{
|
||
radius = 850;
|
||
}
|
||
explosion_sound( mortar_name, explosion_origin );
|
||
PlayFx( 0, level._effect[mortar_name], explosion_origin );
|
||
localPlayers = getlocalplayers();
|
||
for(i = 0; i < localPlayers.size; i ++)
|
||
{
|
||
localPlayers[i] Earthquake( power, time, explosion_origin, radius );
|
||
}
|
||
}
|
||
explosion_sound( mortar_name, pos )
|
||
{
|
||
if( !IsDefined( level._explosion_last_sound ) )
|
||
{
|
||
level._explosion_last_sound = 0;
|
||
}
|
||
soundnum = RandomInt( 3 ) + 1;
|
||
while( soundnum == level._explosion_last_sound )
|
||
{
|
||
soundnum = RandomInt( 3 ) + 1;
|
||
}
|
||
level._explosion_last_sound = soundnum;
|
||
if( level._effectType[mortar_name] == "mortar" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_dirt", pos );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_dirt", pos );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_dirt", pos );
|
||
break;
|
||
}
|
||
}
|
||
if( level._effectType[mortar_name] == "mortar_water" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_water", pos );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_water", pos );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_water", pos );
|
||
break;
|
||
}
|
||
}
|
||
else if( level._effectType[mortar_name] == "artillery" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_explosion4", pos );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_explosion5", pos );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_explosion1", pos );
|
||
break;
|
||
}
|
||
}
|
||
else if( level._effectType[mortar_name] == "bomb" )
|
||
{
|
||
switch( soundnum )
|
||
{
|
||
case 1:
|
||
PlaySound( 0, "mortar_explosion1", pos );
|
||
break;
|
||
case 2:
|
||
PlaySound( 0, "mortar_explosion4", pos );
|
||
break;
|
||
case 3:
|
||
PlaySound( 0, "mortar_explosion5", pos );
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
explosion_activate( mortar_name, blast_radius, min_damage, max_damage, quake_power, quake_time, quake_radius, dust_points )
|
||
{
|
||
set_mortar_quake( mortar_name, 0.15, 2, 850, true );
|
||
if( !IsDefined( blast_radius ) )
|
||
{
|
||
blast_radius = level._explosion_blast_radius[mortar_name];
|
||
}
|
||
if( !IsDefined( quake_power ) )
|
||
{
|
||
quake_power = level._explosion_quake_power[mortar_name];
|
||
}
|
||
if( !IsDefined( quake_time ) )
|
||
{
|
||
quake_time = level._explosion_quake_time[mortar_name];
|
||
}
|
||
if( !IsDefined( quake_radius ) )
|
||
{
|
||
quake_radius = level._explosion_quake_radius[mortar_name];
|
||
}
|
||
explosion_incoming( mortar_name, self.origin );
|
||
level notify( "explosion", mortar_name );
|
||
explosion_boom( mortar_name, self.origin, quake_power, quake_time, quake_radius );
|
||
if( IsDefined( dust_points ) && dust_points.size > 0 )
|
||
{
|
||
max_range = 384;
|
||
if( IsDefined( level._explosion_dust_range ) && IsDefined( level._explosion_dust_range[mortar_name] ) )
|
||
{
|
||
max_range = level._explosion_dust_range[mortar_name];
|
||
}
|
||
for( i = 0; i < dust_points.size; i++ )
|
||
{
|
||
if( DistanceSquared( dust_points[i].origin, self.origin ) < max_range * max_range )
|
||
{
|
||
if( IsDefined( dust_points[i].script_fxid ) )
|
||
{
|
||
PlayFx( 0, level._effect[dust_points[i].script_fxid], dust_points[i].origin );
|
||
}
|
||
else
|
||
{
|
||
PlayFx( 0, level._effect[level._explosion_dust_name[mortar_name]], dust_points[i].origin );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
mortar_loop( mortar_name, barrage_amount, no_terrain )
|
||
{
|
||
level endon( "stop_all_mortar_loops" );
|
||
assertex( ( IsDefined( mortar_name ) &&( mortar_name != "" ) ), "mortar_name not passed. pass in level script" );
|
||
assertex( ( IsDefined( level._effect ) && IsDefined( level._effect[mortar_name] ) ), "level._effect[strMortars] not defined. define in level script" );
|
||
last_explosion = -1;
|
||
set_mortar_range( mortar_name, 300, 2200, true );
|
||
set_mortar_delays( mortar_name, 5, 7, 5, 7, true );
|
||
set_mortar_chance( mortar_name, 0, true );
|
||
if( !IsDefined( barrage_amount ) || barrage_amount < 1 )
|
||
{
|
||
barrage_amount = 1;
|
||
}
|
||
if( !IsDefined( no_terrain ) )
|
||
{
|
||
no_terrain = false;
|
||
}
|
||
if( IsDefined( level._explosion_stopNotify ) && IsDefined( level._explosion_stopNotify[mortar_name] ) )
|
||
{
|
||
level endon( level._explosion_stopNotify[mortar_name] );
|
||
}
|
||
if( !IsDefined( level._explosion_stop_barrage ) || !IsDefined( level._explosion_stop_barrage[mortar_name] ) )
|
||
{
|
||
level._explosion_stop_barrage[mortar_name] = false;
|
||
}
|
||
explosion_points = [];
|
||
explosion_points_structs = [];
|
||
num_points = 0;
|
||
while(num_points == 0)
|
||
{
|
||
explosion_points = GetEntArray( 0, mortar_name, "targetname" );
|
||
explosion_points_structs = getstructarray( mortar_name, "targetname" );
|
||
num_points = explosion_points.size + explosion_points_structs.size;
|
||
wait(0.5);
|
||
}
|
||
for( i = 0; i < explosion_points_structs.size; i++ )
|
||
{
|
||
explosion_points_structs[i].is_struct = true;
|
||
explosion_points = add_to_array( explosion_points, explosion_points_structs[i] );
|
||
}
|
||
explosion_points_structs = [];
|
||
dust_points = [];
|
||
if( IsDefined( level._explosion_dust_name[mortar_name] ) )
|
||
{
|
||
dust_name = level._explosion_dust_name[mortar_name];
|
||
dust_points = GetEntArray( 0, dust_name, "targetname" );
|
||
dust_points_structs = [];
|
||
dust_points_structs = getstructarray( dust_name, "targetname" );
|
||
for( i = 0; i < dust_points_structs.size; i++ )
|
||
{
|
||
dust_points_structs[i].is_struct = true;
|
||
dust_points = add_to_array( dust_points, dust_points_structs[i] );
|
||
}
|
||
dust_points_structs = [];
|
||
}
|
||
if( IsDefined( level._explosion_start_notify ) && IsDefined( level._explosion_start_notify[mortar_name] ) )
|
||
{
|
||
level waittill( level._explosion_start_notify[mortar_name] );
|
||
}
|
||
while( true )
|
||
{
|
||
while( !level._explosion_stop_barrage[mortar_name] )
|
||
{
|
||
do_mortar = false;
|
||
for( j = 0; j < barrage_amount; j++ )
|
||
{
|
||
max_rangeSQ = level._explosion_max_range[mortar_name] * level._explosion_max_range[mortar_name];
|
||
min_rangeSQ = level._explosion_min_range[mortar_name] * level._explosion_min_range[mortar_name];
|
||
random_num = RandomInt( explosion_points.size );
|
||
for( i = 0; i < explosion_points.size; i++ )
|
||
{
|
||
num = ( i + random_num ) % explosion_points.size;
|
||
do_mortar = false;
|
||
players = getlocalplayers();
|
||
for( q = 0; q < players.size; q++ )
|
||
{
|
||
dist = DistanceSquared( players[q] GetOrigin(), explosion_points[num].origin );
|
||
if( num != last_explosion && dist < max_rangeSQ && dist > min_rangeSQ )
|
||
{
|
||
if( level._explosion_view_chance[mortar_name] > 0 )
|
||
{
|
||
if( players[q] player_view_chance( level._explosion_view_chance[mortar_name], explosion_points[num].origin ) )
|
||
{
|
||
do_mortar = true;
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
do_mortar = false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
do_mortar = true;
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
do_mortar = false;
|
||
}
|
||
}
|
||
if( do_mortar )
|
||
{
|
||
explosion_points[num] thread explosion_activate( mortar_name, undefined, undefined, undefined, undefined, undefined, undefined, dust_points );
|
||
last_explosion = num;
|
||
break;
|
||
}
|
||
}
|
||
last_explosion = -1;
|
||
if( do_mortar )
|
||
{
|
||
if( IsDefined( level._explosion_delay ) && IsDefined( level._explosion_delay[mortar_name] ) )
|
||
{
|
||
wait( level._explosion_delay[mortar_name] );
|
||
}
|
||
else
|
||
{
|
||
wait( RandomFloatRange( level._explosion_min_delay[mortar_name], level._explosion_max_delay[mortar_name] ) );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
j--;
|
||
wait( 0.25 );
|
||
}
|
||
}
|
||
if( barrage_amount > 1 )
|
||
{
|
||
if( IsDefined( level._explosion_barrage_delay ) && IsDefined( level._explosion_barrage_delay[mortar_name] ) )
|
||
{
|
||
wait( level._explosion_barrage_delay[mortar_name] );
|
||
}
|
||
else
|
||
{
|
||
wait( RandomFloatRange( level._explosion_barrage_min_delay[mortar_name], level._explosion_barrage_max_delay[mortar_name] ) );
|
||
}
|
||
}
|
||
}
|
||
wait( 0.05 );
|
||
}
|
||
}
|
||
|
||
|