X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=sv_user.c;h=58bef9bfb0a3f44a31ac9ec3270af7a91c19f75a;hb=HEAD;hp=9395be62acf37d7fea8d4e6a0fe97010530e55e3;hpb=0eb36dc61506a11e8d90a7ea7722bb029d6fc724;p=xonotic%2Fdarkplaces.git diff --git a/sv_user.c b/sv_user.c index 9395be62..58bef9bf 100644 --- a/sv_user.c +++ b/sv_user.c @@ -718,7 +718,7 @@ static void SV_ReadClientMove (void) } // as requested by FrikaC, cursor_trace_ent is reset to world if the // entity is free at time of receipt - if (PRVM_EDICT_NUM(move->cursor_entitynumber)->priv.server->free) + if (PRVM_EDICT_NUM(move->cursor_entitynumber)->free) move->cursor_entitynumber = 0; if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__); } @@ -811,7 +811,8 @@ static void SV_ExecuteClientMoves(void) move->time = bound(sv.time - 1, move->time, sv.time); // prevent slowhack/speedhack combos move->time = max(move->time, host_client->cmd.time); // prevent backstepping of time // bones_was_here: limit moveframetime to a multiple of sv.frametime to match inputtimeout behaviour - moveframetime = min(move->time - host_client->cmd.time, min(0.1, sys_ticrate.value > 0.0 ? sv.frametime * ceil(sv_clmovement_inputtimeout.value / sv.frametime) : sv_clmovement_inputtimeout.value)); + moveframetime = min(move->time - host_client->cmd.time, min(0.1, sys_ticrate.value > 0.0 && sv.frametime > 0.0 ? sv.frametime * ceil(sv_clmovement_inputtimeout.value / sv.frametime) : sv_clmovement_inputtimeout.value)); + // discard (treat like lost) moves with too low distance from // the previous one to prevent hacks using float inaccuracy @@ -986,6 +987,7 @@ void SV_ReadClientMessage(void) prvm_prog_t *prog = SVVM_prog; int netcmd, num, start; char *s, *p, *q; + size_t slen; if(sv_autodemo_perclient.integer >= 2) SV_WriteDemoMessage(host_client, &(host_client->netconnection->message), true); @@ -998,14 +1000,14 @@ void SV_ReadClientMessage(void) if (!host_client->active) { // a command caused an error - SV_DropClient (false); + SV_DropClient (false, "Connection closing"); return; } if (sv_message.badread) { Con_Print("SV_ReadClientMessage: badread\n"); - SV_DropClient (false); + SV_DropClient (false, "An internal server error occurred"); return; } @@ -1024,7 +1026,7 @@ void SV_ReadClientMessage(void) Con_Printf("SV_ReadClientMessage: unknown command char %i (at offset 0x%x)\n", netcmd, sv_message.readcount); if (developer_networking.integer) Com_HexDumpToConsole(sv_message.data, sv_message.cursize); - SV_DropClient (false); + SV_DropClient (false, "Unknown message sent to the server"); return; case clc_nop: @@ -1034,7 +1036,8 @@ void SV_ReadClientMessage(void) // allow reliable messages now as the client is done with initial loading if (host_client->sendsignon == 2) host_client->sendsignon = 0; - s = MSG_ReadString(&sv_message, sv_readstring, sizeof(sv_readstring)); + slen = MSG_ReadString_len(&sv_message, sv_readstring, sizeof(sv_readstring)); + s = sv_readstring; q = NULL; for(p = s; *p; ++p) switch(*p) { @@ -1053,19 +1056,19 @@ void SV_ReadClientMessage(void) if (strncasecmp(s, "spawn", 5) == 0 || strncasecmp(s, "begin", 5) == 0 || strncasecmp(s, "prespawn", 8) == 0) - Cmd_ExecuteString (cmd_serverfromclient, s, src_client, true); + Cmd_ExecuteString(cmd_serverfromclient, s, slen, src_client, true); else if (PRVM_serverfunction(SV_ParseClientCommand)) { int restorevm_tempstringsbuf_cursize; restorevm_tempstringsbuf_cursize = prog->tempstringsbuf.cursize; - PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, s); + PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, s, slen); PRVM_serverglobalfloat(time) = sv.time; PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict); prog->ExecuteProgram(prog, PRVM_serverfunction(SV_ParseClientCommand), "QC function SV_ParseClientCommand is missing"); prog->tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize; } else - Cmd_ExecuteString (cmd_serverfromclient, s, src_client, true); + Cmd_ExecuteString(cmd_serverfromclient, s, slen, src_client, true); break; clc_stringcmd_invalid: @@ -1075,7 +1078,9 @@ clc_stringcmd_invalid: break; case clc_disconnect: - SV_DropClient (false); // client wants to disconnect + SV_DropClient (true, sv.protocol == PROTOCOL_DARKPLACES8 + ? MSG_ReadString(&sv_message, sv_readstring, sizeof(sv_readstring)) + : "Disconnect by user"); // client wants to disconnect return; case clc_move: