boiii-scripts/mp/_threat_detector.csc
2023-04-13 17:30:38 +02:00

117 lines
11 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\weapons\_decoy;
#using scripts\shared\weapons\_weaponobjects;
#using scripts\shared\duplicaterender_mgr;
#namespace threat_detector;
function autoexec __init__sytem__() { system::register("threat_detector",&__init__,undefined,undefined); }
function __init__()
{
level.sensorHandle = 1;
level.sensors = [];
clientfield::register( "missile", "threat_detector", 1, 1, "int", &spawnedThreatDetector,!true, !true );
}
function spawnedThreatDetector( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
{
if( newVal != 1 )
{
return;
}
if( GetLocalPlayer( localClientNum ) != self.owner )
{
return;
}
sensorIndex = level.sensors.size;
level.sensorHandle++;
level.sensors[ sensorIndex ] = spawnstruct();
level.sensors[ sensorIndex ].handle = level.sensorHandle;
level.sensors[ sensorIndex ].cent = self;
level.sensors[ sensorIndex ].team = self.team;
level.sensors[ sensorIndex ].owner = self GetOwner( localClientNum );
level.sensors[ sensorIndex ].owner AddSensorGrenadeArea( self.origin, level.sensorHandle );
self.owner thread sensorGrenadeThink( self, level.sensorHandle, localClientNum );
self.owner thread clearThreatDetectorOnDelete( self, level.sensorHandle, localClientNum );
}
function sensorGrenadeThink( sensorEnt, sensorHandle, localClientNum )
{
sensorEnt endon( "entityshutdown" );
if( isdefined( sensorEnt.owner ) == false )
{
return;
}
while( true )
{
players = GetPlayers( localClientNum );
foreach( player in players )
{
if( self util::IsEnemyPlayer( player ) )
{
if( player hasPerk( localClientNum, "specialty_nomotionsensor" ) || player hasPerk( localClientNum, "specialty_sengrenjammer" ) )
{
player duplicate_render::set_player_threat_detected( localClientNum, false );
continue;
}
threatDetectorRadius = GetDvarFloat( "cg_threatDetectorRadius", 0 );
threatDetectorRadiusSqrd = threatDetectorRadius * threatDetectorRadius;
if( DistanceSquared( player.origin, sensorEnt.origin ) < threatDetectorRadiusSqrd )
{
player duplicate_render::set_player_threat_detected( localClientNum, true );
}
else
{
player duplicate_render::set_player_threat_detected( localClientNum, false );
}
}
}
wait( 1 );
}
}
function clearThreatDetectorOnDelete( sensorEnt, sensorHandle, localClientNum )
{
sensorEnt waittill( "entityshutdown" );
entIndex = 0;
for( i = 0; i < level.sensors.size; i++ )
{
size = level.sensors.size;
if( sensorHandle == level.sensors[ i ].handle )
{
level.sensors[ i ].owner RemoveSensorGrenadeArea( sensorHandle );
entIndex = 0;
break;
}
}
players = GetPlayers( localClientNum );
foreach( player in players )
{
if( self util::IsEnemyPlayer( player ) )
{
player duplicate_render::set_player_threat_detected( localClientNum, false );
}
}
}