if (svs.clients[i].active)
players++;
print ("host: %s\n", Cvar_VariableString ("hostname"));
- print ("version: %s build %s\n", gamename, buildstring);
+ print ("version: %s build %s (gamename %s)\n", gamename, buildstring, gamenetworkfiltername);
print ("protocol: %i (%s)\n", Protocol_NumberForEnum(sv.protocol), Protocol_NameForEnum(sv.protocol));
print ("map: %s\n", sv.name);
print ("timing: %s\n", Host_TimingReport(vabuf, sizeof(vabuf)));
svs.clients = (client_t *)Mem_Alloc(sv_mempool, sizeof(client_t) * svs.maxclients);
}
+#ifdef CONFIG_MENU
// remove menu
if (key_dest == key_menu || key_dest == key_menu_grabbed)
MR_ToggleMenu(0);
+#endif
key_dest = key_game;
svs.serverflags = 0; // haven't completed an episode yet
return;
}
+#ifdef CONFIG_MENU
// remove menu
if (key_dest == key_menu || key_dest == key_menu_grabbed)
MR_ToggleMenu(0);
+#endif
key_dest = key_game;
SV_SaveSpawnparms ();
return;
}
+#ifdef CONFIG_MENU
// remove menu
if (key_dest == key_menu || key_dest == key_menu_grabbed)
MR_ToggleMenu(0);
+#endif
key_dest = key_game;
allowcheats = sv_cheats.integer != 0;
void Host_Savegame_to(prvm_prog_t *prog, const char *name)
{
qfile_t *f;
- int i, k, l, lightstyles = 64;
+ int i, k, l, numbuffers, lightstyles = 64;
char comment[SAVEGAME_COMMENT_LENGTH+1];
char line[MAX_INPUTLINE];
qboolean isserver;
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++)
+ numbuffers = Mem_ExpandableArray_IndexRange(&prog->stringbuffersarray);
+ for (i = 0; i < numbuffers; i++)
{
prvm_stringbuffer_t *stringbuffer = (prvm_stringbuffer_t*) Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i);
if(stringbuffer && (stringbuffer->flags & STRINGBUFFER_SAVED))
{
+ FS_Printf(f,"sv.buffer %i %i \"string\"\n", i, stringbuffer->flags & STRINGBUFFER_QCFLAGS);
for(k = 0; k < stringbuffer->num_strings; k++)
{
if (!stringbuffer->strings[k])
===============
*/
+prvm_stringbuffer_t *BufStr_FindCreateReplace (prvm_prog_t *prog, int bufindex, int flags, char *format);
+void BufStr_Set(prvm_prog_t *prog, prvm_stringbuffer_t *stringbuffer, int strindex, const char *str);
+void BufStr_Del(prvm_prog_t *prog, prvm_stringbuffer_t *stringbuffer);
+void BufStr_Flush(prvm_prog_t *prog);
+
static void Host_Loadgame_f (void)
{
prvm_prog_t *prog = SVVM_prog;
const char *t;
char *text;
prvm_edict_t *ent;
- int i, k;
+ int i, k, numbuffers;
int entnum;
int version;
float spawn_parms[NUM_SPAWN_PARMS];
prvm_stringbuffer_t *stringbuffer;
- size_t alloclen;
if (Cmd_Argc() != 2)
{
if (cls.demoplayback)
CL_Disconnect ();
+#ifdef CONFIG_MENU
// remove menu
if (key_dest == key_menu || key_dest == key_menu_grabbed)
MR_ToggleMenu(0);
+#endif
key_dest = key_game;
cls.demonum = -1; // stop demo loop in case this fails
while (entnum >= prog->max_edicts)
PRVM_MEM_IncreaseEdicts(prog);
ent = PRVM_EDICT_NUM(entnum);
- memset(ent->fields.vp, 0, prog->entityfields * 4);
+ memset(ent->fields.fp, 0, prog->entityfields * sizeof(prvm_vec_t));
ent->priv.server->free = false;
if(developer_entityparsing.integer)
memset(sv.lightstyles[0], 0, sizeof(sv.lightstyles));
memset(sv.model_precache[0], 0, sizeof(sv.model_precache));
memset(sv.sound_precache[0], 0, sizeof(sv.sound_precache));
+ BufStr_Flush(prog);
+
while (COM_ParseToken_Simple(&t, false, false, true))
{
if (!strcmp(com_token, "sv.lightstyles"))
else
Con_Printf("unsupported sound %i \"%s\"\n", i, com_token);
}
+ else if (!strcmp(com_token, "sv.buffer"))
+ {
+ if (COM_ParseToken_Simple(&t, false, false, true))
+ {
+ i = atoi(com_token);
+ if (i >= 0)
+ {
+ k = STRINGBUFFER_SAVED;
+ if (COM_ParseToken_Simple(&t, false, false, true))
+ k |= atoi(com_token);
+ if (!BufStr_FindCreateReplace(prog, i, k, "string"))
+ Con_Printf("failed to create stringbuffer %i\n", i);
+ }
+ else
+ Con_Printf("unsupported stringbuffer index %i \"%s\"\n", i, com_token);
+ }
+ else
+ Con_Printf("unexpected end of line when parsing sv.buffer (expected buffer index)\n");
+ }
else if (!strcmp(com_token, "sv.bufstr"))
{
- COM_ParseToken_Simple(&t, false, false, true);
- i = atoi(com_token);
- COM_ParseToken_Simple(&t, false, false, true);
- k = atoi(com_token);
- COM_ParseToken_Simple(&t, false, false, true);
- 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);
+ if (!COM_ParseToken_Simple(&t, false, false, true))
+ Con_Printf("unexpected end of line when parsing sv.bufstr\n");
else
{
- // code copied from VM_bufstr_set
- // expand buffer
- if (stringbuffer->max_strings <= i)
+ i = atoi(com_token);
+ stringbuffer = BufStr_FindCreateReplace(prog, i, STRINGBUFFER_SAVED, "string");
+ if (stringbuffer)
{
- 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);
+ if (COM_ParseToken_Simple(&t, false, false, true))
+ {
+ k = atoi(com_token);
+ if (COM_ParseToken_Simple(&t, false, false, true))
+ BufStr_Set(prog, stringbuffer, k, com_token);
+ else
+ Con_Printf("unexpected end of line when parsing sv.bufstr (expected string)\n");
+ }
+ else
+ Con_Printf("unexpected end of line when parsing sv.bufstr (expected strindex)\n");
}
- // 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);
+ else
+ Con_Printf("failed to create stringbuffer %i \"%s\"\n", i, com_token);
}
}
// skip any trailing text or unrecognized commands
}
Mem_Free(text);
+ // remove all temporary flagged string buffers (ones created with BufStr_FindCreateReplace)
+ numbuffers = Mem_ExpandableArray_IndexRange(&prog->stringbuffersarray);
+ for (i = 0; i < numbuffers; i++)
+ {
+ if ( (stringbuffer = (prvm_stringbuffer_t *)Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i)) )
+ if (stringbuffer->flags & STRINGBUFFER_TEMP)
+ BufStr_Del(prog, stringbuffer);
+ }
+
if(developer_entityparsing.integer)
Con_Printf("Host_Loadgame_f: finished\n");
PRVM_serveredictstring(host_client->edict, netname) = PRVM_SetEngineString(prog, host_client->name);
if (strcmp(host_client->old_name, host_client->name))
{
- if (host_client->spawned)
+ if (host_client->begun)
SV_BroadcastPrintf("%s ^7changed name to %s\n", host_client->old_name, host_client->name);
strlcpy(host_client->old_name, host_client->name, sizeof(host_client->old_name));
// send notification to all clients
PRVM_serveredictstring(host_client->edict, playerskin) = PRVM_SetEngineString(prog, host_client->playerskin);
if (strcmp(host_client->old_skin, host_client->playerskin))
{
- //if (host_client->spawned)
+ //if (host_client->begun)
// SV_BroadcastPrintf("%s changed skin to %s\n", host_client->name, host_client->playerskin);
strlcpy(host_client->old_skin, host_client->playerskin, sizeof(host_client->old_skin));
/*// send notification to all clients
if (host_client->edict && PRVM_serverfunction(SV_ChangeTeam))
{
Con_DPrint("Calling SV_ChangeTeam\n");
- prog->globals.generic[OFS_PARM0] = playercolor;
+ prog->globals.fp[OFS_PARM0] = playercolor;
PRVM_serverglobalfloat(time) = sv.time;
PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict);
prog->ExecuteProgram(prog, PRVM_serverfunction(SV_ChangeTeam), "QC function SV_ChangeTeam is missing");
}
cvar_t cl_rate = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate", "20000", "internal storage cvar for current rate (changed by rate command)"};
+cvar_t cl_rate_burstsize = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate_burstsize", "1024", "internal storage cvar for current rate control burst size (changed by rate_burstsize command)"};
static void Host_Rate_f(void)
{
int rate;
host_client->rate = rate;
}
+static void Host_Rate_BurstSize_f(void)
+{
+ int rate_burstsize;
+
+ if (Cmd_Argc() != 2)
+ {
+ Con_Printf("\"rate_burstsize\" is \"%i\"\n", cl_rate_burstsize.integer);
+ Con_Print("rate_burstsize <bytes>\n");
+ return;
+ }
+
+ rate_burstsize = atoi(Cmd_Argv(1));
+
+ if (cmd_source == src_command)
+ {
+ Cvar_SetValue ("_cl_rate_burstsize", rate_burstsize);
+ return;
+ }
+
+ host_client->rate_burstsize = rate_burstsize;
+}
/*
==================
{
if (cmd_source == src_client)
{
- if(cls.state == ca_dedicated || host_client == &svs.clients[0]) // non-admin
+ if(cls.state == ca_dedicated || host_client != &svs.clients[0]) // non-admin
{
print("Pause not allowed.\n");
return;
*/
static void Host_PreSpawn_f (void)
{
- if (host_client->spawned)
+ if (host_client->prespawned)
{
- Con_Print("prespawn not valid -- already spawned\n");
+ Con_Print("prespawn not valid -- already prespawned\n");
return;
}
+ host_client->prespawned = true;
if (host_client->netconnection)
{
client_t *client;
int stats[MAX_CL_STATS];
+ if (!host_client->prespawned)
+ {
+ Con_Print("Spawn not valid -- not yet prespawned\n");
+ return;
+ }
if (host_client->spawned)
{
Con_Print("Spawn not valid -- already spawned\n");
return;
}
+ host_client->spawned = true;
// reset name change timer again because they might want to change name
// again in the first 5 seconds after connecting
*/
static void Host_Begin_f (void)
{
- host_client->spawned = true;
+ if (!host_client->spawned)
+ {
+ Con_Print("Begin not valid -- not yet spawned\n");
+ return;
+ }
+ if (host_client->begun)
+ {
+ Con_Print("Begin not valid -- already begun\n");
+ return;
+ }
+ host_client->begun = true;
// LordHavoc: note: this code also exists in SV_DropClient
if (sv.loadgame)
case '8':
case '9':
// MED 01/04/97 added hipnotic give stuff
- if (gamemode == GAME_HIPNOTIC)
+ if (gamemode == GAME_HIPNOTIC || gamemode == GAME_QUOTH)
{
if (t[0] == '6')
{
lhnetsocket_t *mysocket;
char peer_address[64];
+ if (Cmd_Argc() == 1)
+ {
+ Con_Printf("%s: Usage: %s command\n", Cmd_Argv(0), Cmd_Argv(0));
+ return;
+ }
+
if (!rcon_password.string || !rcon_password.string[0] || rcon_secure.integer > 0)
{
Con_Printf ("You must set rcon_password before issuing an pqrcon command, and rcon_secure must be 0.\n");
lhnetsocket_t *mysocket;
char vabuf[1024];
+ if (Cmd_Argc() == 1)
+ {
+ Con_Printf("%s: Usage: %s command\n", Cmd_Argv(0), Cmd_Argv(0));
+ return;
+ }
+
if (!rcon_password.string || !rcon_password.string[0])
{
Con_Printf ("You must set rcon_password before issuing an rcon command.\n");
Cmd_AddCommand_WithClientCommand ("color", Host_Color_f, Host_Color_f, "change your player shirt and pants colors");
Cvar_RegisterVariable (&cl_rate);
Cmd_AddCommand_WithClientCommand ("rate", Host_Rate_f, Host_Rate_f, "change your network connection speed");
+ Cvar_RegisterVariable (&cl_rate_burstsize);
+ Cmd_AddCommand_WithClientCommand ("rate_burstsize", Host_Rate_BurstSize_f, Host_Rate_BurstSize_f, "change your network connection speed");
Cvar_RegisterVariable (&cl_pmodel);
Cmd_AddCommand_WithClientCommand ("pmodel", Host_PModel_f, Host_PModel_f, "(Nehahra-only) change your player model choice");