]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'bones_was_here/sv_legacy_bbox_expand_4' into 'master'
authorbones_was_here <bones_was_here@xonotic.au>
Thu, 14 Mar 2024 22:19:58 +0000 (22:19 +0000)
committerbones_was_here <bones_was_here@xonotic.au>
Thu, 14 Mar 2024 22:19:58 +0000 (22:19 +0000)
Remove legacy Quake bbox expansion & related item placement and networking upgrades

See merge request xonotic/xonotic-data.pk3dir!1234

14 files changed:
qcsrc/client/main.qc
qcsrc/common/_all.inc
qcsrc/common/checkextension.qc [new file with mode: 0644]
qcsrc/common/checkextension.qh [new file with mode: 0644]
qcsrc/common/physics/movetypes/movetypes.qc
qcsrc/common/physics/movetypes/toss.qc
qcsrc/common/playerstats.qc
qcsrc/lib/log.qh
qcsrc/lib/warpzone/common.qc
qcsrc/lib/warpzone/common.qh
qcsrc/lib/warpzone/util_server.qh
qcsrc/menu/menu.qc
qcsrc/server/world.qc
qcsrc/tools/sv_game-hashtest.sh

index 9e214551097dd0dc60e5d3431cbfd4df32b43ecc..e30f9bbcb21d481cbbfe9cb156bf8332f1a3b3cf 100644 (file)
@@ -13,6 +13,7 @@
 #include <client/shownames.qh>
 #include <client/view.qh>
 #include <client/weapons/projectile.qh>
+#include <common/checkextension.qh>
 #include <common/deathtypes/all.qh>
 #include <common/effects/all.inc>
 #include <common/effects/all.qh>
@@ -50,6 +51,8 @@ void CSQC_Init()
        LOG_TRACEF("^4CSQC Build information: ^1%s", WATERMARK);
 #endif
 
+       CheckEngineExtensions();
+
        {
                int i = 0;
                for ( ; i < 255; ++i)
index 0a2cca157e65e54bd9bd3d9fb45b64a2dfdc4eba..b775b9686af21c166eaccff8b3da1688cba3d83c 100644 (file)
@@ -1,5 +1,7 @@
 noref float autocvar_net_connecttimeout = 30;
 
+#include "checkextension.qc"
+
 #ifdef GAMEQC
 #include "anim.qc"
 #include "animdecide.qc"
diff --git a/qcsrc/common/checkextension.qc b/qcsrc/common/checkextension.qc
new file mode 100644 (file)
index 0000000..3e1a69f
--- /dev/null
@@ -0,0 +1,60 @@
+#include "checkextension.qh"
+
+#ifdef GAMEQC
+entity findbox_tofield_Fallback(vector mins, vector maxs, .entity tofield)
+{
+       // 0.03125 minimum radius because findradius returns no results if radius is zero
+       // but findbox for a zero-sized box returns entities touching the specified point
+       entity chain = findradius_tofield(0.5 * (mins + maxs), max(0.03125, 0.5 * vlen(maxs - mins)), tofield);
+       entity prev = NULL;
+       for (entity e = chain; e; e = e.tofield)
+       {
+               if (boxesoverlap(e.absmin, e.absmax, mins, maxs))
+                       prev = e;
+               else // not in box so remove from chain
+               {
+                       if (prev)
+                               prev.tofield = e.tofield;
+                       else
+                               chain = chain.tofield;
+               }
+       }
+       return chain;
+}
+entity findbox_Fallback(vector mins, vector maxs)
+{
+       return findbox_tofield_Fallback(mins, maxs, chain);
+}
+#endif // GAMEQC
+
+void CheckEngineExtensions(void)
+{
+       if (!cvar("pr_checkextension"))
+               LOG_FATAL("Engine lacks the QC extension system.");
+
+       if (!checkextension("DP_QC_URI_GET") || !checkextension("DP_QC_URI_POST"))
+               LOG_WARN("Engine lacks HTTP support, XonStat and map downloads are unavailable.");
+
+       if (!checkextension("DP_CRYPTO"))
+               LOG_WARN("Engine lacks DP_CRYPTO, Player IDs (required for XonStat and CTS/CTF records) are unavailable.");
+
+#ifdef SVQC // change to GAMEQC if/when we use nudgeoutofsolid in CSQC
+       if (!checkextension("DP_QC_NUDGEOUTOFSOLID"))
+       {
+               LOG_WARN("Engine lacks DP_QC_NUDGEOUTOFSOLID, falling back to WarpZoneLib_MoveOutOfSolid().");
+               // DP_QC_NUDGEOUTOFSOLID fixes many cases WarpZoneLib_MoveOutOfSolid() can't, usually in less CPU time
+               nudgeoutofsolid = WarpZoneLib_MoveOutOfSolid;
+       }
+#endif
+
+#ifdef GAMEQC
+       if (!checkextension("DP_QC_FINDBOX"))
+       {
+               LOG_WARN("Engine lacks DP_QC_FINDBOX, performance will be suboptimal.");
+               findbox = findbox_Fallback;
+               findbox_tofield = findbox_tofield_Fallback;
+       }
+#endif
+
+       // TODO: add proper warns/errors for other extensions we depend on
+}
diff --git a/qcsrc/common/checkextension.qh b/qcsrc/common/checkextension.qh
new file mode 100644 (file)
index 0000000..c00cad8
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void CheckEngineExtensions(void);
index df246c6cd40f89dea1e186cc5e1ba3c14e9aca63..73ceb57b0621f85ce638add082b9ffb0b268a58f 100644 (file)
@@ -683,7 +683,10 @@ bool _Movetype_PushEntity(entity this, vector push, bool dolink)  // SV_PushEnti
                _Movetype_PushEntityTrace(this, push);
                this.move_nomonsters = oldtype;
                if(trace_startsolid)
+               {
+                       trace_fraction = 0;
                        return true;
+               }
        }
 
        this.origin = trace_endpos;
index c23ab4384b7651ffb0e284da0ce8b353d1272f85..5c254811d181c2cac9f5a5496490ae442241d403 100644 (file)
@@ -50,14 +50,17 @@ void _Movetype_Physics_Toss(entity this, float dt)  // SV_Physics_Toss
        float movetime = dt;
        for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; bump++)
        {
+               if(this.velocity == '0 0 0')
+                       break;
+
                vector move = this.velocity * movetime;
                if(!_Movetype_PushEntity(this, move, true))
-                       return;
+                       return; // teleported
                if (wasfreed(this))
                        return;
 
                // NOTE: this is bmodelstartsolid in the engine
-               if (trace_startsolid && trace_ent.solid == SOLID_BSP)
+               if (trace_allsolid && trace_fraction == 0 && trace_ent.solid == SOLID_BSP)
                {
                        // QC lacks pointers so we must save the old trace values
                        float oldtrace_fraction = trace_fraction;
@@ -68,9 +71,16 @@ void _Movetype_Physics_Toss(entity this, float dt)  // SV_Physics_Toss
                        trace_plane_normal = oldtrace_plane_normal;
                        trace_ent = oldtrace_ent;
                        if(!_Movetype_PushEntity(this, move, true))
-                               return;
+                               return; // teleported
                        if (wasfreed(this))
                                return;
+                       if (trace_allsolid && trace_fraction == 0)
+                       {
+                               // immovably stuck, don't waste CPU trying to move again
+                               this.velocity = '0 0 0';
+                               SET_ONGROUND(this);
+                               return;
+                       }
                }
 
                if (trace_fraction == 1)
index 548246f5fc45a75b82af918a1f9bd9aa70f2b145..9744eda19231c450315c6984af9a690bdae6b36f 100644 (file)
@@ -288,11 +288,11 @@ void PlayerStats_GameReport_Init() // initiated before InitGameplayMode so that
        {
                PlayerStats_GameReport_DelayMapVote = true;
 
-               serverflags |= SERVERFLAG_PLAYERSTATS;
                if(autocvar_g_playerstats_gamereport_uri != cvar_defstring("g_playerstats_gamereport_uri"))
-               {
-                       serverflags |= SERVERFLAG_PLAYERSTATS_CUSTOM;
-               }
+                       serverflags |= SERVERFLAG_PLAYERSTATS | SERVERFLAG_PLAYERSTATS_CUSTOM;
+               else if(checkextension("DP_CRYPTO") && checkextension("DP_QC_URI_POST"))
+                       // XonStat submission requires player and server IDs, and HTTPS POST
+                       serverflags |= SERVERFLAG_PLAYERSTATS;
 
                PlayerStats_GameReport_AddEvent(PLAYERSTATS_ALIVETIME);
                PlayerStats_GameReport_AddEvent(PLAYERSTATS_AVGLATENCY);
index f33202f939ddaf975aa785b3fdd924372d6e1d11..2a94fcf09739876f5273f4a70514e1a1662c1b6b 100644 (file)
@@ -34,65 +34,55 @@ void print_assertfailed_fatal(string expr);
 #define ASSERT_LESS(name, var, const) noref int name[(const - var + 1)];
 
 
-#if defined(MENUQC)
-string(string, string...) strcat1n = #53;
-#else
-string(string, string...) strcat1n = #115;
-#endif
-
 // would be nice if __FUNC__ could be concatenated at compile time
 #if 0
        // less work, bigger binary
-       #define __SOURCELOC__ (sprintf("^7%s^9(^9"__FILE__"^7:^9"STR(__LINE__)"^7)", __FUNC__))
+       #define __SOURCELOC__ (sprintf("^7%s^9(^9"__FILE__"^7:^9"STR(__LINE__)"^7)\n", __FUNC__))
 #else
-       #define __SOURCELOC__ (sprintf("^7%s^9(^9%s^7:^9%s^7)", __FUNC__, __FILE__, STR(__LINE__)))
+       #define __SOURCELOC__ (sprintf("^7%s^9(^9%s^7:^9%s^7)\n", __FUNC__, __FILE__, STR(__LINE__)))
 #endif
 
-#define _LOG_HEADER(level) "^9[::^7"PROGNAME"^9::"level"^9] ", __SOURCELOC__
-#define _LOG(f, level, s) \
+#define _LOG_HEADER(level, full) strcat("^9[::^7", PROGNAME, "^9::", level, "^9] ", ((full) ? __SOURCELOC__ : ""))
+
+#define _LOG(func_header, level, func_msg, s) \
        MACRO_BEGIN \
-               if (autocvar_developer > 0) f(strcat1n(_LOG_HEADER(level), "\n")); \
-               f(strcat1n("^7", s, "\n")); \
+               func_header(_LOG_HEADER(level, autocvar_developer > 0)); \
+               func_msg(strcat("^7", s, "\n")); \
        MACRO_END
 
-#define  LOG_FATAL(...) _LOG_FATAL(strcat1n(__VA_ARGS__))
+#define  LOG_FATAL(...) _LOG_FATAL(strcat(__VA_ARGS__))
 #define  LOG_FATALF(...) _LOG_FATAL(sprintf(__VA_ARGS__))
-#define _LOG_FATAL(s) _LOG(error, "^1FATAL", s)
+#define _LOG_FATAL(s) _LOG(print, "^1FATAL", error, s)
 
-#define  LOG_SEVERE(...) _LOG_SEVERE(strcat1n(__VA_ARGS__))
+#define  LOG_SEVERE(...) _LOG_SEVERE(strcat(__VA_ARGS__))
 #define  LOG_SEVEREF(...) _LOG_SEVERE(sprintf(__VA_ARGS__))
-#define _LOG_SEVERE(s) _LOG(backtrace, "^1SEVERE", s)
+#define _LOG_SEVERE(s) _LOG(print, "^1SEVERE", backtrace, s)
 
-#define  LOG_WARN(...) _LOG_WARN(strcat1n(__VA_ARGS__))
+#define  LOG_WARN(...) _LOG_WARN(strcat(__VA_ARGS__))
 #define  LOG_WARNF(...) _LOG_WARN(sprintf(__VA_ARGS__))
-#define _LOG_WARN(s) _LOG(print, "^3WARNING", s)
+#define _LOG_WARN(s) _LOG(print, "^3WARNING", print, s)
 
-#define  LOG_INFO(...) _LOG_INFO(strcat1n(__VA_ARGS__))
+#define  LOG_INFO(...) _LOG_INFO(strcat(__VA_ARGS__))
 #define  LOG_INFOF(...) _LOG_INFO(sprintf(__VA_ARGS__))
 #define _LOG_INFO(s) \
        MACRO_BEGIN \
-               if (autocvar_developer > 1) dprint(strcat1n(_LOG_HEADER("^5INFO"), "\n")); \
+               if (autocvar_developer > 0) print(_LOG_HEADER("^5INFO", autocvar_developer > 1)); \
                string __s = s; \
                print("^7", __s); \
                /* TODO: unconditionally add a newline when possible */ \
                if (str2chr(__s, strlen(__s) - 1) != '\n') { print("\n"); } \
        MACRO_END
 
-#define  LOG_TRACE(...) _LOG_TRACE(strcat1n(__VA_ARGS__))
+#define  LOG_TRACE(...) _LOG_TRACE(strcat(__VA_ARGS__))
 #define  LOG_TRACEF(...) _LOG_TRACE(sprintf(__VA_ARGS__))
-#define _LOG_TRACE(s) _LOG(dprint, "^6TRACE", s)
+#define _LOG_TRACE(s) _LOG(dprint, "^6TRACE", dprint, s)
 
-#define  LOG_DEBUG(...) _LOG_DEBUG(strcat1n(__VA_ARGS__))
+#define  LOG_DEBUG(...) _LOG_DEBUG(strcat(__VA_ARGS__))
 #define  LOG_DEBUGF(...) _LOG_DEBUG(sprintf(__VA_ARGS__))
-#define _LOG_DEBUG(s) _LOG(dprint2, "^2DEBUG", s)
-
-#define dprint2(msg) \
-       MACRO_BEGIN \
-               if (autocvar_developer > 1) dprint(msg); \
-       MACRO_END
+#define _LOG_DEBUG(s) if (autocvar_developer > 1) _LOG(dprint, "^2DEBUG", dprint, s)
 
 // same as LOG_INFO but without any debug information that bloats console output and compiled program files
-#define  LOG_HELP(...) _LOG_HELP(strcat1n(__VA_ARGS__))
+#define  LOG_HELP(...) _LOG_HELP(strcat(__VA_ARGS__))
 #define  LOG_HELPF(...) _LOG_HELP(sprintf(__VA_ARGS__))
 #define _LOG_HELP(s) \
        MACRO_BEGIN \
index 3fe4d038486324b1f9e1b29d4e48a3eb04103c62..7858311bcecdb78404d6999fc56adc5e6969ba95 100644 (file)
@@ -841,16 +841,16 @@ void WarpZoneLib_MoveOutOfSolid_Expand(entity e, vector by)
        }
 }
 
-bool WarpZoneLib_MoveOutOfSolid(entity e)
+int WarpZoneLib_MoveOutOfSolid(entity e)
 {
        vector o = e.origin;
        traceline(o, o, MOVE_WORLDONLY, e);
        if (trace_startsolid)
-               return false;
+               return 0; // too stuck, giving up
 
        tracebox(o, e.mins, e.maxs, o, MOVE_WORLDONLY, e);
        if (!trace_startsolid)
-               return true;
+               return -1; // wasn't stuck
 
        vector m0 = e.mins;
        vector m1 = e.maxs;
@@ -868,8 +868,8 @@ bool WarpZoneLib_MoveOutOfSolid(entity e)
        if (trace_startsolid)
        {
                setorigin(e, o);
-               return false;
+               return 0; // can't fix
        }
 
-       return true;
+       return 1; // was stuck but is fixed now
 }
index f73d079792af9f663775cb4b5294718a16bba03d..f80b5a63873325d50fd67799ad8cb50634df92ea 100644 (file)
@@ -106,7 +106,7 @@ entity WarpZone_RefSys_SpawnSameRefSys(entity me); // spawn().R = me.R
 #ifndef BITXOR_ASSIGN
 # define BITXOR_ASSIGN(a,b) ((a) = ((a) | (b)) - ((a) & (b)))
 #endif
-bool WarpZoneLib_MoveOutOfSolid(entity e);
+int WarpZoneLib_MoveOutOfSolid(entity e);
 #define move_out_of_solid(e) WarpZoneLib_MoveOutOfSolid(e)
 
 bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher, bool touchfunc);
index fe5bf07d43654e9f8867913696490dcfce75ca10..567d17941e45d9610102c45fac5e5bae04acabd5 100644 (file)
@@ -1,6 +1,5 @@
 #pragma once
 
-bool WarpZoneLib_MoveOutOfSolid(entity e);
 #ifdef SVQC
 void WarpZoneLib_ExactTrigger_Init(entity this, bool unsetmodel);
 #endif
index 7796cbccaa1de271031755ca8f1d7a6316aaa647..1edf6bfbaf261fbc59a3ba57dbe72d61bceba507 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "xonotic/util.qh"
 
+#include <common/checkextension.qh>
 #include <common/items/_mod.qh>
 #include <common/weapons/_all.qh>
 #include <common/mapinfo.qh>
@@ -76,6 +77,8 @@ void m_init()
                LOG_TRACEF("^4MQC Build information: ^1%s", WATERMARK);
 #endif
 
+       CheckEngineExtensions();
+
        // list all game dirs (TEST)
        if (cvar("developer") > 0)
        {
index 1562d00a2c893d6c134edc37764dc95b8e8c066f..926349a575665fb8d9c85499557d6be318487a61 100644 (file)
@@ -1,5 +1,6 @@
 #include "world.qh"
 
+#include <common/checkextension.qh>
 #include <common/constants.qh>
 #include <common/deathtypes/all.qh>
 #include <common/gamemodes/_mod.qh>
@@ -746,6 +747,8 @@ void InitGameplayMode()
 bool world_already_spawned;
 spawnfunc(worldspawn)
 {
+       CheckEngineExtensions();
+
        cvar_set("_endmatch", "0");
        server_is_dedicated = boolean(stof(cvar_defstring("is_dedicated")));
 
index f3f0eb233e4279fc4abcf0ba8de9c1428d3a8949..431a6f7c1636f80cd750cb7469d48193366b1c70 100755 (executable)
@@ -185,12 +185,13 @@ mkdir -p data/maps
 createdtoday "data/maps/_init.bsp" \
        || wget -nv -O data/maps/_init.bsp https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/_init/_init.bsp
 
+PASS=0
 while read -r LINE
 do
        printf "%s\n" "$LINE"
-       [ "$LINE" = "All tests OK" ] && PASS=1
+       printf "%s\n" "$LINE" | grep -q ".*All tests OK$" && PASS=1
 done < <(${ENGINE} +developer 1 +map _init +sv_cmd runtest +wait +quit)
-test "$PASS" = "1" || { printf 'sv_cmd runtest failed!'; exit 1; }
+test "$PASS" = "1" || { printf "\033[1;31m%s\033[0m\n" "sv_cmd runtest failed!"; exit 1; }
 
 ${ENGINE} +map _init +sv_cmd dumpnotifs +wait +quit
 diff notifications.cfg data/data/notifications_dump.cfg ||
@@ -228,8 +229,8 @@ then # green ok print
        printf "\033[32m%s\033[0m\n" "hashes match"
        exit 0
 else # red error print
-       printf "\033[32m%s\033[0m\n" "expected: $EXPECT"
-       printf "\033[32m%s\033[0m\n" "  actual: $HASH"
-       printf "\033[31m%s\033[0m\n" "!!! ERROR: HASHES DO NOT MATCH !!!"
+       printf "\033[31m%s\033[0m\n" "expected: $EXPECT"
+       printf "\033[31m%s\033[0m\n" "  actual: $HASH"
+       printf "\033[1;31m%s\033[0m\n" "!!! ERROR: HASHES DO NOT MATCH !!!"
        exit 1
 fi