]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_save.c
snd: fix a hard-to-repro segfault when joining a server
[xonotic/darkplaces.git] / sv_save.c
index 799a0d8a08b2aa450e729dd8fa081e89dff3c1fb..db8764fcce492f83d0669590de3ff8e46a7e4620 100644 (file)
--- a/sv_save.c
+++ b/sv_save.c
@@ -231,7 +231,7 @@ void SV_Savegame_f(cmd_state_t *cmd)
                return;
        }
 
-       strlcpy (name, Cmd_Argv(cmd, 1), sizeof (name));
+       dp_strlcpy (name, Cmd_Argv(cmd, 1), sizeof (name));
        FS_DefaultExtension (name, ".sav", sizeof (name));
 
        SV_Savegame_to(prog, name);
@@ -265,21 +265,16 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                return;
        }
 
-       strlcpy (filename, Cmd_Argv(cmd, 1), sizeof(filename));
+       dp_strlcpy (filename, Cmd_Argv(cmd, 1), sizeof(filename));
        FS_DefaultExtension (filename, ".sav", sizeof (filename));
 
        Con_Printf("Loading game from %s...\n", filename);
 
-       // stop playing demos
-       if (cls.demoplayback)
-               CL_Disconnect ();
+       if(host.hook.Disconnect)
+               host.hook.Disconnect(false, NULL);
 
-#ifdef CONFIG_MENU
-       // remove menu
-       if (key_dest == key_menu || key_dest == key_menu_grabbed)
-               MR_ToggleMenu(0);
-#endif
-       key_dest = key_game;
+       if(host.hook.ToggleMenu)
+               host.hook.ToggleMenu();
 
        cls.demonum = -1;               // stop demo loop in case this fails
 
@@ -325,7 +320,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
 
        // mapname
        COM_ParseToken_Simple(&t, false, false, true);
-       strlcpy (mapname, com_token, sizeof(mapname));
+       dp_strlcpy (mapname, com_token, sizeof(mapname));
 
        if(developer_entityparsing.integer)
                Con_Printf("SV_Loadgame_f: loading time\n");
@@ -367,7 +362,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                        t = start;
                        break;
                }
-               strlcpy(sv.lightstyles[i], com_token, sizeof(sv.lightstyles[i]));
+               dp_strlcpy(sv.lightstyles[i], com_token, sizeof(sv.lightstyles[i]));
        }
 
        if(developer_entityparsing.integer)
@@ -434,7 +429,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                                PRVM_MEM_IncreaseEdicts(prog);
                        ent = PRVM_EDICT_NUM(entnum);
                        memset(ent->fields.fp, 0, prog->entityfields * sizeof(prvm_vec_t));
-                       ent->priv.server->free = false;
+                       ent->free = false;
 
                        if(developer_entityparsing.integer)
                                Con_Printf("SV_Loadgame_f: loading edict %d\n", entnum);
@@ -442,7 +437,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                        PRVM_ED_ParseEdict (prog, start, ent);
 
                        // link it into the bsp tree
-                       if (!ent->priv.server->free && !VectorCompare(PRVM_serveredictvector(ent, absmin), PRVM_serveredictvector(ent, absmax)))
+                       if (!ent->free)
                                SV_LinkEdict(ent);
                }
 
@@ -486,7 +481,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                                        i = atoi(com_token);
                                        COM_ParseToken_Simple(&t, false, false, true);
                                        if (i >= 0 && i < MAX_LIGHTSTYLES)
-                                               strlcpy(sv.lightstyles[i], com_token, sizeof(sv.lightstyles[i]));
+                                               dp_strlcpy(sv.lightstyles[i], com_token, sizeof(sv.lightstyles[i]));
                                        else
                                                Con_Printf("unsupported lightstyle %i \"%s\"\n", i, com_token);
                                }
@@ -497,7 +492,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                                        COM_ParseToken_Simple(&t, false, false, true);
                                        if (i >= 0 && i < MAX_MODELS)
                                        {
-                                               strlcpy(sv.model_precache[i], com_token, sizeof(sv.model_precache[i]));
+                                               dp_strlcpy(sv.model_precache[i], com_token, sizeof(sv.model_precache[i]));
                                                sv.models[i] = Mod_ForName (sv.model_precache[i], true, false, sv.model_precache[i][0] == '*' ? sv.worldname : NULL);
                                        }
                                        else
@@ -509,7 +504,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
                                        i = atoi(com_token);
                                        COM_ParseToken_Simple(&t, false, false, true);
                                        if (i >= 0 && i < MAX_SOUNDS)
-                                               strlcpy(sv.sound_precache[i], com_token, sizeof(sv.sound_precache[i]));
+                                               dp_strlcpy(sv.sound_precache[i], com_token, sizeof(sv.sound_precache[i]));
                                        else
                                                Con_Printf("unsupported sound %i \"%s\"\n", i, com_token);
                                }