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