X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=sv_save.c;h=b90f748775029e8b2ff0b9640fdfef52bd768961;hp=f7f26d69728f9ee173e9714c96f83cde3a366ec0;hb=6ff5802848663ece807c1a425da91d7630a8a036;hpb=197da0b9148dfb2d1b16457df1ba1c08b86ff9c2 diff --git a/sv_save.c b/sv_save.c index f7f26d69..b90f7487 100644 --- a/sv_save.c +++ b/sv_save.c @@ -37,7 +37,7 @@ void SV_Savegame_to(prvm_prog_t *prog, const char *name) int i, k, l, numbuffers, lightstyles = 64; char comment[SAVEGAME_COMMENT_LENGTH+1]; char line[MAX_INPUTLINE]; - qboolean isserver; + qbool isserver; char *s; // first we have to figure out if this can be saved in 64 lightstyles @@ -176,6 +176,30 @@ void SV_Savegame_to(prvm_prog_t *prog, const char *name) Con_Print("done.\n"); } +static qbool SV_CanSave(void) +{ + prvm_prog_t *prog = SVVM_prog; + if(SV_IsLocalServer() == 1) + { + // singleplayer checks + // FIXME: This only checks if the first player is dead? + if ((svs.clients[0].active && PRVM_serveredictfloat(svs.clients[0].edict, deadflag))) + { + Con_Print("Can't savegame with a dead player\n"); + return false; + } + + if(host.hook.CL_Intermission && host.hook.CL_Intermission()) + { + Con_Print("Can't save in intermission.\n"); + return false; + } + } + else + Con_Print(CON_WARN "Warning: saving a multiplayer game may have strange results when restored (to properly resume, all players must join in the same player slots and then the game can be reloaded).\n"); + return true; +} + /* =============== SV_Savegame_f @@ -185,7 +209,6 @@ void SV_Savegame_f(cmd_state_t *cmd) { prvm_prog_t *prog = SVVM_prog; char name[MAX_QPATH]; - qboolean deadflag = false; if (!sv.active) { @@ -193,25 +216,8 @@ void SV_Savegame_f(cmd_state_t *cmd) return; } - deadflag = cl.islocalgame && svs.clients[0].active && PRVM_serveredictfloat(svs.clients[0].edict, deadflag); - - if (cl.islocalgame) - { - // singleplayer checks - if (cl.intermission) - { - Con_Print("Can't save in intermission.\n"); - return; - } - - if (deadflag) - { - Con_Print("Can't savegame with a dead player\n"); - return; - } - } - else - Con_Warn("Warning: saving a multiplayer game may have strange results when restored (to properly resume, all players must join in the same player slots and then the game can be reloaded).\n"); + if(!SV_CanSave()) + return; if (Cmd_Argc(cmd) != 2) { @@ -264,16 +270,11 @@ void SV_Loadgame_f(cmd_state_t *cmd) 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 @@ -428,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); @@ -436,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 && !VectorCompare(PRVM_serveredictvector(ent, absmin), PRVM_serveredictvector(ent, absmax))) SV_LinkEdict(ent); } @@ -518,7 +519,7 @@ void SV_Loadgame_f(cmd_state_t *cmd) if (COM_ParseToken_Simple(&t, false, false, true)) k |= atoi(com_token); if (!BufStr_FindCreateReplace(prog, i, k, "string")) - Con_Errorf("failed to create stringbuffer %i\n", i); + Con_Printf(CON_ERROR "failed to create stringbuffer %i\n", i); } else Con_Printf("unsupported stringbuffer index %i \"%s\"\n", i, com_token); @@ -548,7 +549,7 @@ void SV_Loadgame_f(cmd_state_t *cmd) Con_Printf("unexpected end of line when parsing sv.bufstr (expected strindex)\n"); } else - Con_Errorf("failed to create stringbuffer %i \"%s\"\n", i, com_token); + Con_Printf(CON_ERROR "failed to create stringbuffer %i \"%s\"\n", i, com_token); } } // skip any trailing text or unrecognized commands @@ -572,6 +573,6 @@ void SV_Loadgame_f(cmd_state_t *cmd) Con_Printf("SV_Loadgame_f: finished\n"); // make sure we're connected to loopback - if (sv.active && cls.state == ca_disconnected) - CL_EstablishConnection("local:1", -2); + if(sv.active && host.hook.ConnectLocal) + host.hook.ConnectLocal(); }