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

188 lines
13 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\challenges_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\damagefeedback_shared;
#using scripts\shared\scoreevents_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\weapons\_hacker_tool;
#using scripts\shared\weapons\_weaponobjects;
#namespace threat_detector;
function autoexec __init__sytem__() { system::register("threat_detector",&__init__,undefined,undefined); }
function __init__()
{
clientfield::register( "missile", "threat_detector", 1, 1, "int" );
callback::add_weapon_watcher( &createThreatDetectorWatcher );
}
function createThreatDetectorWatcher()
{
watcher = self weaponobjects::createUseWeaponObjectWatcher( "threat_detector", self.team );
watcher.headicon = false;
watcher.onSpawn =&onSpawnThreatDetector;
watcher.onDetonateCallback =&threatDetectorDestroyed;
watcher.stun = &weaponobjects::weaponStun;
watcher.stunTime = 0;
watcher.onDamage =&watchThreatDetectorDamage;
watcher.enemyDestroy = true;
}
function onSpawnThreatDetector( watcher, player )
{
self endon( "death" );
self thread weaponobjects::onSpawnUseWeaponObject( watcher, player );
self SetOwner( player );
self SetTeam( player.team );
self.owner = player;
self PlayLoopSound( "wpn_sensor_nade_lp" );
self hacker_tool::registerWithHackerTool( level.equipmentHackerToolRadius, level.equipmentHackerToolTimeMs );
player AddWeaponStat( self.weapon, "used", 1 );
self thread watchForStationary( player );
}
function watchForStationary( owner )
{
self endon( "death" );
self endon( "hacked" );
self endon( "explode" );
owner endon( "death" );
owner endon( "disconnect" );
self waittill("stationary" );
self clientfield::set( "threat_detector", 1 );
}
function trackSensorGrenadeVictim( victim )
{
if( !isdefined( self.sensorGrenadeData ) )
{
self.sensorGrenadeData = [];
}
if ( !isdefined( self.sensorGrenadeData[victim.clientid] ) )
{
self.sensorGrenadeData[victim.clientid] = getTime();
}
self clientfield::set_to_player( "threat_detected", 1 );
}
//******************************************************************
// *
// *
//******************************************************************
function threatDetectorDestroyed( attacker, weapon, target )
{
if ( !isdefined( weapon ) || !weapon.isEmp )
{
PlayFX( level._equipment_explode_fx, self.origin );
}
if ( isdefined( attacker ) )
{
if ( self.owner util::IsEnemyPlayer( attacker ) )
{
attacker challenges::destroyedEquipment( weapon );
scoreevents::processScoreEvent( "destroyed_motion_sensor", attacker, self.owner, weapon );
}
}
PlaySoundAtPosition ( "wpn_sensor_nade_explo", self.origin );
self delete();
}
//******************************************************************
// *
// *
//******************************************************************
function watchThreatDetectorDamage( watcher ) // self == sensor grenade
{
self endon( "death" );
self endon( "hacked" );
self SetCanDamage( true );
damageMax = 1;
if ( !self util::isHacked() )
{
self.damageTaken = 0;
}
while( true )
{
self.maxhealth = 100000;
self.health = self.maxhealth;
self waittill( "damage", damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
if( !isdefined( attacker ) || !isplayer( attacker ) )
continue;
if ( level.teambased && IsPlayer( attacker ) )
{
// if we're not hardcore and the team is the same, do not destroy
if( !level.hardcoreMode && self.owner.team == attacker.pers["team"] && self.owner != attacker )
{
continue;
}
}
// most equipment should be flash/concussion-able, so it'll disable for a short period of time
// check to see if the equipment has been flashed/concussed and disable it (checking damage < 5 is a bad idea, so check the weapon name)
// we're currently allowing the owner/teammate to flash their own
// do damage feedback
if ( watcher.stunTime > 0 && weapon.doStun )
{
self thread weaponobjects::stunStart( watcher, watcher.stunTime );
}
if ( weapon.doDamageFeedback )
{
// if we're not on the same team then show damage feedback
if ( level.teambased && self.owner.team != attacker.team )
{
if ( damagefeedback::doDamageFeedback( weapon, attacker ) )
attacker damagefeedback::update();
}
// for ffa just make sure the owner isn't the same
else if ( !level.teambased && self.owner != attacker )
{
if ( damagefeedback::doDamageFeedback( weapon, attacker ) )
attacker damagefeedback::update();
}
}
if ( type == "MOD_MELEE" || weapon.isEmp )
{
self.damageTaken = damageMax;
}
else
{
self.damageTaken += damage;
}
if( self.damageTaken >= damageMax )
{
watcher thread weaponobjects::waitAndDetonate( self, 0.0, attacker, weapon );
return;
}
}
}