]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/util.qc
Include hmg and rpc in the weapon priority lists
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / util.qc
index a6a57c7dfc8ff126095a778b8e52c30d9decb311..e0b501c258ad0453c78c1d8b67b61df392d4a162 100644 (file)
@@ -5,19 +5,39 @@
     #include "constants.qh"
        #include "../client/mutators/events.qh"
     #include "mapinfo.qh"
-    #include "notifications.qh"
-    #include "deathtypes/all.qh"
+    #include "notifications/all.qh"
+    #include <common/deathtypes/all.qh>
 #elif defined(MENUQC)
 #elif defined(SVQC)
     #include "constants.qh"
     #include "../server/autocvars.qh"
     #include "../server/defs.qh"
        #include "../server/mutators/events.qh"
-    #include "notifications.qh"
-    #include "deathtypes/all.qh"
+    #include "notifications/all.qh"
+    #include <common/deathtypes/all.qh>
     #include "mapinfo.qh"
 #endif
 
+#ifdef GAMEQC
+/*
+* Get "real" origin, in worldspace, even if ent is attached to something else.
+*/
+vector real_origin(entity ent)
+{
+       entity e;
+       vector v = ((ent.absmin + ent.absmax) * 0.5);
+
+       e = ent.tag_entity;
+       while(e)
+       {
+               v = v + ((e.absmin + e.absmax) * 0.5);
+               e = e.tag_entity;
+       }
+
+       return v;
+}
+#endif
+
 string wordwrap_buffer;
 
 void wordwrap_buffer_put(string s)
@@ -35,29 +55,30 @@ string wordwrap(string s, float l)
        return r;
 }
 
-#ifndef MENUQC
-#ifndef CSQC
+#ifdef SVQC
+entity _wordwrap_buffer_sprint_ent;
 void wordwrap_buffer_sprint(string s)
-{SELFPARAM();
+{
        wordwrap_buffer = strcat(wordwrap_buffer, s);
        if(s == "\n")
        {
-               sprint(self, wordwrap_buffer);
+               sprint(_wordwrap_buffer_sprint_ent, wordwrap_buffer);
                wordwrap_buffer = "";
        }
 }
 
-void wordwrap_sprint(string s, float l)
-{SELFPARAM();
+void wordwrap_sprint(entity to, string s, float l)
+{
        wordwrap_buffer = "";
+       _wordwrap_buffer_sprint_ent = to;
        wordwrap_cb(s, l, wordwrap_buffer_sprint);
+       _wordwrap_buffer_sprint_ent = NULL;
        if(wordwrap_buffer != "")
-               sprint(self, strcat(wordwrap_buffer, "\n"));
+               sprint(to, strcat(wordwrap_buffer, "\n"));
        wordwrap_buffer = "";
        return;
 }
 #endif
-#endif
 
 #ifndef SVQC
 string draw_UseSkinFor(string pic)
@@ -163,205 +184,6 @@ void depthfirst(entity start, .entity up, .entity downleft, .entity right, void(
        }
 }
 
-// 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)
-{
-       // inhibit stupid negative zero
-       if(number == 0)
-               number = 0;
-       // we have sprintf...
-       return sprintf("%.*f", decimals, number);
-}
-
-// Databases (hash tables)
-const float DB_BUCKETS = 8192;
-void db_save(float db, string pFilename)
-{
-       float fh, i, n;
-       fh = fopen(pFilename, FILE_WRITE);
-       if(fh < 0)
-       {
-               LOG_INFO(strcat("^1Can't write DB to ", pFilename));
-               return;
-       }
-       n = buf_getsize(db);
-       fputs(fh, strcat(ftos(DB_BUCKETS), "\n"));
-       for(i = 0; i < n; ++i)
-               fputs(fh, strcat(bufstr_get(db, i), "\n"));
-       fclose(fh);
-}
-
-int db_create()
-{
-       return buf_create();
-}
-
-int db_load(string pFilename)
-{
-       float db, fh, i, j, n;
-       string l;
-       db = buf_create();
-       if(db < 0)
-               return -1;
-       fh = fopen(pFilename, FILE_READ);
-       if(fh < 0)
-               return db;
-       l = fgets(fh);
-       if(stof(l) == DB_BUCKETS)
-       {
-               i = 0;
-               while((l = fgets(fh)))
-               {
-                       if(l != "")
-                               bufstr_set(db, i, l);
-                       ++i;
-               }
-       }
-       else
-       {
-               // different count of buckets, or a dump?
-               // need to reorganize the database then (SLOW)
-               //
-               // note: we also parse the first line (l) in case the DB file is
-               // missing the bucket count
-               do
-               {
-                       n = tokenizebyseparator(l, "\\");
-                       for(j = 2; j < n; j += 2)
-                               db_put(db, argv(j-1), uri_unescape(argv(j)));
-               }
-               while((l = fgets(fh)));
-       }
-       fclose(fh);
-       return db;
-}
-
-void db_dump(float db, string pFilename)
-{
-       float fh, i, j, n, m;
-       fh = fopen(pFilename, FILE_WRITE);
-       if(fh < 0)
-               error(strcat("Can't dump DB to ", pFilename));
-       n = buf_getsize(db);
-       fputs(fh, "0\n");
-       for(i = 0; i < n; ++i)
-       {
-               m = tokenizebyseparator(bufstr_get(db, i), "\\");
-               for(j = 2; j < m; j += 2)
-                       fputs(fh, strcat("\\", argv(j-1), "\\", argv(j), "\n"));
-       }
-       fclose(fh);
-}
-
-void db_close(float db)
-{
-       buf_del(db);
-}
-
-string db_get(float db, string pKey)
-{
-       float h;
-       h = crc16(false, pKey) % DB_BUCKETS;
-       return uri_unescape(infoget(bufstr_get(db, h), pKey));
-}
-
-void db_put(float db, string pKey, string pValue)
-{
-       float h;
-       h = crc16(false, pKey) % DB_BUCKETS;
-       bufstr_set(db, h, infoadd(bufstr_get(db, h), pKey, uri_escape(pValue)));
-}
-
-void db_test()
-{
-       float db, i;
-       LOG_INFO("LOAD...\n");
-       db = db_load("foo.db");
-       LOG_INFO("LOADED. FILL...\n");
-       for(i = 0; i < DB_BUCKETS; ++i)
-               db_put(db, ftos(random()), "X");
-       LOG_INFO("FILLED. SAVE...\n");
-       db_save(db, "foo.db");
-       LOG_INFO("SAVED. CLOSE...\n");
-       db_close(db);
-       LOG_INFO("CLOSED.\n");
-}
-
-// Multiline text file buffers
-int buf_load(string pFilename)
-{
-       float buf, fh, i;
-       string l;
-       buf = buf_create();
-       if(buf < 0)
-               return -1;
-       fh = fopen(pFilename, FILE_READ);
-       if(fh < 0)
-       {
-               buf_del(buf);
-               return -1;
-       }
-       i = 0;
-       while((l = fgets(fh)))
-       {
-               bufstr_set(buf, i, l);
-               ++i;
-       }
-       fclose(fh);
-       return buf;
-}
-
-void buf_save(float buf, string pFilename)
-{
-       float fh, i, n;
-       fh = fopen(pFilename, FILE_WRITE);
-       if(fh < 0)
-               error(strcat("Can't write buf to ", pFilename));
-       n = buf_getsize(buf);
-       for(i = 0; i < n; ++i)
-               fputs(fh, strcat(bufstr_get(buf, i), "\n"));
-       fclose(fh);
-}
-
-string format_time(float seconds)
-{
-       float days, hours, minutes;
-       seconds = floor(seconds + 0.5);
-        days = floor(seconds / 864000);
-        seconds -= days * 864000;
-        hours = floor(seconds / 36000);
-        seconds -= hours * 36000;
-       minutes = floor(seconds / 600);
-       seconds -= minutes * 600;
-        if (days > 0)
-                return sprintf(_("%d days, %02d:%02d:%02d"), days, hours, minutes, seconds);
-        else
-                return sprintf(_("%02d:%02d:%02d"), hours, minutes, seconds);
-}
-
-string mmsss(float tenths)
-{
-       float minutes;
-       string s;
-       tenths = floor(tenths + 0.5);
-       minutes = floor(tenths / 600);
-       tenths -= minutes * 600;
-       s = ftos(1000 + tenths);
-       return strcat(ftos(minutes), ":", substring(s, 1, 2), ".", substring(s, 3, 1));
-}
-
-string mmssss(float hundredths)
-{
-       float minutes;
-       string s;
-       hundredths = floor(hundredths + 0.5);
-       minutes = floor(hundredths / 6000);
-       hundredths -= minutes * 6000;
-       s = ftos(10000 + hundredths);
-       return strcat(ftos(minutes), ":", substring(s, 1, 2), ".", substring(s, 3, 2));
-}
-
 string ScoreString(int pFlags, float pValue)
 {
        string valstr;
@@ -473,7 +295,7 @@ float compressShortVector(vector vec)
 {
        vector ang;
        float p, y, len;
-       if(vlen(vec) == 0)
+       if(vec == '0 0 0')
                return 0;
        //print("compress: ", vtos(vec), "\n");
        ang = vectoangles(vec);
@@ -501,7 +323,7 @@ float compressShortVector(vector vec)
        return (p * 0x1000) + (y * 0x80) + len;
 }
 
-void compressShortVector_init()
+STATIC_INIT(compressShortVector)
 {
        float l = 1;
        float f = pow(2, 1/8);
@@ -528,7 +350,7 @@ void compressShortVector_init()
        }
 }
 
-#ifndef MENUQC
+#ifdef GAMEQC
 float CheckWireframeBox(entity forent, vector v0, vector dvx, vector dvy, vector dvz)
 {
        traceline(v0, v0 + dvx, true, forent); if(trace_fraction < 1) return 0;
@@ -575,6 +397,9 @@ string fixPriorityList(string order, float from, float to, float subtract, float
                n = tokenize_console(neworder);
                for(w = to; w >= from; --w)
                {
+                       float wflags = Weapons_from(w).spawnflags;
+                       if(wflags & WEP_FLAG_HIDDEN && wflags & WEP_FLAG_MUTATORBLOCKED && !(wflags & WEP_FLAG_NORMAL))
+                               continue;
                        for(i = 0; i < n; ++i)
                                if(stof(argv(i)) == w)
                                        break;
@@ -624,24 +449,7 @@ string swapInPriorityList(string order, float i, float j)
        return order;
 }
 
-float cvar_value_issafe(string s)
-{
-       if(strstrofs(s, "\"", 0) >= 0)
-               return 0;
-       if(strstrofs(s, "\\", 0) >= 0)
-               return 0;
-       if(strstrofs(s, ";", 0) >= 0)
-               return 0;
-       if(strstrofs(s, "$", 0) >= 0)
-               return 0;
-       if(strstrofs(s, "\r", 0) >= 0)
-               return 0;
-       if(strstrofs(s, "\n", 0) >= 0)
-               return 0;
-       return 1;
-}
-
-#ifndef MENUQC
+#ifdef GAMEQC
 void get_mi_min_max(float mode)
 {
        vector mi, ma;
@@ -665,7 +473,7 @@ void get_mi_min_max(float mode)
 
        mi_min = mi;
        mi_max = ma;
-       MapInfo_Get_ByName(mi_shortname, 0, 0);
+       MapInfo_Get_ByName(mi_shortname, 0, NULL);
        if(MapInfo_Map_mins.x < MapInfo_Map_maxs.x)
        {
                mi_min = MapInfo_Map_mins;
@@ -682,7 +490,7 @@ void get_mi_min_max(float mode)
                                         '0 1 0' * ma.y + '0 0 1' * ma.z,
                                         '1 0 0' * ma.x,
                                         MOVE_WORLDONLY,
-                                        world);
+                                        NULL);
                        if(!trace_startsolid)
                                mi_min.x = trace_endpos.x;
 
@@ -691,7 +499,7 @@ void get_mi_min_max(float mode)
                                         '1 0 0' * ma.x + '0 0 1' * ma.z,
                                         '0 1 0' * ma.y,
                                         MOVE_WORLDONLY,
-                                        world);
+                                        NULL);
                        if(!trace_startsolid)
                                mi_min.y = trace_endpos.y;
 
@@ -700,7 +508,7 @@ void get_mi_min_max(float mode)
                                         '1 0 0' * ma.x + '0 1 0' * ma.y,
                                         '0 0 1' * ma.z,
                                         MOVE_WORLDONLY,
-                                        world);
+                                        NULL);
                        if(!trace_startsolid)
                                mi_min.z = trace_endpos.z;
 
@@ -709,7 +517,7 @@ void get_mi_min_max(float mode)
                                         '0 1 0' * ma.y + '0 0 1' * ma.z,
                                         '1 0 0' * mi.x,
                                         MOVE_WORLDONLY,
-                                        world);
+                                        NULL);
                        if(!trace_startsolid)
                                mi_max.x = trace_endpos.x;
 
@@ -718,7 +526,7 @@ void get_mi_min_max(float mode)
                                         '1 0 0' * ma.x + '0 0 1' * ma.z,
                                         '0 1 0' * mi.y,
                                         MOVE_WORLDONLY,
-                                        world);
+                                        NULL);
                        if(!trace_startsolid)
                                mi_max.y = trace_endpos.y;
 
@@ -727,7 +535,7 @@ void get_mi_min_max(float mode)
                                         '1 0 0' * ma.x + '0 1 0' * ma.y,
                                         '0 0 1' * mi.z,
                                         MOVE_WORLDONLY,
-                                        world);
+                                        NULL);
                        if(!trace_startsolid)
                                mi_max.z = trace_endpos.z;
                }
@@ -780,13 +588,12 @@ void get_mi_min_max_texcoords(float mode)
 float cvar_settemp(string tmp_cvar, string tmp_value)
 {
        float created_saved_value;
-       entity e;
 
        created_saved_value = 0;
 
        if (!(tmp_cvar || tmp_value))
        {
-               LOG_TRACE("Error: Invalid usage of cvar_settemp(string, string); !\n");
+               LOG_TRACE("Error: Invalid usage of cvar_settemp(string, string); !");
                return 0;
        }
 
@@ -796,15 +603,17 @@ float cvar_settemp(string tmp_cvar, string tmp_value)
                return 0;
        }
 
-       for(e = world; (e = find(e, classname, "saved_cvar_value")); )
-               if(e.netname == tmp_cvar)
-                       created_saved_value = -1; // skip creation
+       IL_EACH(g_saved_cvars, it.netname == tmp_cvar,
+       {
+               created_saved_value = -1; // skip creation
+               break; // no need to continue
+       });
 
        if(created_saved_value != -1)
        {
                // creating a new entity to keep track of this cvar
-               e = new(saved_cvar_value);
-               make_pure(e);
+               entity e = new_pure(saved_cvar_value);
+               IL_PUSH(g_saved_cvars, e);
                e.netname = strzone(tmp_cvar);
                e.message = strzone(cvar_string(tmp_cvar));
                created_saved_value = 1;
@@ -816,167 +625,41 @@ float cvar_settemp(string tmp_cvar, string tmp_value)
        return created_saved_value;
 }
 
-float cvar_settemp_restore()
+int cvar_settemp_restore()
 {
-       float i = 0;
-       entity e = world;
-       while((e = find(e, classname, "saved_cvar_value")))
+       int j = 0;
+       // FIXME this new-style loop fails!
+#if 0
+       FOREACH_ENTITY_CLASS("saved_cvar_value", true,
        {
-               if(cvar_type(e.netname))
+               if(cvar_type(it.netname))
                {
-                       cvar_set(e.netname, e.message);
-                       remove(e);
-                       ++i;
+                       cvar_set(it.netname, it.message);
+                       strunzone(it.netname);
+                       strunzone(it.message);
+                       delete(it);
+                       ++j;
                }
                else
-                       LOG_INFOF("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname);
-       }
-
-       return i;
-}
+                       LOG_INFOF("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", it.netname);
+       });
 
-float rgb_mi_ma_to_hue(vector rgb, float mi, float ma)
-{
-       if(mi == ma)
-               return 0;
-       else if(ma == rgb.x)
+#else
+       entity e = NULL;
+       while((e = find(e, classname, "saved_cvar_value")))
        {
-               if(rgb.y >= rgb.z)
-                       return (rgb.y - rgb.z) / (ma - mi);
+               if(cvar_type(e.netname))
+               {
+                       cvar_set(e.netname, e.message);
+                       delete(e);
+                       ++j;
+               }
                else
-                       return (rgb.y - rgb.z) / (ma - mi) + 6;
+                       print(sprintf("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname));
        }
-       else if(ma == rgb.y)
-               return (rgb.z - rgb.x) / (ma - mi) + 2;
-       else // if(ma == rgb_z)
-               return (rgb.x - rgb.y) / (ma - mi) + 4;
-}
-
-vector hue_mi_ma_to_rgb(float hue, float mi, float ma)
-{
-       vector rgb;
-
-       hue -= 6 * floor(hue / 6);
-
-       //else if(ma == rgb_x)
-       //      hue = 60 * (rgb_y - rgb_z) / (ma - mi);
-       if(hue <= 1)
-       {
-               rgb.x = ma;
-               rgb.y = hue * (ma - mi) + mi;
-               rgb.z = mi;
-       }
-       //else if(ma == rgb_y)
-       //      hue = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
-       else if(hue <= 2)
-       {
-               rgb.x = (2 - hue) * (ma - mi) + mi;
-               rgb.y = ma;
-               rgb.z = mi;
-       }
-       else if(hue <= 3)
-       {
-               rgb.x = mi;
-               rgb.y = ma;
-               rgb.z = (hue - 2) * (ma - mi) + mi;
-       }
-       //else // if(ma == rgb_z)
-       //      hue = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
-       else if(hue <= 4)
-       {
-               rgb.x = mi;
-               rgb.y = (4 - hue) * (ma - mi) + mi;
-               rgb.z = ma;
-       }
-       else if(hue <= 5)
-       {
-               rgb.x = (hue - 4) * (ma - mi) + mi;
-               rgb.y = mi;
-               rgb.z = ma;
-       }
-       //else if(ma == rgb_x)
-       //      hue = 60 * (rgb_y - rgb_z) / (ma - mi);
-       else // if(hue <= 6)
-       {
-               rgb.x = ma;
-               rgb.y = mi;
-               rgb.z = (6 - hue) * (ma - mi) + mi;
-       }
-
-       return rgb;
-}
-
-vector rgb_to_hsv(vector rgb)
-{
-       float mi, ma;
-       vector hsv;
-
-       mi = min(rgb.x, rgb.y, rgb.z);
-       ma = max(rgb.x, rgb.y, rgb.z);
-
-       hsv.x = rgb_mi_ma_to_hue(rgb, mi, ma);
-       hsv.z = ma;
-
-       if(ma == 0)
-               hsv.y = 0;
-       else
-               hsv.y = 1 - mi/ma;
-
-       return hsv;
-}
-
-vector hsv_to_rgb(vector hsv)
-{
-       return hue_mi_ma_to_rgb(hsv.x, hsv.z * (1 - hsv.y), hsv.z);
-}
-
-vector rgb_to_hsl(vector rgb)
-{
-       float mi, ma;
-       vector hsl;
-
-       mi = min(rgb.x, rgb.y, rgb.z);
-       ma = max(rgb.x, rgb.y, rgb.z);
-
-       hsl.x = rgb_mi_ma_to_hue(rgb, mi, ma);
-
-       hsl.z = 0.5 * (mi + ma);
-       if(mi == ma)
-               hsl.y = 0;
-       else if(hsl.z <= 0.5)
-               hsl.y = (ma - mi) / (2*hsl.z);
-       else // if(hsl_z > 0.5)
-               hsl.y = (ma - mi) / (2 - 2*hsl.z);
-
-       return hsl;
-}
-
-vector hsl_to_rgb(vector hsl)
-{
-       float mi, ma, maminusmi;
-
-       if(hsl.z <= 0.5)
-               maminusmi = hsl.y * 2 * hsl.z;
-       else
-               maminusmi = hsl.y * (2 - 2 * hsl.z);
-
-       // hsl_z     = 0.5 * mi + 0.5 * ma
-       // maminusmi =     - mi +       ma
-       mi = hsl.z - 0.5 * maminusmi;
-       ma = hsl.z + 0.5 * maminusmi;
-
-       return hue_mi_ma_to_rgb(hsl.x, mi, ma);
-}
+#endif
 
-string rgb_to_hexcolor(vector rgb)
-{
-       return
-               strcat(
-                       "^x",
-                       DEC_TO_HEXDIGIT(floor(rgb.x * 15 + 0.5)),
-                       DEC_TO_HEXDIGIT(floor(rgb.y * 15 + 0.5)),
-                       DEC_TO_HEXDIGIT(floor(rgb.z * 15 + 0.5))
-               );
+       return j;
 }
 
 float textLengthUpToWidth(string theText, float maxWidth, vector theSize, textLengthUpToWidth_widthFunction_t w)
@@ -1251,7 +934,7 @@ string textShortenToLength(string theText, float maxWidth, textLengthUpToLength_
                return strcat(substring(theText, 0, textLengthUpToLength(theText, maxWidth - tw("..."), tw)), "...");
 }
 
-float isGametypeInFilter(float gt, float tp, float ts, string pattern)
+float isGametypeInFilter(Gametype gt, float tp, float ts, string pattern)
 {
        string subpattern, subpattern2, subpattern3, subpattern4;
        subpattern = strcat(",", MapInfo_Type_ToString(gt), ",");
@@ -1297,60 +980,6 @@ float isGametypeInFilter(float gt, float tp, float ts, string pattern)
        return 1;
 }
 
-vector solve_quadratic(float a, float b, float c) // ax^2 + bx + c = 0
-{
-       vector v;
-       float D;
-       v = '0 0 0';
-       if(a == 0)
-       {
-               if(b != 0)
-               {
-                       v.x = v.y = -c / b;
-                       v.z = 1;
-               }
-               else
-               {
-                       if(c == 0)
-                       {
-                               // actually, every number solves the equation!
-                               v.z = 1;
-                       }
-               }
-       }
-       else
-       {
-               D = b*b - 4*a*c;
-               if(D >= 0)
-               {
-                       D = sqrt(D);
-                       if(a > 0) // put the smaller solution first
-                       {
-                               v.x = ((-b)-D) / (2*a);
-                               v.y = ((-b)+D) / (2*a);
-                       }
-                       else
-                       {
-                               v.x = (-b+D) / (2*a);
-                               v.y = (-b-D) / (2*a);
-                       }
-                       v.z = 1;
-               }
-               else
-               {
-                       // complex solutions!
-                       D = sqrt(-D);
-                       v.x = -b / (2*a);
-                       if(a > 0)
-                               v.y =  D / (2*a);
-                       else
-                               v.y = -D / (2*a);
-                       v.z = 0;
-               }
-       }
-       return v;
-}
-
 vector solve_shotdirection(vector myorg, vector myvel, vector eorg, vector evel, float spd, float newton_style)
 {
        vector ret;
@@ -1486,7 +1115,7 @@ vector decompressShotOrigin(int f)
        return v;
 }
 
-#ifndef MENUQC
+#ifdef GAMEQC
 vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype)
 {
        // NOTE: we'll always choose the SMALLER value...
@@ -1535,27 +1164,6 @@ string getcurrentmod()
                return argv(n - 1);
 }
 
-// from the GNU Scientific Library
-float gsl_ran_gaussian_lastvalue;
-float gsl_ran_gaussian_lastvalue_set;
-float gsl_ran_gaussian(float sigma)
-{
-       float a, b;
-       if(gsl_ran_gaussian_lastvalue_set)
-       {
-               gsl_ran_gaussian_lastvalue_set = 0;
-               return sigma * gsl_ran_gaussian_lastvalue;
-       }
-       else
-       {
-               a = random() * 2 * M_PI;
-               b = sqrt(-2 * log(random()));
-               gsl_ran_gaussian_lastvalue = cos(a) * b;
-               gsl_ran_gaussian_lastvalue_set = 1;
-               return sigma * sin(a) * b;
-       }
-}
-
 float matchacl(string acl, string str)
 {
        string t, s;
@@ -1622,7 +1230,7 @@ float get_model_parameters(string m, float sk)
        }
        get_model_parameters_fixbone = 0;
 
-#ifndef MENUQC
+#ifdef GAMEQC
        MUTATOR_CALLHOOK(ClearModelParams);
 #endif
 
@@ -1687,7 +1295,7 @@ float get_model_parameters(string m, float sk)
                        get_model_parameters_bone_upperbody = s;
                if(c == "bone_weapon")
                        get_model_parameters_bone_weapon = s;
-       #ifndef MENUQC
+       #ifdef GAMEQC
                MUTATOR_CALLHOOK(GetModelParams, c, s);
        #endif
                for(int i = 0; i < MAX_AIM_BONES; ++i)
@@ -1713,57 +1321,6 @@ float get_model_parameters(string m, float sk)
        return 1;
 }
 
-float vercmp_recursive(string v1, string v2)
-{
-       float dot1, dot2;
-       string s1, s2;
-       float r;
-
-       dot1 = strstrofs(v1, ".", 0);
-       dot2 = strstrofs(v2, ".", 0);
-       if(dot1 == -1)
-               s1 = v1;
-       else
-               s1 = substring(v1, 0, dot1);
-       if(dot2 == -1)
-               s2 = v2;
-       else
-               s2 = substring(v2, 0, dot2);
-
-       r = stof(s1) - stof(s2);
-       if(r != 0)
-               return r;
-
-       r = strcasecmp(s1, s2);
-       if(r != 0)
-               return r;
-
-       if(dot1 == -1)
-               if(dot2 == -1)
-                       return 0;
-               else
-                       return -1;
-       else
-               if(dot2 == -1)
-                       return 1;
-               else
-                       return vercmp_recursive(substring(v1, dot1 + 1, 999), substring(v2, dot2 + 1, 999));
-}
-
-float vercmp(string v1, string v2)
-{
-       if(strcasecmp(v1, v2) == 0) // early out check
-               return 0;
-
-       // "git" beats all
-       if(v1 == "git")
-               return 1;
-       if(v2 == "git")
-               return -1;
-
-       return vercmp_recursive(v1, v2);
-}
-
 // x-encoding (encoding as zero length invisible string)
 const string XENCODE_2  = "xX";
 const string XENCODE_22 = "0123456789abcdefABCDEF";
@@ -1807,16 +1364,6 @@ string strlimitedlen(string input, string truncation, float strip_colors, float
                return strcat(substring(input, 0, (strlen(input) - strlen(truncation))), truncation);
 }*/
 
-#ifdef CSQC
-entity ReadCSQCEntity()
-{
-       int f = ReadShort();
-       if(f == 0)
-               return world;
-       return findfloat(world, entnum, f);
-}
-#endif
-
 float shutdown_running;
 #ifdef SVQC
 void SV_Shutdown()
@@ -1836,49 +1383,12 @@ void m_shutdown()
        {
                shutdown_running = 1;
                Shutdown();
+               shutdownhooks();
        }
        cvar_settemp_restore(); // this must be done LAST, but in any case
 }
 
-const float APPROXPASTTIME_ACCURACY_REQUIREMENT = 0.05;
-#define APPROXPASTTIME_MAX (16384 * APPROXPASTTIME_ACCURACY_REQUIREMENT)
-#define APPROXPASTTIME_RANGE (64 * APPROXPASTTIME_ACCURACY_REQUIREMENT)
-// this will use the value:
-//   128
-// accuracy near zero is APPROXPASTTIME_MAX/(256*255)
-// accuracy at x is 1/derivative, i.e.
-//   APPROXPASTTIME_MAX * (1 + 256 * (dt / APPROXPASTTIME_MAX))^2 / 65536
-#ifdef SVQC
-void WriteApproxPastTime(float dst, float t)
-{
-       float dt = time - t;
-
-       // warning: this is approximate; do not resend when you don't have to!
-       // be careful with sendflags here!
-       // we want: 0 -> 0.05, 1 -> 0.1, ..., 255 -> 12.75
-
-       // map to range...
-       dt = 256 * (dt / ((APPROXPASTTIME_MAX / 256) + dt));
-
-       // round...
-       dt = rint(bound(0, dt, 255));
-
-       WriteByte(dst, dt);
-}
-#endif
-#ifdef CSQC
-float ReadApproxPastTime()
-{
-       float dt = ReadByte();
-
-       // map from range...PPROXPASTTIME_MAX / 256
-       dt = (APPROXPASTTIME_MAX / 256) * (dt / (256 - dt));
-
-       return servertime - dt;
-}
-#endif
-
-#ifndef MENUQC
+#ifdef GAMEQC
 .float skeleton_bones_index;
 void Skeleton_SetBones(entity e)
 {
@@ -1928,7 +1438,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
 
        // start with a 1-element queue
        queue_start = queue_end = e;
-       queue_end.(fld) = world;
+       queue_end.(fld) = NULL;
        queue_end.FindConnectedComponent_processing = 1;
 
        // for each queued item:
@@ -1936,7 +1446,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
        {
                // find all neighbors of queue_start
                entity t;
-               for(t = world; (t = nxt(t, queue_start, pass)); )
+               for(t = NULL; (t = nxt(t, queue_start, pass)); )
                {
                        if(t.FindConnectedComponent_processing)
                                continue;
@@ -1945,7 +1455,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
                                // it is connected? ADD IT. It will look for neighbors soon too.
                                queue_end.(fld) = t;
                                queue_end = t;
-                               queue_end.(fld) = world;
+                               queue_end.(fld) = NULL;
                                queue_end.FindConnectedComponent_processing = 1;
                        }
                }
@@ -1956,37 +1466,30 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
                queue_start.FindConnectedComponent_processing = 0;
 }
 
-#ifndef MENUQC
+#ifdef GAMEQC
 vector animfixfps(entity e, vector a, vector b)
 {
        // multi-frame anim: keep as-is
        if(a.y == 1)
        {
-               float dur;
-               dur = frameduration(e.modelindex, a.x);
-               if(dur <= 0 && b.y)
+               float dur = frameduration(e.modelindex, a.x);
+               if (dur <= 0 && b.y)
                {
                        a = b;
                        dur = frameduration(e.modelindex, a.x);
                }
-               if(dur > 0)
+               if (dur > 0)
                        a.z = 1.0 / dur;
        }
        return a;
 }
 #endif
 
-#ifdef SVQC
-void dedicated_print(string input) // print(), but only print if the server is not local
-{
-       if(server_is_dedicated) { LOG_INFO(input); }
-}
-#endif
-
-#ifndef MENUQC
-float Announcer_PickNumber(float type, float num)
+#ifdef GAMEQC
+Notification Announcer_PickNumber(int type, int num)
 {
-       switch(type)
+    return = NULL;
+       switch (type)
        {
                case CNT_GAMESTART:
                {
@@ -2091,11 +1594,10 @@ float Announcer_PickNumber(float type, float num)
                        break;
                }
        }
-       return NOTIF_ABORT; // abort sending if none of these numbers were right
 }
 #endif
 
-#ifndef MENUQC
+#ifdef GAMEQC
 int Mod_Q1BSP_SuperContentsFromNativeContents(int nativecontents)
 {
        switch(nativecontents)