X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=sv_send.c;h=a9675530a9f98313657985c7ae2e5cb035134878;hb=3234ca5c2c700a2568f099caa3df6d4b4ee23ba8;hp=9ff78a0860c17c2376b611277c6c64602bb70d32;hpb=2c1140a494598d75a12c01f82d7c9accff974fbb;p=xonotic%2Fdarkplaces.git diff --git a/sv_send.c b/sv_send.c index 9ff78a08..a9675530 100644 --- a/sv_send.c +++ b/sv_send.c @@ -710,7 +710,7 @@ static void SV_PrepareEntitiesForSending(void) memset(sv.sendentitiesindex, 0, prog->num_edicts * sizeof(*sv.sendentitiesindex)); for (e = 1, ent = PRVM_NEXT_EDICT(prog->edicts);e < prog->num_edicts;e++, ent = PRVM_NEXT_EDICT(ent)) { - if (!ent->priv.server->free && SV_PrepareEntityForSending(ent, sv.sendentities + sv.numsendentities, e)) + if (!ent->free && SV_PrepareEntityForSending(ent, sv.sendentities + sv.numsendentities, e)) { sv.sendentitiesindex[e] = sv.sendentities + sv.numsendentities; sv.numsendentities++; @@ -956,13 +956,12 @@ void SV_MarkWriteEntityStateToClient(entity_state_t *s, client_t *client) s->specialvisibilityradius ? sv_cullentities_trace_samples_extra.integer : sv_cullentities_trace_samples.integer; - float enlarge = sv_cullentities_trace_enlarge.value; if(samples > 0) { int eyeindex; for (eyeindex = 0;eyeindex < sv.writeentitiestoclient_numeyes;eyeindex++) - if(SV_CanSeeBox(samples, sv_cullentities_trace_eyejitter.value, enlarge, sv_cullentities_trace_expand.value, sv.writeentitiestoclient_eyes[eyeindex], ed->priv.server->cullmins, ed->priv.server->cullmaxs)) + if(SV_CanSeeBox(samples, sv_cullentities_trace_eyejitter.value, sv_cullentities_trace_enlarge.value, sv_cullentities_trace_expand.value, sv.writeentitiestoclient_eyes[eyeindex], ed->priv.server->cullmins, ed->priv.server->cullmaxs)) break; if(eyeindex < sv.writeentitiestoclient_numeyes) svs.clients[sv.writeentitiestoclient_clientnumber].visibletime[s->number] = @@ -971,7 +970,7 @@ void SV_MarkWriteEntityStateToClient(entity_state_t *s, client_t *client) ? sv_cullentities_trace_delay_players.value : sv_cullentities_trace_delay.value ); - else if (host.realtime > svs.clients[sv.writeentitiestoclient_clientnumber].visibletime[s->number]) + else if ((float)host.realtime > svs.clients[sv.writeentitiestoclient_clientnumber].visibletime[s->number]) { sv.writeentitiestoclient_stats_culled_trace++; return; @@ -995,19 +994,16 @@ void SV_AddCameraEyes(void) prvm_prog_t *prog = SVVM_prog; int e, i, j, k; prvm_edict_t *ed; - static int cameras[MAX_LEVELNETWORKEYES]; - static vec3_t camera_origins[MAX_LEVELNETWORKEYES]; - static int eye_levels[MAX_CLIENTNETWORKEYES]; + int cameras[MAX_LEVELNETWORKEYES]; + vec3_t camera_origins[MAX_LEVELNETWORKEYES]; + int eye_levels[MAX_CLIENTNETWORKEYES] = {0}; int n_cameras = 0; vec3_t mi, ma; - for(i = 0; i < sv.writeentitiestoclient_numeyes; ++i) - eye_levels[i] = 0; - // check line of sight to portal entities and add them to PVS for (e = 1, ed = PRVM_NEXT_EDICT(prog->edicts);e < prog->num_edicts;e++, ed = PRVM_NEXT_EDICT(ed)) { - if (!ed->priv.server->free) + if (!ed->free) { if(PRVM_serveredictfunction(ed, camera_transform)) { @@ -1045,7 +1041,12 @@ void SV_AddCameraEyes(void) for(k = 0; k < sv.writeentitiestoclient_numeyes; ++k) if(eye_levels[k] <= MAX_EYE_RECURSION) { - if(SV_CanSeeBox(sv_cullentities_trace_samples.integer, sv_cullentities_trace_eyejitter.value, sv_cullentities_trace_enlarge.value, sv_cullentities_trace_expand.value, sv.writeentitiestoclient_eyes[k], mi, ma)) + if(SV_CanSeeBox(sv_cullentities_trace_samples_extra.integer, sv_cullentities_trace_eyejitter.value, sv_cullentities_trace_enlarge.value, sv_cullentities_trace_expand.value, sv.writeentitiestoclient_eyes[k], mi, ma)) + svs.clients[sv.writeentitiestoclient_clientnumber].visibletime[cameras[j]] = host.realtime + sv_cullentities_trace_delay.value; + + // bones_was_here: this use of visibletime doesn't conflict because sv_cullentities_trace doesn't consider portal entities + // the explicit cast prevents float precision differences that cause the condition to fail + if ((float)host.realtime <= svs.clients[sv.writeentitiestoclient_clientnumber].visibletime[cameras[j]]) { eye_levels[sv.writeentitiestoclient_numeyes] = eye_levels[k] + 1; VectorCopy(camera_origins[j], sv.writeentitiestoclient_eyes[sv.writeentitiestoclient_numeyes]); @@ -1652,7 +1653,7 @@ static void SV_UpdateToReliableMessages (void) if (clientcamera > 0) { int oldclientcamera = host_client->clientcamera; - if (clientcamera >= prog->max_edicts || PRVM_EDICT_NUM(clientcamera)->priv.required->free) + if (clientcamera >= prog->max_edicts || PRVM_EDICT_NUM(clientcamera)->free) clientcamera = PRVM_NUM_FOR_EDICT(host_client->edict); host_client->clientcamera = clientcamera; @@ -1713,7 +1714,7 @@ void SV_SendClientMessages(void) if (host_client->netconnection->message.overflowed) { - SV_DropClient (true); // if the message couldn't send, kick off + SV_DropClient (true, "Buffer overflow in net message"); // if the message couldn't send, kick off continue; }