Avoid a segfault at the end of hipnotic.

This is based on ccr's patch, but a little more thorough (he missed some
potential problems) and probably more readable (the original code wasn't
the greatest (still isn't, but...))..
This commit is contained in:
Bill Currie 2013-11-27 16:08:30 +09:00
parent 4c6478c77f
commit 7de0317a22

View file

@ -294,6 +294,7 @@ CL_RelinkEntities (void)
int i, j; int i, j;
int entvalid; int entvalid;
vec3_t delta; vec3_t delta;
int model_flags;
r_data->player_entity = &cl_entities[cl.viewentity]; r_data->player_entity = &cl_entities[cl.viewentity];
@ -365,13 +366,16 @@ CL_RelinkEntities (void)
VectorCopy (ent_colormod[new->colormod], ent->colormod); VectorCopy (ent_colormod[new->colormod], ent->colormod);
ent->colormod[3] = ENTALPHA_DECODE (new->alpha); ent->colormod[3] = ENTALPHA_DECODE (new->alpha);
model_flags = 0;
if (ent->model)
model_flags = ent->model->flags;
if (cl_forcelink[i]) { if (cl_forcelink[i]) {
// The entity was not updated in the last message so move to the // The entity was not updated in the last message so move to the
// final spot // final spot
ent->pose1 = ent->pose2 = -1; ent->pose1 = ent->pose2 = -1;
VectorCopy (new->origin, ent->origin); VectorCopy (new->origin, ent->origin);
if (!(ent->model->flags & EF_ROTATE)) if (!(model_flags & EF_ROTATE))
CL_TransformEntity (ent, new->angles, true); CL_TransformEntity (ent, new->angles, true);
if (i != cl.viewentity || chase_active->int_val) { if (i != cl.viewentity || chase_active->int_val) {
if (ent->efrag) if (ent->efrag)
@ -388,14 +392,14 @@ CL_RelinkEntities (void)
|| fabs (delta[2]) > 100) { || fabs (delta[2]) > 100) {
// assume a teleportation, not a motion // assume a teleportation, not a motion
VectorCopy (new->origin, ent->origin); VectorCopy (new->origin, ent->origin);
if (!(ent->model->flags & EF_ROTATE)) if (!(model_flags & EF_ROTATE))
CL_TransformEntity (ent, new->angles, true); CL_TransformEntity (ent, new->angles, true);
ent->pose1 = ent->pose2 = -1; ent->pose1 = ent->pose2 = -1;
} else { } else {
vec3_t angles, d; vec3_t angles, d;
// interpolate the origin and angles // interpolate the origin and angles
VectorMultAdd (old->origin, f, delta, ent->origin); VectorMultAdd (old->origin, f, delta, ent->origin);
if (!(ent->model->flags & EF_ROTATE)) { if (!(model_flags & EF_ROTATE)) {
VectorSubtract (new->angles, old->angles, d); VectorSubtract (new->angles, old->angles, d);
for (j = 0; j < 3; j++) { for (j = 0; j < 3; j++) {
if (d[j] > 180) if (d[j] > 180)
@ -420,7 +424,7 @@ CL_RelinkEntities (void)
} }
// rotate binary objects locally // rotate binary objects locally
if (ent->model->flags & EF_ROTATE) { if (model_flags & EF_ROTATE) {
vec3_t angles; vec3_t angles;
VectorCopy (new->angles, angles); VectorCopy (new->angles, angles);
angles[YAW] = bobjrotate; angles[YAW] = bobjrotate;
@ -431,7 +435,7 @@ CL_RelinkEntities (void)
new->glow_color); new->glow_color);
if (VectorDistance_fast (old->origin, ent->origin) > (256 * 256)) if (VectorDistance_fast (old->origin, ent->origin) > (256 * 256))
VectorCopy (ent->origin, old->origin); VectorCopy (ent->origin, old->origin);
if (ent->model->flags & ~EF_ROTATE) if (model_flags & ~EF_ROTATE)
CL_ModelEffects (ent, i, new->glow_color); CL_ModelEffects (ent, i, new->glow_color);
cl_forcelink[i] = false; cl_forcelink[i] = false;