From a637d95cc6a096cf69cd7bddc86468f2ec28d933 Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Fri, 3 Feb 2023 15:38:17 +1000 Subject: [PATCH] Add cvar sv_legacy_bbox_expand for disabling Quake entity bbox expansion This avoids obscure bugs and awkward workarounds especially with CSQC player prediction. Signed-off-by: bones_was_here --- dpdefs/progsdefs.qc | 2 +- server.h | 1 + sv_main.c | 2 ++ sv_phys.c | 45 +++++++++++++++++++++++---------------------- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/dpdefs/progsdefs.qc b/dpdefs/progsdefs.qc index 2ccd8431..867a53df 100644 --- a/dpdefs/progsdefs.qc +++ b/dpdefs/progsdefs.qc @@ -236,7 +236,7 @@ float FL_INWATER = 16; // for enter / leave water splash float FL_MONSTER = 32; float FL_GODMODE = 64; // player cheat float FL_NOTARGET = 128; // player cheat -float FL_ITEM = 256; // extra wide size for bonus items +float FL_ITEM = 256; // extra wide size for bonus items IF sv_legacy_bbox_expand is 1 float FL_ONGROUND = 512; // standing on something float FL_PARTIALGROUND = 1024; // not all corners are valid float FL_WATERJUMP = 2048; // player jumping out of water diff --git a/server.h b/server.h index bfd20ecb..39c3686b 100644 --- a/server.h +++ b/server.h @@ -478,6 +478,7 @@ extern cvar_t sv_gravity; extern cvar_t sv_idealpitchscale; extern cvar_t sv_jumpstep; extern cvar_t sv_jumpvelocity; +extern cvar_t sv_legacy_bbox_expand; extern cvar_t sv_maxairspeed; extern cvar_t sv_maxrate; extern cvar_t sv_maxspeed; diff --git a/sv_main.c b/sv_main.c index 12632eb3..dd0d404d 100644 --- a/sv_main.c +++ b/sv_main.c @@ -128,6 +128,7 @@ cvar_t sv_init_frame_count = {0, "sv_init_frame_count", "2", "number of frames t cvar_t sv_idealpitchscale = {0, "sv_idealpitchscale","0.8", "how much to look up/down slopes and stairs when not using freelook"}; cvar_t sv_jumpstep = {CVAR_NOTIFY, "sv_jumpstep", "0", "whether you can step up while jumping"}; cvar_t sv_jumpvelocity = {0, "sv_jumpvelocity", "270", "cvar that can be used by QuakeC code for jump velocity"}; +cvar_t sv_legacy_bbox_expand = {0, "sv_legacy_bbox_expand", "1", "before linking an entity to the area grid, decrease its mins and increase its maxs by '1 1 1', or '15 15 1' if it has flag FL_ITEM (this is the Quake/QuakeWorld behaviour); disable to make SVQC bboxes consistent with CSQC which never does this expansion"}; cvar_t sv_maxairspeed = {0, "sv_maxairspeed", "30", "maximum speed a player can accelerate to when airborn (note that it is possible to completely stop by moving the opposite direction)"}; cvar_t sv_maxrate = {CVAR_SAVE | CVAR_NOTIFY, "sv_maxrate", "1000000", "upper limit on client rate cvar, should reflect your network connection quality"}; cvar_t sv_maxspeed = {CVAR_NOTIFY, "sv_maxspeed", "320", "maximum speed a player can accelerate to when on ground (can be exceeded by tricks)"}; @@ -541,6 +542,7 @@ void SV_Init (void) Cvar_RegisterVariable (&sv_idealpitchscale); Cvar_RegisterVariable (&sv_jumpstep); Cvar_RegisterVariable (&sv_jumpvelocity); + Cvar_RegisterVariable (&sv_legacy_bbox_expand); Cvar_RegisterVariable (&sv_maxairspeed); Cvar_RegisterVariable (&sv_maxrate); Cvar_RegisterVariable (&sv_maxspeed); diff --git a/sv_phys.c b/sv_phys.c index 95598da8..34a4cdf0 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -857,29 +857,30 @@ void SV_LinkEdict (prvm_edict_t *ent) VectorAdd(PRVM_serveredictvector(ent, origin), PRVM_serveredictvector(ent, maxs), maxs); } -// -// to make items easier to pick up and allow them to be grabbed off -// of shelves, the abs sizes are expanded -// - if ((int)PRVM_serveredictfloat(ent, flags) & FL_ITEM) - { - mins[0] -= 15; - mins[1] -= 15; - mins[2] -= 1; - maxs[0] += 15; - maxs[1] += 15; - maxs[2] += 1; - } - else + if (sv_legacy_bbox_expand.integer) { - // because movement is clipped an epsilon away from an actual edge, - // we must fully check even when bounding boxes don't quite touch - mins[0] -= 1; - mins[1] -= 1; - mins[2] -= 1; - maxs[0] += 1; - maxs[1] += 1; - maxs[2] += 1; + if ((int)PRVM_serveredictfloat(ent, flags) & FL_ITEM) + { + // to make items easier to pick up and allow them to be grabbed off + // of shelves, the abs sizes are expanded + mins[0] -= 15; + mins[1] -= 15; + mins[2] -= 1; + maxs[0] += 15; + maxs[1] += 15; + maxs[2] += 1; + } + else + { + // because movement is clipped an epsilon away from an actual edge, + // we must fully check even when bounding boxes don't quite touch + mins[0] -= 1; + mins[1] -= 1; + mins[2] -= 1; + maxs[0] += 1; + maxs[1] += 1; + maxs[2] += 1; + } } VectorCopy(mins, PRVM_serveredictvector(ent, absmin)); -- 2.39.2