X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=716abaf9880f183d47d9a82cd8c3af52e9b0eeb4;hp=9b6d433621066cd36349d1ae793f9ece062d3cd7;hb=c039d054a46888048d214000273ccfc63e4611b6;hpb=1d0313b550f20ceef79a51c4c8a2029eb673d979 diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 9b6d43362..716abaf98 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/all.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/all.qh" + #include "notifications/all.qh" + #include #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) @@ -274,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); @@ -302,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); @@ -329,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; @@ -425,7 +446,7 @@ string swapInPriorityList(string order, float i, float j) return order; } -#ifndef MENUQC +#ifdef GAMEQC void get_mi_min_max(float mode) { vector mi, ma; @@ -449,7 +470,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; @@ -466,7 +487,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; @@ -475,7 +496,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; @@ -484,7 +505,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; @@ -493,7 +514,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; @@ -502,7 +523,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; @@ -511,7 +532,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; } @@ -564,13 +585,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; } @@ -580,15 +600,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 = new(saved_cvar_value); - make_pure(e); + entity e = new_pure(saved_cvar_value); e.netname = strzone(tmp_cvar); e.message = strzone(cvar_string(tmp_cvar)); created_saved_value = 1; @@ -600,23 +621,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); + delete(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; + delete(e); + ++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; + return j; } float textLengthUpToWidth(string theText, float maxWidth, vector theSize, textLengthUpToWidth_widthFunction_t w) @@ -891,7 +930,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), ","); @@ -1072,7 +1111,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... @@ -1187,7 +1226,7 @@ float get_model_parameters(string m, float sk) } get_model_parameters_fixbone = 0; -#ifndef MENUQC +#ifdef GAMEQC MUTATOR_CALLHOOK(ClearModelParams); #endif @@ -1252,7 +1291,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) @@ -1345,7 +1384,7 @@ void m_shutdown() cvar_settemp_restore(); // this must be done LAST, but in any case } -#ifndef MENUQC +#ifdef GAMEQC .float skeleton_bones_index; void Skeleton_SetBones(entity e) { @@ -1395,7 +1434,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: @@ -1403,7 +1442,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; @@ -1412,7 +1451,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; } } @@ -1423,37 +1462,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: { @@ -1558,11 +1590,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)