]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/gibs.qc
moved gibbing from server to client
[divverent/nexuiz.git] / data / qcsrc / client / gibs.qc
1 void Gib_Touch()
2 {
3         // TODO maybe bounce of walls, make more gibs, etc.
4         
5         sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(random() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM);
6         pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10);
7
8         remove(self);
9 }
10
11 void Gib_Draw()
12 {
13         vector oldorg;
14         oldorg = self.origin;
15
16         Movetype_Physics(FALSE);
17         
18         trailparticles(self, particleeffectnum("TR_BLOOD"), oldorg, self.origin);
19
20         self.renderflags = 0;
21         self.alpha = bound(0, self.nextthink - time, 1);
22
23         if(self.alpha == 0)
24                 remove(self);
25         else
26                 R_AddEntity(self);
27 }
28
29 void TossGib (string mdlname, vector org, vector v, float destroyontouch)
30 {
31         entity gib;
32
33         // TODO remove some gibs according to cl_nogibs
34         
35         gib = spawn();
36         gib.classname = "gib";
37         gib.move_movetype = MOVETYPE_BOUNCE;
38         gib.gravity = 1;
39         gib.solid = SOLID_CORPSE;
40
41         setmodel (gib, mdlname); // precision set above
42
43         setsize (gib, '-8 -8 -8', '8 8 8');
44
45         gib.draw = Gib_Draw;
46         if(destroyontouch)
47                 gib.move_touch = Gib_Touch;
48
49         gib.move_origin = org;
50         gib.move_velocity = v + randomvec();
51         gib.move_avelocity = randomvec() * vlen(gib.move_velocity);
52         gib.move_time = time;
53         gib.damageforcescale = 3.5;
54
55         gib.nextthink = time + 12 + random () * 4;
56 }
57
58 void Ent_GibSplash()
59 {
60         float amount, type;
61         vector org, vel, mi, ma;
62
63         float c, gibfactor, randomvalue;
64
65         amount = ReadByte() / 16.0; // gibbage amount
66         type = ReadByte(); // gibbage type
67         org_x = ReadShort() * 4 + 2;
68         org_y = ReadShort() * 4 + 2;
69         org_z = ReadShort() * 4 + 2;
70         vel = decompressShortVector(ReadShort());
71         mi = decompressShortVector(ReadShort());
72         ma = decompressShortVector(ReadShort());
73
74         gibfactor = 1 - cvar("cl_nogibs");
75         if(gibfactor <= 0)
76                 return;
77         
78         amount *= gibfactor;
79
80         if(cvar("ekg"))
81                 amount *= 5;
82
83         if(type == 1) // full gibbage
84         {
85                 sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
86
87                 if(random() < amount)
88                         TossGib("models/gibs/eye.md3", org, vel + randomvec() * 150, 0);
89                 te_bloodshower(org + mi, org + ma, 1200, 1000 * amount);
90                 if(random() < amount)
91                         TossGib("models/gibs/bloodyskull.md3", org, vel, 0);
92
93                 for(c = 0; c < amount; ++c)
94                 {
95                         randomvalue = amount - c;
96                                 
97                         if(random() < randomvalue)
98                                 TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
99                         if(random() < randomvalue)
100                                 TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
101                         if(random() < randomvalue)
102                                 TossGib ("models/gibs/chest.md3", org + '0 0 -12', vel + randomvec() * (random() * 120 + 80),0);
103                         if(random() < randomvalue)
104                                 TossGib ("models/gibs/smallchest.md3", org, vel + randomvec() * (random() * 120 + 80),0);
105                         if(random() < randomvalue)
106                                 TossGib ("models/gibs/leg1.md3", org + '0 0 -5', vel + randomvec() * (random() * 120 + 85),0);
107                         if(random() < randomvalue)
108                                 TossGib ("models/gibs/leg2.md3", org + '0 0 -9', vel + randomvec() * (random() * 120 + 85),0);
109
110                         // these splat on impact
111                         if(random() < randomvalue)
112                                 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
113                         if(random() < randomvalue)
114                                 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
115                         if(random() < randomvalue)
116                                 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
117                         if(random() < randomvalue)
118                                 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
119                 }
120         }
121         else if(type == 2) // just blood
122         {
123                 pointparticles(particleeffectnum("blood"), org, vel, amount);
124         }
125         else if(type == 3) // single gib
126         {
127                 TossGib ("models/gibs/chunk.mdl", org, vel, 1);
128         }
129 }
130
131 void GibSplash_Precache()
132 {
133         precache_model("models/gibs/chunk.mdl");
134         precache_model("models/gibs/leg1.mdl");
135         precache_model("models/gibs/leg2.mdl");
136         precache_model("models/gibs/chest.mdl");
137         precache_model("models/gibs/smallchest.mdl");
138         precache_model("models/gibs/arm.mdl");
139         precache_model("models/gibs/bloodyskull.mdl");
140         precache_model("models/gibs/eye.mdl");
141 }