134 lines
2.8 KiB
Plaintext
134 lines
2.8 KiB
Plaintext
main()
|
|
{
|
|
precacheShellshock("flashbang_mp");
|
|
}
|
|
|
|
|
|
startMonitoringFlash()
|
|
{
|
|
self thread monitorFlash();
|
|
}
|
|
|
|
|
|
stopMonitoringFlash(disconnected)
|
|
{
|
|
self notify("stop_monitoring_flash");
|
|
}
|
|
|
|
|
|
flashRumbleLoop( duration )
|
|
{
|
|
self endon("stop_monitoring_flash");
|
|
|
|
self endon("flash_rumble_loop");
|
|
self notify("flash_rumble_loop");
|
|
|
|
goalTime = getTime() + duration * 1000;
|
|
|
|
while ( getTime() < goalTime )
|
|
{
|
|
self PlayRumbleOnEntity( "damage_heavy" );
|
|
wait( 0.05 );
|
|
}
|
|
}
|
|
|
|
|
|
monitorFlash()
|
|
{
|
|
self endon("disconnect");
|
|
self.flashEndTime = 0;
|
|
while(1)
|
|
{
|
|
self waittill( "flashbang", origin, amount_distance, amount_angle, attacker );
|
|
|
|
if ( !isalive( self ) )
|
|
continue;
|
|
|
|
if ( isDefined( self.usingRemote ) )
|
|
continue;
|
|
|
|
hurtattacker = false;
|
|
hurtvictim = true;
|
|
|
|
if ( amount_angle < 0.5 )
|
|
amount_angle = 0.5;
|
|
else if ( amount_angle > 0.8 )
|
|
amount_angle = 1;
|
|
|
|
duration = amount_distance * amount_angle * 6;
|
|
|
|
if ( duration < 0.25 )
|
|
continue;
|
|
|
|
rumbleduration = undefined;
|
|
if ( duration > 2 )
|
|
rumbleduration = 0.75;
|
|
else
|
|
rumbleduration = 0.25;
|
|
|
|
assert(isdefined(self.pers["team"]));
|
|
if (level.teamBased && isdefined(attacker) && isdefined(attacker.pers["team"]) && attacker.pers["team"] == self.pers["team"] && attacker != self)
|
|
{
|
|
if(level.friendlyfire == 0) // no FF
|
|
{
|
|
continue;
|
|
}
|
|
else if(level.friendlyfire == 1) // FF
|
|
{
|
|
}
|
|
else if(level.friendlyfire == 2) // reflect
|
|
{
|
|
duration = duration * .5;
|
|
rumbleduration = rumbleduration * .5;
|
|
hurtvictim = false;
|
|
hurtattacker = true;
|
|
}
|
|
else if(level.friendlyfire == 3) // share
|
|
{
|
|
duration = duration * .5;
|
|
rumbleduration = rumbleduration * .5;
|
|
hurtattacker = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
attacker notify( "flash_hit" );
|
|
}
|
|
|
|
if (hurtvictim)
|
|
self thread applyFlash(duration, rumbleduration);
|
|
if (hurtattacker)
|
|
attacker thread applyFlash(duration, rumbleduration);
|
|
}
|
|
}
|
|
|
|
applyFlash(duration, rumbleduration)
|
|
{
|
|
// wait for the highest flash duration this frame,
|
|
// and apply it in the following frame
|
|
|
|
if (!isdefined(self.flashDuration) || duration > self.flashDuration)
|
|
self.flashDuration = duration;
|
|
if (!isdefined(self.flashRumbleDuration) || rumbleduration > self.flashRumbleDuration)
|
|
self.flashRumbleDuration = rumbleduration;
|
|
|
|
wait .05;
|
|
|
|
if (isdefined(self.flashDuration)) {
|
|
self shellshock( "flashbang_mp", self.flashDuration ); // TODO: avoid shellshock overlap
|
|
self.flashEndTime = getTime() + (self.flashDuration * 1000);
|
|
}
|
|
if (isdefined(self.flashRumbleDuration)) {
|
|
self thread flashRumbleLoop( self.flashRumbleDuration ); //TODO: Non-hacky rumble.
|
|
}
|
|
|
|
self.flashDuration = undefined;
|
|
self.flashRumbleDuration = undefined;
|
|
}
|
|
|
|
|
|
isFlashbanged()
|
|
{
|
|
return isDefined( self.flashEndTime ) && gettime() < self.flashEndTime;
|
|
}
|