X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=sv_main.c;h=f1bf0bc1560c9f5db5ea2389ebbee6286092b050;hb=b84125ed0d5fc6922a9ea18b7762b489e377175d;hp=57530854f833d8d07cf9a10d85e07cb1f51accc0;hpb=43484d755f33629395d8dba63cf9b3515222d21c;p=xonotic%2Fdarkplaces.git diff --git a/sv_main.c b/sv_main.c index 57530854..f1bf0bc1 100644 --- a/sv_main.c +++ b/sv_main.c @@ -372,7 +372,6 @@ void SV_SendServerinfo (client_t *client) MSG_WriteByte (&client->netconnection->message, svc_signonnum); MSG_WriteByte (&client->netconnection->message, 1); - client->sendsignon = true; client->spawned = false; // need prespawn, spawn, etc } @@ -1180,7 +1179,7 @@ SV_SendClientDatagram ======================= */ static unsigned char sv_sendclientdatagram_buf[NET_MAXMESSAGE]; // FIXME? -qboolean SV_SendClientDatagram (client_t *client) +void SV_SendClientDatagram (client_t *client) { int rate, maxrate, maxsize, maxsize2; sizebuf_t msg; @@ -1219,31 +1218,35 @@ qboolean SV_SendClientDatagram (client_t *client) msg.maxsize = maxsize; msg.cursize = 0; - MSG_WriteByte (&msg, svc_time); - MSG_WriteFloat (&msg, sv.time); - - // add the client specific data to the datagram - SV_WriteClientdataToMessage (client, client->edict, &msg, stats); - VM_SV_WriteAutoSentStats (client, client->edict, &msg, stats); - SV_WriteEntitiesToClient (client, client->edict, &msg, stats); - - // expand packet size to allow effects to go over the rate limit - // (dropping them is FAR too ugly) - msg.maxsize = maxsize2; - - // copy the server datagram if there is space - // FIXME: put in delayed queue of effects to send - if (sv.datagram.cursize > 0 && msg.cursize + sv.datagram.cursize <= msg.maxsize) - SZ_Write (&msg, sv.datagram.data, sv.datagram.cursize); - -// send the datagram - if (NetConn_SendUnreliableMessage (client->netconnection, &msg) == -1) + if (host_client->spawned) { - SV_DropClient (true);// if the message couldn't send, kick off - return false; + MSG_WriteByte (&msg, svc_time); + MSG_WriteFloat (&msg, sv.time); + + // add the client specific data to the datagram + SV_WriteClientdataToMessage (client, client->edict, &msg, stats); + VM_SV_WriteAutoSentStats (client, client->edict, &msg, stats); + SV_WriteEntitiesToClient (client, client->edict, &msg, stats); + + // expand packet size to allow effects to go over the rate limit + // (dropping them is FAR too ugly) + msg.maxsize = maxsize2; + + // copy the server datagram if there is space + // FIXME: put in delayed queue of effects to send + if (sv.datagram.cursize > 0 && msg.cursize + sv.datagram.cursize <= msg.maxsize) + SZ_Write (&msg, sv.datagram.data, sv.datagram.cursize); + } + else if (realtime > client->keepalivetime) + { + // the player isn't totally in the game yet + // send small keepalive messages if too much time has passed + client->keepalivetime = realtime + 5; + MSG_WriteChar (&msg, svc_nop); } - return true; +// send the datagram + NetConn_SendUnreliableMessage (client->netconnection, &msg, sv.protocol); } /* @@ -1337,30 +1340,6 @@ void SV_UpdateToReliableMessages (void) } -/* -======================= -SV_SendNop - -Send a nop message without trashing or sending the accumulated client -message buffer -======================= -*/ -void SV_SendNop (client_t *client) -{ - sizebuf_t msg; - unsigned char buf[4]; - - msg.data = buf; - msg.maxsize = sizeof(buf); - msg.cursize = 0; - - MSG_WriteChar (&msg, svc_nop); - - if (NetConn_SendUnreliableMessage (client->netconnection, &msg) == -1) - SV_DropClient (true); // if the message couldn't send, kick off - client->last_message = realtime; -} - /* ======================= SV_SendClientMessages @@ -1370,6 +1349,9 @@ void SV_SendClientMessages (void) { int i, prepared = false; + if (sv.protocol == PROTOCOL_QUAKEWORLD) + Sys_Error("SV_SendClientMessages: no quakeworld support\n"); + // update frags, names, etc SV_UpdateToReliableMessages(); @@ -1387,43 +1369,13 @@ void SV_SendClientMessages (void) continue; } - if (host_client->spawned) - { - if (!prepared) - { - prepared = true; - // only prepare entities once per frame - SV_PrepareEntitiesForSending(); - } - if (!SV_SendClientDatagram (host_client)) - continue; - } - else - { - // the player isn't totally in the game yet - // send small keepalive messages if too much time has passed - // send a full message when the next signon stage has been requested - // some other message data (name changes, etc) may accumulate - // between signon stages - if (!host_client->sendsignon) - { - if (realtime - host_client->last_message > 5) - SV_SendNop (host_client); - continue; // don't send out non-signon messages - } - } - - if (host_client->netconnection->message.cursize) + if (!prepared) { - if (!NetConn_CanSendMessage (host_client->netconnection)) - continue; - - if (NetConn_SendReliableMessage (host_client->netconnection, &host_client->netconnection->message) == -1) - SV_DropClient (true); // if the message couldn't send, kick off - SZ_Clear (&host_client->netconnection->message); - host_client->last_message = realtime; - host_client->sendsignon = false; + prepared = true; + // only prepare entities once per frame + SV_PrepareEntitiesForSending(); } + SV_SendClientDatagram (host_client); } // clear muzzle flashes @@ -1722,10 +1674,8 @@ void SV_SpawnServer (const char *server) if (sv.active) { // Tell all the clients that the server is changing levels - SV_VM_Begin(); MSG_WriteByte(&sv.reliable_datagram, svc_stufftext); MSG_WriteString(&sv.reliable_datagram, "reconnect\n"); - SV_VM_End(); } else {