1 #include "g_local.h"
2 
pointinback(edict_t * self,vec3_t point)3 qboolean pointinback (edict_t *self, vec3_t point)
4 {
5 	vec3_t	vec;
6 	float	dot;
7 	vec3_t	forward;
8 
9 	AngleVectors (self->s.angles, forward, NULL, NULL);
10 	VectorSubtract (point, self->s.origin, vec);
11 	VectorNormalize (vec);
12 	dot = DotProduct (vec, forward);
13 
14 	if (dot < -0.3)
15 		return true;
16 	return false;
17 }
pointinfront(edict_t * self,vec3_t point)18 qboolean pointinfront (edict_t *self, vec3_t point)
19 {
20 	vec3_t	vec;
21 	float	dot;
22 	vec3_t	forward;
23 
24 	AngleVectors (self->s.angles, forward, NULL, NULL);
25 	VectorSubtract (point, self->s.origin, vec);
26 	VectorNormalize (vec);
27 	dot = DotProduct (vec, forward);
28 
29 	if (dot > 0.3)
30 		return true;
31 	return false;
32 }
pointabove(edict_t * self,vec3_t point)33 qboolean pointabove (edict_t *self, vec3_t point)
34 {
35 	vec3_t	vec;
36 	float	dot;
37 	vec3_t	up;
38 
39 	AngleVectors (self->s.angles, NULL, NULL, up);
40 	VectorSubtract (point, self->s.origin, vec);
41 	VectorNormalize (vec);
42 	dot = DotProduct (vec, up);
43 
44 	if (dot > 0.3)
45 		return true;
46 	return false;
47 }
pointbelow(edict_t * self,vec3_t point)48 qboolean pointbelow (edict_t *self, vec3_t point)
49 {
50 	vec3_t	vec;
51 	float	dot;
52 	vec3_t	up;
53 
54 	AngleVectors (self->s.angles, NULL, NULL, up);
55 	VectorSubtract (point, self->s.origin, vec);
56 	VectorNormalize (vec);
57 	dot = DotProduct (vec, up);
58 
59 	if (dot < -0.3)
60 		return true;
61 	return false;
62 }
63 
64 // checks if behind (not sides)
inback(edict_t * self,edict_t * other)65 qboolean inback (edict_t *self, edict_t *other)
66 {
67 	vec3_t	vec;
68 	float	dot;
69 	vec3_t	forward;
70 
71 	AngleVectors (self->s.angles, forward, NULL, NULL);
72 	VectorSubtract (other->s.origin, self->s.origin, vec);
73 	VectorNormalize (vec);
74 	dot = DotProduct (vec, forward);
75 
76 	if (dot < -0.3)
77 		return true;
78 	return false;
79 }
MatrixApplyLocationDamage(edict_t * targ,vec3_t point,int mod,int damage)80 int MatrixApplyLocationDamage (edict_t *targ, vec3_t point, int mod, int damage)
81 {
82 	vec3_t hitpos;
83 
84 	VectorSubtract(point, targ->s.origin, hitpos);
85 
86 	if (!( mod == MOD_BLASTER	   || mod == MOD_SHOTGUN  || mod == MOD_SSHOTGUN
87 		|| mod == MOD_HYPERBLASTER || mod == MOD_CHAINGUN || mod == MOD_MACHINEGUN
88 		|| mod == MOD_ROCKET	   || mod == MOD_GRENADE  || mod == MOD_HANDGRENADE
89 		|| mod == MOD_RAILGUN	   || mod == MOD_KICK	  || mod == MOD_SWEEP
90 		|| mod == MOD_HOVER		   || mod == MOD_SNIPER	  || mod == MOD_AK_MK23
91 		|| mod == MOD_HOOK		  ||  mod == MOD_JAB	  ||  mod == MOD_UNKNOWN))
92 		return LOC_NULL;
93 
94 	if (fabs((targ->s.origin[2] + targ->viewheight) - point[2]) <= 4)
95 	{
96 		damage *= 2;
97 		if (pointinfront(targ, point))
98 			return LOC_FACE;
99 		else
100 			return LOC_HEAD;
101 	}
102 	else if (((targ->s.origin[2] + targ->viewheight) - point[2]) < 20)// if (hitpos[2] > 0)
103 	{
104 		if (pointinfront(targ, point))
105 			return LOC_CHEST;
106 		else if (pointinback(targ, point))
107 			return LOC_BACK;
108 		else if (hitpos[1] > 0)
109 			return LOC_RIGHTARM;
110 		else
111 			return LOC_LEFTARM;
112 	}
113 	else
114 	{
115 		damage *= 0.8;
116 		if (hitpos[1] > 0)
117 			return LOC_RIGHTLEG;
118 		else
119 			return LOC_LEFTLEG;
120 	}
121 }
122 
123