]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_main.c
cameras: when new eye pos == old eye pos, do not create a network eye
[xonotic/darkplaces.git] / sv_main.c
index 32abfe34b16e231e1a48473e2faf82eb87e8c2da..db56fde35da9ef2243d3d2db0ee6948f6770c937 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -56,10 +56,13 @@ cvar_t sv_airaccel_qw = {0, "sv_airaccel_qw", "1", "ratio of QW-style air contro
 cvar_t sv_airaccel_sideways_friction = {0, "sv_airaccel_sideways_friction", "", "anti-sideways movement stabilization (reduces speed gain when zigzagging); when < 0, only so much friction is applied that braking (by accelerating backwards) cannot be stronger"};
 cvar_t sv_airaccelerate = {0, "sv_airaccelerate", "-1", "rate at which a player accelerates to sv_maxairspeed while in the air, if less than 0 the sv_accelerate variable is used instead"};
 cvar_t sv_airstopaccelerate = {0, "sv_airstopaccelerate", "0", "when set, replacement for sv_airaccelerate when moving backwards"};
+cvar_t sv_airspeedlimit_nonqw = {0, "sv_airspeedlimit_nonqw", "0", "when set, this is a soft speed limit while in air when using airaccel_qw not equal to 1"};
 cvar_t sv_airstrafeaccelerate = {0, "sv_airstrafeaccelerate", "0", "when set, replacement for sv_airaccelerate when just strafing"};
 cvar_t sv_maxairstrafespeed = {0, "sv_maxairstrafespeed", "0", "when set, replacement for sv_maxairspeed when just strafing"};
+cvar_t sv_airstrafeaccel_qw = {0, "sv_airstrafeaccel_qw", "0", "when set, replacement for sv_airaccel_qw when just strafing"};
 cvar_t sv_aircontrol = {0, "sv_aircontrol", "0", "CPMA-style air control"};
 cvar_t sv_aircontrol_power = {0, "sv_aircontrol_power", "2", "CPMA-style air control exponent"};
+cvar_t sv_aircontrol_penalty = {0, "sv_aircontrol_penalty", "0", "deceleration while using CPMA-style air control"};
 cvar_t sv_allowdownloads = {0, "sv_allowdownloads", "1", "whether to allow clients to download files from the server (does not affect http downloads)"};
 cvar_t sv_allowdownloads_archive = {0, "sv_allowdownloads_archive", "0", "whether to allow downloads of archives (pak/pk3)"};
 cvar_t sv_allowdownloads_config = {0, "sv_allowdownloads_config", "0", "whether to allow downloads of config files (cfg)"};
@@ -106,12 +109,12 @@ cvar_t sv_gameplayfix_noairborncorpse_allowsuspendeditems = {0, "sv_gameplayfix_
 cvar_t sv_gameplayfix_nudgeoutofsolid = {0, "sv_gameplayfix_nudgeoutofsolid", "1", "attempts to fix physics errors (where an object ended up in solid for some reason)"};
 cvar_t sv_gameplayfix_nudgeoutofsolid_bias = {0, "sv_gameplayfix_nudgeoutofsolid_bias", "0", "over-correction on nudgeoutofsolid logic, to prevent constant contact"};
 cvar_t sv_gameplayfix_q2airaccelerate = {0, "sv_gameplayfix_q2airaccelerate", "0", "Quake2-style air acceleration"};
-cvar_t sv_gameplayfix_nogravityonground = {0, "sv_gameplayfix_nogravityonground", "0", "Quake2-style air acceleration"};
+cvar_t sv_gameplayfix_nogravityonground = {0, "sv_gameplayfix_nogravityonground", "0", "turn off gravity when on ground (to get rid of sliding)"};
 cvar_t sv_gameplayfix_setmodelrealbox = {0, "sv_gameplayfix_setmodelrealbox", "1", "fixes a bug in Quake that made setmodel always set the entity box to ('-16 -16 -16', '16 16 16') rather than properly checking the model box, breaks some poorly coded mods"};
 cvar_t sv_gameplayfix_slidemoveprojectiles = {0, "sv_gameplayfix_slidemoveprojectiles", "1", "allows MOVETYPE_FLY/FLYMISSILE/TOSS/BOUNCE/BOUNCEMISSILE entities to finish their move in a frame even if they hit something, fixes 'gravity accumulation' bug for grenades on steep slopes"};
 cvar_t sv_gameplayfix_stepdown = {0, "sv_gameplayfix_stepdown", "0", "attempts to step down stairs, not just up them (prevents the familiar thud..thud..thud.. when running down stairs and slopes)"};
 cvar_t sv_gameplayfix_stepwhilejumping = {0, "sv_gameplayfix_stepwhilejumping", "1", "applies step-up onto a ledge even while airborn, useful if you would otherwise just-miss the floor when running across small areas with gaps (for instance running across the moving platforms in dm2, or jumping to the megahealth and red armor in dm2 rather than using the bridge)"};
-cvar_t sv_gameplayfix_stepmultipletimes = {0, "sv_gameplayfix_stepmultipletimes", "1", "applies step-up onto a ledge more than once in a single frame, when running quickly up stairs"};
+cvar_t sv_gameplayfix_stepmultipletimes = {0, "sv_gameplayfix_stepmultipletimes", "0", "applies step-up onto a ledge more than once in a single frame, when running quickly up stairs"};
 cvar_t sv_gameplayfix_swiminbmodels = {0, "sv_gameplayfix_swiminbmodels", "1", "causes pointcontents (used to determine if you are in a liquid) to check bmodel entities as well as the world model, so you can swim around in (possibly moving) water bmodel entities"};
 cvar_t sv_gameplayfix_upwardvelocityclearsongroundflag = {0, "sv_gameplayfix_upwardvelocityclearsongroundflag", "1", "prevents monsters, items, and most other objects from being stuck to the floor when pushed around by damage, and other situations in mods"};
 cvar_t sv_gameplayfix_downtracesupportsongroundflag = {0, "sv_gameplayfix_downtracesupportsongroundflag", "1", "prevents very short moves from clearing onground (which may make the player stick to the floor at high netfps)"};
@@ -379,8 +382,11 @@ void SV_Init (void)
        Cvar_RegisterVariable (&sv_airstopaccelerate);
        Cvar_RegisterVariable (&sv_airstrafeaccelerate);
        Cvar_RegisterVariable (&sv_maxairstrafespeed);
+       Cvar_RegisterVariable (&sv_airstrafeaccel_qw);
+       Cvar_RegisterVariable (&sv_airspeedlimit_nonqw);
        Cvar_RegisterVariable (&sv_aircontrol);
        Cvar_RegisterVariable (&sv_aircontrol_power);
+       Cvar_RegisterVariable (&sv_aircontrol_penalty);
        Cvar_RegisterVariable (&sv_allowdownloads);
        Cvar_RegisterVariable (&sv_allowdownloads_archive);
        Cvar_RegisterVariable (&sv_allowdownloads_config);
@@ -535,6 +541,7 @@ void SV_Init (void)
        if (gamemode == GAME_NEXUIZ)
        {
                Cvar_SetValueQuick (&sv_gameplayfix_q2airaccelerate, 1);
+               Cvar_SetValueQuick (&sv_gameplayfix_stepmultipletimes, 1);
        }
 
        sv_mempool = Mem_AllocPool("server", 0, NULL);
@@ -972,14 +979,19 @@ void SV_ConnectClient (int clientnum, netconn_t *netconnection)
 {
        client_t                *client;
        int                             i;
-       float                   spawn_parms[NUM_SPAWN_PARMS];
 
        client = svs.clients + clientnum;
 
 // set up the client_t
        if (sv.loadgame)
-               memcpy (spawn_parms, client->spawn_parms, sizeof(spawn_parms));
-       memset (client, 0, sizeof(*client));
+       {
+               float backupparms[NUM_SPAWN_PARMS];
+               memcpy(backupparms, client->spawn_parms, sizeof(backupparms));
+               memset(client, 0, sizeof(*client));
+               memcpy(client->spawn_parms, backupparms, sizeof(backupparms));
+       }
+       else
+               memset(client, 0, sizeof(*client));
        client->active = true;
        client->netconnection = netconnection;
 
@@ -1001,9 +1013,7 @@ void SV_ConnectClient (int clientnum, netconn_t *netconnection)
                client->rate = 1000000000;
        client->connecttime = realtime;
 
-       if (sv.loadgame)
-               memcpy (client->spawn_parms, spawn_parms, sizeof(spawn_parms));
-       else
+       if (!sv.loadgame)
        {
                // call the progs to get default spawn parms for the new client
                // set self to world to intentionally cause errors with broken SetNewParms code in some mods
@@ -1599,9 +1609,9 @@ void SV_AddCameraEyes(void)
 {
        int e, i, j, k;
        prvm_edict_t *ed;
-       int cameras[MAX_LEVELNETWORKEYES];
-       vec3_t camera_origins[MAX_LEVELNETWORKEYES];
-       int eye_levels[MAX_CLIENTNETWORKEYES];
+       static int cameras[MAX_LEVELNETWORKEYES];
+       static vec3_t camera_origins[MAX_LEVELNETWORKEYES];
+       static int eye_levels[MAX_CLIENTNETWORKEYES];
        int n_cameras = 0;
        vec3_t mi, ma;
        prvm_eval_t *valendpos, *val;
@@ -1629,11 +1639,13 @@ void SV_AddCameraEyes(void)
                                VectorClear(PRVM_G_VECTOR(OFS_PARM1));
                                PRVM_ExecuteProgram(val->function, "QC function e.camera_transform is missing");
                                if(!VectorCompare(valendpos->vector, sv.writeentitiestoclient_eyes[0]))
+                               {
                                        VectorCopy(valendpos->vector, camera_origins[n_cameras]);
-                               cameras[n_cameras] = e;
-                               ++n_cameras;
-                               if(n_cameras >= MAX_LEVELNETWORKEYES)
-                                       break;
+                                       cameras[n_cameras] = e;
+                                       ++n_cameras;
+                                       if(n_cameras >= MAX_LEVELNETWORKEYES)
+                                               break;
+                               }
                        }
                }
        }
@@ -1966,13 +1978,16 @@ void SV_WriteClientdataToMessage (client_t *client, prvm_edict_t *ent, sizebuf_t
        statsf[STAT_MOVEVARS_AIRSTOPACCELERATE] = sv_airstopaccelerate.value;
        statsf[STAT_MOVEVARS_AIRSTRAFEACCELERATE] = sv_airstrafeaccelerate.value;
        statsf[STAT_MOVEVARS_MAXAIRSTRAFESPEED] = sv_maxairstrafespeed.value;
+       statsf[STAT_MOVEVARS_AIRSTRAFEACCEL_QW] = sv_airstrafeaccel_qw.value;
        statsf[STAT_MOVEVARS_AIRCONTROL] = sv_aircontrol.value;
        statsf[STAT_MOVEVARS_AIRCONTROL_POWER] = sv_aircontrol_power.value;
+       statsf[STAT_MOVEVARS_AIRCONTROL_PENALTY] = sv_aircontrol_penalty.value;
        statsf[STAT_MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL] = sv_warsowbunny_airforwardaccel.value;
        statsf[STAT_MOVEVARS_WARSOWBUNNY_ACCEL] = sv_warsowbunny_accel.value;
        statsf[STAT_MOVEVARS_WARSOWBUNNY_TOPSPEED] = sv_warsowbunny_topspeed.value;
        statsf[STAT_MOVEVARS_WARSOWBUNNY_TURNACCEL] = sv_warsowbunny_turnaccel.value;
        statsf[STAT_MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO] = sv_warsowbunny_backtosideratio.value;
+       statsf[STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW] = sv_airspeedlimit_nonqw.value;
        statsf[STAT_FRAGLIMIT] = fraglimit.value;
        statsf[STAT_TIMELIMIT] = timelimit.value;
 
@@ -2382,7 +2397,7 @@ static void SV_UpdateToReliableMessages (void)
 
                // frags
                host_client->frags = (int)host_client->edict->fields.server->frags;
-               if(gamemode == GAME_NEXUIZ)
+               if(gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC)
                        if(!host_client->spawned && host_client->netconnection)
                                host_client->frags = -666;
                if (host_client->old_frags != host_client->frags)
@@ -3073,8 +3088,12 @@ void SV_SpawnServer (const char *server)
 
        if (!FS_FileExists(modelname))
        {
-               Con_Printf("SpawnServer: no map file named %s\n", modelname);
-               return;
+               dpsnprintf (modelname, sizeof(modelname), "maps/%s", server);
+               if (!FS_FileExists(modelname))
+               {
+                       Con_Printf("SpawnServer: no map file named maps/%s.bsp\n", server);
+                       return;
+               }
        }
 
        if (cls.state != ca_dedicated)