]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Move more entities away from world origin
authorTimePath <andrew.hardaker1995@gmail.com>
Thu, 10 Mar 2016 01:18:21 +0000 (12:18 +1100)
committerTimePath <andrew.hardaker1995@gmail.com>
Thu, 10 Mar 2016 02:04:51 +0000 (13:04 +1100)
qcsrc/common/debug.qh
qcsrc/lib/oo.qh
qcsrc/server/mutators/mutator/gamemode_ctf.qc

index 4f60e9fe3cf5b5e4334c9c805d87fff81c618ab5..a72d3538a76b3d14d468937f920fc3adbe0fdc30 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef DEBUG_H
-#define DEBUG_H
+#pragma once
 
 #ifndef MENUQC
 .bool debug;
@@ -32,9 +31,10 @@ REGISTER_NET_TEMP(net_debug)
                WriteHeader(channel, net_debug);
                WriteShort(channel, etof(this));
                WriteByte(channel, is_pure(this));
-               WriteCoord(channel, this.origin.x);
-               WriteCoord(channel, this.origin.y);
-               WriteCoord(channel, this.origin.z);
+               vector o = this.origin;
+               if (o == '0 0 0') // brushes
+                   o = (this.absmin + this.absmax) / 2;
+               WriteCoord(channel, o.x); WriteCoord(channel, o.y); WriteCoord(channel, o.z);
                WriteString(channel, this.classname);
                WriteString(channel, this.sourceLoc);
                return true;
@@ -42,6 +42,15 @@ REGISTER_NET_TEMP(net_debug)
 #endif
 
 #ifndef MENUQC
+/**
+ * 0: off
+ * 1: on
+ * 2: on (pure)
+ * 3: on (.entnum != 0)
+ * 4: on (.origin == '0 0 0')
+ * 5: on (.debug != 0), server only
+ * 6: on (.solid != 0)
+ */
 bool autocvar_debugdraw;
 #endif
 
@@ -73,7 +82,11 @@ bool autocvar_debugdraw;
                                {
                                        if (e.origin) continue;
                                }
-                               else if (autocvar_debugdraw > 4)
+                               if (autocvar_debugdraw == 5)
+                {
+                    if (!e.debug) continue;
+                }
+                               else if (autocvar_debugdraw > 5)
                                {
                                        bool flag = true;
                                        do {
@@ -169,8 +182,8 @@ GENERIC_COMMAND(bufstr_get, "Examine a string buffer object")
        {
                case CMD_REQUEST_COMMAND:
                {
-                   int bufhandle = stof(argv(1));
-                   int string_index = stof(argv(2));
+                       int bufhandle = stof(argv(1));
+                       int string_index = stof(argv(2));
                        string s = bufstr_get(bufhandle, string_index);
                        LOG_INFOF("%s\n", s);
                        return;
@@ -203,4 +216,57 @@ GENERIC_COMMAND(version, "Print the current version")
        }
 }
 
+REGISTER_STAT(TRACE_ENT, int)
+#ifdef SVQC
+bool autocvar_debugtrace;
+
+REGISTER_MUTATOR(trace, autocvar_debugtrace);
+
+.bool debug_trace_button;
+.int solid_prev;
+MUTATOR_HOOKFUNCTION(trace, SV_StartFrame)
+{
+       FOREACH_CLIENT(true, {
+               bool skip = false;
+               bool btn = PHYS_INPUT_BUTTON_HOOK(it);
+               if (btn == it.debug_trace_button) skip = true;
+               it.debug_trace_button = btn;
+               if (!btn || skip) continue;
+               FOREACH_ENTITY(true, {
+                   it.solid_prev = it.solid;
+                       it.solid = SOLID_BBOX;
+               });
+               vector forward; vector right; vector up;
+               MAKEVECTORS(makevectors, it.v_angle, forward, right, up);
+               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;
+               });
+               entity e = trace_ent;
+               int i = etof(e);
+               STAT(TRACE_ENT, it) = i;
+               if (!e) continue;
+               setorigin(e, e.origin + '0 0 100');
+               stuffcmd(it, sprintf("prvm_edict server %d\n", i));
+       });
+}
+#endif
+#ifdef CSQC
+entity TRACE_ENT;
+void Trace_draw2d(entity this)
+{
+       int e = STAT(TRACE_ENT);
+       if (!e) return;
+       vector pos = '0 0 0';
+       pos.y += vid_conheight / 2;
+       drawstring(pos, sprintf("prvm_edict server %d", e), '10 10 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+}
+
+STATIC_INIT(TRACE_ENT)
+{
+       entity e = TRACE_ENT = new_pure(TRACE_ENT);
+       e.draw2d = Trace_draw2d;
+}
 #endif
index 7ecc745d0f436b21d3d950e58401b362c75bfb24..efcb7876a6d448e070828c719ec8d452b224a0ce 100644 (file)
@@ -50,6 +50,9 @@ entity __spawn(string _classname, string _sourceLoc, bool pure)
                #ifdef CSQC
                setorigin(this, '0 0 10000');
                #endif
+               #ifdef SVQC
+        setorigin(this, '0 0 -10000');
+        #endif
        }
        return this;
 }
index a8d2df2014b1d376c70bb09d4d5ebd05c5ed2b27..6d7ac760c2bc1e63f799f7d3ff7d238dc74e143b 100644 (file)
@@ -2715,7 +2715,7 @@ void ctf_ScoreRules(int teams)
 // code from here on is just to support maps that don't have flag and team entities
 void ctf_SpawnTeam (string teamname, int teamcolor)
 {
-       entity this = new(ctf_team);
+       entity this = new_pure(ctf_team);
        this.netname = teamname;
        this.cnt = teamcolor;
        this.spawnfunc_checked = true;