145 lines
3.1 KiB
Plaintext
145 lines
3.1 KiB
Plaintext
void() s_explode1 = [0, s_explode2] {};
|
|
void() s_explode2 = [1, s_explode3] {};
|
|
void() s_explode3 = [2, s_explode4] {};
|
|
void() s_explode4 = [3, s_explode5] {};
|
|
void() s_explode5 = [4, s_explode6] {};
|
|
void() s_explode6 = [5, SUB_Remove] {};
|
|
|
|
/*==========
|
|
BecomeExplosion
|
|
==========*/
|
|
void() BecomeExplosion =
|
|
{
|
|
self.solid = SOLID_NOT;
|
|
self.movetype = MOVETYPE_NONE;
|
|
self.velocity = '0 0 0';
|
|
self.touch = SUB_Null;
|
|
setmodel (self, "progs/s_explod.spr");
|
|
s_explode1();
|
|
};
|
|
|
|
/*==========
|
|
grenade_explode
|
|
==========*/
|
|
static void() grenade_explode =
|
|
{
|
|
RadiusDamage (self, self.owner, self.dmg, world);
|
|
te_explosion(self.origin);
|
|
BecomeExplosion();
|
|
};
|
|
|
|
/*==========
|
|
grenade_touch
|
|
==========*/
|
|
static void() grenade_touch =
|
|
{
|
|
if (pointcontents(self.origin) == CONTENT_SKY)
|
|
{
|
|
remove(self);
|
|
return;
|
|
}
|
|
if (other.takedamage == DAMAGE_AIM)
|
|
{
|
|
grenade_explode();
|
|
return;
|
|
}
|
|
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
|
|
};
|
|
|
|
/*==========
|
|
launch_grenade
|
|
|
|
used for player, zombie and ogre grenades
|
|
==========*/
|
|
void(vector org, vector dir, float spd, float dam) launch_grenade =
|
|
{
|
|
newmis = spawn();
|
|
newmis.classname = "grenade";
|
|
newmis.owner = self;
|
|
newmis.solid = SOLID_BBOX;
|
|
newmis.movetype = MOVETYPE_BOUNCE;
|
|
|
|
setmodel (newmis, "progs/grenade.mdl");
|
|
setsize (newmis, '0 0 0', '0 0 0');
|
|
setorigin (newmis, org);
|
|
|
|
newmis.dmg = dam;
|
|
|
|
newmis.touch = grenade_touch;
|
|
newmis.angles = vectoangles(dir);
|
|
newmis.velocity = dir * spd;
|
|
|
|
newmis.think = grenade_explode;
|
|
newmis.nextthink = time + 2.5;
|
|
};
|
|
|
|
/*==========
|
|
spike_touch
|
|
==========*/
|
|
static void() spike_touch2 =
|
|
{
|
|
if (pointcontents(self.origin) == CONTENT_SKY)
|
|
{
|
|
remove(self);
|
|
return;
|
|
}
|
|
|
|
// move out of the wall / floor slightly
|
|
self.origin = self.origin - 8*normalize(self.velocity);
|
|
|
|
// lasers always play an impact sound
|
|
if (self.classname == "laser")
|
|
sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_IDLE);
|
|
|
|
if (other.takedamage)
|
|
{
|
|
Damage(other, self, self.owner, self.dmg);
|
|
if (other.solid == SOLID_BSP)
|
|
SpawnTouchParticles(self.dmg, 192);
|
|
else
|
|
SpawnTouchblood(self.dmg);
|
|
}
|
|
else
|
|
{
|
|
if (self.classname == "laser")
|
|
te_gunshot(self.origin);
|
|
else if (self.classname == "spike")
|
|
te_spike(self.origin);
|
|
else if (self.classname == "superspike")
|
|
te_superspike(self.origin);
|
|
else if (self.classname == "wizspike")
|
|
te_wizspike(self.origin);
|
|
else if (self.classname == "knightspike")
|
|
te_knightspike(self.origin);
|
|
}
|
|
|
|
remove(self);
|
|
};
|
|
|
|
/*==========
|
|
launch_spike
|
|
|
|
used for nails, lasers, scrag spit and hellknight fire
|
|
==========*/
|
|
void(string name, string mod, vector org, vector dir, float spd, float dam) launch_spike2 =
|
|
{
|
|
newmis = spawn();
|
|
newmis.classname = name; // spike, superspike, laser, knightspike, wizspike
|
|
newmis.owner = self;
|
|
newmis.solid = SOLID_BBOX;
|
|
newmis.movetype = MOVETYPE_FLYMISSILE;
|
|
|
|
setmodel (newmis, mod);
|
|
setsize (newmis, '0 0 0', '0 0 0');
|
|
setorigin (newmis, org);
|
|
|
|
newmis.dmg = dam;
|
|
|
|
newmis.touch = spike_touch2;
|
|
newmis.angles = vectoangles(dir);
|
|
newmis.velocity = dir * spd;
|
|
|
|
newmis.think = SUB_Remove;
|
|
newmis.nextthink = time + 10;
|
|
};
|