78 lines
1.5 KiB
Plaintext
78 lines
1.5 KiB
Plaintext
// common.qc: common functions
|
|
|
|
float() crandom = {
|
|
return 2 * (random() - 0.5);
|
|
};
|
|
|
|
float(float x, float y) max = {
|
|
return x < y ? y : x;
|
|
};
|
|
|
|
float(float x, float y) min = {
|
|
return x < y ? x : y;
|
|
};
|
|
|
|
float(float x, float mi, float ma) minmax = {
|
|
return min(max(x, mi), ma);
|
|
};
|
|
|
|
/* returns the range catagorization of an entity reletive to self
|
|
* 0 melee range, will become hostile even if back is turned
|
|
* 1 visibility and infront, or visibility and show hostile
|
|
* 2 infront and show hostile
|
|
* 3 only triggered by damage
|
|
*/
|
|
float(entity targ) range = {
|
|
vector spot1, spot2;
|
|
float r;
|
|
spot1 = self.origin + self.view_ofs;
|
|
spot2 = targ.origin + targ.view_ofs;
|
|
|
|
r = vlen(spot1 - spot2);
|
|
if(r < 120) {
|
|
return RANGE_MELEE;
|
|
}
|
|
if(r < 500) {
|
|
return RANGE_NEAR;
|
|
}
|
|
if(r < 1000) {
|
|
return RANGE_MID;
|
|
}
|
|
return RANGE_FAR;
|
|
};
|
|
|
|
// returns 1 if the entity is visible to self, even if not infront()
|
|
float(entity targ) visible = {
|
|
vector spot1, spot2;
|
|
|
|
spot1 = self.origin + self.view_ofs;
|
|
spot2 = targ.origin + targ.view_ofs;
|
|
traceline(spot1, spot2, TRUE, self); // see through other monsters
|
|
|
|
if(trace_inopen && trace_inwater) {
|
|
return FALSE; // sight line crossed contents
|
|
}
|
|
|
|
if(trace_fraction == 1) {
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
};
|
|
|
|
// returns 1 if the entity is in front(in sight) of self
|
|
float(entity targ) infront = {
|
|
vector vec;
|
|
float dot;
|
|
|
|
makevectors(self.angles);
|
|
vec = normalize(targ.origin - self.origin);
|
|
dot = vec * v_forward;
|
|
|
|
if(dot > 0.3) {
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
};
|
|
|
|
// EOF
|