1
0
Fork 0
forked from fte/fteqw

Add pm_bunnyfriction cvar to better mimic nq player physics with predictable QW physics.

This commit is contained in:
Shpoike 2023-01-25 23:14:13 +00:00
parent 45df6806c2
commit 990066dea1
8 changed files with 49 additions and 14 deletions

View file

@ -2570,6 +2570,7 @@ void CL_CheckServerInfo(void)
cl.bunnyspeedcap = Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_bunnyspeedcap")); cl.bunnyspeedcap = Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_bunnyspeedcap"));
movevars.slidefix = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_slidefix")) != 0); movevars.slidefix = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_slidefix")) != 0);
movevars.slidyslopes = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_slidyslopes")) != 0); movevars.slidyslopes = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_slidyslopes")) != 0);
movevars.bunnyfriction = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_bunnyfriction")) != 0);
movevars.airstep = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_airstep")) != 0); movevars.airstep = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_airstep")) != 0);
movevars.pground = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_pground")) != 0); movevars.pground = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_pground")) != 0);
movevars.stepdown = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_stepdown")) != 0); movevars.stepdown = (Q_atof(InfoBuf_ValueForKey(&cl.serverinfo, "pm_stepdown")) != 0);

View file

@ -1078,17 +1078,18 @@ const char *presetexec[] =
struct struct
{ {
const char *name; const char *name;
qboolean dorestart;
const char *desc; const char *desc;
const char *settings; const char *settings;
} builtinpresets[] = } builtinpresets[] =
{ {
{ "hdr", { "hdr", true,
"Don't let colour depth stop you!", "Don't let colour depth stop you!",
"set vid_srgb 2\n" "set vid_srgb 2\n"
"set r_hdr_irisadaptation 1\n" "set r_hdr_irisadaptation 1\n"
}, },
{ "shib", { "shib", true,
"Performance optimisations for large/detailed maps.", "Performance optimisations for large/detailed maps.",
"set r_temporalscenecache 1\n" //the main speedup. "set r_temporalscenecache 1\n" //the main speedup.
@ -1096,7 +1097,7 @@ struct
"set sv_autooffload 1\n" //Needs polish still. "set sv_autooffload 1\n" //Needs polish still.
"set gl_pbolightmaps 1\n" //FIXME: this needs to be the default eventually. "set gl_pbolightmaps 1\n" //FIXME: this needs to be the default eventually.
}, },
{ "dm", { "dm", false,
"Various settings to make you more competitive." "Various settings to make you more competitive."
"set cl_yieldcpu 0\n" "set cl_yieldcpu 0\n"
@ -1110,20 +1111,42 @@ struct
"set sys_clockprecision 1\n" //windows kinda sucks otherwise "set sys_clockprecision 1\n" //windows kinda sucks otherwise
#endif #endif
}, },
{ "qw", { "qw", false,
"Enable QuakeWorld-isms, for better gameplay.", "Enable QuakeWorld physics, for better gameplay.",
"set sv_nqplayerphysics 0\n" "set sv_nqplayerphysics 0\n"
"set sv_gameplayfix_multiplethinks 1\n" "set sv_gameplayfix_multiplethinks 1\n"
"cvarreset pm_bunnyfriction\n"
"cvarreset pm_edgefriction\n"
"cvarreset pm_slidefix\n"
"cvarreset pm_slidyslopes\n"
}, },
{ "nq" { "hybridphysics", false,
"Disable QuakeWorld-isms, for nq mod compat.", "Tweak QuakeWorld player physics to feel like nq physics, while still supporting prediction.",
"set sv_nqplayerphysics 0\n"
"set sv_gameplayfix_multiplethinks 1\n"
"set pm_bunnyfriction 1\n" //don't need bunnyspeedcap with this.
"set pm_edgefriction 2\n" //forces traceline instead of tracebox, to match nq (applies earlier, making it more aggressive)
"set pm_slidefix 1\n" //smoother running down slopes
"set pm_slidyslopes 1\n" //*sigh*
"set pm_noround 1\n" //lame
"set sv_maxtic 0\n" //fixed tick rates.
},
{ "nq", false,
"Disable QuakeWorld physics, for nq mod compat.",
"set sv_nqplayerphysics 1\n" "set sv_nqplayerphysics 1\n"
"set sv_gameplayfix_multiplethinks 0\n" "set sv_gameplayfix_multiplethinks 0\n"
//*also* set these, in case they use nqplayerphysics 2 after, which should give better hints.
"set pm_bunnyfriction 1\n" //don't need bunnyspeedcap with this.
"set pm_edgefriction 2\n" //forces traceline instead of tracebox, to match nq (applies earlier, making it more aggressive)
"set pm_slidefix 1\n" //smoother running down slopes
"set pm_slidyslopes 1\n" //*sigh*
"set pm_noround 1\n" //lame
}, },
{ "dp", { "dp", false,
"Reconfigures FTE to mimic DP for compat reasons.", "Reconfigures FTE to mimic DP for compat reasons.",
"if $server then echo Be sure to restart your server\n" "if $server then echo Be sure to restart your server\n"
@ -1153,7 +1176,7 @@ struct
// "sv_listen_dp 1\nsv_listen_nq 0\nsv_listen_qw 0\ncl_loopbackprotocol dpp7\ndpcompat_nopreparse 1\n" // "sv_listen_dp 1\nsv_listen_nq 0\nsv_listen_qw 0\ncl_loopbackprotocol dpp7\ndpcompat_nopreparse 1\n"
}, },
{ "tenebrae", { "tenebrae", true,
"Reconfigures FTE to mimic Tenebrae for compat/style reasons.", "Reconfigures FTE to mimic Tenebrae for compat/style reasons.",
//for the luls. combine with the tenebrae mod for maximum effect. //for the luls. combine with the tenebrae mod for maximum effect.
"fps_preset nq\n" "fps_preset nq\n"
@ -1169,7 +1192,7 @@ struct
"set r_nolerp 1\n" //well, that matches tenebrae. for the luls, right? "set r_nolerp 1\n" //well, that matches tenebrae. for the luls, right?
}, },
{ "timedemo", { "timedemo", false,
"Reconfigure some stuff to get through timedemos really fast. Some people might consider this cheating.", "Reconfigure some stuff to get through timedemos really fast. Some people might consider this cheating.",
//some extra things to pwn timedemos. //some extra things to pwn timedemos.
"fps_preset fast\n" "fps_preset fast\n"
@ -1457,7 +1480,7 @@ void FPS_Preset_f (void)
{ {
if (!stricmp(builtinpresets[i].name, arg)) if (!stricmp(builtinpresets[i].name, arg))
{ {
if (doreload) if (doreload && builtinpresets[i].dorestart)
Cbuf_InsertText("\nfs_restart\nvid_reload\n", RESTRICT_LOCAL, false); Cbuf_InsertText("\nfs_restart\nvid_reload\n", RESTRICT_LOCAL, false);
Cbuf_InsertText(builtinpresets[i].settings, RESTRICT_LOCAL, false); Cbuf_InsertText(builtinpresets[i].settings, RESTRICT_LOCAL, false);
return; return;

View file

@ -8324,6 +8324,7 @@ qboolean CSQC_Init (qboolean anycsqc, const char *csprogsname, unsigned int chec
movevars.stepdown = true; movevars.stepdown = true;
movevars.walljump = false;//(pm_walljump.value); movevars.walljump = false;//(pm_walljump.value);
movevars.slidyslopes = false;//(pm_slidyslopes.value!=0); movevars.slidyslopes = false;//(pm_slidyslopes.value!=0);
movevars.bunnyfriction = false;
movevars.autobunny = false; //pm_autobunny.value!=0 movevars.autobunny = false; //pm_autobunny.value!=0
movevars.watersinkspeed = 60;//*pm_watersinkspeed.string?pm_watersinkspeed.value:60; movevars.watersinkspeed = 60;//*pm_watersinkspeed.string?pm_watersinkspeed.value:60;
movevars.flyfriction = 4;//*pm_flyfriction.string?pm_flyfriction.value:4; movevars.flyfriction = 4;//*pm_flyfriction.string?pm_flyfriction.value:4;

View file

@ -1473,8 +1473,9 @@ void PM_PlayerMove (float gamespeed)
pmove.jump_msec = 0; pmove.jump_msec = 0;
} }
PM_CheckJump ();
if (!movevars.bunnyfriction)
PM_CheckJump (); //qw-style bunny
PM_Friction (); PM_Friction ();
if (pmove.waterlevel >= 2) if (pmove.waterlevel >= 2)
@ -1486,6 +1487,9 @@ void PM_PlayerMove (float gamespeed)
else else
PM_AirMove (); PM_AirMove ();
if (movevars.bunnyfriction)
PM_CheckJump (); //nq-style bunny. note tick rate differences too.
/* //round to network precision /* //round to network precision
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {

View file

@ -119,6 +119,7 @@ typedef struct {
qboolean stepdown; qboolean stepdown;
qboolean slidyslopes; qboolean slidyslopes;
qboolean autobunny; qboolean autobunny;
qboolean bunnyfriction; //force at least one frame of friction when bunnying.
int stepheight; int stepheight;
qbyte coordtype; //FIXME: EZPEXT1_FLOATENTCOORDS should mean 4, but the result does not match ezquake/mvdsv's round-towards-origin which would result in inconsistencies. so player coords are rounded inconsistently. qbyte coordtype; //FIXME: EZPEXT1_FLOATENTCOORDS should mean 4, but the result does not match ezquake/mvdsv's round-towards-origin which would result in inconsistencies. so player coords are rounded inconsistently.

View file

@ -5690,6 +5690,7 @@ void SV_InitLocal (void)
extern cvar_t sv_aim; extern cvar_t sv_aim;
extern cvar_t pm_bunnyspeedcap; extern cvar_t pm_bunnyspeedcap;
extern cvar_t pm_bunnyfriction;
extern cvar_t pm_ktjump; extern cvar_t pm_ktjump;
extern cvar_t pm_slidefix; extern cvar_t pm_slidefix;
extern cvar_t pm_airstep; extern cvar_t pm_airstep;
@ -5766,6 +5767,7 @@ void SV_InitLocal (void)
Cvar_Register (&sv_bigcoords, cvargroup_serverphysics); Cvar_Register (&sv_bigcoords, cvargroup_serverphysics);
Cvar_Register (&pm_bunnyspeedcap, cvargroup_serverphysics); Cvar_Register (&pm_bunnyspeedcap, cvargroup_serverphysics);
Cvar_Register (&pm_bunnyfriction, cvargroup_serverphysics);
Cvar_Register (&pm_watersinkspeed, cvargroup_serverphysics); Cvar_Register (&pm_watersinkspeed, cvargroup_serverphysics);
Cvar_Register (&pm_flyfriction, cvargroup_serverphysics); Cvar_Register (&pm_flyfriction, cvargroup_serverphysics);
Cvar_Register (&pm_ktjump, cvargroup_serverphysics); Cvar_Register (&pm_ktjump, cvargroup_serverphysics);

View file

@ -73,13 +73,14 @@ cvar_t pm_bunnyspeedcap = CVARFD("pm_bunnyspeedcap", "", CVAR_SERVERINFO, "0 or
cvar_t pm_watersinkspeed = CVARFD("pm_watersinkspeed", "", CVAR_SERVERINFO, "This is the speed that players will sink at while inactive in water. Empty means 60."); cvar_t pm_watersinkspeed = CVARFD("pm_watersinkspeed", "", CVAR_SERVERINFO, "This is the speed that players will sink at while inactive in water. Empty means 60.");
cvar_t pm_flyfriction = CVARFD("pm_flyfriction", "", CVAR_SERVERINFO, "Amount of friction that applies in fly or 6dof mode. Empty means 4."); cvar_t pm_flyfriction = CVARFD("pm_flyfriction", "", CVAR_SERVERINFO, "Amount of friction that applies in fly or 6dof mode. Empty means 4.");
cvar_t pm_slidefix = CVARFD("pm_slidefix", "", CVAR_SERVERINFO, "Fixes an issue when walking down slopes (ie: so they act more like slopes and not a series of steps)"); cvar_t pm_slidefix = CVARFD("pm_slidefix", "", CVAR_SERVERINFO, "Fixes an issue when walking down slopes (ie: so they act more like slopes and not a series of steps)");
cvar_t pm_slidyslopes = CVARFD("pm_slidyslopes", "", CVAR_SERVERINFO, "Replicates NQ behaviour, where players will slowly slide down ramps"); cvar_t pm_slidyslopes = CVARFD("pm_slidyslopes", "", CVAR_SERVERINFO, "Replicates NQ behaviour, where players will slowly slide down ramps. Generally requires 'pm_noround 1' too, otherwise the effect rounds to nothing.");
cvar_t pm_bunnyfriction = CVARFD("pm_bunnyfriction", "", CVAR_SERVERINFO, "Replicates NQ behaviour, ensuring that there's at least a frame of friction while jumping - friction is proportional to tick rate.");
cvar_t pm_autobunny = CVARFD("pm_autobunny", "", CVAR_SERVERINFO, "Players will continue jumping without needing to release the jump button."); cvar_t pm_autobunny = CVARFD("pm_autobunny", "", CVAR_SERVERINFO, "Players will continue jumping without needing to release the jump button.");
cvar_t pm_airstep = CVARAFD("pm_airstep", "", /*dp*/"sv_jumpstep", CVAR_SERVERINFO, "Allows players to step up while jumping. This makes stairs more graceful but also increases potential jump heights."); cvar_t pm_airstep = CVARAFD("pm_airstep", "", /*dp*/"sv_jumpstep", CVAR_SERVERINFO, "Allows players to step up while jumping. This makes stairs more graceful but also increases potential jump heights.");
cvar_t pm_pground = CVARFD("pm_pground", "", CVAR_SERVERINFO, "Use persisten onground state instead of recalculating every frame."CON_WARNING"Do NOT use with nq mods, as most nq mods will interfere with onground state, resulting in glitches."); cvar_t pm_pground = CVARFD("pm_pground", "", CVAR_SERVERINFO, "Use persisten onground state instead of recalculating every frame."CON_WARNING"Do NOT use with nq mods, as most nq mods will interfere with onground state, resulting in glitches.");
cvar_t pm_stepdown = CVARFD("pm_stepdown", "", CVAR_SERVERINFO, "Causes physics to stick to the ground, instead of constantly losing traction whiloe going down steps."); cvar_t pm_stepdown = CVARFD("pm_stepdown", "", CVAR_SERVERINFO, "Causes physics to stick to the ground, instead of constantly losing traction whiloe going down steps.");
cvar_t pm_walljump = CVARFD("pm_walljump", "", CVAR_SERVERINFO, "Allows the player to bounce off walls while arborne."); cvar_t pm_walljump = CVARFD("pm_walljump", "", CVAR_SERVERINFO, "Allows the player to bounce off walls while arborne.");
cvar_t pm_edgefriction = CVARAFD("pm_edgefriction", "", /*nq*/"edgefriction", CVAR_SERVERINFO, "Default value of 2"); cvar_t pm_edgefriction = CVARAFD("pm_edgefriction", "", /*nq*/"edgefriction", CVAR_SERVERINFO, "Increases friction when about to walk over a cliff, so you're less likely to plummet by mistake. When empty defaults to 2, but uses a tracebox instead of a traceline to detect the drop.");
#define cvargroup_serverphysics "server physics variables" #define cvargroup_serverphysics "server physics variables"
void WPhys_Init(void) void WPhys_Init(void)

View file

@ -115,6 +115,7 @@ extern cvar_t pm_bunnyspeedcap;
extern cvar_t pm_ktjump; extern cvar_t pm_ktjump;
extern cvar_t pm_slidefix; extern cvar_t pm_slidefix;
extern cvar_t pm_slidyslopes; extern cvar_t pm_slidyslopes;
extern cvar_t pm_bunnyfriction;
extern cvar_t pm_autobunny; extern cvar_t pm_autobunny;
extern cvar_t pm_airstep; extern cvar_t pm_airstep;
extern cvar_t pm_pground; extern cvar_t pm_pground;
@ -7608,6 +7609,7 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
movevars.stepdown = (pm_stepdown.value != 0); movevars.stepdown = (pm_stepdown.value != 0);
movevars.walljump = (pm_walljump.value); movevars.walljump = (pm_walljump.value);
movevars.slidyslopes = (pm_slidyslopes.value!=0); movevars.slidyslopes = (pm_slidyslopes.value!=0);
movevars.bunnyfriction = (pm_bunnyfriction.value!=0);
movevars.autobunny = (pm_autobunny.value!=0); movevars.autobunny = (pm_autobunny.value!=0);
movevars.watersinkspeed = *pm_watersinkspeed.string?pm_watersinkspeed.value:60; movevars.watersinkspeed = *pm_watersinkspeed.string?pm_watersinkspeed.value:60;
movevars.flyfriction = *pm_flyfriction.string?pm_flyfriction.value:4; movevars.flyfriction = *pm_flyfriction.string?pm_flyfriction.value:4;