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