X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qh;h=fa25ade7d899ec5a8704465bfa46ec92fab2bb8c;hb=e7c63b4a159ba5bed1a4e35d1df9ca19cdef95a2;hp=8b1170b4e22968e37491460ca12b973c1318dbdd;hpb=8453b937f5516bc70a813794e9c78b6c43e63587;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 8b1170b4e..fa25ade7d 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -1,6 +1,9 @@ // a dummy macro that prevents the "hanging ;" warning #define ENDS_WITH_CURLY_BRACE +// return the actual code name of a var as a string +#define VAR_TO_TEXT(var) #var + #ifdef HAVE_YO_DAWG_CPP // TODO make ascii art pic of xzibit // YO DAWG! @@ -37,6 +40,11 @@ void ACCUMULATE_call(string func) ACCUMULATE_call(#func) #endif +// used for simplifying ACCUMULATE_FUNCTIONs +#define SET_FIRST_OR_LAST(input,first,count) if(!input) { input = (first + count); } +#define SET_FIELD_COUNT(field,first,count) if(!field) { field = (first + count); ++count; } +#define CHECK_MAX_COUNT(name,max,count,type) if(count == max) { error(strcat("Maximum ", type, " hit: ", VAR_TO_TEXT(name), ": ", ftos(count), ".\n")); } + // this returns a tempstring containing a copy of s with additional \n newlines added, it also replaces \n in the text with a real newline // NOTE: s IS allowed to be a tempstring string wordwrap(string s, float l); @@ -252,6 +260,9 @@ float get_model_parameters_weight; float get_model_parameters_age; string get_model_parameters_bone_upperbody; string get_model_parameters_bone_weapon; +#define MAX_AIM_BONES 4 +string get_model_parameters_bone_aim[MAX_AIM_BONES]; +float get_model_parameters_bone_aimweight[MAX_AIM_BONES]; float get_model_parameters_fixbone; string get_model_parameters_desc; float get_model_parameters(string mod, float skn); // call with string_null to clear; skin -1 means mod is the filename of the txt file and is to be split @@ -368,6 +379,45 @@ typedef entity(entity cur, entity near, entity pass) findNextEntityNearFunction_ typedef float(entity a, entity b, entity pass) isConnectedFunction_t; void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t nxt, isConnectedFunction_t iscon, entity pass); +// expand multiple arguments into one argument by stripping parenthesis +#define XPD(...) __VA_ARGS__ + +float Count_Proper_Strings(string improper, string...count); +float Count_Proper_Floats(float improper, float...count); + +#ifndef MENUQC +void backtrace(string msg); +#endif + +// color code replace, place inside of sprintf and parse the string... defaults described as constants +// foreground/normal colors +var string autocvar_hud_colorset_foreground_1 = "2"; // F1 - Green // primary priority (important names, etc) +var string autocvar_hud_colorset_foreground_2 = "3"; // F2 - Yellow // secondary priority (items, locations, numbers, etc) +var string autocvar_hud_colorset_foreground_3 = "4"; // F3 - Blue // tertiary priority or relatively inconsequential text +var string autocvar_hud_colorset_foreground_4 = "1"; // F4 - Red // notice/attention grabbing texting +// "kill" colors +var string autocvar_hud_colorset_kill_1 = "1"; // K1 - Red // "bad" or "dangerous" text (death messages against you, kill notifications, etc) +var string autocvar_hud_colorset_kill_2 = "3"; // K2 - Yellow // similar to above, but less important... OR, a highlight out of above message type +var string autocvar_hud_colorset_kill_3 = "4"; // K3 - Blue // "good" or "beneficial" text (you fragging someone, etc) +// background color +var string autocvar_hud_colorset_background = "7"; // BG - White // neutral/unimportant text + +string CCR(string input); + +#ifndef MENUQC +#ifdef CSQC +#define GENTLE (autocvar_cl_gentle || autocvar_cl_gentle_messages) +#else +#define GENTLE autocvar_sv_gentle +#endif +#define normal_or_gentle(normal,gentle) (GENTLE ? ((gentle != "") ? gentle : normal) : normal) +#endif + +// allow writing to also pass through to spectators (like so spectators see the same centerprints as players for example) +#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) entity varname; varname = msg_entity; FOR_EACH_REALCLIENT(msg_entity) if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) statement msg_entity = varname +#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement) +#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0 + vector vec3(float x, float y, float z); #ifndef MENUQC