X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=d60489b35b390b0ee4c709b7f9e3a7b0a22291a3;hb=5204bb8cced9548d5c44f6d6a5ab2e5e4a841030;hp=a4529feb781ae20f7b670442a5dfb45a86a87bb9;hpb=5fbf1b000aeab4cc583f562a35cf0dddef63aa52;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index a4529feb..d60489b3 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -269,29 +269,6 @@ void Host_Map_f (void) SV_SpawnServer(level); if (sv.active && cls.state == ca_disconnected) CL_EstablishConnection("local:1"); - -#ifdef AUTODEMO_BROKEN -// if cl_autodemo is set, automatically start recording a demo if one isn't being recorded already - if (cl_autodemo.integer && !cls.demorecording) - { - char demofile[MAX_OSPATH]; - - dpsnprintf (demofile, sizeof(demofile), "%s_%s.dem", Sys_TimeString (cl_autodemo_nameformat.string), level); - - Con_Printf ("Recording to %s.\n", demofile); - - cls.demofile = FS_Open (demofile, "wb", false, false); - if (cls.demofile) - { - cls.forcetrack = -1; - FS_Printf (cls.demofile, "%i\n", cls.forcetrack); - } - else - Con_Print ("ERROR: couldn't open.\n"); - - cls.demorecording = true; - } -#endif } /* @@ -371,36 +348,38 @@ This is sent just before a server changes levels */ void Host_Reconnect_f (void) { + char temp[128]; + // if not connected, reconnect to the most recent server + if (!cls.netcon) + { + // if we have connected to a server recently, the userinfo + // will still contain its IP address, so get the address... + InfoString_GetValue(cls.userinfo, "*ip", temp, sizeof(temp)); + if (temp[0]) + CL_EstablishConnection(temp); + else + Con_Printf("Reconnect to what server? (you have not connected to a server yet)\n"); + return; + } + // if connected, do something based on protocol if (cls.protocol == PROTOCOL_QUAKEWORLD) { + // quakeworld can just re-login if (cls.qw_downloadmemory) // don't change when downloading return; S_StopAllSounds(); - if (cls.netcon) + if (cls.state == ca_connected && cls.signon < SIGNONS) { - if (cls.state == ca_connected && cls.signon < SIGNONS) - { - Con_Printf("reconnecting...\n"); - MSG_WriteChar(&cls.netcon->message, qw_clc_stringcmd); - MSG_WriteString(&cls.netcon->message, "new"); - } - else - { - char temp[128]; - // if we have connected to a server recently, the userinfo - // will still contain its IP address, so get the address... - InfoString_GetValue(cls.userinfo, "*ip", temp, sizeof(temp)); - if (temp[0]) - CL_EstablishConnection(temp); - else - Con_Printf("Reconnect to what server? (you have not connected to a server yet)\n"); - } + Con_Printf("reconnecting...\n"); + MSG_WriteChar(&cls.netcon->message, qw_clc_stringcmd); + MSG_WriteString(&cls.netcon->message, "new"); } } else { + // netquake uses reconnect on level changes (silly) if (Cmd_Argc() != 1) { Con_Print("reconnect : wait for signon messages again\n"); @@ -754,7 +733,7 @@ void Host_Loadgame_f (void) Host_Name_f ====================== */ -cvar_t cl_name = {CVAR_SAVE, "_cl_name", "player", "internal storage cvar for current player name (changed by name command)"}; +cvar_t cl_name = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_name", "player", "internal storage cvar for current player name (changed by name command)"}; void Host_Name_f (void) { int i, j; @@ -779,17 +758,16 @@ void Host_Name_f (void) if (cmd_source == src_command) { Cvar_Set ("_cl_name", newName); - CL_SetInfo("name", newName, true, false, false, false); return; } - if (sv.time < host_client->nametime) + if (realtime < host_client->nametime) { SV_ClientPrintf("You can't change name more than once every 5 seconds!\n"); return; } - host_client->nametime = sv.time + 5; + host_client->nametime = realtime + 5; // point the string back at updateclient->name to keep it safe strlcpy (host_client->name, newName, sizeof (host_client->name)); @@ -811,7 +789,7 @@ void Host_Name_f (void) Host_Playermodel_f ====================== */ -cvar_t cl_playermodel = {CVAR_SAVE, "_cl_playermodel", "", "internal storage cvar for current player model in Nexuiz (changed by playermodel command)"}; +cvar_t cl_playermodel = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_playermodel", "", "internal storage cvar for current player model in Nexuiz (changed by playermodel command)"}; // the old cl_playermodel in cl_main has been renamed to __cl_playermodel void Host_Playermodel_f (void) { @@ -837,24 +815,23 @@ void Host_Playermodel_f (void) if (cmd_source == src_command) { Cvar_Set ("_cl_playermodel", newPath); - CL_SetInfo("playermodel", newPath, true, false, false, false); return; } /* - if (sv.time < host_client->nametime) + if (realtime < host_client->nametime) { SV_ClientPrintf("You can't change playermodel more than once every 5 seconds!\n"); return; } - host_client->nametime = sv.time + 5; + host_client->nametime = realtime + 5; */ // point the string back at updateclient->name to keep it safe strlcpy (host_client->playermodel, newPath, sizeof (host_client->playermodel)); if( prog->fieldoffsets.playermodel >= 0 ) - PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.playermodel)->string = PRVM_SetEngineString(host_client->playermodel); + PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.playermodel)->string = PRVM_SetEngineString(host_client->playermodel); if (strcmp(host_client->old_model, host_client->playermodel)) { strlcpy(host_client->old_model, host_client->playermodel, sizeof(host_client->old_model)); @@ -870,7 +847,7 @@ void Host_Playermodel_f (void) Host_Playerskin_f ====================== */ -cvar_t cl_playerskin = {CVAR_SAVE, "_cl_playerskin", "", "internal storage cvar for current player skin in Nexuiz (changed by playerskin command)"}; +cvar_t cl_playerskin = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_playerskin", "", "internal storage cvar for current player skin in Nexuiz (changed by playerskin command)"}; void Host_Playerskin_f (void) { int i, j; @@ -895,24 +872,23 @@ void Host_Playerskin_f (void) if (cmd_source == src_command) { Cvar_Set ("_cl_playerskin", newPath); - CL_SetInfo("playerskin", newPath, true, false, false, false); return; } /* - if (sv.time < host_client->nametime) + if (realtime < host_client->nametime) { SV_ClientPrintf("You can't change playermodel more than once every 5 seconds!\n"); return; } - host_client->nametime = sv.time + 5; + host_client->nametime = realtime + 5; */ // point the string back at updateclient->name to keep it safe strlcpy (host_client->playerskin, newPath, sizeof (host_client->playerskin)); if( prog->fieldoffsets.playerskin >= 0 ) - PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.playerskin)->string = PRVM_SetEngineString(host_client->playerskin); + PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.playerskin)->string = PRVM_SetEngineString(host_client->playerskin); if (strcmp(host_client->old_skin, host_client->playerskin)) { //if (host_client->spawned) @@ -968,8 +944,10 @@ void Host_Say(qboolean teamonly) p1++; } // note this uses the chat prefix \001 - if (!fromServer) + if (!fromServer && !teamonly) dpsnprintf (text, sizeof(text), "\001%s" STRING_COLOR_DEFAULT_STR ": %s", host_client->name, p1); + else if (!fromServer && teamonly) + dpsnprintf (text, sizeof(text), "\001(%s" STRING_COLOR_DEFAULT_STR "): %s", host_client->name, p1); else if(*(sv_adminnick.string)) dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", sv_adminnick.string, p1); else @@ -1142,7 +1120,7 @@ void Host_Tell_f(void) Host_Color_f ================== */ -cvar_t cl_color = {CVAR_SAVE, "_cl_color", "0", "internal storage cvar for current player colors (changed by color command)"}; +cvar_t cl_color = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_color", "0", "internal storage cvar for current player colors (changed by color command)"}; void Host_Color(int changetop, int changebottom) { int top, bottom, playercolor; @@ -1165,15 +1143,6 @@ void Host_Color(int changetop, int changebottom) if (cmd_source == src_command) { Cvar_SetValueQuick(&cl_color, playercolor); - if (changetop >= 0) - CL_SetInfo("topcolor", va("%i", top), true, false, false, false); - if (changebottom >= 0) - CL_SetInfo("bottomcolor", va("%i", bottom), true, false, false, false); - if (cls.protocol != PROTOCOL_QUAKEWORLD && cls.netcon) - { - MSG_WriteByte(&cls.netcon->message, clc_stringcmd); - MSG_WriteString(&cls.netcon->message, va("color %i %i", top, bottom)); - } return; } @@ -1193,7 +1162,7 @@ void Host_Color(int changetop, int changebottom) prvm_eval_t *val; if (host_client->edict) { - if ((val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.clientcolors))) + if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.clientcolors))) val->_float = playercolor; host_client->edict->fields.server->team = bottom + 1; } @@ -1254,7 +1223,7 @@ void Host_BottomColor_f(void) Host_Color(-1, atoi(Cmd_Argv(1))); } -cvar_t cl_rate = {CVAR_SAVE, "_cl_rate", "10000", "internal storage cvar for current rate (changed by rate command)"}; +cvar_t cl_rate = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate", "10000", "internal storage cvar for current rate (changed by rate command)"}; void Host_Rate_f(void) { int rate; @@ -1271,7 +1240,6 @@ void Host_Rate_f(void) if (cmd_source == src_command) { Cvar_SetValue ("_cl_rate", max(NET_MINRATE, rate)); - CL_SetInfo("rate", va("%i", rate), true, false, false, false); return; } @@ -1323,7 +1291,7 @@ LordHavoc: only supported for Nehahra, I personally think this is dumb, but Mind LordHavoc: correction, Mindcrime will be removing pmodel in the future, but it's still stuck here for compatibility. ====================== */ -cvar_t cl_pmodel = {CVAR_SAVE, "_cl_pmodel", "0", "internal storage cvar for current player model number in nehahra (changed by pmodel command)"}; +cvar_t cl_pmodel = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_pmodel", "0", "internal storage cvar for current player model number in nehahra (changed by pmodel command)"}; static void Host_PModel_f (void) { int i; @@ -1346,7 +1314,7 @@ static void Host_PModel_f (void) return; } - if (host_client->edict && (val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.pmodel))) + if (host_client->edict && (val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.pmodel))) val->_float = i; } @@ -1432,7 +1400,7 @@ void Host_Spawn_f (void) prog->globals.server->self = PRVM_EDICT_TO_PROG(host_client->edict); PRVM_ExecuteProgram (prog->globals.server->ClientConnect, "QC function ClientConnect is missing"); - if ((Sys_DoubleTime() - host_client->connecttime) <= sv.time) + if (svs.maxclients > 1 || cls.state == ca_dedicated) Con_Printf("%s entered the game\n", host_client->name); PRVM_ExecuteProgram (prog->globals.server->PutClientInServer, "QC function PutClientInServer is missing"); @@ -1674,7 +1642,7 @@ void Host_Give_f (void) break; case 's': - if (gamemode == GAME_ROGUE && (val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_shells1))) + if (gamemode == GAME_ROGUE && (val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_shells1))) val->_float = v; host_client->edict->fields.server->ammo_shells = v; @@ -1682,7 +1650,7 @@ void Host_Give_f (void) case 'n': if (gamemode == GAME_ROGUE) { - if ((val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_nails1))) + if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_nails1))) { val->_float = v; if (host_client->edict->fields.server->weapon <= IT_LIGHTNING) @@ -1697,7 +1665,7 @@ void Host_Give_f (void) case 'l': if (gamemode == GAME_ROGUE) { - val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_lava_nails); + val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_lava_nails); if (val) { val->_float = v; @@ -1709,7 +1677,7 @@ void Host_Give_f (void) case 'r': if (gamemode == GAME_ROGUE) { - val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_rockets1); + val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_rockets1); if (val) { val->_float = v; @@ -1725,7 +1693,7 @@ void Host_Give_f (void) case 'm': if (gamemode == GAME_ROGUE) { - val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_multi_rockets); + val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_multi_rockets); if (val) { val->_float = v; @@ -1740,7 +1708,7 @@ void Host_Give_f (void) case 'c': if (gamemode == GAME_ROGUE) { - val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_cells1); + val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_cells1); if (val) { val->_float = v; @@ -1756,7 +1724,7 @@ void Host_Give_f (void) case 'p': if (gamemode == GAME_ROGUE) { - val = PRVM_GETEDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_plasma); + val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ammo_plasma); if (val) { val->_float = v; @@ -1923,7 +1891,7 @@ void Host_Startdemos_f (void) { int i, c; - if (cls.state == ca_dedicated || COM_CheckParm("-listen") || COM_CheckParm("-benchmark") || COM_CheckParm("-demo") || COM_CheckParm("-demolooponly")) + if (cls.state == ca_dedicated || COM_CheckParm("-listen") || COM_CheckParm("-benchmark") || COM_CheckParm("-demo")) return; c = Cmd_Argc() - 1; @@ -1991,10 +1959,17 @@ void Host_SendCvar_f (void) if(Cmd_Argc() != 2) return; - if(!(c = Cvar_FindVar(Cmd_Argv(1))) || (c->flags & CVAR_PRIVATE)) + c = Cvar_FindVar(Cmd_Argv(1)); + if (cls.state == ca_connected) + { + // LordHavoc: if there is no such cvar or if it is private, send a + // reply indicating that it has no value + if(!c || (c->flags & CVAR_PRIVATE)) + Cmd_ForwardStringToServer(va("sentcvar %s\n", c->name)); + else + Cmd_ForwardStringToServer(va("sentcvar %s \"%s\"\n", c->name, c->string)); return; - if (cls.state != ca_dedicated) - Cmd_ForwardStringToServer(va("sentcvar %s \"%s\"\n", c->name, c->string)); + } if(!sv.active)// || !prog->funcoffsets.SV_ParseClientCommand) return; @@ -2416,7 +2391,7 @@ void Host_InitCommands (void) Cmd_AddCommand ("restart", Host_Restart_f, "restart current level"); Cmd_AddCommand ("changelevel", Host_Changelevel_f, "change to another level, bringing along all connected clients"); Cmd_AddCommand ("connect", Host_Connect_f, "connect to a server by IP address or hostname"); - Cmd_AddCommand ("reconnect", Host_Reconnect_f, "reset signon level in preparation for a new level (do not use)"); + Cmd_AddCommand ("reconnect", Host_Reconnect_f, "reconnect to the last server you were on, or resets a quakeworld connection (do not use if currently playing on a netquake server)"); Cmd_AddCommand ("version", Host_Version_f, "print engine version"); Cmd_AddCommand_WithClientCommand ("say", Host_Say_f, Host_Say_f, "send a chat message to everyone on the server"); Cmd_AddCommand_WithClientCommand ("say_team", Host_Say_Team_f, Host_Say_Team_f, "send a chat message to your team on the server"); @@ -2460,7 +2435,7 @@ void Host_InitCommands (void) Cmd_AddCommand_WithClientCommand ("begin", NULL, Host_Begin_f, "signon 3 (client asks server to start sending entities, and will go to signon 4 (playing) when the first entity update is received)"); Cmd_AddCommand ("maxplayers", MaxPlayers_f, "sets limit on how many players (or bots) may be connected to the server at once"); - Cmd_AddCommand ("sendcvar", Host_SendCvar_f, "sends the value of a cvar to the server as a sentcvar command, for use by QuakeC"); // By [515] + Cmd_AddCommand ("sendcvar", Host_SendCvar_f, "sends the value of a cvar to the server as a sentcvar command, for use by QuakeC"); Cvar_RegisterVariable (&rcon_password); Cvar_RegisterVariable (&rcon_address);