boiii-scripts/shared/abilities/gadgets/_gadget_heat_wave.csc
2023-04-13 17:30:38 +02:00

232 lines
14 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\duplicaterender_mgr;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\postfx_shared;
#using scripts\shared\visionset_mgr_shared;
#using scripts\shared\abilities\_ability_player;
#using scripts\shared\abilities\_ability_power;
#using scripts\shared\abilities\_ability_util;
#using scripts\shared\_burnplayer;
// This does more traces accordingly.
#precache( "client_fx", "player/fx_plyr_heat_wave" );
#precache( "client_fx", "player/fx_plyr_heat_wave_1p" );
#precache( "client_fx", "player/fx_plyr_heat_wave_distortion_volume" );
#precache( "client_fx", "player/fx_plyr_heat_wave_distortion_volume_air" );
#precache( "client_tagfxset", "ability_hero_heat_wave_player_impact" );
function autoexec __init__sytem__() { system::register("gadget_heat_wave",&__init__,undefined,undefined); }
function __init__()
{
clientfield::register( "scriptmover", "heatwave_fx", 1, 1, "int", &set_heatwave_fx, !true, !true );
clientfield::register( "allplayers", "heatwave_victim", 1, 1, "int", &update_victim, !true, !true );
clientfield::register( "toplayer", "heatwave_activate", 1, 1, "int", &update_activate, !true, !true );
level.debug_heat_wave_traces = GetDvarInt( "scr_debug_heat_wave_traces", 0 );
visionset_mgr::register_visionset_info( "heatwave", 1, 16, undefined, "heatwave" );
visionset_mgr::register_visionset_info( "charred", 1, 16, undefined, "charred" );
/#
level thread updateDvars();
#/
}
/#
function updateDvars()
{
while(1)
{
level.debug_heat_wave_traces = GetDvarInt( "scr_debug_heat_wave_traces", level.debug_heat_wave_traces );
wait(1.0);
}
}
#/
function update_activate( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if( newVal )
{
self thread postfx::PlayPostfxBundle( "pstfx_heat_pulse" );
}
}
function update_victim( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if( newVal )
{
self endon( "entityshutdown" );
self util::waittill_dobj( localClientNum );
self PlayRumbleOnEntity( localClientNum, "heat_wave_damage" );
PlayTagFXSet( localClientNum, "ability_hero_heat_wave_player_impact", self );
}
}
function set_heatwave_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self clear_heat_wave_fx( localClientNum );
if( newVal )
{
self.heatWaveFx = [];
self thread aoe_fx( localClientNum );
}
}
function clear_heat_wave_fx( localClientNum )
{
if( !isDefined( self.heatWaveFx ) )
{
return;
}
foreach( fx in self.heatWaveFx )
{
StopFx( localClientNum, fx );
}
}
function aoe_fx( localClientNum )
{
self endon ( "entityshutdown" );
center = self.origin + ( 0, 0, 30 );
startPitch = -90;
yaw_count = [];
yaw_count[ 0 ] = 1;
yaw_count[ 1 ] = 4;
yaw_count[ 2 ] = 6;
yaw_count[ 3 ] = 8;
yaw_count[ 4 ] = 6;
yaw_count[ 5 ] = 4;
yaw_count[ 6 ] = 1;
pitch_vals = [];
pitch_vals[0] = 90;
pitch_vals[3] = 0;
pitch_vals[6] = -90;
trace = bullettrace( center, center + ( 0, 0, -1 ) * 400, false, self );
if ( trace["fraction"] < 1.0 )
{
pitch_vals[1] = 90 - atan( 150 / ( trace["fraction"] * 400 ) ); // evenly spaced 200 units away
pitch_vals[2] = 90 - atan( 300 / ( trace["fraction"] * 400 ) );
}
else
{
pitch_vals[1] = 60;
pitch_vals[2] = 30;
}
trace = bullettrace( center, center + ( 0, 0, 1 ) * 400, false, self );
if ( trace["fraction"] < 1.0 )
{
pitch_vals[5] = -90 + atan( 150 / ( trace["fraction"] * 400 ) ); // evenly spaced 200 units away
pitch_vals[4] = -90 + atan( 300 / ( trace["fraction"] * 400 ) );
}
else
{
pitch_vals[5] = -60;
pitch_vals[4] = -30;
}
currentPitch = startPitch;
for ( yaw_level = 0; yaw_level < yaw_count.size; yaw_level++ )
{
currentPitch = pitch_vals[yaw_level];
do_fx( localClientNum, center, yaw_count[yaw_level], currentPitch );
}
}
function do_fx( localClientNum, center, yaw_count, pitch )
{
currentYaw = RandomInt( 360 );
for( fxCount = 0; fxCount < yaw_count; fxCount++ )
{
randomOffsetPitch = RandomInt( 5 ) - 2.5;
randomOffsetYaw = RandomInt( 30 ) - 15;
angles = ( pitch + randomOffsetPitch, currentYaw + randomOffsetYaw, 0 );
traceDir = AnglesToForward( angles );
currentYaw += 360 / yaw_count;
fx_position = center + traceDir * 400;
trace = bullettrace( center, fx_position, false, self );
sphere_size = 5;
angles = ( 0, RandomInt( 360 ), 0 );
forward = AnglesToForward( angles );
if ( trace["fraction"] < 1.0 )
{
fx_position = center + traceDir * 400 * trace["fraction"];
/#
if( level.debug_heat_wave_traces )
{
Sphere( fx_position, sphere_size, ( 1, 0, 1 ), 1, true, 8, 300 );
Sphere( trace["position"], sphere_size, ( 1, 1, 0 ), 1, true, 8, 300 );
}
#/
normal = trace["normal"];
if ( LengthSquared( normal ) == 0 )
{
normal = -1 * traceDir;
}
right = ( normal[2] * -1, normal[1] * -1, normal[0] );
if( LengthSquared( VectorCross( forward, normal ) ) == 0 )
{
forward = VectorCross( right, forward );
}
self.heatWaveFx[self.heatWaveFx.size] = PlayFx( localClientNum, "player/fx_plyr_heat_wave_distortion_volume", trace["position"], normal, forward );
}
else
{
/#
if( level.debug_heat_wave_traces )
{
Line( fx_position + ( 0,0,50 ), fx_position - ( 0,0,50 ), ( 1, 0, 0 ), 1, false, 300 );
Sphere( fx_position, sphere_size, ( 1, 0, 1 ), 1, true, 8, 300 );
}
#/
if( LengthSquared( VectorCross( forward, traceDir * -1 ) ) == 0 )
{
forward = VectorCross( right, forward );
}
self.heatWaveFx[self.heatWaveFx.size] = PlayFx( localClientNum, "player/fx_plyr_heat_wave_distortion_volume_air", fx_position, traceDir * -1, forward );
}
if( fxCount % 2 )
{
{wait(.016);};
}
}
}