X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=bb2fcba0abacc5ecef45730709add23a735e5468;hb=8453b937f5516bc70a813794e9c78b6c43e63587;hp=6e534ffc19464a92777b956353b926f48ddd578e;hpb=97ee6130a24f5452a61eec2310bd14f8390ceb4f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 6e534ffc1..bb2fcba0a 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -463,6 +463,11 @@ string ScoreString(float pFlags, float pValue) return valstr; } +float dotproduct(vector a, vector b) +{ + return a_x * b_x + a_y * b_y + a_z * b_z; +} + vector cross(vector a, vector b) { return @@ -860,44 +865,56 @@ float cvar_settemp(string tmp_cvar, string tmp_value) float created_saved_value; entity e; - created_saved_value = FALSE; - + created_saved_value = 0; + if not(tmp_cvar || tmp_value) { dprint("Error: Invalid usage of cvar_settemp(string, string); !\n"); - return FALSE; + return 0; } - + + if(!cvar_type(tmp_cvar)) + { + print(sprintf("Error: cvar %s doesn't exist!\n", tmp_cvar)); + return 0; + } + for(e = world; (e = find(e, classname, "saved_cvar_value")); ) if(e.netname == tmp_cvar) - goto saved; // skip creation - - // creating a new entity to keep track of this cvar - e = spawn(); - e.classname = "saved_cvar_value"; - e.netname = strzone(tmp_cvar); - e.message = strzone(cvar_string(tmp_cvar)); - created_saved_value = TRUE; - - // an entity for this cvar already exists - :saved - + created_saved_value = -1; // skip creation + + if(created_saved_value != -1) + { + // creating a new entity to keep track of this cvar + e = spawn(); + e.classname = "saved_cvar_value"; + e.netname = strzone(tmp_cvar); + e.message = strzone(cvar_string(tmp_cvar)); + created_saved_value = 1; + } + // update the cvar to the value given cvar_set(tmp_cvar, tmp_value); - + return created_saved_value; } float cvar_settemp_restore() { - float i; - entity e; - while((e = find(world, classname, "saved_cvar_value"))) + float i = 0; + entity e = world; + while((e = find(e, classname, "saved_cvar_value"))) { - cvar_set(e.netname, e.message); - remove(e); + if(cvar_type(e.netname)) + { + cvar_set(e.netname, e.message); + remove(e); + ++i; + } + else + print(sprintf("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname)); } - + return i; } @@ -1459,8 +1476,12 @@ float isGametypeInFilter(float gt, float tp, float ts, string pattern) if(strstrofs(strcat(",", pattern, ","), subpattern, 0) < 0) if(strstrofs(strcat(",", pattern, ","), subpattern2, 0) < 0) if(strstrofs(strcat(",", pattern, ","), subpattern3, 0) < 0) - if((!subpattern4) || strstrofs(strcat(",", pattern, ","), subpattern4, 0) < 0) - return 0; + { + if not(subpattern4) + return 0; + if(strstrofs(strcat(",", pattern, ","), subpattern4, 0) < 0) + return 0; + } } return 1; } @@ -1990,9 +2011,16 @@ float get_model_parameters(string m, float sk) get_model_parameters_weight = -1; get_model_parameters_age = -1; get_model_parameters_desc = string_null; + get_model_parameters_bone_upperbody = string_null; + get_model_parameters_bone_weapon = string_null; + get_model_parameters_fixbone = 0; if not(m) return 1; + + if(substring(m, -9, 5) == "_lod1" || substring(m, -9, 5) == "_lod2") + m = strcat(substring(m, 0, -10), substring(m, -4, -1)); + if(sk < 0) { if(substring(m, -4, -1) != ".txt") @@ -2041,6 +2069,12 @@ float get_model_parameters(string m, float sk) get_model_parameters_weight = stof(s); if(c == "age") get_model_parameters_age = stof(s); + if(c == "bone_upperbody") + get_model_parameters_bone_upperbody = s; + if(c == "bone_weapon") + get_model_parameters_bone_weapon = s; + if(c == "fixbone") + get_model_parameters_fixbone = stof(s); } while((s = fgets(fh))) @@ -2416,3 +2450,74 @@ float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor) // (3.5, [0.2..2.3]) // (4, 1) } + +.float FindConnectedComponent_processing; +void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t nxt, isConnectedFunction_t iscon, entity pass) +{ + entity queue_start, queue_end; + + // we build a queue of to-be-processed entities. + // queue_start is the next entity to be checked for neighbors + // queue_end is the last entity added + + if(e.FindConnectedComponent_processing) + error("recursion or broken cleanup"); + + // start with a 1-element queue + queue_start = queue_end = e; + queue_end.fld = world; + queue_end.FindConnectedComponent_processing = 1; + + // for each queued item: + for(; queue_start; queue_start = queue_start.fld) + { + // find all neighbors of queue_start + entity t; + for(t = world; (t = nxt(t, queue_start, pass)); ) + { + if(t.FindConnectedComponent_processing) + continue; + if(iscon(t, queue_start, pass)) + { + // 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.FindConnectedComponent_processing = 1; + } + } + } + + // unmark + for(queue_start = e; queue_start; queue_start = queue_start.fld) + queue_start.FindConnectedComponent_processing = 0; +} + +vector vec3(float x, float y, float z) +{ + vector v; + v_x = x; + v_y = y; + v_z = z; + return v; +} + +#ifndef MENUQC +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) + { + a = b; + dur = frameduration(e.modelindex, a_x); + } + if(dur > 0) + a_z = 1.0 / dur; + } + return a; +} +#endif