From fca8620cba0be97dc35dc800ef21a24ea88fc92c Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Tue, 6 Apr 2021 12:22:32 +0200 Subject: [PATCH] Server: Physics variables are now controlled via sv_ cvars like they usually are in idTech, however we're now checking them every frame and updating the networked infokeys in question --- src/server/entry.qc | 2 ++ src/server/hlmaterials.qc | 6 ++--- src/shared/pmove.h | 4 +++ src/shared/pmove.qc | 51 ++++++++++++++++++++++++++++++--------- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/server/entry.qc b/src/server/entry.qc index 74700171..df1542ea 100644 --- a/src/server/entry.qc +++ b/src/server/entry.qc @@ -24,6 +24,8 @@ Called once every single frame. void StartFrame(void) { + PMove_StartFrame(); + /* For entity parenting to work, we need to go through and run on every * this method on every CBaseEntity class */ for (entity a = world; (a = findfloat(a, ::identity, 1));) { diff --git a/src/server/hlmaterials.qc b/src/server/hlmaterials.qc index 7d2b04d9..eba57cd0 100644 --- a/src/server/hlmaterials.qc +++ b/src/server/hlmaterials.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 Marco Hladik + * Copyright (c) 2016-2021 Marco Hladik * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -45,8 +45,6 @@ HLMaterials_Load(string filename) void HLMaterials_Init(void) { - /* load materials.txt because someone thought this was the best idea */ - hashMaterials = __NULL__; hashMaterials = hash_createtab(2, HASH_ADD); @@ -68,6 +66,6 @@ HLMaterials_Init(void) /* the way TW did it back in '03 */ HLMaterials_Load(sprintf("maps/%s.mat", mapname)); - /* the way TW did it back in '03 */ + /* Trinity does it this way */ HLMaterials_Load(sprintf("maps/%s_materials.txt", mapname)); } diff --git a/src/shared/pmove.h b/src/shared/pmove.h index 4150ded1..a2c26ed2 100644 --- a/src/shared/pmove.h +++ b/src/shared/pmove.h @@ -22,6 +22,10 @@ int trace_endcontentsi; .vector basevelocity; .entity groundentity; +#ifdef SERVER +void PMove_StartFrame(void); +#endif + void PMove_Init(void); int PMove_Contents(vector org); float PMove_Gravity(entity ent); diff --git a/src/shared/pmove.qc b/src/shared/pmove.qc index 1bfbaa92..b29c3741 100644 --- a/src/shared/pmove.qc +++ b/src/shared/pmove.qc @@ -62,6 +62,18 @@ #define PMOVE_STEP_RUNSPEED 220 #endif +/* if they're undefined by a config, they'll be set by the game/mod default */ +var float autocvar_sv_stepheight = PMOVE_STEPHEIGHT; +var float autocvar_sv_airstepheight = PMOVE_AIRSTEPHEIGHT; +var float autocvar_sv_friction = PMOVE_FRICTION; +var float autocvar_sv_edgefriction = PMOVE_EDGEFRICTION; +var float autocvar_sv_stopspeed = PMOVE_STOPSPEED; +var float autocvar_sv_gravity = PMOVE_GRAVITY; +var float autocvar_sv_airaccelerate = PMOVE_AIRACCELERATE; +var float autocvar_sv_wateraccelerate = PMOVE_WATERACCELERATE; +var float autocvar_sv_accelerate = PMOVE_ACCELERATE; +var float autocvar_sv_maxspeed = PMOVE_MAXSPEED; + /* FIXME: jumptime should use the time global, as time intervals are not * predictable - decrement it based upon input_timelength */ @@ -72,20 +84,35 @@ void PMove_Init(void) { -#ifdef SERVER - readcmd(sprintf("serverinfo phy_stepheight %d\n", PMOVE_STEPHEIGHT)); - readcmd(sprintf("serverinfo phy_airstepheight %d\n", PMOVE_AIRSTEPHEIGHT)); - readcmd(sprintf("serverinfo phy_friction %d\n", PMOVE_FRICTION)); - readcmd(sprintf("serverinfo phy_edgefriction %d\n", PMOVE_EDGEFRICTION)); - readcmd(sprintf("serverinfo phy_stopspeed %d\n", PMOVE_STOPSPEED)); - readcmd(sprintf("serverinfo phy_gravity %d\n", PMOVE_GRAVITY)); - readcmd(sprintf("serverinfo phy_airaccelerate %d\n", PMOVE_AIRACCELERATE)); - readcmd(sprintf("serverinfo phy_wateraccelerate %d\n", PMOVE_WATERACCELERATE)); - readcmd(sprintf("serverinfo phy_accelerate %d\n", PMOVE_ACCELERATE)); - readcmd(sprintf("serverinfo phy_maxspeed %d\n", PMOVE_MAXSPEED)); -#endif } +#ifdef SERVER +/* we need to network our changes everytime cvars are updated */ +void +PMove_UpdateVar(string info, string cv) +{ + float d = cvar(cv); + if (serverkeyfloat(info) != d) { + readcmd(sprintf("serverinfo %s %d\n", info, d)); + } +} + +void +PMove_StartFrame(void) +{ + PMove_UpdateVar("phy_stepheight", "sv_stepheight"); + PMove_UpdateVar("phy_airstepheight", "sv_airstepheight"); + PMove_UpdateVar("phy_friction", "sv_friction"); + PMove_UpdateVar("phy_edgefriction", "sv_edgefriction"); + PMove_UpdateVar("phy_stopspeed", "sv_stopspeed"); + PMove_UpdateVar("phy_gravity", "sv_gravity"); + PMove_UpdateVar("phy_airaccelerate", "sv_airaccelerate"); + PMove_UpdateVar("phy_wateraccelerate", "sv_wateraccelerate"); + PMove_UpdateVar("phy_accelerate", "sv_accelerate"); + PMove_UpdateVar("phy_maxspeed", "sv_maxspeed"); +} +#endif + /* pointcontents reimplementation, only way we can effectively trace * against ladders and liquids that are defined in the game-logic. */