3 // TODO maybe bounce of walls, make more gibs, etc.
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);
16 Movetype_Physics(FALSE);
18 if(self.touch == Gib_Touch) // don't do this for the "chunk" thingie...
19 trailparticles(self, particleeffectnum("TR_SLIGHTBLOOD"), oldorg, self.origin);
21 trailparticles(self, particleeffectnum("TR_BLOOD"), oldorg, self.origin);
24 self.alpha = bound(0, self.nextthink - time, 1);
32 void TossGib (string mdlname, vector org, vector v, float destroyontouch)
36 // TODO remove some gibs according to cl_nogibs
39 gib.classname = "gib";
40 gib.move_movetype = MOVETYPE_BOUNCE;
42 gib.solid = SOLID_CORPSE;
44 setmodel (gib, mdlname); // precision set above
46 setsize (gib, '-8 -8 -8', '8 8 8');
50 gib.move_touch = Gib_Touch;
52 gib.move_origin = gib.origin = org;
53 gib.move_velocity = v + randomvec();
54 gib.move_avelocity = randomvec() * vlen(gib.move_velocity);
56 gib.damageforcescale = 3.5;
58 gib.nextthink = time + 12 + random () * 4;
63 float amount, type, isgentle;
64 vector org, vel, mi, ma;
66 float c, gibfactor, randomvalue;
68 type = ReadByte(); // gibbage type
69 amount = ReadByte() / 16.0; // gibbage amount
70 org_x = ReadShort() * 4 + 2;
71 org_y = ReadShort() * 4 + 2;
72 org_z = ReadShort() * 4 + 2;
73 vel = decompressShortVector(ReadShort());
74 mi = decompressShortVector(ReadShort());
75 ma = decompressShortVector(ReadShort());
77 isgentle = (type & 0x80 || cvar("cl_gentle"));
81 gibfactor = 1 - cvar("cl_nogibs");
90 if(type == 1) // full gibbage
92 sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
95 TossGib("models/gibs/eye.md3", org, vel + randomvec() * 150, 0);
96 te_bloodshower(org + mi, org + ma, 1200, 1000 * amount);
98 TossGib("models/gibs/bloodyskull.md3", org, vel + randomvec() * 100, 0);
100 for(c = 0; c < amount; ++c)
102 randomvalue = amount - c;
104 if(random() < randomvalue)
105 TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
106 if(random() < randomvalue)
107 TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
108 if(random() < randomvalue)
109 TossGib ("models/gibs/chest.md3", org + '0 0 -12', vel + randomvec() * (random() * 120 + 80),0);
110 if(random() < randomvalue)
111 TossGib ("models/gibs/smallchest.md3", org, vel + randomvec() * (random() * 120 + 80),0);
112 if(random() < randomvalue)
113 TossGib ("models/gibs/leg1.md3", org + '0 0 -5', vel + randomvec() * (random() * 120 + 85),0);
114 if(random() < randomvalue)
115 TossGib ("models/gibs/leg2.md3", org + '0 0 -9', vel + randomvec() * (random() * 120 + 85),0);
117 // these splat on impact
118 if(random() < randomvalue)
119 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
120 if(random() < randomvalue)
121 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
122 if(random() < randomvalue)
123 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
124 if(random() < randomvalue)
125 TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
128 else if(type == 2) // just blood
130 pointparticles(particleeffectnum("blood"), org, vel, amount);
132 else if(type == 3) // single gib
134 if(random() < amount)
135 TossGib ("models/gibs/chunk.mdl", org, vel, 1);
139 void GibSplash_Precache()
141 precache_model("models/gibs/chunk.mdl");
142 precache_model("models/gibs/leg1.md3");
143 precache_model("models/gibs/leg2.md3");
144 precache_model("models/gibs/chest.md3");
145 precache_model("models/gibs/smallchest.md3");
146 precache_model("models/gibs/arm.md3");
147 precache_model("models/gibs/bloodyskull.md3");
148 precache_model("models/gibs/eye.md3");