Files
2019-12-30 17:23:05 +01:00

106 lines
2.5 KiB
Plaintext

/*this is a point entity from Rubicon Rumble Pack Devkit; REQUIRES A TARGETNAME*/
// ===== TRIGGER_SHAKE =======================================================
float VIEWONLY = 1;
void() shake_think =
{
if (self.attack_finished < time) // Done
{
self.nextthink = -1;
if (self.noise1 != "")
sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
return;
}
local entity plyr;
// Shake all players in the effect radius...
plyr = findradius(self.origin, self.count);
while(plyr)
{
if (plyr.flags & FL_CLIENT)
{
local float d;
// Scale effect by distance
d = vlen(self.origin - plyr.origin);
d = (self.count - d)/self.count;
if (d > 0)
{
// shake up the view
plyr.punchangle_x = -1 * (random() + (0.025*self.dmg*d));
// push the player around
if (plyr.flags & FL_ONGROUND && !(self.spawnflags & VIEWONLY))
{
d = self.dmg*d;
plyr.velocity_x = plyr.velocity_x + (random()*d*2 - d);
plyr.velocity_y = plyr.velocity_y + (random()*d*2 - d);
plyr.velocity_z = plyr.velocity_z + (random()*d);// always push up
}
}
}
plyr = plyr.chain;
}
// keep going
self.nextthink = time + 0.1;
};
void() shake_use =
{
if (self.attack_finished > time) return;// already active
// Start...
if (self.noise != "")
sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
self.attack_finished = time + self.wait;
self.nextthink = time + 0.1;
};
/*QUAKED trigger_shake (.5 .5 .5) (-8 -8 -8) (8 8 8) VIEWONLY
Earthquake trigger - shakes players in it's radius when active.
Strength of tremor is greatest at the centre.
"dmg" Strength at center (default is 120)
"wait" Duration of shake (default is 1)
"count" Affect radius (defalt is 200)
"noise" Noise to play when starting to shake
"noise1" Noise to play when stopping
"targetname" Must be triggered
Spawnflags:
"VIEWONLY" Shakes the view, but player movement is not affected
*/
void() trigger_shake =
{
if (SUB_Inhibit ()) // new spawnflags for all entities -- iw
return;
if (!self.targetname) objerror("trigger_shake without name");
if (self.noise != "") precache_sound (self.noise);
if (self.noise1 != "") precache_sound (self.noise1);
if (!self.dmg) self.dmg = 120;
if (self.count <= 0) self.count = 200;
if (self.wait <= 0) self.wait = 1.0;
setorigin(self, self.origin);
self.nextthink = -1;
self.think = shake_think;
self.use = shake_use;
};