#ifndef COMMON_UTIL_H
#define COMMON_UTIL_H
+#ifndef MENUQC
+
+vector real_origin(entity ent);
+#endif
+
// this returns a tempstring containing a copy of s with additional \n newlines added, it also replaces \n in the text with a real newline
// NOTE: s IS allowed to be a tempstring
string wordwrap(string s, float l);
float median(float a, float b, float c);
// converts a number to a string with the indicated number of decimals
-// works for up to 10 decimals!
string ftos_decimals(float number, float decimals);
+string ftos_mindecimals(float number);
bool fexists(string f);
float power2of(float e);
float log2of(float x);
-const string HEXDIGITS = "0123456789ABCDEF0123456789abcdef";
-#define HEXDIGIT_TO_DEC_RAW(d) (strstrofs(HEXDIGITS, (d), 0))
-#define HEXDIGIT_TO_DEC(d) ((HEXDIGIT_TO_DEC_RAW(d) | 0x10) - 0x10)
-#define DEC_TO_HEXDIGIT(d) (substring(HEXDIGITS, (d), 1))
-
vector rgb_to_hsl(vector rgb);
vector hsl_to_rgb(vector hsl);
vector rgb_to_hsv(vector rgb);
float boxesoverlap(vector m1, vector m2, vector m3, vector m4);
float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs);
-typedef float(string s, vector size) textLengthUpToWidth_widthFunction_t;
-typedef float(string s) textLengthUpToLength_lenFunction_t;
+USING(textLengthUpToWidth_widthFunction_t, float(string s, vector size));
+USING(textLengthUpToLength_lenFunction_t, float(string s));
float textLengthUpToWidth(string theText, float maxWidth, vector size, textLengthUpToWidth_widthFunction_t tw);
string textShortenToWidth(string theText, float maxWidth, vector size, textLengthUpToWidth_widthFunction_t tw);
float textLengthUpToLength(string theText, float maxWidth, textLengthUpToLength_lenFunction_t tw);
#ifndef MENUQC
#ifdef CSQC
int ReadInt24_t();
-vector ReadInt48_t();
-vector ReadInt72_t();
#else
void WriteInt24_t(float dest, float val);
void WriteInt48_t(float dest, vector val);
float gsl_ran_gaussian(float sigma);
-string car(string s); // returns first word
-string cdr(string s); // returns all but first word
float matchacl(string acl, string str); // matches str against ACL acl (with entries +foo*, +foo, +*foo, +*foo*, and same with - for forbidding)
-float startsWith(string haystack, string needle);
-float startsWithNocase(string haystack, string needle);
string get_model_datafilename(string mod, float skn, string fil); // skin -1 will return wildcard, mod string_null will also put wildcard there
string get_model_parameters_modelname;
string get_model_parameters_desc;
float get_model_parameters(string mod, float skn); // call with string_null to clear; skin -1 means mod is the filename of the txt file and is to be split
-vector vec2(vector v);
-
#ifndef MENUQC
vector NearestPointOnBox(entity box, vector org);
#endif
string xencode(float f);
float xdecode(string s);
-#ifdef CSQC
-entity ReadCSQCEntity();
-#endif
-
#ifndef MENUQC
string strtolower(string s);
#endif
// as it may exceed 0..1 bounds, or go in reverse
float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor);
-typedef entity(entity cur, entity near, entity pass) findNextEntityNearFunction_t;
-typedef float(entity a, entity b, entity pass) isConnectedFunction_t;
+USING(findNextEntityNearFunction_t, entity(entity cur, entity near, entity pass));
+USING(isConnectedFunction_t, float(entity a, entity b, entity pass));
void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t nxt, isConnectedFunction_t iscon, entity pass);
// expand multiple arguments into one argument by stripping parenthesis
#define normal_or_gentle(normal, gentle) (GENTLE ? ((gentle != "") ? gentle : normal) : normal)
#endif
-// allow writing to also pass through to spectators (like so spectators see the same centerprints as players for example)
-#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) entity varname; varname = msg_entity; FOR_EACH_REALCLIENT(msg_entity) if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) statement msg_entity = varname
-#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
-#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0
-
-vector vec3(float x, float y, float z);
-
#ifndef MENUQC
vector animfixfps(entity e, vector a, vector b);
#endif
-#ifdef SVQC
-void dedicated_print(string input);
-#endif
-
#ifndef MENUQC
const float CNT_NORMAL = 1;
const float CNT_GAMESTART = 2;
const float CNT_KILL = 4;
const float CNT_RESPAWN = 5;
const float CNT_ROUNDSTART = 6;
-float Announcer_PickNumber(float type, float num);
+entity Announcer_PickNumber(float type, float num);
#endif
#ifndef MENUQC