X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=7fa2f576a64649cce85982cf908b5b4b0ae2a229;hb=1633673cc6c65bdca0120f2a4fc33e8c2449f06d;hp=53c14cfb0cd1798a706bb96cb36bce8afd924ba8;hpb=f879dea04474678d9a263cf5d8c127415e390ca5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 53c14cfb0..7fa2f576a 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -865,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; } @@ -1464,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; } @@ -1985,7 +2001,7 @@ string get_model_datafilename(string m, float sk, string fil) float get_model_parameters(string m, float sk) { string fn, s, c; - float fh; + float fh, i; get_model_parameters_modelname = string_null; get_model_parameters_modelskin = -1; @@ -1995,9 +2011,21 @@ 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; + for(i = 0; i < MAX_AIM_BONES; ++i) + { + get_model_parameters_bone_aim[i] = string_null; + get_model_parameters_bone_aimweight[i] = 0; + } + 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") @@ -2046,6 +2074,18 @@ 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; + for(i = 0; i < MAX_AIM_BONES; ++i) + if(c == strcat("bone_aim", ftos(i))) + { + get_model_parameters_bone_aimweight[i] = stof(car(s)); + get_model_parameters_bone_aim[i] = cdr(s); + } + if(c == "fixbone") + get_model_parameters_fixbone = stof(s); } while((s = fgets(fh))) @@ -2463,3 +2503,106 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t for(queue_start = e; queue_start; queue_start = queue_start.fld) queue_start.FindConnectedComponent_processing = 0; } + +// todo: this sucks, lets find a better way to do backtraces? +#ifndef MENUQC +void backtrace(string msg) +{ + float dev, war; + #ifdef SVQC + dev = autocvar_developer; + war = autocvar_prvm_backtraceforwarnings; + #else + dev = cvar("developer"); + war = cvar("prvm_backtraceforwarnings"); + #endif + cvar_set("developer", "1"); + cvar_set("prvm_backtraceforwarnings", "1"); + print("\n"); + print("--- CUT HERE ---\nWARNING: "); + print(msg); + print("\n"); + remove(world); // isn't there any better way to cause a backtrace? + print("\n--- CUT UNTIL HERE ---\n"); + cvar_set("developer", ftos(dev)); + cvar_set("prvm_backtraceforwarnings", ftos(war)); +} +#endif + +// color code replace, place inside of sprintf and parse the string +string CCR(string input) +{ + // See the autocvar declarations in util.qh for default values + + // foreground/normal colors + input = strreplace("^F1", strcat("^", autocvar_hud_colorset_foreground_1), input); + input = strreplace("^F2", strcat("^", autocvar_hud_colorset_foreground_2), input); + input = strreplace("^F3", strcat("^", autocvar_hud_colorset_foreground_3), input); + input = strreplace("^F4", strcat("^", autocvar_hud_colorset_foreground_4), input); + + // "kill" colors + input = strreplace("^K1", strcat("^", autocvar_hud_colorset_kill_1), input); + input = strreplace("^K2", strcat("^", autocvar_hud_colorset_kill_2), input); + input = strreplace("^K3", strcat("^", autocvar_hud_colorset_kill_3), input); + + // background colors + input = strreplace("^BG", strcat("^", autocvar_hud_colorset_background), input); + input = strreplace("^N", "^7", input); // "none"-- reset to white... + return input; +} + +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 + +#ifdef SVQC +void dedicated_print(string input) // print(), but only print if the server is not local +{ + if(server_is_dedicated) { print(input); } +} +#endif + +#ifndef MENUQC +float Announcer_PickNumber(float num) +{ + switch(num) + { + case 10: num = ANNCE_NUM_10; break; + case 9: num = ANNCE_NUM_9; break; + case 8: num = ANNCE_NUM_8; break; + case 7: num = ANNCE_NUM_7; break; + case 6: num = ANNCE_NUM_6; break; + case 5: num = ANNCE_NUM_5; break; + case 4: num = ANNCE_NUM_4; break; + case 3: num = ANNCE_NUM_3; break; + case 2: num = ANNCE_NUM_2; break; + case 1: num = ANNCE_NUM_1; break; + } + return num; +} +#endif