-/*
-=============
-SV_WriteEntitiesToClient
-
-=============
-*/
-/*
-void SV_WriteEntitiesToClient_QUAKE (client_t *client, edict_t *clent, sizebuf_t *msg)
-{
- int e, clentnum, bits, alpha, glowcolor, glowsize, scale, effects, lightsize;
- int culled_pvs, culled_trace, visibleentities, totalentities;
- qbyte *pvs;
- vec3_t origin, angles, entmins, entmaxs, testorigin, testeye;
- float nextfullupdate, alphaf;
- edict_t *ent;
- eval_t *val;
- entity_state_t *baseline; // LordHavoc: delta or startup baseline
- model_t *model;
-
- Mod_CheckLoaded(sv.worldmodel);
-
-// find the client's PVS
- VectorAdd (clent->v->origin, clent->v->view_ofs, testeye);
- fatbytes = 0;
- if (sv.worldmodel && sv.worldmodel->brush.FatPVS)
- fatbytes = sv.worldmodel->brush.FatPVS(sv.worldmodel, testeye, 8, sv_writeentitiestoclient_pvs, sizeof(sv_writeentitiestoclient_pvs));
-
- culled_pvs = 0;
- culled_trace = 0;
- visibleentities = 0;
- totalentities = 0;
-
- clentnum = EDICT_TO_PROG(clent); // LordHavoc: for comparison purposes
- // send all entities that touch the pvs
- ent = NEXT_EDICT(sv.edicts);
- for (e = 1;e < sv.num_edicts;e++, ent = NEXT_EDICT(ent))
- {
- bits = 0;
-
- // prevent delta compression against this frame (unless actually sent, which will restore this later)
- nextfullupdate = client->nextfullupdate[e];
- client->nextfullupdate[e] = -1;
-
- if (ent != clent) // LordHavoc: always send player
- {
- if ((val = GETEDICTFIELDVALUE(ent, eval_viewmodelforclient)) && val->edict)
- {
- if (val->edict != clentnum)
- {
- // don't show to anyone else
- continue;
- }
- else
- bits |= U_VIEWMODEL; // show relative to the view
- }
- else
- {
- // LordHavoc: never draw something told not to display to this client
- if ((val = GETEDICTFIELDVALUE(ent, eval_nodrawtoclient)) && val->edict == clentnum)
- continue;
- if ((val = GETEDICTFIELDVALUE(ent, eval_drawonlytoclient)) && val->edict && val->edict != clentnum)
- continue;
- }
- }
-
- glowsize = 0;
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_glow_size)))
- glowsize = (int) val->_float >> 2;
- if (glowsize > 255) glowsize = 255;
- if (glowsize < 0) glowsize = 0;
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_glow_trail)))
- if (val->_float != 0)
- bits |= U_GLOWTRAIL;
-
- if (ent->v->modelindex >= 0 && ent->v->modelindex < MAX_MODELS && *PR_GetString(ent->v->model))
- {
- model = sv.models[(int)ent->v->modelindex];
- Mod_CheckLoaded(model);
- }
- else
- {
- model = NULL;
- if (ent != clent) // LordHavoc: always send player
- if (glowsize == 0 && (bits & U_GLOWTRAIL) == 0) // no effects
- continue;
- }
-
- VectorCopy(ent->v->angles, angles);
- VectorCopy(ent->v->origin, origin);
-
- // ent has survived every check so far, check if it is visible
- if (ent != clent && ((bits & U_VIEWMODEL) == 0))
- {
- // use the predicted origin
- entmins[0] = origin[0] - 1.0f;
- entmins[1] = origin[1] - 1.0f;
- entmins[2] = origin[2] - 1.0f;
- entmaxs[0] = origin[0] + 1.0f;
- entmaxs[1] = origin[1] + 1.0f;
- entmaxs[2] = origin[2] + 1.0f;
- // using the model's bounding box to ensure things are visible regardless of their physics box
- if (model)
- {
- if (ent->v->angles[0] || ent->v->angles[2]) // pitch and roll
- {
- VectorAdd(entmins, model->rotatedmins, entmins);
- VectorAdd(entmaxs, model->rotatedmaxs, entmaxs);
- }
- else if (ent->v->angles[1])
- {
- VectorAdd(entmins, model->yawmins, entmins);
- VectorAdd(entmaxs, model->yawmaxs, entmaxs);
- }
- else
- {
- VectorAdd(entmins, model->normalmins, entmins);
- VectorAdd(entmaxs, model->normalmaxs, entmaxs);
- }
- }
-
- totalentities++;
-
- // if not touching a visible leaf
- if (sv_cullentities_pvs.integer && fatbytes && sv.worldmodel && sv.worldmodel->brush.BoxTouchingPVS && !sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, sv_writeentitiestoclient_pvs, entmins, entmaxs))
- {
- culled_pvs++;
- continue;
- }
-
- // don't try to cull embedded brush models with this, they're sometimes huge (spanning several rooms)
- if (sv_cullentities_trace.integer && (model == NULL || model->name[0] != '*'))
- {
- // LordHavoc: test random offsets, to maximize chance of detection
- testorigin[0] = lhrandom(entmins[0], entmaxs[0]);
- testorigin[1] = lhrandom(entmins[1], entmaxs[1]);
- testorigin[2] = lhrandom(entmins[2], entmaxs[2]);
-
- sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, testeye, testeye, testorigin, testorigin, SUPERCONTENTS_SOLID);
- if (trace.fraction == 1)
- client->visibletime[e] = realtime + 1;
- else
- {
- //test nearest point on bbox
- testorigin[0] = bound(entmins[0], testeye[0], entmaxs[0]);
- testorigin[1] = bound(entmins[1], testeye[1], entmaxs[1]);
- testorigin[2] = bound(entmins[2], testeye[2], entmaxs[2]);
-
- sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, testeye, testeye, testorigin, testorigin, SUPERCONTENTS_SOLID);
- if (trace.fraction == 1)
- client->visibletime[e] = realtime + 1;
- else if (realtime > client->visibletime[e])
- {
- culled_trace++;
- continue;
- }
- }
- }
- visibleentities++;
- }
-
- alphaf = 255.0f;
- scale = 16;
- glowcolor = 254;
- effects = ent->v->effects;
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_alpha)))
- if (val->_float != 0)
- alphaf = val->_float * 255.0f;
-
- // HalfLife support
- if ((val = GETEDICTFIELDVALUE(ent, eval_renderamt)))
- if (val->_float != 0)
- alphaf = val->_float;
-
- if (alphaf == 0.0f)
- alphaf = 255.0f;
- alpha = bound(0, alphaf, 255);
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_scale)))
- if ((scale = (int) (val->_float * 16.0)) == 0) scale = 16;
- if (scale < 0) scale = 0;
- if (scale > 255) scale = 255;
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_glow_color)))
- if (val->_float != 0)
- glowcolor = (int) val->_float;
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_fullbright)))
- if (val->_float != 0)
- effects |= EF_FULLBRIGHT;
-
- if (ent != clent)
- {
- if (glowsize == 0 && (bits & U_GLOWTRAIL) == 0) // no effects
- {
- if (model) // model
- {
- // don't send if flagged for NODRAW and there are no effects
- if (model->flags == 0 && ((effects & EF_NODRAW) || scale <= 0 || alpha <= 0))
- continue;
- }
- else // no model and no effects
- continue;
- }
- }
-
- if (msg->maxsize - msg->cursize < 32) // LordHavoc: increased check from 16 to 32
- {
- Con_Print("packet overflow\n");
- // mark the rest of the entities so they can't be delta compressed against this frame
- for (;e < sv.num_edicts;e++)
- {
- client->nextfullupdate[e] = -1;
- client->visibletime[e] = -1;
- }
- return;
- }
-
- if ((val = GETEDICTFIELDVALUE(ent, eval_exteriormodeltoclient)) && val->edict == clentnum)
- bits = bits | U_EXTERIORMODEL;
-
-// send an update
- baseline = &ent->e->baseline;
-
- if (((int)ent->v->effects & EF_DELTA) && sv_deltacompress.integer)
- {
- // every half second a full update is forced
- if (realtime < client->nextfullupdate[e])
- {
- bits |= U_DELTA;
- baseline = &ent->e->deltabaseline;
- }
- else
- nextfullupdate = realtime + 0.5f;
- }
- else
- nextfullupdate = realtime + 0.5f;
-
- // restore nextfullupdate since this is being sent for real
- client->nextfullupdate[e] = nextfullupdate;
-
- if (e >= 256)
- bits |= U_LONGENTITY;
-
- if (ent->v->movetype == MOVETYPE_STEP)
- bits |= U_STEP;
-
- // LordHavoc: old stuff, but rewritten to have more exact tolerances
- if (origin[0] != baseline->origin[0]) bits |= U_ORIGIN1;
- if (origin[1] != baseline->origin[1]) bits |= U_ORIGIN2;
- if (origin[2] != baseline->origin[2]) bits |= U_ORIGIN3;
- if (((int)(angles[0]*(256.0/360.0)) & 255) != ((int)(baseline->angles[0]*(256.0/360.0)) & 255)) bits |= U_ANGLE1;
- if (((int)(angles[1]*(256.0/360.0)) & 255) != ((int)(baseline->angles[1]*(256.0/360.0)) & 255)) bits |= U_ANGLE2;
- if (((int)(angles[2]*(256.0/360.0)) & 255) != ((int)(baseline->angles[2]*(256.0/360.0)) & 255)) bits |= U_ANGLE3;
- if (baseline->colormap != (qbyte) ent->v->colormap) bits |= U_COLORMAP;
- if (baseline->skin != (qbyte) ent->v->skin) bits |= U_SKIN;
- if ((baseline->frame & 0x00FF) != ((int) ent->v->frame & 0x00FF)) bits |= U_FRAME;
- if ((baseline->effects & 0x00FF) != ((int) ent->v->effects & 0x00FF)) bits |= U_EFFECTS;
- if ((baseline->modelindex & 0x00FF) != ((int) ent->v->modelindex & 0x00FF)) bits |= U_MODEL;
-
- // LordHavoc: new stuff
- if (baseline->alpha != alpha) bits |= U_ALPHA;
- if (baseline->scale != scale) bits |= U_SCALE;
- if (((int) baseline->effects & 0xFF00) != ((int) ent->v->effects & 0xFF00)) bits |= U_EFFECTS2;
- if (baseline->glowsize != glowsize) bits |= U_GLOWSIZE;
- if (baseline->glowcolor != glowcolor) bits |= U_GLOWCOLOR;
- if (((int) baseline->frame & 0xFF00) != ((int) ent->v->frame & 0xFF00)) bits |= U_FRAME2;
- if (((int) baseline->frame & 0xFF00) != ((int) ent->v->modelindex & 0xFF00)) bits |= U_MODEL2;
-
- // update delta baseline
- VectorCopy(ent->v->origin, ent->e->deltabaseline.origin);
- VectorCopy(ent->v->angles, ent->e->deltabaseline.angles);
- ent->e->deltabaseline.colormap = ent->v->colormap;
- ent->e->deltabaseline.skin = ent->v->skin;
- ent->e->deltabaseline.frame = ent->v->frame;
- ent->e->deltabaseline.effects = ent->v->effects;
- ent->e->deltabaseline.modelindex = ent->v->modelindex;
- ent->e->deltabaseline.alpha = alpha;
- ent->e->deltabaseline.scale = scale;
- ent->e->deltabaseline.glowsize = glowsize;
- ent->e->deltabaseline.glowcolor = glowcolor;
-
- // write the message
- if (bits >= 16777216)
- bits |= U_EXTEND2;
- if (bits >= 65536)
- bits |= U_EXTEND1;
- if (bits >= 256)
- bits |= U_MOREBITS;
- bits |= U_SIGNAL;
-
- MSG_WriteByte (msg, bits);
- if (bits & U_MOREBITS)
- MSG_WriteByte (msg, bits>>8);
- // LordHavoc: extend bytes have to be written here due to delta compression
- if (bits & U_EXTEND1)
- MSG_WriteByte (msg, bits>>16);
- if (bits & U_EXTEND2)
- MSG_WriteByte (msg, bits>>24);
-
- // LordHavoc: old stuff
- if (bits & U_LONGENTITY)
- MSG_WriteShort (msg,e);
- else
- MSG_WriteByte (msg,e);
- if (bits & U_MODEL) MSG_WriteByte(msg, ent->v->modelindex);
- if (bits & U_FRAME) MSG_WriteByte(msg, ent->v->frame);
- if (bits & U_COLORMAP) MSG_WriteByte(msg, ent->v->colormap);
- if (bits & U_SKIN) MSG_WriteByte(msg, ent->v->skin);
- if (bits & U_EFFECTS) MSG_WriteByte(msg, ent->v->effects);
- if (bits & U_ORIGIN1) MSG_WriteCoord(msg, origin[0], sv.protocol);
- if (bits & U_ANGLE1) MSG_WriteAngle(msg, angles[0], sv.protocol);
- if (bits & U_ORIGIN2) MSG_WriteCoord(msg, origin[1], sv.protocol);
- if (bits & U_ANGLE2) MSG_WriteAngle(msg, angles[1], sv.protocol);
- if (bits & U_ORIGIN3) MSG_WriteCoord(msg, origin[2], sv.protocol);
- if (bits & U_ANGLE3) MSG_WriteAngle(msg, angles[2], sv.protocol);
-
- // LordHavoc: new stuff
- if (bits & U_ALPHA) MSG_WriteByte(msg, alpha);
- if (bits & U_SCALE) MSG_WriteByte(msg, scale);
- if (bits & U_EFFECTS2) MSG_WriteByte(msg, (int)ent->v->effects >> 8);
- if (bits & U_GLOWSIZE) MSG_WriteByte(msg, glowsize);
- if (bits & U_GLOWCOLOR) MSG_WriteByte(msg, glowcolor);
- if (bits & U_FRAME2) MSG_WriteByte(msg, (int)ent->v->frame >> 8);
- if (bits & U_MODEL2) MSG_WriteByte(msg, (int)ent->v->modelindex >> 8);
- }
-
- if (sv_cullentities_stats.integer)
- Con_Printf("client \"%s\" entities: %d total, %d visible, %d culled by: %d pvs %d trace\n", client->name, totalentities, visibleentities, culled_pvs + culled_trace, culled_pvs, culled_trace);
-}
-*/
-