304 lines
17 KiB
Plaintext
304 lines
17 KiB
Plaintext
#using scripts\codescripts\struct;
|
|
|
|
#using scripts\shared\clientfield_shared;
|
|
#using scripts\shared\math_shared;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\util_shared;
|
|
#using scripts\shared\vehicle_shared;
|
|
#using scripts\shared\vehicles\_driving_fx;
|
|
|
|
|
|
|
|
|
|
|
|
#using scripts\mp\_callbacks;
|
|
#using scripts\mp\_util;
|
|
#using scripts\mp\_vehicle;
|
|
|
|
// _rcbomb.csc
|
|
// Sets up clientside behavior for the rcbomb
|
|
|
|
#precache( "client_fx", "killstreaks/fx_rcxd_lights_blinky" );
|
|
#precache( "client_fx", "killstreaks/fx_rcxd_lights_solid" );
|
|
#precache( "client_fx", "killstreaks/fx_rcxd_lights_red" );
|
|
#precache( "client_fx", "killstreaks/fx_rcxd_lights_grn" );
|
|
#precache( "client_fx", "_t6/weapon/grenade/fx_spark_disabled_rc_car" );
|
|
|
|
#namespace rcbomb;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function autoexec __init__sytem__() { system::register("rcbomb",&__init__,undefined,undefined); }
|
|
|
|
function __init__()
|
|
{
|
|
level._effect["rcbomb_enemy_light"] = "killstreaks/fx_rcxd_lights_blinky";
|
|
level._effect["rcbomb_friendly_light"] = "killstreaks/fx_rcxd_lights_solid";
|
|
level._effect["rcbomb_enemy_light_blink"] = "killstreaks/fx_rcxd_lights_red";
|
|
level._effect["rcbomb_friendly_light_blink"] = "killstreaks/fx_rcxd_lights_grn";
|
|
level._effect["rcbomb_stunned"] = "_t6/weapon/grenade/fx_spark_disabled_rc_car";
|
|
|
|
level.rcBombBundle = struct::get_script_bundle( "killstreak", "killstreak_rcbomb" );
|
|
|
|
// vehicle flags
|
|
clientfield::register( "vehicle", "rcbomb_stunned", 1, 1, "int", &callback::callback_stunned, !true, !true );
|
|
|
|
vehicle::add_vehicletype_callback( "rc_car_mp",&spawned );
|
|
}
|
|
|
|
function spawned(localClientNum)
|
|
{
|
|
self thread demo_think( localClientNum );
|
|
self thread stunnedHandler(localClientNum);
|
|
self thread boost_think( localClientNum );
|
|
self thread shutdown_think( localClientNum );
|
|
|
|
self.driving_fx_collision_override = &OnDrivingFxCollision;
|
|
self.driving_fx_jump_landing_override = &OnDrivingFxJumpLanding;
|
|
|
|
self.killstreakBundle = level.rcBombBundle;
|
|
}
|
|
|
|
function demo_think( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
if ( !IsDemoPlaying() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
for ( ;; )
|
|
{
|
|
level util::waittill_any( "demo_jump", "demo_player_switch" );
|
|
self vehicle::lights_off( localClientNum );
|
|
}
|
|
}
|
|
|
|
function boost_blur( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
if ( isdefined( self.owner ) && self.owner isLocalPlayer() )
|
|
{
|
|
EnableSpeedBlur( localClientNum, GetDvarFloat( "scr_rcbomb_amount", 0.1 ), GetDvarFloat( "scr_rcbomb_inner_radius", 0.5 ), GetDvarFloat( "scr_rcbomb_outer_radius", 0.75 ), false, 0 );
|
|
|
|
wait( GetDvarFloat( "scr_rcbomb_duration", 1.0 ) );
|
|
|
|
DisableSpeedBlur( localClientNum );
|
|
}
|
|
}
|
|
|
|
function boost_think( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
for ( ;; )
|
|
{
|
|
self waittill( "veh_boost" );
|
|
self boost_blur( localClientNum );
|
|
}
|
|
}
|
|
|
|
function shutdown_think( localClientNum )
|
|
{
|
|
self waittill( "entityshutdown" );
|
|
DisableSpeedBlur( localClientNum );
|
|
}
|
|
|
|
function play_screen_fx_dirt(localClientNum)
|
|
{
|
|
// support for this has been removed with the .menu system
|
|
/*
|
|
pick_one = RandomIntRange(0,4);
|
|
if ( pick_one == 0 )
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dirt", "dirt", "in", 0 );
|
|
}
|
|
else if ( pick_one == 1 )
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dirt", "dirt_right_splash", "in", 0 );
|
|
}
|
|
else if ( pick_one == 2 )
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dirt", "dirt_left_splash", "in", 0 );
|
|
}
|
|
else
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dirt", "blurred_dirt_random", "in", 0 );
|
|
}
|
|
*/
|
|
}
|
|
|
|
function play_screen_fx_dust(localClientNum)
|
|
{
|
|
// support for this has been removed with the .menu system
|
|
/*
|
|
pick_one = RandomIntRange(0,4);
|
|
if ( pick_one == 0 )
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dust", "dust", "in", 0 );
|
|
}
|
|
else if ( pick_one == 1 )
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dust", "dust_right_splash", "in", 0 );
|
|
}
|
|
else if ( pick_one == 2 )
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dust", "dust_left_splash", "in", 0 );
|
|
}
|
|
else
|
|
{
|
|
AnimateUI( localClientNum, "fullscreen_dust", "blurred_dust_random", "in", 0 );
|
|
}
|
|
*/
|
|
}
|
|
|
|
function play_driving_screen_fx( localClientNum )
|
|
{
|
|
speed_fraction = 0;
|
|
|
|
while(1)
|
|
{
|
|
speed = self getspeed();
|
|
maxspeed = self getmaxspeed();
|
|
|
|
if ( speed < 0 )
|
|
{
|
|
maxspeed = self getmaxreversespeed();
|
|
}
|
|
|
|
if ( maxspeed > 0 )
|
|
{
|
|
speed_fraction = Abs(speed) / maxspeed;
|
|
}
|
|
else
|
|
{
|
|
speed_fraction = 0;
|
|
}
|
|
if ( self iswheelcolliding( "back_left" ) || self iswheelcolliding( "back_right" ) )
|
|
{
|
|
// probably need to fix this to work on spectators
|
|
if ( self IsLocalClientDriver( localClientNum ) )
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function play_boost_fx( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
while( 1 )
|
|
{
|
|
speed = self GetSpeed();
|
|
|
|
if ( speed > 400 )
|
|
{
|
|
self PlaySound( localClientNum, "mpl_veh_rc_boost" );
|
|
return;
|
|
}
|
|
|
|
util::server_wait( localClientNum, 0.1 );
|
|
}
|
|
}
|
|
|
|
function stunnedHandler( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
self thread engineStutterHandler( localClientNum );
|
|
|
|
while( 1 )
|
|
{
|
|
self waittill( "stunned" );
|
|
///#
|
|
// PrintLn( "CLIENT ***************** stunned" );
|
|
//#/
|
|
|
|
self setstunned( true );
|
|
|
|
self thread notStunnedHandler( localClientNum );
|
|
|
|
self thread play_stunned_fx_handler( localClientNum );
|
|
}
|
|
}
|
|
|
|
function notStunnedHandler( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
self endon( "stunned" );
|
|
|
|
self waittill( "not_stunned" );
|
|
///#
|
|
// PrintLn( "CLIENT ***************** not stunned" );
|
|
//#/
|
|
|
|
self setstunned( false );
|
|
}
|
|
|
|
function play_stunned_fx_handler( localClientNum ) // self == rc car
|
|
{
|
|
self endon( "entityshutdown" );
|
|
self endon( "stunned" );
|
|
self endon( "not_stunned" );
|
|
|
|
// we need this so we can continue to play fx if being stunned by the jammer
|
|
while( true )
|
|
{
|
|
playfxontag( localClientNum, level._effect["rcbomb_stunned"], self, "tag_origin" );
|
|
wait( 0.5 );
|
|
}
|
|
}
|
|
|
|
function engineStutterHandler( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
while( 1 )
|
|
{
|
|
self waittill( "veh_engine_stutter" );
|
|
if ( self IsLocalClientDriver( localClientNum ) )
|
|
{
|
|
player = getlocalplayer( localClientNum );
|
|
|
|
if( isdefined( player ) )
|
|
{
|
|
player PlayRumbleOnEntity( localClientNum, "rcbomb_engine_stutter" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function OnDrivingFxCollision( localClientNum, player, hip, hitn, hit_intensity )
|
|
{
|
|
if( isdefined( hit_intensity ) && hit_intensity > 15 )
|
|
{
|
|
volume = driving_fx::get_impact_vol_from_speed();
|
|
|
|
if (isdefined (self.sounddef))
|
|
{
|
|
alias = self.sounddef + "_suspension_lg_hd";
|
|
}
|
|
else
|
|
{
|
|
alias = "veh_default_suspension_lg_hd";
|
|
}
|
|
|
|
id = PlaySound( 0, alias, self.origin, volume);
|
|
player Earthquake( 0.7, 0.25, player.origin, 1500 );
|
|
player PlayRumbleOnEntity( localClientNum, "damage_heavy" );
|
|
}
|
|
}
|
|
|
|
function OnDrivingFxJumpLanding( localClientNum, player )
|
|
{
|
|
// do nothing for now
|
|
}
|
|
|
|
|