1 #include "g_local.h"
2 void Leper_Effects(edict_t *ent);
3 void Leper_NoLegs(edict_t *ent);
4 void Leper_NoArms(edict_t *ent);
5 void ThrowUpNow(edict_t *self, int limb);
P_ProjectSource(gclient_t * client,vec3_t point,vec3_t distance,vec3_t forward,vec3_t right,vec3_t result)6 static void P_ProjectSource (gclient_t *client, vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result)
7 {
8 vec3_t _distance;
9
10 VectorCopy (distance, _distance);
11 if (client->pers.hand == LEFT_HANDED)
12 _distance[1] *= -1;
13 else if (client->pers.hand == CENTER_HANDED)
14 _distance[1] = 0;
15 G_ProjectSource (point, _distance, forward, right, result);
16 }
17
Leper_Think(edict_t * ent)18 void Leper_Think (edict_t *ent)
19 {
20 qboolean movefast;
21 int l,r;
22 if(!leper->value)
23 return;
24 if(ent->leftleg<0)
25 ent->leftleg = 0;
26 if(ent->rightleg<0)
27 ent->rightleg = 0;
28 if(ent->leftarm<0)
29 ent->leftarm = 0;
30 if(ent->rightarm<0)
31 ent->rightarm = 0;
32
33 if(!ent->leftarm || !ent->rightarm)
34 Leper_NoArms(ent);
35
36 if(fabs(ent->velocity[0]) >50 || fabs(ent->velocity[1]) >50)
37 movefast = true;
38 else
39 movefast = false;
40
41 if((!ent->leftleg || !ent->rightleg) //if you only have 1 leg, not none, not 2.
42 && !(!ent->leftleg && !ent->rightleg)
43 && movefast
44 && ent->groundentity && action->value)
45 {
46 ent->velocity[2] += hop->value;
47 r = 1 + (rand()&1);
48 l = (1 + random()*2)*25;
49 gi.sound (ent, CHAN_VOICE, gi.soundindex(va("*pain%i_%i.wav", l, r)), 1, ATTN_NORM, 0);
50 }
51
52 if(!ent->leftleg)
53 ThrowUpNow(ent, LOC_LEFTLEG);
54 if(!ent->rightleg)
55 ThrowUpNow(ent, LOC_RIGHTLEG);
56 if(!ent->rightarm)
57 ThrowUpNow(ent, LOC_RIGHTARM);
58 if(!ent->leftarm)
59 ThrowUpNow(ent, LOC_LEFTARM);
60 }
61
Leper_Effects(edict_t * ent)62 void Leper_Effects(edict_t *ent)
63 {
64
65 int scorethingy;
66 float xyspeed = sqrt(ent->velocity[0]*ent->velocity[0] + ent->velocity[1]*ent->velocity[1]);
67
68 if(!leper->value || IsGenderless(ent))
69 {
70 ent->s.modelindex4 = 0;
71 ent->s.modelindex3 = 0;
72 return;
73 }
74
75
76 if(ent->deadflag)
77 {
78 ent->s.modelindex4 = 0;
79 ent->s.modelindex3 = 0;
80 ent->s.modelindex2 = 0;
81 return;
82 }
83 if (IsNeutral(ent))
84 {
85 if(ent->leftleg > 0 && ent->rightleg > 0)
86 ent->s.modelindex4 = gi.modelindex ("players/cyborg/bothlegs.md2");
87 else if(ent->leftleg > 0 && !ent->rightleg)
88 ent->s.modelindex4 = gi.modelindex ("players/cyborg/limb_lleg.md2");
89 else if(!ent->leftleg && ent->rightleg> 0)
90 ent->s.modelindex4 = gi.modelindex ("players/cyborg/limb_rleg.md2");
91 else
92 ent->s.modelindex4 = 0;
93
94 if(ent->leftarm> 0 && ent->rightarm > 0)
95 ent->s.modelindex3 = gi.modelindex ("players/cyborg/botharms.md2");
96 else if(ent->leftarm > 0 && !ent->rightarm)
97 ent->s.modelindex3 = gi.modelindex ("players/cyborg/limb_larm.md2");
98 else if(!ent->leftarm && ent->rightarm > 0)
99 ent->s.modelindex3 = gi.modelindex ("players/cyborg/limb_rarm.md2");
100 }
101 else if (IsFemale(ent))
102 {
103 if(ent->leftleg > 0 && ent->rightleg > 0)
104 ent->s.modelindex4 = gi.modelindex ("players/female/bothlegs.md2");
105 else if(ent->leftleg > 0 && !ent->rightleg)
106 ent->s.modelindex4 = gi.modelindex ("players/female/limb_lleg.md2");
107 else if(!ent->leftleg && ent->rightleg> 0)
108 ent->s.modelindex4 = gi.modelindex ("players/female/limb_rleg.md2");
109 else
110 ent->s.modelindex4 = 0;
111
112 if(ent->leftarm> 0 && ent->rightarm > 0)
113 ent->s.modelindex3 = gi.modelindex ("players/female/botharms.md2");
114 else if(ent->leftarm > 0 && !ent->rightarm)
115 ent->s.modelindex3 = gi.modelindex ("players/female/limb_larm.md2");
116 else if(!ent->leftarm && ent->rightarm > 0)
117 ent->s.modelindex3 = gi.modelindex ("players/female/limb_rarm.md2");
118 }
119 else
120 {
121 if(ent->leftleg > 0 && ent->rightleg > 0)
122 ent->s.modelindex4 = gi.modelindex ("players/male/bothlegs.md2");
123 else if(ent->leftleg > 0 && !ent->rightleg)
124 ent->s.modelindex4 = gi.modelindex ("players/male/limb_lleg.md2");
125 else if(!ent->leftleg && ent->rightleg> 0)
126 ent->s.modelindex4 = gi.modelindex ("players/male/limb_rleg.md2");
127 else
128 ent->s.modelindex4 = 0;
129
130 if(ent->leftarm> 0 && ent->rightarm > 0)
131 ent->s.modelindex3 = gi.modelindex ("players/male/botharms.md2");
132 else if(ent->leftarm > 0 && !ent->rightarm)
133 ent->s.modelindex3 = gi.modelindex ("players/male/limb_larm.md2");
134 else if(!ent->leftarm && ent->rightarm > 0)
135 ent->s.modelindex3 = gi.modelindex ("players/male/limb_rarm.md2");
136 }
137
138 if(!ent->leftarm && !ent->rightarm)
139 {
140 ent->s.modelindex3 = 0;
141 ent->s.modelindex2 = 0;
142 }
143 else if(!ent->s.modelindex2)
144 ent->s.modelindex2 = 255;
145
146 if(ent->client->cloak_framenum > level.framenum )
147 {
148 ent->s.modelindex4 = 0;
149 ent->s.modelindex3 = 0;
150 // ent->s.modelindex2 = 0;
151 }
152
153
154 }
155
Leper_NoLegs(edict_t * ent)156 void Leper_NoLegs(edict_t *ent)
157 {
158 if(!action->value)
159 return;
160
161 if(!ent->leftleg && !ent->rightleg)
162 {
163 stuffcmd (ent, "cl_forwardspeed 20\n");
164 stuffcmd (ent, "cl_sidespeed 20\n");
165 }
166 else
167 {
168 stuffcmd (ent, "cl_forwardspeed 200\n");
169 stuffcmd (ent, "cl_sidespeed 200\n");
170 }
171
172 }
173
Leper_NoArms(edict_t * ent)174 void Leper_NoArms(edict_t *ent)
175 {
176
177 }
178
Cmd_KillLeg_f(edict_t * ent)179 void Cmd_KillLeg_f(edict_t *ent)
180 {
181 edict_t *drop;
182 int damage = random() * 100;
183 if(ent->leftleg)
184 {
185 ent->leftleg = 0;
186 ThrowGib (ent, "models/objects/gibs/leg/tris.md2", damage, GIB_ORGANIC);
187
188 Leper_NoLegs(ent);
189 return;
190 }
191 if(ent->rightleg)
192 {
193 ent->rightleg = 0;
194
195 ThrowGib (ent, "models/objects/gibs/leg/tris.md2", damage, GIB_ORGANIC);
196 Leper_NoLegs(ent);
197
198 }
199
200
201 }
202
Cmd_KillArm_f(edict_t * ent)203 void Cmd_KillArm_f(edict_t *ent)
204 {
205
206 int damage = random() * 100;
207 if(ent->leftarm)
208 {
209 ent->leftarm = 0;
210 ThrowGib (ent, "models/objects/gibs/arm/tris.md2", damage, GIB_ORGANIC);
211 //if(!ent->leftarm && !ent->rightarm)
212 // NoAmmoWeaponChange (ent);
213
214 return;
215 }
216 if(ent->rightarm)
217 {
218 ent->rightarm = 0;
219 ThrowGib (ent, "models/objects/gibs/arm/tris.md2", damage, GIB_ORGANIC);
220 //if(!ent->leftarm && !ent->rightarm)
221 // NoAmmoWeaponChange (ent);
222 }
223
224
225 }
Leper_RandomShot(edict_t * ent,int offsetangle)226 int Leper_RandomShot (edict_t *ent, int offsetangle)
227 {
228
229
230 if(ent->leftarm && ent->rightarm)
231 return 0;
232 else if(!ent->leftarm || !ent->rightarm)
233 return ((rand () % offsetangle) - (offsetangle/2));
234 else
235 return ((rand () % (offsetangle*2)) - (offsetangle));
236 }
237
Leper_TDamage(edict_t * targ,edict_t * attacker,vec3_t point,int damage,int mod)238 void Leper_TDamage (edict_t *targ, edict_t *attacker, vec3_t point, int damage, int mod)
239 {
240 edict_t *drop;
241 float xyspeed = sqrt(targ->velocity[0]*targ->velocity[0] + targ->velocity[1]*targ->velocity[1]);
242 int lepmod = mod;
243
244 if (!xyspeed)
245 if(lepmod == LOC_LEFTARM)
246 lepmod = LOC_BACK;
247 else if(lepmod == LOC_BACK)
248 lepmod = LOC_RIGHTARM;
249 else if(lepmod == LOC_RIGHTARM)
250 lepmod = LOC_CHEST;
251 else if(lepmod == LOC_CHEST)
252 lepmod = LOC_LEFTARM;
253
254 //legs crunch if you hit the ground hard
255 if (mod == MOD_FALLING)
256 {
257 if(targ->leftleg)
258 {
259 targ->leftleg-=damage;
260 if(targ->leftleg<0)
261 {
262 damage = targ->leftleg * -1;
263 targ->leftleg = 0;
264
265 if(IsFemale(targ))
266 ThrowGib (targ, "players/female/limb_lleg.md2", damage, GIB_ORGANIC);
267 else if(IsNeutral(targ))
268 ThrowGib (targ, "players/cyborg/limb_lleg.md2", damage, GIB_ORGANIC);
269 else
270 ThrowGib (targ, "players/male/limb_lleg.md2", damage, GIB_ORGANIC);
271 }
272
273 }
274
275 if(targ->rightleg)
276 {
277 targ->rightleg-=damage;
278 if(targ->rightleg<0)
279 {
280 targ->rightleg = 0;
281 damage = targ->leftleg * -1;
282
283 if(IsFemale(targ))
284 ThrowGib (targ, "players/female/limb_rleg.md2", damage, GIB_ORGANIC);
285 else if(IsNeutral(targ))
286 ThrowGib (targ, "players/cyborg/limb_rleg.md2", damage, GIB_ORGANIC);
287 else
288 ThrowGib (targ, "players/male/limb_rleg.md2", damage, GIB_ORGANIC);
289
290 }
291
292 }
293 Leper_NoLegs(targ);
294 }
295
296
297 if (lepmod == LOC_LEFTLEG)
298 {
299 if(targ->leftleg > 0)
300 {
301 targ->leftleg -= damage;
302 if(targ->leftleg <= 0)
303 {
304
305 targ->leftleg = 0;
306
307 if(IsFemale(targ))
308 ThrowGib (targ, "players/female/limb_lleg.md2", damage, GIB_ORGANIC);
309 else if(IsNeutral(targ))
310 ThrowGib (targ, "players/cyborg/limb_lleg.md2", damage, GIB_ORGANIC);
311 else
312 ThrowGib (targ, "players/male/limb_lleg.md2", damage, GIB_ORGANIC);
313
314 Leper_NoLegs(targ);
315 }
316
317 }
318 else
319 {
320 lepmod = LOC_RIGHTLEG;
321 }
322
323 }
324 if (lepmod == LOC_RIGHTLEG && targ->rightleg > 0)
325 {
326 if(targ->rightleg > 0)
327 {
328 targ->rightleg -= damage;
329 if(targ->rightleg <= 0)
330 {
331 targ->rightleg = 0;
332
333
334 if(IsFemale(targ))
335 ThrowGib (targ, "players/female/limb_rleg.md2", damage, GIB_ORGANIC);
336 else if(IsNeutral(targ))
337 ThrowGib (targ, "players/cyborg/limb_rleg.md2", damage, GIB_ORGANIC);
338 else
339 ThrowGib (targ, "players/male/limb_rleg.md2", damage, GIB_ORGANIC);
340
341 Leper_NoLegs(targ);
342 }
343
344 }
345 else
346 {
347 lepmod = LOC_LEFTLEG;
348 }
349 }
350 if (lepmod == LOC_LEFTLEG)
351 {
352 if(targ->leftleg > 0)
353 {
354 targ->leftleg -= damage;
355 if(targ->leftleg <= 0)
356 {
357 targ->leftleg = 0;
358
359 if(IsFemale(targ))
360 ThrowGib (targ, "players/female/limb_lleg.md2", damage, GIB_ORGANIC);
361 else if(IsNeutral(targ))
362 ThrowGib (targ, "players/cyborg/limb_lleg.md2", damage, GIB_ORGANIC);
363 else
364 ThrowGib (targ, "players/male/limb_lleg.md2", damage, GIB_ORGANIC);
365
366 Leper_NoLegs(targ);
367 }
368
369 }
370
371
372
373 }
374 if (lepmod == LOC_LEFTARM && targ->leftarm > 0)
375 {
376 targ->leftarm -= damage;
377 if(targ->leftarm <= 0)
378 {
379 targ->leftarm=0;
380
381 if(IsFemale(targ))
382 ThrowGib (targ, "players/female/limb_larm.md2", damage, GIB_ORGANIC);
383 else if(IsNeutral(targ))
384 ThrowGib (targ, "players/cyborg/limb_larm.md2", damage, GIB_ORGANIC);
385 else
386 ThrowGib (targ, "players/male/limb_larm.md2", damage, GIB_ORGANIC);
387
388
389 // if(!targ->leftarm && !targ->rightarm)
390 // NoAmmoWeaponChange (targ);
391 }
392
393
394 }
395 if (lepmod == LOC_RIGHTARM && targ->rightarm > 0)
396 {
397 targ->rightarm -= damage;
398 if(targ->rightarm <= 0)
399 {
400 targ->rightarm=0;
401 if(IsFemale(targ))
402 ThrowGib (targ, "players/female/limb_rarm.md2", damage, GIB_ORGANIC);
403 else if(IsNeutral(targ))
404 ThrowGib (targ, "players/cyborg/limb_rarm.md2", damage, GIB_ORGANIC);
405 else
406 ThrowGib (targ, "players/male/limb_rarm.md2", damage, GIB_ORGANIC);
407
408
409 // if(!targ->leftarm && !targ->rightarm)
410 // NoAmmoWeaponChange (targ);
411 }
412
413 }
414
415
416
417 //leper
418 }
419
ThrowUpNow(edict_t * self,int limb)420 void ThrowUpNow(edict_t *self, int limb)
421 {
422 // use some local vector variables to work with
423 vec3_t forward, right;
424 vec3_t mouth_pos, spew_vector;
425
426 if(self->deadflag)
427 return;
428
429 if(random() > 0.01)
430 return;
431
432 // set the spew vector, based on the client's view angle
433
434
435 // Make the spew originate from our limb
436 if(limb == LOC_LEFTARM)
437 {
438 VectorCopy (self->client->v_angle, forward);
439 forward[YAW]=self->client->v_angle[YAW] - 90;
440 AngleVectors (forward, forward, right, NULL);
441
442 VectorCopy (self->s.origin, mouth_pos);
443 if(!self->leftleg && !self->rightleg)
444 mouth_pos[2] += 2;
445 else
446 mouth_pos[2] += 11;
447 VectorScale (forward, 1, spew_vector);
448
449 gi.WriteByte (svc_temp_entity);
450 gi.WriteByte (TE_BLOOD);
451 gi.WritePosition (mouth_pos);
452 gi.WriteDir (forward);
453 gi.multicast (mouth_pos, MULTICAST_PVS);
454 }
455 if(limb == LOC_RIGHTARM)
456 {
457 VectorCopy (self->client->v_angle, forward);
458 forward[YAW]=self->client->v_angle[YAW] + 90;
459 AngleVectors (forward, forward, right, NULL);
460
461 VectorCopy (self->s.origin, mouth_pos);
462 if(!self->leftleg && !self->rightleg)
463 mouth_pos[2] += 2;
464 else
465 mouth_pos[2] += 11;
466 VectorScale (forward, 1, spew_vector);
467 gi.WriteByte (svc_temp_entity);
468 gi.WriteByte (TE_BLOOD);
469 gi.WritePosition (mouth_pos);
470 gi.WriteDir (forward);
471 gi.multicast (mouth_pos, MULTICAST_PVS);
472 }
473 if(limb == LOC_LEFTLEG)
474 {
475 VectorCopy (self->client->v_angle, forward);
476 forward[YAW]=self->client->v_angle[YAW] - 90;
477 forward[ROLL]=self->client->v_angle[ROLL] - 45;
478 AngleVectors (forward, forward, right, NULL);
479
480
481 VectorCopy (self->s.origin, mouth_pos);
482 mouth_pos[2] -= 11;
483 VectorScale (forward, 1, spew_vector);
484
485 gi.WriteByte (svc_temp_entity);
486 gi.WriteByte (TE_BLOOD);
487 gi.WritePosition (mouth_pos);
488 gi.WriteDir (forward);
489 gi.multicast (mouth_pos, MULTICAST_PVS);
490 }
491 if(limb == LOC_RIGHTLEG)
492 {
493 VectorCopy (self->client->v_angle, forward);
494 forward[YAW]=self->client->v_angle[YAW] + 90;
495 forward[ROLL]=self->client->v_angle[ROLL] + 45;
496 AngleVectors (forward, forward, right, NULL);
497
498 VectorCopy (self->s.origin, mouth_pos);
499 mouth_pos[2] -= 11;
500 VectorScale (forward, 1, spew_vector);
501
502 gi.WriteByte (svc_temp_entity);
503 gi.WriteByte (TE_BLOOD);
504 gi.WritePosition (mouth_pos);
505 gi.WriteDir (forward);
506 gi.multicast (mouth_pos, MULTICAST_PVS);
507 }
508
509 }
510
511