Files
IL-GSC/BO1/PC/ZM/clientscripts/_mortar.csc
2024-02-18 17:32:07 -05:00

519 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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