From a0a5cc0006a3d07ec905a23835e80a7c4f746579 Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Tue, 14 Jul 2020 20:37:17 +1000 Subject: [PATCH] Remove autocvar_sv_q3defragcompat and use 1 bitfield to track .arena and .defi files --- qcsrc/common/mapobjects/func/button.qc | 4 ++-- qcsrc/common/mapobjects/func/door.qc | 2 +- qcsrc/common/mapobjects/trigger/hurt.qc | 4 ++-- qcsrc/common/mapobjects/trigger/jumppads.qc | 2 +- qcsrc/common/mapobjects/trigger/multi.qc | 2 +- qcsrc/common/physics/player.qc | 2 +- qcsrc/common/stats.qh | 6 ++---- qcsrc/server/client.qc | 2 +- qcsrc/server/compat/quake3.qc | 21 ++++++++------------- qcsrc/server/compat/quake3.qh | 2 +- qcsrc/server/g_world.qc | 5 +++-- xonotic-server.cfg | 2 -- 12 files changed, 23 insertions(+), 31 deletions(-) diff --git a/qcsrc/common/mapobjects/func/button.qc b/qcsrc/common/mapobjects/func/button.qc index 423ac5e7b..c716b400c 100644 --- a/qcsrc/common/mapobjects/func/button.qc +++ b/qcsrc/common/mapobjects/func/button.qc @@ -206,8 +206,8 @@ spawnfunc(func_button) if (!this.lip) this.lip = 4; - if(this.wait == -1 && autocvar_sv_q3defragcompat) - this.wait = 0.1; // compatibility for q3df: "instant" return + if(this.wait < 0 && q3compat) + this.wait = 0.1; // compatibility for q3: -1 = return immediately if(this.noise != "") precache_sound(this.noise); diff --git a/qcsrc/common/mapobjects/func/door.qc b/qcsrc/common/mapobjects/func/door.qc index 11196ab38..48e11ad87 100644 --- a/qcsrc/common/mapobjects/func/door.qc +++ b/qcsrc/common/mapobjects/func/door.qc @@ -737,7 +737,7 @@ spawnfunc(func_door) } else if (!this.speed) { - if (autocvar_sv_q3defragcompat) + if (q3compat) this.speed = 400; else this.speed = 100; diff --git a/qcsrc/common/mapobjects/trigger/hurt.qc b/qcsrc/common/mapobjects/trigger/hurt.qc index 8c21c509c..19447c41b 100644 --- a/qcsrc/common/mapobjects/trigger/hurt.qc +++ b/qcsrc/common/mapobjects/trigger/hurt.qc @@ -25,7 +25,7 @@ void trigger_hurt_touch(entity this, entity toucher) if (toucher.triggerhurttime < time) { EXACTTRIGGER_TOUCH(this, toucher); - toucher.triggerhurttime = time + ((autocvar_sv_q3defragcompat && !(this.spawnflags & HURT_SLOW)) ? 0.1 : 1); + toucher.triggerhurttime = time + ((q3compat && !(this.spawnflags & HURT_SLOW)) ? 0.1 : 1); entity own; own = this.enemy; @@ -66,7 +66,7 @@ spawnfunc(trigger_hurt) this.use = trigger_hurt_use; this.enemy = world; // I hate you all if (!this.dmg) - this.dmg = ((autocvar_sv_q3defragcompat) ? 5 : 10000); + this.dmg = ((q3compat) ? 5 : 10000); if (this.message == "") this.message = "was in the wrong place"; if (this.message2 == "") diff --git a/qcsrc/common/mapobjects/trigger/jumppads.qc b/qcsrc/common/mapobjects/trigger/jumppads.qc index 2c160eae9..66daba830 100644 --- a/qcsrc/common/mapobjects/trigger/jumppads.qc +++ b/qcsrc/common/mapobjects/trigger/jumppads.qc @@ -135,7 +135,7 @@ bool jumppad_push(entity this, entity targ) vector org = targ.origin; #ifdef SVQC - if(autocvar_sv_q3defragcompat) + if(q3compat) #elif defined(CSQC) if(STAT(Q3DEFRAGCOMPAT)) #endif diff --git a/qcsrc/common/mapobjects/trigger/multi.qc b/qcsrc/common/mapobjects/trigger/multi.qc index df915a649..c087f071a 100644 --- a/qcsrc/common/mapobjects/trigger/multi.qc +++ b/qcsrc/common/mapobjects/trigger/multi.qc @@ -176,7 +176,7 @@ spawnfunc(trigger_multiple) this.wait = 0; this.use = multi_use; - if(this.wait == -1 && autocvar_sv_q3defragcompat) + if(this.wait == -1 && q3compat & BIT(1)) this.wait = 0.1; // compatibility for q3df: "instant" return EXACTTRIGGER_INIT; diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index 5d4beb1ac..e24973610 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -53,7 +53,7 @@ void Physics_UpdateStats(entity this) : 0; STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, this) = Physics_ClientOption(this, "airspeedlimit_nonqw", autocvar_sv_airspeedlimit_nonqw) * maxspd_mod; } - bool q3dfcompat = autocvar_sv_q3defragcompat && autocvar_sv_q3defragcompat_changehitbox; // NOTE: these hitboxes are off by 1 due to engine differences + bool q3dfcompat = q3compat && autocvar_sv_q3defragcompat_changehitbox; // NOTE: these hitboxes are off by 1 due to engine differences STAT(PL_MIN, this) = (q3dfcompat) ? '-15 -15 -20' : autocvar_sv_player_mins; STAT(PL_MAX, this) = (q3dfcompat) ? '15 15 36' : autocvar_sv_player_maxs; STAT(PL_VIEW_OFS, this) = (q3dfcompat) ? '0 0 30' : autocvar_sv_player_viewoffset; diff --git a/qcsrc/common/stats.qh b/qcsrc/common/stats.qh index c77ca16be..ba56d924d 100644 --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@ -3,6 +3,7 @@ #ifdef SVQC #include #include +#include #endif // Full list of all stat constants, included in a single location for easy reference @@ -323,10 +324,7 @@ bool autocvar_sv_slick_applygravity; #endif REGISTER_STAT(SLICK_APPLYGRAVITY, bool, autocvar_sv_slick_applygravity) -#ifdef SVQC -bool autocvar_sv_q3defragcompat; -#endif -REGISTER_STAT(Q3DEFRAGCOMPAT, bool, autocvar_sv_q3defragcompat) +REGISTER_STAT(Q3DEFRAGCOMPAT, bool, q3compat) #ifdef SVQC #include "physics/movetypes/movetypes.qh" diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 2c687286b..cac8adc58 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -612,7 +612,7 @@ void PutPlayerInServer(entity this) this.respawn_flags = 0; this.respawn_time = 0; STAT(RESPAWN_TIME, this) = 0; - bool q3dfcompat = autocvar_sv_q3defragcompat && autocvar_sv_q3defragcompat_changehitbox; + bool q3dfcompat = q3compat && autocvar_sv_q3defragcompat_changehitbox; this.scale = ((q3dfcompat) ? 0.9 : autocvar_sv_player_scale); this.fade_time = 0; this.pain_frame = 0; diff --git a/qcsrc/server/compat/quake3.qc b/qcsrc/server/compat/quake3.qc index f7b77d83d..4f2b380dd 100644 --- a/qcsrc/server/compat/quake3.qc +++ b/qcsrc/server/compat/quake3.qc @@ -37,19 +37,12 @@ NOTE: for best experience, you need to swap MGs with SGs in the map or it won't have a MG */ -bool q3compat_arena(string mapname) -{ - if(fexists(strcat("scripts/", mapname, ".arena"))) return true; - - return false; -} - // SG -> MG || SG -SPAWNFUNC_ITEM_COND(ammo_shells, q3compat_arena(mapname), ITEM_Bullets, ITEM_Shells) -SPAWNFUNC_WEAPON_COND(weapon_shotgun, q3compat_arena(mapname), WEP_MACHINEGUN, WEP_SHOTGUN) +SPAWNFUNC_ITEM_COND(ammo_shells, q3compat & BIT(0), ITEM_Bullets, ITEM_Shells) +SPAWNFUNC_WEAPON_COND(weapon_shotgun, q3compat & BIT(0), WEP_MACHINEGUN, WEP_SHOTGUN) // MG -> SG || MG -SPAWNFUNC_ITEM_COND(ammo_bullets, q3compat_arena(mapname), ITEM_Shells, ITEM_Bullets) +SPAWNFUNC_ITEM_COND(ammo_bullets, q3compat & BIT(0), ITEM_Shells, ITEM_Bullets) // GL -> Mortar SPAWNFUNC_ITEM(ammo_grenades, ITEM_Rockets) @@ -63,7 +56,7 @@ SPAWNFUNC_WEAPON(weapon_chaingun, WEP_HLAC) SPAWNFUNC_ITEM(ammo_belt, ITEM_Cells) // Team Arena Nailgun -> Crylink || Quake Nailgun -> Electro -SPAWNFUNC_WEAPON_COND(weapon_nailgun, q3compat_arena(mapname), WEP_CRYLINK, WEP_ELECTRO) +SPAWNFUNC_WEAPON_COND(weapon_nailgun, q3compat & BIT(0), WEP_CRYLINK, WEP_ELECTRO) SPAWNFUNC_ITEM(ammo_nails, ITEM_Cells) // LG -> Electro @@ -294,9 +287,11 @@ bool DoesQ3ARemoveThisEntity(entity this) // Xonotic is usually played with a CPM-based physics so we default to CPM mode if(cvar_string("g_mod_physics") == "Q3") { - if(this.notvq3) return true; + if(this.notvq3) + return true; } - else if(this.notcpm) return true; + else if(this.notcpm) + return true; // Q3 mappers use "notq3a" or "notta" to disable an entity in Q3A or Q3TA // Xonotic has ~equivalent features to Team Arena diff --git a/qcsrc/server/compat/quake3.qh b/qcsrc/server/compat/quake3.qh index eb77acd1e..5d759e378 100644 --- a/qcsrc/server/compat/quake3.qh +++ b/qcsrc/server/compat/quake3.qh @@ -1,6 +1,6 @@ #pragma once -bool q3compat_arena(string mapname); +int q3compat = 0; bool DoesQ3ARemoveThisEntity(entity this); .int fragsfilter_cnt; diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 884e6c3be..20cdd4889 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -878,8 +878,9 @@ spawnfunc(worldspawn) MapInfo_Enumerate(); MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1); - if(fexists(strcat("scripts/", mapname, ".defi"))) - cvar_settemp("sv_q3defragcompat", "1"); + q3compat = BITSET(q3compat, BIT(0), fexists(strcat("scripts/", mapname, ".arena"))); + q3compat = BITSET(q3compat, BIT(1), fexists(strcat("scripts/", mapname, ".defi"))); + LOG_INFO("CHECKED FOR: scripts/", mapname, ".arena and scripts/", mapname, ".defi, q3compat set to ", ftos(q3compat)); if(whichpack(strcat("maps/", mapname, ".cfg")) != "") { diff --git a/xonotic-server.cfg b/xonotic-server.cfg index 6f26e726f..11a774b01 100644 --- a/xonotic-server.cfg +++ b/xonotic-server.cfg @@ -494,8 +494,6 @@ sv_gameplayfix_consistentplayerprethink 1 sv_gameplayfix_gravityunaffectedbyticrate 1 sv_gameplayfix_nogravityonground 1 -set sv_q3defragcompat 0 "toggle for some compatibility hacks (for Q3DF map compatibility)" - set g_movement_highspeed 1 "multiplier scale for movement speed (applies to sv_maxspeed and sv_maxairspeed, also applies to air acceleration when g_movement_highspeed_q3_compat is set to 0)" set g_movement_highspeed_q3_compat 0 "apply speed modifiers to air movement in a more Q3-compatible way (only apply speed buffs and g_movement_highspeed to max air speed, not to acceleration)" -- 2.39.2