if (in == 0) // default layout
{
- print ("#%-3u %-16.16s %3i %2i:%02i:%02i\n", i+1, client->name, frags, hours, minutes, seconds);
- print (" %s\n", ip);
+ // LordHavoc: we must use multiple prints for ProQuake compatibility
+ print ("#%-3u ", i+1);
+ print ("%-16.16s ", client->name);
+ print ("%4i ", frags);
+ print ("%2i:%02i:%02i\n ", hours, minutes, seconds);
+ print ("%s\n", ip);
+// print ("#%-3u %-16.16s %3i %2i:%02i:%02i\n", i+1, client->name, frags, hours, minutes, seconds);
+// print (" %s\n", ip);
}
else if (in == 1) // extended layout
{
}
// remove menu
+ if (key_dest == key_menu || key_dest == key_menu_grabbed)
+ MR_ToggleMenu(0);
key_dest = key_game;
svs.serverflags = 0; // haven't completed an episode yet
}
// remove menu
+ if (key_dest == key_menu || key_dest == key_menu_grabbed)
+ MR_ToggleMenu(0);
key_dest = key_game;
SV_VM_Begin();
}
// remove menu
+ if (key_dest == key_menu || key_dest == key_menu_grabbed)
+ MR_ToggleMenu(0);
key_dest = key_game;
allowcheats = sv_cheats.integer != 0;
void Host_Savegame_to (const char *name)
{
qfile_t *f;
- int i, lightstyles = 64;
+ int i, k, l, lightstyles = 64;
char comment[SAVEGAME_COMMENT_LENGTH+1];
+ char line[MAX_INPUTLINE];
qboolean isserver;
+ char *s;
// first we have to figure out if this can be saved in 64 lightstyles
// (for Quake compatibility)
for (i=1 ; i<MAX_SOUNDS ; i++)
if (sv.sound_precache[i][0])
FS_Printf(f,"sv.sound_precache %i %s\n", i, sv.sound_precache[i]);
+
+ // darkplaces extension - save buffers
+ for (i = 0; i < (int)Mem_ExpandableArray_IndexRange(&prog->stringbuffersarray); i++)
+ {
+ prvm_stringbuffer_t *stringbuffer = (prvm_stringbuffer_t*) Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i);
+ if(stringbuffer && (stringbuffer->flags & STRINGBUFFER_SAVED))
+ {
+ for(k = 0; k < stringbuffer->num_strings; k++)
+ {
+ if (!stringbuffer->strings[k])
+ continue;
+ // Parse the string a bit to turn special characters
+ // (like newline, specifically) into escape codes
+ s = stringbuffer->strings[k];
+ for (l = 0;l < (int)sizeof(line) - 2 && *s;)
+ {
+ if (*s == '\n')
+ {
+ line[l++] = '\\';
+ line[l++] = 'n';
+ }
+ else if (*s == '\r')
+ {
+ line[l++] = '\\';
+ line[l++] = 'r';
+ }
+ else if (*s == '\\')
+ {
+ line[l++] = '\\';
+ line[l++] = '\\';
+ }
+ else if (*s == '"')
+ {
+ line[l++] = '\\';
+ line[l++] = '"';
+ }
+ else
+ line[l++] = *s;
+ s++;
+ }
+ line[l] = '\0';
+ FS_Printf(f,"sv.bufstr %i %i \"%s\"\n", i, k, line);
+ }
+ }
+ }
FS_Printf(f,"*/\n");
#endif
Host_Loadgame_f
===============
*/
+
void Host_Loadgame_f (void)
{
char filename[MAX_QPATH];
const char *t;
char *text;
prvm_edict_t *ent;
- int i;
+ int i, k;
int entnum;
int version;
float spawn_parms[NUM_SPAWN_PARMS];
+ prvm_stringbuffer_t *stringbuffer;
+ size_t alloclen;
if (Cmd_Argc() != 2)
{
CL_Disconnect ();
// remove menu
+ if (key_dest == key_menu || key_dest == key_menu_grabbed)
+ MR_ToggleMenu(0);
key_dest = key_game;
cls.demonum = -1; // stop demo loop in case this fails
// parse the global vars
PRVM_ED_ParseGlobals (start);
+
+ // restore the autocvar globals
+ Cvar_UpdateAllAutoCvars();
}
else
{
if (i >= 0 && i < MAX_MODELS)
{
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.modelname : NULL);
+ sv.models[i] = Mod_ForName (sv.model_precache[i], true, false, sv.model_precache[i][0] == '*' ? sv.worldname : NULL);
}
else
Con_Printf("unsupported model %i \"%s\"\n", i, com_token);
else
Con_Printf("unsupported sound %i \"%s\"\n", i, com_token);
}
+ else if (!strcmp(com_token, "sv.bufstr"))
+ {
+ COM_ParseToken_Simple(&t, false, false);
+ i = atoi(com_token);
+ COM_ParseToken_Simple(&t, false, false);
+ k = atoi(com_token);
+ COM_ParseToken_Simple(&t, false, false);
+ stringbuffer = (prvm_stringbuffer_t*) Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i);
+ // VorteX: nasty code, cleanup required
+ // create buffer at this index
+ if(!stringbuffer)
+ stringbuffer = (prvm_stringbuffer_t *) Mem_ExpandableArray_AllocRecordAtIndex(&prog->stringbuffersarray, i);
+ if (!stringbuffer)
+ Con_Printf("cant write string %i into buffer %i\n", k, i);
+ else
+ {
+ // code copied from VM_bufstr_set
+ // expand buffer
+ if (stringbuffer->max_strings <= i)
+ {
+ char **oldstrings = stringbuffer->strings;
+ stringbuffer->max_strings = max(stringbuffer->max_strings * 2, 128);
+ while (stringbuffer->max_strings <= i)
+ stringbuffer->max_strings *= 2;
+ stringbuffer->strings = (char **) Mem_Alloc(prog->progs_mempool, stringbuffer->max_strings * sizeof(stringbuffer->strings[0]));
+ if (stringbuffer->num_strings > 0)
+ memcpy(stringbuffer->strings, oldstrings, stringbuffer->num_strings * sizeof(stringbuffer->strings[0]));
+ if (oldstrings)
+ Mem_Free(oldstrings);
+ }
+ // allocate string
+ stringbuffer->num_strings = max(stringbuffer->num_strings, k + 1);
+ if(stringbuffer->strings[k])
+ Mem_Free(stringbuffer->strings[k]);
+ stringbuffer->strings[k] = NULL;
+ alloclen = strlen(com_token) + 1;
+ stringbuffer->strings[k] = (char *)Mem_Alloc(prog->progs_mempool, alloclen);
+ memcpy(stringbuffer->strings[k], com_token, alloclen);
+ }
+ }
// skip any trailing text or unrecognized commands
while (COM_ParseToken_Simple(&t, true, false) && strcmp(com_token, "\n"))
;
SZ_Clear(&net_message);
MSG_WriteLong (&net_message, 0);
MSG_WriteByte (&net_message, CCREQ_RCON);
- SZ_Write(&net_message, (void*)rcon_password.string, n);
+ SZ_Write(&net_message, (const unsigned char*)rcon_password.string, n);
+ MSG_WriteByte (&net_message, 0); // terminate the (possibly partial) string
MSG_WriteString (&net_message, Cmd_Args());
StoreBigLong(net_message.data, NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
NetConn_Write(mysocket, net_message.data, net_message.cursize, &to);