]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/gibs.qc
fix typo
[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, isgentle;
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         isgentle = (type & 0x8000 || cvar("cl_gentle"));
75         type = type & 0x7FFF;
76
77
78         gibfactor = 1 - cvar("cl_nogibs");
79         if(gibfactor <= 0)
80                 return;
81         
82         amount *= gibfactor;
83
84         if(cvar("ekg"))
85                 amount *= 5;
86
87         if(type == 1) // full gibbage
88         {
89                 sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
90
91                 if(random() < amount)
92                         TossGib("models/gibs/eye.md3", org, vel + randomvec() * 150, 0);
93                 te_bloodshower(org + mi, org + ma, 1200, 1000 * amount);
94                 if(random() < amount)
95                         TossGib("models/gibs/bloodyskull.md3", org, vel, 0);
96
97                 for(c = 0; c < amount; ++c)
98                 {
99                         randomvalue = amount - c;
100                                 
101                         if(random() < randomvalue)
102                                 TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
103                         if(random() < randomvalue)
104                                 TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
105                         if(random() < randomvalue)
106                                 TossGib ("models/gibs/chest.md3", org + '0 0 -12', vel + randomvec() * (random() * 120 + 80),0);
107                         if(random() < randomvalue)
108                                 TossGib ("models/gibs/smallchest.md3", org, vel + randomvec() * (random() * 120 + 80),0);
109                         if(random() < randomvalue)
110                                 TossGib ("models/gibs/leg1.md3", org + '0 0 -5', vel + randomvec() * (random() * 120 + 85),0);
111                         if(random() < randomvalue)
112                                 TossGib ("models/gibs/leg2.md3", org + '0 0 -9', vel + randomvec() * (random() * 120 + 85),0);
113
114                         // these splat on impact
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                         if(random() < randomvalue)
120                                 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
121                         if(random() < randomvalue)
122                                 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
123                 }
124         }
125         else if(type == 2) // just blood
126         {
127                 pointparticles(particleeffectnum("blood"), org, vel, amount);
128         }
129         else if(type == 3) // single gib
130         {
131                 TossGib ("models/gibs/chunk.mdl", org, vel, 1);
132         }
133 }
134
135 void GibSplash_Precache()
136 {
137         precache_model("models/gibs/chunk.mdl");
138         precache_model("models/gibs/leg1.mdl");
139         precache_model("models/gibs/leg2.mdl");
140         precache_model("models/gibs/chest.mdl");
141         precache_model("models/gibs/smallchest.mdl");
142         precache_model("models/gibs/arm.mdl");
143         precache_model("models/gibs/bloodyskull.mdl");
144         precache_model("models/gibs/eye.mdl");
145 }