]> 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 a335a7f9f6e171f1673063b93c0520c25dfc6a4e..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;
@@ -1091,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
@@ -1327,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);
@@ -1430,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)
                {
@@ -1791,6 +1818,7 @@ void SV_SpawnServer (char *server)
 // run two frames to allow everything to settle
        sv.frametime = pr_global_struct->frametime = host_frametime = 0.1;
        SV_Physics ();
+       sv.frametime = pr_global_struct->frametime = host_frametime = 0.1;
        SV_Physics ();
 
        Mod_PurgeUnused();