]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_main.c
fix for misparsing of sound length in "data" chunk of WAVE, this should fix stereo...
[xonotic/darkplaces.git] / sv_main.c
index 5e886884e58078a6e9e3c750982827221cc63add..d8c47b0d5e7f3d4b6161d5259598ba55f294864c 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -246,7 +246,7 @@ void SV_SendServerinfo (client_t *client)
        MSG_WriteString (&client->message,message);
 
        MSG_WriteByte (&client->message, svc_serverinfo);
-       MSG_WriteLong (&client->message, DPPROTOCOL_VERSION2);
+       MSG_WriteLong (&client->message, DPPROTOCOL_VERSION3);
        MSG_WriteByte (&client->message, svs.maxclients);
 
        if (!coop.integer && deathmatch.integer)
@@ -333,10 +333,14 @@ void SV_ConnectClient (int clientnum)
                        client->spawn_parms[i] = (&pr_global_struct->parm1)[i];
        }
 
+#if NOROUTINGFIX
+       SV_SendServerinfo (client);
+#else
        // send serverinfo on first nop
        client->waitingforconnect = true;
        client->sendsignon = true;
        client->spawned = false;                // need prespawn, spawn, etc
+#endif
 }
 
 
@@ -680,7 +684,25 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                                        client->visibletime[e] = realtime + 1;
                                else
                                {
-                                       if (realtime > client->visibletime[e])
+                                       //test nearest point on bbox
+                                       testorigin[0] = bound(entmins[0], org[0], entmaxs[0]);
+                                       testorigin[1] = bound(entmins[1], org[1], entmaxs[1]);
+                                       testorigin[2] = bound(entmins[2], org[2], entmaxs[2]);
+
+                                       memset (&trace, 0, sizeof(trace_t));
+                                       trace.fraction = 1;
+                                       trace.allsolid = true;
+                                       VectorCopy(testorigin, trace.endpos);
+
+                                       VectorCopy(org, RecursiveHullCheckInfo.start);
+                                       VectorSubtract(testorigin, testeye, RecursiveHullCheckInfo.dist);
+                                       RecursiveHullCheckInfo.hull = sv.worldmodel->hulls;
+                                       RecursiveHullCheckInfo.trace = &trace;
+                                       SV_RecursiveHullCheck (sv.worldmodel->hulls->firstclipnode, 0, 1, testeye, testorigin);
+
+                                       if (trace.fraction == 1)
+                                               client->visibletime[e] = realtime + 1;
+                                       else if (realtime > client->visibletime[e])
                                        {
                                                culled_trace++;
                                                continue;
@@ -961,10 +983,6 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                        VectorCopy(ent->v.origin, origin);
                }
 
-               // don't send an entity if it's coordinates would wrap around
-               if (origin[0] < -32768 || origin[1] < -32768 || origin[2] < -32768 || origin[0] > 32767 || origin[1] > 32767 || origin[2] > 32767)
-                       continue;
-
                // ent has survived every check so far, check if it is visible
                // always send embedded brush models, they don't generate much traffic
                if (ent != clent && ((flags & RENDER_VIEWMODEL) == 0) && (model == NULL || model->type != mod_brush || model->name[0] != '*'))
@@ -1095,6 +1113,9 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
 
                if (ent->v.movetype == MOVETYPE_STEP)
                        flags |= RENDER_STEP;
+               // don't send an entity if it's coordinates would wrap around
+               if ((effects & EF_LOWPRECISION) && origin[0] >= -32768 && origin[1] >= -32768 && origin[2] >= -32768 && origin[0] <= 32767 && origin[1] <= 32767 && origin[2] <= 32767)
+                       flags |= RENDER_LOWPRECISION;
 
                s = EntityFrame_NewEntity(&entityframe, e);
                // if we run out of space, abort
@@ -1331,7 +1352,7 @@ qboolean SV_SendClientDatagram (client_t *client)
        MSG_WriteByte (&msg, svc_time);
        MSG_WriteFloat (&msg, sv.time);
 
-       if (!client->waitingforconnect)
+       if (client->spawned)
        {
                // add the client specific data to the datagram
                SV_WriteClientdataToMessage (client->edict, &msg);
@@ -1434,11 +1455,13 @@ void SV_SendClientMessages (void)
                if (!host_client->active)
                        continue;
 
+#ifndef NOROUTINGFIX
                if (host_client->sendserverinfo)
                {
                        host_client->sendserverinfo = false;
                        SV_SendServerinfo (host_client);
                }
+#endif
 
                if (host_client->spawned)
                {