291 lines
15 KiB
Plaintext
291 lines
15 KiB
Plaintext
#using scripts\shared\callbacks_shared;
|
|
#using scripts\shared\clientfield_shared;
|
|
#using scripts\shared\flag_shared;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\util_shared;
|
|
#using scripts\shared\weapons\_tacticalinsertion;
|
|
|
|
|
|
|
|
|
|
|
|
#using scripts\mp\gametypes\_spawnlogic;
|
|
|
|
|
|
#using scripts\mp\_util;
|
|
#using scripts\mp\killstreaks\_airsupport;
|
|
|
|
#namespace spawning;
|
|
|
|
function autoexec __init__sytem__() { system::register("perks",&__init__,undefined,undefined); }
|
|
|
|
function __init__()
|
|
{
|
|
clientfield::register( "allplayers", "flying", 1, 1, "int" );
|
|
|
|
callback::on_connect( &on_player_connect );
|
|
callback::on_spawned( &on_player_spawned );
|
|
}
|
|
|
|
function on_player_connect( local_client_num )
|
|
{
|
|
}
|
|
|
|
function on_player_spawned( local_client_num )
|
|
{
|
|
self thread monitorGPSJammer();
|
|
self thread monitorSenGrenJammer();
|
|
self thread monitorFlight();
|
|
}
|
|
|
|
function monitorFlight()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
self.flying = false;
|
|
while( IsDefined(self) )
|
|
{
|
|
flying = !( self isOnGround() );
|
|
if ( self.flying != flying )
|
|
{
|
|
self clientfield::set("flying",flying);
|
|
self.flying = flying;
|
|
}
|
|
|
|
{wait(.05);};
|
|
}
|
|
}
|
|
|
|
function monitorGPSJammer()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
|
|
require_perk = true;
|
|
/#
|
|
require_perk = false;
|
|
#/
|
|
|
|
if ( require_perk && self HasPerk( "specialty_gpsjammer" ) == false )
|
|
return;
|
|
|
|
self clientfield::set( "gps_jammer_active", ( self HasPerk( "specialty_gpsjammer" ) ? 1 : 0 ) );
|
|
gracePeriods = GetDvarInt( "perk_gpsjammer_graceperiods", 4 );
|
|
minspeed = GetDvarInt( "perk_gpsjammer_min_speed", 100 );
|
|
mindistance = GetDvarInt( "perk_gpsjammer_min_distance", 10 );
|
|
timePeriod = GetDvarInt( "perk_gpsjammer_time_period", 200 );
|
|
timePeriodSec = timePeriod/1000;
|
|
minspeedSq = minspeed * minspeed;
|
|
mindistanceSq = mindistance * mindistance;
|
|
|
|
if ( minspeedSq == 0 ) // will never fail min speed check below so early out.
|
|
return;
|
|
|
|
assert ( timePeriodSec >= 0.05 );
|
|
if ( timePeriodSec < 0.05 )
|
|
return;
|
|
|
|
hasPerk = true;
|
|
stateChange = false;
|
|
failedDistanceCheck = false;
|
|
currentFailCount = 0;
|
|
timePassed = 0;
|
|
timeSinceDistanceCheck = 0;
|
|
previousOrigin = self.origin;
|
|
GPSJammerProtection = false;
|
|
|
|
while(1)
|
|
{
|
|
/#
|
|
gracePeriods = GetDvarInt( "perk_gpsjammer_graceperiods", gracePeriods );
|
|
minspeed = GetDvarInt( "perk_gpsjammer_min_speed", minspeed );
|
|
mindistance = GetDvarInt( "perk_gpsjammer_min_distance", mindistance );
|
|
timePeriod = GetDvarInt( "perk_gpsjammer_time_period", timePeriod );
|
|
timePeriodSec = timePeriod/1000;
|
|
minspeedSq = minspeed * minspeed;
|
|
mindistanceSq = mindistance * mindistance;
|
|
#/
|
|
GPSJammerProtection = false;
|
|
if ( util::isUsingRemote() || ( isdefined( self.isPlanting ) && self.isPlanting ) || ( isdefined( self.isDefusing ) && self.isDefusing ) )
|
|
{
|
|
GPSJammerProtection = true;
|
|
}
|
|
else
|
|
{
|
|
if ( timeSinceDistanceCheck > 1 )
|
|
{
|
|
timeSinceDistanceCheck = 0;
|
|
if ( DistanceSquared( previousOrigin, self.origin ) < mindistanceSq )
|
|
{
|
|
failedDistanceCheck = true;
|
|
}
|
|
else
|
|
{
|
|
failedDistanceCheck = false;
|
|
}
|
|
previousOrigin = self.origin;
|
|
}
|
|
velocity = self GetVelocity();
|
|
|
|
speedsq = lengthsquared( velocity );
|
|
|
|
if ( speedSq > minspeedSq && failedDistanceCheck == false )
|
|
{
|
|
GPSJammerProtection = true;
|
|
}
|
|
}
|
|
|
|
if ( GPSJammerProtection == true && self HasPerk( "specialty_gpsjammer" ) )
|
|
{
|
|
/#
|
|
if (GetDvarint( "scr_debug_perk_gpsjammer")!=0)
|
|
{
|
|
sphere( self.origin + (0,0,70), 12, (0,0,1), 1, true, 16, 3 );
|
|
}
|
|
#/
|
|
currentFailCount = 0;
|
|
if ( hasPerk == false )
|
|
{
|
|
stateChange = false;
|
|
hasPerk = true;
|
|
self clientfield::set( "gps_jammer_active", 1 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
currentFailCount++;
|
|
|
|
if ( hasPerk == true && currentFailCount >= gracePeriods )
|
|
{
|
|
stateChange = true;
|
|
hasPerk = false;
|
|
self clientfield::set( "gps_jammer_active", 0 );
|
|
}
|
|
}
|
|
if ( stateChange == true )
|
|
{
|
|
level notify("radar_status_change");
|
|
}
|
|
timeSinceDistanceCheck += timePeriodSec;
|
|
wait( timePeriodSec );
|
|
}
|
|
}
|
|
|
|
function monitorSenGrenJammer()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
require_perk = true;
|
|
/#
|
|
require_perk = false;
|
|
#/
|
|
|
|
if ( require_perk && self HasPerk( "specialty_sengrenjammer" ) == false )
|
|
return;
|
|
|
|
self clientfield::set( "sg_jammer_active", ( self HasPerk( "specialty_sengrenjammer" ) ? 1 : 0 ) );
|
|
gracePeriods = GetDvarInt( "perk_sgjammer_graceperiods", 4 );
|
|
minspeed = GetDvarInt( "perk_sgjammer_min_speed", 100 );
|
|
mindistance = GetDvarInt( "perk_sgjammer_min_distance", 10 );
|
|
timePeriod = GetDvarInt( "perk_sgjammer_time_period", 200 );
|
|
timePeriodSec = timePeriod/1000;
|
|
minspeedSq = minspeed * minspeed;
|
|
mindistanceSq = mindistance * mindistance;
|
|
|
|
if ( minspeedSq == 0 ) // will never fail min speed check below so early out.
|
|
return;
|
|
|
|
assert ( timePeriodSec >= 0.05 );
|
|
if ( timePeriodSec < 0.05 )
|
|
return;
|
|
|
|
hasPerk = true;
|
|
stateChange = false;
|
|
failedDistanceCheck = false;
|
|
currentFailCount = 0;
|
|
timePassed = 0;
|
|
timeSinceDistanceCheck = 0;
|
|
previousOrigin = self.origin;
|
|
SGJammerProtection = false;
|
|
|
|
while(1)
|
|
{
|
|
/#
|
|
gracePeriods = GetDvarInt( "perk_sgjammer_graceperiods", gracePeriods );
|
|
minspeed = GetDvarInt( "perk_sgjammer_min_speed", minspeed );
|
|
mindistance = GetDvarInt( "perk_sgjammer_min_distance", mindistance );
|
|
timePeriod = GetDvarInt( "perk_sgjammer_time_period", timePeriod );
|
|
timePeriodSec = timePeriod/1000;
|
|
minspeedSq = minspeed * minspeed;
|
|
mindistanceSq = mindistance * mindistance;
|
|
#/
|
|
SGJammerProtection = false;
|
|
if ( util::isUsingRemote() || ( isdefined( self.isPlanting ) && self.isPlanting ) || ( isdefined( self.isDefusing ) && self.isDefusing ) )
|
|
{
|
|
SGJammerProtection = true;
|
|
}
|
|
else
|
|
{
|
|
if ( timeSinceDistanceCheck > 1 )
|
|
{
|
|
timeSinceDistanceCheck = 0;
|
|
if ( DistanceSquared( previousOrigin, self.origin ) < mindistanceSq )
|
|
{
|
|
failedDistanceCheck = true;
|
|
}
|
|
else
|
|
{
|
|
failedDistanceCheck = false;
|
|
}
|
|
previousOrigin = self.origin;
|
|
}
|
|
velocity = self GetVelocity();
|
|
|
|
speedsq = lengthsquared( velocity );
|
|
|
|
if ( speedSq > minspeedSq && failedDistanceCheck == false )
|
|
{
|
|
SGJammerProtection = true;
|
|
}
|
|
}
|
|
|
|
if ( SGJammerProtection == true && self HasPerk( "specialty_sengrenjammer" ) )
|
|
{
|
|
/#
|
|
if (GetDvarint( "scr_debug_perk_sengrenjammer")!=0)
|
|
{
|
|
sphere( self.origin + (0,0,65), 12, (0,1,0), 1, true, 16, 3 );
|
|
}
|
|
#/
|
|
currentFailCount = 0;
|
|
if ( hasPerk == false )
|
|
{
|
|
stateChange = false;
|
|
hasPerk = true;
|
|
self clientfield::set( "sg_jammer_active", 1 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
currentFailCount++;
|
|
|
|
if ( hasPerk == true && currentFailCount >= gracePeriods )
|
|
{
|
|
stateChange = true;
|
|
hasPerk = false;
|
|
self clientfield::set( "sg_jammer_active", 0 );
|
|
}
|
|
}
|
|
if ( stateChange == true )
|
|
{
|
|
level notify("radar_status_change");
|
|
}
|
|
timeSinceDistanceCheck += timePeriodSec;
|
|
wait( timePeriodSec );
|
|
}
|
|
}
|
|
|