// 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