mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-09 10:27:51 -05:00
226 lines
5.7 KiB
Plaintext
226 lines
5.7 KiB
Plaintext
#include maps/mp/gametypes/_damagefeedback;
|
|
#include maps/mp/gametypes/_globallogic_player;
|
|
#include maps/mp/_utility;
|
|
#include maps/mp/_scoreevents;
|
|
#include maps/mp/_challenges;
|
|
#include maps/mp/killstreaks/_emp;
|
|
#include maps/mp/_hacker_tool;
|
|
#include maps/mp/gametypes/_weaponobjects;
|
|
#include common_scripts/utility;
|
|
|
|
init()
|
|
{
|
|
level.isplayertrackedfunc = ::isplayertracked;
|
|
}
|
|
|
|
createsensorgrenadewatcher()
|
|
{
|
|
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "sensor_grenade", "sensor_grenade_mp", self.team );
|
|
watcher.headicon = 0;
|
|
watcher.onspawn = ::onspawnsensorgrenade;
|
|
watcher.detonate = ::sensorgrenadedestroyed;
|
|
watcher.stun = ::maps/mp/gametypes/_weaponobjects::weaponstun;
|
|
watcher.stuntime = 0;
|
|
watcher.reconmodel = "t6_wpn_motion_sensor_world_detect";
|
|
watcher.ondamage = ::watchsensorgrenadedamage;
|
|
watcher.enemydestroy = 1;
|
|
}
|
|
|
|
onspawnsensorgrenade( watcher, player )
|
|
{
|
|
self endon( "death" );
|
|
self thread maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject( watcher, player );
|
|
self setowner( player );
|
|
self setteam( player.team );
|
|
self.owner = player;
|
|
self playloopsound( "fly_sensor_nade_lp" );
|
|
self maps/mp/_hacker_tool::registerwithhackertool( level.equipmenthackertoolradius, level.equipmenthackertooltimems );
|
|
player addweaponstat( "sensor_grenade_mp", "used", 1 );
|
|
self thread watchforstationary( player );
|
|
self thread watchforexplode( player );
|
|
}
|
|
|
|
watchforstationary( owner )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "hacked" );
|
|
self endon( "explode" );
|
|
owner endon( "death" );
|
|
owner endon( "disconnect" );
|
|
self waittill( "stationary" );
|
|
checkfortracking( self.origin );
|
|
}
|
|
|
|
watchforexplode( owner )
|
|
{
|
|
self endon( "hacked" );
|
|
self endon( "delete" );
|
|
owner endon( "death" );
|
|
owner endon( "disconnect" );
|
|
self waittill( "explode", origin );
|
|
checkfortracking( origin + ( 0, 0, 1 ) );
|
|
}
|
|
|
|
checkfortracking( origin )
|
|
{
|
|
if ( isDefined( self.owner ) == 0 )
|
|
{
|
|
return;
|
|
}
|
|
players = level.players;
|
|
_a85 = level.players;
|
|
_k85 = getFirstArrayKey( _a85 );
|
|
while ( isDefined( _k85 ) )
|
|
{
|
|
player = _a85[ _k85 ];
|
|
if ( player isenemyplayer( self.owner ) )
|
|
{
|
|
if ( !player hasperk( "specialty_nomotionsensor" ) )
|
|
{
|
|
if ( distancesquared( player.origin, origin ) < 562500 )
|
|
{
|
|
trace = bullettrace( origin, player.origin + vectorScale( ( 0, 0, 1 ), 12 ), 0, player );
|
|
if ( trace[ "fraction" ] == 1 )
|
|
{
|
|
self.owner tracksensorgrenadevictim( player );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_k85 = getNextArrayKey( _a85, _k85 );
|
|
}
|
|
}
|
|
|
|
tracksensorgrenadevictim( victim )
|
|
{
|
|
if ( !isDefined( self.sensorgrenadedata ) )
|
|
{
|
|
self.sensorgrenadedata = [];
|
|
}
|
|
if ( !isDefined( self.sensorgrenadedata[ victim.clientid ] ) )
|
|
{
|
|
self.sensorgrenadedata[ victim.clientid ] = getTime();
|
|
}
|
|
}
|
|
|
|
isplayertracked( player, time )
|
|
{
|
|
playertracked = 0;
|
|
if ( isDefined( self.sensorgrenadedata ) && isDefined( self.sensorgrenadedata[ player.clientid ] ) )
|
|
{
|
|
if ( ( self.sensorgrenadedata[ player.clientid ] + 10000 ) > time )
|
|
{
|
|
playertracked = 1;
|
|
}
|
|
}
|
|
return playertracked;
|
|
}
|
|
|
|
sensorgrenadedestroyed( attacker, weaponname )
|
|
{
|
|
from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname );
|
|
if ( !from_emp )
|
|
{
|
|
playfx( level._equipment_explode_fx, self.origin );
|
|
}
|
|
if ( isDefined( attacker ) )
|
|
{
|
|
if ( self.owner isenemyplayer( attacker ) )
|
|
{
|
|
attacker maps/mp/_challenges::destroyedequipment( weaponname );
|
|
maps/mp/_scoreevents::processscoreevent( "destroyed_motion_sensor", attacker, self.owner, weaponname );
|
|
}
|
|
}
|
|
playsoundatposition( "dst_equipment_destroy", self.origin );
|
|
self delete();
|
|
}
|
|
|
|
watchsensorgrenadedamage( watcher )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "hacked" );
|
|
self setcandamage( 1 );
|
|
damagemax = 1;
|
|
if ( !self maps/mp/_utility::ishacked() )
|
|
{
|
|
self.damagetaken = 0;
|
|
}
|
|
for ( ;; )
|
|
{
|
|
while ( 1 )
|
|
{
|
|
self.maxhealth = 100000;
|
|
self.health = self.maxhealth;
|
|
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
|
if ( !isDefined( attacker ) || !isplayer( attacker ) )
|
|
{
|
|
continue;
|
|
}
|
|
while ( level.teambased && isplayer( attacker ) )
|
|
{
|
|
while ( !level.hardcoremode && self.owner.team == attacker.pers[ "team" ] && self.owner != attacker )
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
if ( isDefined( weaponname ) )
|
|
{
|
|
switch( weaponname )
|
|
{
|
|
case "concussion_grenade_mp":
|
|
case "flash_grenade_mp":
|
|
if ( watcher.stuntime > 0 )
|
|
{
|
|
self thread maps/mp/gametypes/_weaponobjects::stunstart( watcher, watcher.stuntime );
|
|
}
|
|
if ( level.teambased && self.owner.team != attacker.team )
|
|
{
|
|
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
|
{
|
|
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
|
}
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( !level.teambased && self.owner != attacker )
|
|
{
|
|
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
|
{
|
|
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case "emp_grenade_mp":
|
|
damage = damagemax;
|
|
default:
|
|
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
|
{
|
|
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
weaponname = "";
|
|
}
|
|
if ( type == "MOD_MELEE" )
|
|
{
|
|
self.damagetaken = damagemax;
|
|
}
|
|
else
|
|
{
|
|
self.damagetaken += damage;
|
|
}
|
|
if ( self.damagetaken >= damagemax )
|
|
{
|
|
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0, attacker, weaponname );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|