return sprintf("%.*f", decimals, number);
}
-float time;
vector colormapPaletteColor(float c, float isPants)
{
switch(c)
}
}
-vector healtharmor_maxdamage(float h, float a, float armorblock)
+#ifndef MENUQC
+vector healtharmor_maxdamage(float h, float a, float armorblock, float deathtype)
{
// NOTE: we'll always choose the SMALLER value...
float healthdamage, armordamage, armorideal;
+ if (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
armordamage = a + (h - 1); // damage we can take if we could use more armor
return v;
}
-vector healtharmor_applydamage(float a, float armorblock, float damage)
+vector healtharmor_applydamage(float a, float armorblock, float deathtype, float damage)
{
vector v;
+ if (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
v_z = 0;
return v;
}
+#endif
string getcurrentmod()
{
v += ReadByte(); // note: this is unsigned
return v;
}
+vector ReadInt48_t()
+{
+ vector v;
+ v_x = ReadInt24_t();
+ v_y = ReadInt24_t();
+ v_z = 0;
+ return v;
+}
+vector ReadInt72_t()
+{
+ vector v;
+ v_x = ReadInt24_t();
+ v_y = ReadInt24_t();
+ v_z = ReadInt24_t();
+ return v;
+}
#else
void WriteInt24_t(float dst, float val)
{
WriteShort(dst, (v = floor(val / 256)));
WriteByte(dst, val - v * 256); // 0..255
}
+void WriteInt48_t(float dst, vector val)
+{
+ WriteInt24_t(dst, val_x);
+ WriteInt24_t(dst, val_y);
+}
+void WriteInt72_t(float dst, vector val)
+{
+ WriteInt24_t(dst, val_x);
+ WriteInt24_t(dst, val_y);
+ WriteInt24_t(dst, val_z);
+}
#endif
#endif
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;
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")
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)))
float lowestbit(float f)
{
- f &~= f * 2;
- f &~= f * 4;
- f &~= f * 16;
- f &~= f * 256;
- f &~= f * 65536;
+ f &= ~(f * 2);
+ f &= ~(f * 4);
+ f &= ~(f * 16);
+ f &= ~(f * 256);
+ f &= ~(f * 65536);
return f;
}
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;
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 type, float num)
+{
+ switch(type)
+ {
+ case CNT_GAMESTART:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_GAMESTART_10;
+ case 9: return ANNCE_NUM_GAMESTART_9;
+ case 8: return ANNCE_NUM_GAMESTART_8;
+ case 7: return ANNCE_NUM_GAMESTART_7;
+ case 6: return ANNCE_NUM_GAMESTART_6;
+ case 5: return ANNCE_NUM_GAMESTART_5;
+ case 4: return ANNCE_NUM_GAMESTART_4;
+ case 3: return ANNCE_NUM_GAMESTART_3;
+ case 2: return ANNCE_NUM_GAMESTART_2;
+ case 1: return ANNCE_NUM_GAMESTART_1;
+ }
+ break;
+ }
+ case CNT_IDLE:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_IDLE_10;
+ case 9: return ANNCE_NUM_IDLE_9;
+ case 8: return ANNCE_NUM_IDLE_8;
+ case 7: return ANNCE_NUM_IDLE_7;
+ case 6: return ANNCE_NUM_IDLE_6;
+ case 5: return ANNCE_NUM_IDLE_5;
+ case 4: return ANNCE_NUM_IDLE_4;
+ case 3: return ANNCE_NUM_IDLE_3;
+ case 2: return ANNCE_NUM_IDLE_2;
+ case 1: return ANNCE_NUM_IDLE_1;
+ }
+ break;
+ }
+ case CNT_KILL:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_KILL_10;
+ case 9: return ANNCE_NUM_KILL_9;
+ case 8: return ANNCE_NUM_KILL_8;
+ case 7: return ANNCE_NUM_KILL_7;
+ case 6: return ANNCE_NUM_KILL_6;
+ case 5: return ANNCE_NUM_KILL_5;
+ case 4: return ANNCE_NUM_KILL_4;
+ case 3: return ANNCE_NUM_KILL_3;
+ case 2: return ANNCE_NUM_KILL_2;
+ case 1: return ANNCE_NUM_KILL_1;
+ }
+ break;
+ }
+ case CNT_RESPAWN:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_RESPAWN_10;
+ case 9: return ANNCE_NUM_RESPAWN_9;
+ case 8: return ANNCE_NUM_RESPAWN_8;
+ case 7: return ANNCE_NUM_RESPAWN_7;
+ case 6: return ANNCE_NUM_RESPAWN_6;
+ case 5: return ANNCE_NUM_RESPAWN_5;
+ case 4: return ANNCE_NUM_RESPAWN_4;
+ case 3: return ANNCE_NUM_RESPAWN_3;
+ case 2: return ANNCE_NUM_RESPAWN_2;
+ case 1: return ANNCE_NUM_RESPAWN_1;
+ }
+ break;
+ }
+ case CNT_ROUNDSTART:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_ROUNDSTART_10;
+ case 9: return ANNCE_NUM_ROUNDSTART_9;
+ case 8: return ANNCE_NUM_ROUNDSTART_8;
+ case 7: return ANNCE_NUM_ROUNDSTART_7;
+ case 6: return ANNCE_NUM_ROUNDSTART_6;
+ case 5: return ANNCE_NUM_ROUNDSTART_5;
+ case 4: return ANNCE_NUM_ROUNDSTART_4;
+ case 3: return ANNCE_NUM_ROUNDSTART_3;
+ case 2: return ANNCE_NUM_ROUNDSTART_2;
+ case 1: return ANNCE_NUM_ROUNDSTART_1;
+ }
+ break;
+ }
+ default:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_10;
+ case 9: return ANNCE_NUM_9;
+ case 8: return ANNCE_NUM_8;
+ case 7: return ANNCE_NUM_7;
+ case 6: return ANNCE_NUM_6;
+ case 5: return ANNCE_NUM_5;
+ case 4: return ANNCE_NUM_4;
+ case 3: return ANNCE_NUM_3;
+ case 2: return ANNCE_NUM_2;
+ case 1: return ANNCE_NUM_1;
+ }
+ break;
+ }
+ }
+ return NOTIF_ABORT; // abort sending if none of these numbers were right
+}
+#endif