]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/g_violence.qc
(untested) make rain and snow client side entities
[divverent/nexuiz.git] / data / qcsrc / server / g_violence.qc
1 void GibDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
2 {
3         float r;
4         r = random ();
5         if (r < 0.60)
6                 sound (self, CHAN_PROJECTILE, "misc/gib_splat01.wav", VOL_BASE, ATTN_NORM);
7         else if (r < 0.65)
8                 sound (self, CHAN_PROJECTILE, "misc/gib_splat02.wav", VOL_BASE, ATTN_NORM);
9         else if (r < 0.70)
10                 sound (self, CHAN_PROJECTILE, "misc/gib_splat03.wav", VOL_BASE, ATTN_NORM);
11         else if (r < 0.75)
12                 sound (self, CHAN_PROJECTILE, "misc/gib_splat04.wav", VOL_BASE, ATTN_NORM);
13         
14         if(sv_gentle < 1)
15                 pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10);
16         self.health = self.health - damage;
17         if (self.health <= -1000)
18         {
19                 self.event_damage = SUB_Null;
20                 SUB_VanishOrRemove (self);
21         }
22 }
23
24
25 void GibTouch ()
26 {
27         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
28         {
29                 SUB_VanishOrRemove(self);
30                 return;
31         }
32         GibDamage (other, other, 1000, 0, self.origin, '0 0 0');
33 }
34
35
36 .float gibrandom;
37 .float gibmodelindex;
38 float Gib_customizeentityforclient()
39 {
40         if(self.classname == "player") // the eye
41         {
42                 if(sv_gentle > 0) {
43                         self.model = "";
44                         return TRUE;
45                 }
46                 if(self.gibrandom > other.cvar_cl_nogibs)
47                         self.model = self.mdl;
48                 else
49                         self.model = "";
50                 return TRUE;
51         }
52         else // other gibs - don't even need to send them
53                 return (self.gibrandom > other.cvar_cl_nogibs);
54 };
55
56 // changes by LordHavoc on 03/30/04
57 // TossGib now takes a gib entity so it can be used for tossing heads
58 // gib.velocity now uses randomvec() instead of a bunch of manual random calls
59 // merged Gib() into PlayerGib()
60 void TossGib (entity gib, string mdlname, vector org, vector v, float destroyontouch)
61 {
62         if (gib == world)
63         {
64                 gib = spawn ();
65                 gib.deadflag = DEAD_DEAD;
66         }
67
68         // don't set his classname to something else or it'll screw up a lot of stuff
69         if(gib.classname != "player")
70                 gib.classname = "gib";
71         gib.iscreature = FALSE; // not a creature, because lava sounds on gibs are annoying
72         gib.movetype = MOVETYPE_BOUNCE;
73         gib.solid = SOLID_CORPSE;
74         gib.skin = 0;
75         gib.effects = 0;
76         gib.gibrandom = random(); // used for customize function to reduce gibs
77         gib.customizeentityforclient = Gib_customizeentityforclient;
78         gib.effects = EF_LOWPRECISION; // use less bandwidth
79
80         gib.mdl = mdlname;
81         setmodel (gib, mdlname); // precision set above
82         gib.gibmodelindex = gib.modelindex;
83         setsize (gib, '-8 -8 -8', '8 8 8');
84         setorigin (gib, org);
85
86         gib.health = -1;
87         gib.takedamage = DAMAGE_YES;
88         gib.damageforcescale = 3.5;
89         gib.event_damage = GibDamage;
90         if (destroyontouch == 1)
91                 gib.touch = GibTouch;
92
93         gib.velocity = v + randomvec();
94         gib.avelocity = randomvec() * vlen(gib.velocity);
95         gib.oldvelocity = gib.velocity;
96
97         SUB_SetFade (gib, time + 12 + random () * 4, 1);
98 }