#pragma once
+#ifdef CSQC
+#include <client/resources.qh>
+#endif
+
// This includes some functions useful for debugging.
// Some more bot-specific ones are in server/pathlib/debug.qc.
it.debug_trace_button = btn;
if (!btn || skip) continue;
FOREACH_ENTITY(true, {
- it.solid_prev = it.solid;
+ it.solid_prev = it.solid;
it.solid = SOLID_BBOX;
});
vector forward = '0 0 0'; vector right = '0 0 0'; vector up = '0 0 0';
vector pos = it.origin + it.view_ofs;
traceline(pos, pos + forward * max_shot_distance, MOVE_NORMAL, it);
FOREACH_ENTITY(true, {
- it.solid = it.solid_prev;
- it.solid_prev = 0;
+ it.solid = it.solid_prev;
+ it.solid_prev = 0;
});
entity e = trace_ent;
int i = etof(e);
// reusing existing fields
ATTRIB(DebugText3d, origin, vector);
ATTRIB(DebugText3d, message, string); // the text (i wanted to use the .text field but then this whole macro-based-inheritance thing shat itself)
+ ATTRIB(DebugText3d, health, float); // text alignment (recycled field)
ATTRIB(DebugText3d, hit_time, float); // when it was created
ATTRIB(DebugText3d, fade_rate, float); // how fast is should disappear
ATTRIB(DebugText3d, velocity, vector);
- CONSTRUCTOR(DebugText3d, vector pos, string msg, float fade_rate_, vector vel) {
+ CONSTRUCTOR(DebugText3d, vector pos, string msg, float align, float fade_rate_, vector vel) {
CONSTRUCT(DebugText3d);
this.origin = pos;
this.message = strzone(msg);
+ SetResourceAmount(this, RESOURCE_HEALTH, align);
this.hit_time = time;
this.fade_rate = fade_rate_;
this.velocity = vel;
}
DESTRUCTOR(DebugText3d) {
- strunzone(this.message);
+ strfree(this.message);
}
void DebugText3d_draw2d(DebugText3d this) {
return;
}
+ int size = 8;
vector screen_pos = project_3d_to_2d(this.origin) + since_created * this.velocity;
+ float align = GetResourceAmount(this, RESOURCE_HEALTH);
+ if (align > 0)
+ screen_pos.x -= stringwidth(this.message, true, size * '1 1 0') * min(1, align);
if (screen_pos.z < 0) return; // behind camera
screen_pos.z = 0;
vector rgb = '1 1 0';
- int size = 8;
drawcolorcodedstring2_builtin(screen_pos, this.message, size * '1 1 0', rgb, alpha_, DRAWFLAG_NORMAL);
}
ATTRIB(DebugText3d, draw2d, void(DebugText3d), DebugText3d_draw2d);
NET_HANDLE(debug_text_3d, bool is_new) {
vector pos = ReadVector();
string msg = ReadString();
+ float align = ReadFloat();
float duration = ReadFloat();
vector vel = ReadVector();
- make_impure(NEW(DebugText3d, pos, msg, 1 / duration, vel));
+ make_impure(NEW(DebugText3d, pos, msg, align, 1 / duration, vel));
return true;
}
#ifdef SVQC
-AUTOCVAR(debug_text_3d_default_duration, float, 10, "Default duration for debug_text_3d()");
-AUTOCVAR(debug_text_3d_default_velocity, vector, '0 -10 0', "Default velocity for debug_text_3d() in screen coords (X and Y from top left)");
-
-STATIC_INIT(debug_text_3d) {
- // HACK: these cvars are only used in macros so they give unused warning unless the macros are expanded
- autocvar_debug_text_3d_default_duration = autocvar_debug_text_3d_default_duration;
- autocvar_debug_text_3d_default_velocity = autocvar_debug_text_3d_default_velocity;
-}
-
+// can't use autocvars because they give unused warning unless the macros are expanded
#define debug_text_3d(...) EVAL(OVERLOAD(debug_text_3d, __VA_ARGS__))
-#define debug_text_3d_2(pos, msg) debug_text_3d_3(pos, msg, autocvar_debug_text_3d_default_duration);
-#define debug_text_3d_3(pos, msg, dur) debug_text_3d_4(pos, msg, dur, autocvar_debug_text_3d_default_velocity);
-#define debug_text_3d_4(pos, msg, dur, vel) debug_text_3d_fn(pos, msg, dur, vel);
+#define debug_text_3d_2(pos, msg) debug_text_3d_3(pos, msg, cvar("debug_text_3d_default_align"))
+#define debug_text_3d_3(pos, msg, align) debug_text_3d_4(pos, msg, align, cvar("debug_text_3d_default_duration"))
+#define debug_text_3d_4(pos, msg, align, dur) debug_text_3d_5(pos, msg, align, dur, stov(cvar_string("debug_text_3d_default_velocity")))
+#define debug_text_3d_5(pos, msg, align, dur, vel) debug_text_3d_fn(pos, msg, align, dur, vel)
-void debug_text_3d_fn(vector pos, string msg, float duration, vector velocity) {
+ERASEABLE
+void debug_text_3d_fn(vector pos, string msg, float align, float duration, vector vel) {
WriteHeader(MSG_BROADCAST, debug_text_3d);
WriteVector(MSG_BROADCAST, pos);
WriteString(MSG_BROADCAST, msg);
+ WriteFloat(MSG_BROADCAST, align);
WriteFloat(MSG_BROADCAST, duration);
- WriteVector(MSG_BROADCAST, velocity);
+ WriteVector(MSG_BROADCAST, vel);
}
#endif // SVQC