X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=d04fdecd68dc791f05a8fe93878ed0e6185822b4;hb=b9671f63469586007314131f3f53728795c035cd;hp=b687086ba941ed6f51b38910906074d71e3652d4;hpb=f40d50ebdbbfc5c65f0e75cdfa3bd176501e8d4a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index b687086ba..d04fdecd6 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -5,19 +5,39 @@ #include "constants.qh" #include "../client/mutators/events.qh" #include "mapinfo.qh" - #include "notifications.qh" - #include "deathtypes.qh" + #include "notifications/all.qh" + #include #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.qh" + #include "notifications/all.qh" + #include #include "mapinfo.qh" #endif +#ifndef MENUQC +/* +* 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) @@ -37,22 +57,25 @@ string wordwrap(string s, float l) #ifndef MENUQC #ifndef CSQC +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; } @@ -163,205 +186,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 +297,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); @@ -624,23 +448,6 @@ 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 void get_mi_min_max(float mode) { @@ -682,7 +489,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 +498,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 +507,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 +516,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 +525,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 +534,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,7 +587,6 @@ 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; @@ -796,15 +602,16 @@ 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 + FOREACH_ENTITY_CLASS("saved_cvar_value", 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 = spawn(); - e.classname = "saved_cvar_value"; + entity e = new_pure(saved_cvar_value); e.netname = strzone(tmp_cvar); e.message = strzone(cvar_string(tmp_cvar)); created_saved_value = 1; @@ -816,167 +623,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; + int j = 0; + // FIXME this new-style loop fails! +#if 0 + FOREACH_ENTITY_CLASS("saved_cvar_value", true, + { + if(cvar_type(it.netname)) + { + cvar_set(it.netname, it.message); + strunzone(it.netname); + strunzone(it.message); + remove(it); + ++j; + } + else + LOG_INFOF("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", it.netname); + }); + +#else + entity e = NULL; while((e = find(e, classname, "saved_cvar_value"))) { if(cvar_type(e.netname)) { cvar_set(e.netname, e.message); remove(e); - ++i; + ++j; } else - LOG_INFOF("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname); + print(sprintf("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname)); } +#endif - return i; -} - -float rgb_mi_ma_to_hue(vector rgb, float mi, float ma) -{ - if(mi == ma) - return 0; - else if(ma == rgb.x) - { - if(rgb.y >= rgb.z) - return (rgb.y - rgb.z) / (ma - mi); - else - return (rgb.y - rgb.z) / (ma - mi) + 6; - } - 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); -} - -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) @@ -1297,60 +978,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; @@ -1491,7 +1118,7 @@ vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype) { // NOTE: we'll always choose the SMALLER value... float healthdamage, armordamage, armorideal; - if (deathtype == DEATH_DROWN) // Why should armor help here... + if (DEATH_IS(deathtype, DEATH_DROWN)) // Why should armor help here... armorblock = 0; vector v; healthdamage = (h - 1) / (1 - armorblock); // damage we can take if we could use more health @@ -1514,7 +1141,7 @@ vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype) vector healtharmor_applydamage(float a, float armorblock, int deathtype, float damage) { vector v; - if (deathtype == DEATH_DROWN) // Why should armor help here... + if (DEATH_IS(deathtype, DEATH_DROWN)) // Why should armor help here... armorblock = 0; v.y = bound(0, damage * armorblock, a); // save v.x = bound(0, damage - v.y, damage); // take @@ -1535,27 +1162,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; @@ -1713,57 +1319,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 +1362,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,48 +1381,11 @@ 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 .float skeleton_bones_index; void Skeleton_SetBones(entity e) @@ -1928,7 +1436,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 +1444,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 +1453,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; } } @@ -1962,31 +1470,24 @@ 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) +Notification Announcer_PickNumber(int type, int num) { - switch(type) + return = NULL; + switch (type) { case CNT_GAMESTART: { @@ -2091,7 +1592,6 @@ float Announcer_PickNumber(float type, float num) break; } } - return NOTIF_ABORT; // abort sending if none of these numbers were right } #endif