Change show_hostile from int to float and remove unnecessary casts.

In the vanilla code show_hostile was a qboolean what's clearly wrong.
For wome reasons I don't remember I changed it to an integer and added
the casts. This is problematic because show_hostile is derived from
level.time which is a float. The loss in precision broke some corner
cases like monsters becoming activated when they shouldn't.

Found, analyzed and reported by @BjossiAlfreds in yquake2/yquake2#525.
This commit is contained in:
Yamagi 2020-03-10 10:18:21 +01:00
parent 6fb2d6e4da
commit f0793d17f8
2 changed files with 5 additions and 5 deletions

View file

@ -503,7 +503,7 @@ FoundTarget(edict_t *self)
level.sight_entity->light_level = 128; level.sight_entity->light_level = 128;
} }
self->show_hostile = (int)level.time + 1; /* wake up other monsters */ self->show_hostile = level.time + 1; /* wake up other monsters */
VectorCopy(self->enemy->s.origin, self->monsterinfo.last_sighting); VectorCopy(self->enemy->s.origin, self->monsterinfo.last_sighting);
self->monsterinfo.trail_time = level.time; self->monsterinfo.trail_time = level.time;
@ -692,7 +692,7 @@ FindTarget(edict_t *self)
if (r == RANGE_NEAR) if (r == RANGE_NEAR)
{ {
if ((client->show_hostile < (int)level.time) && !infront(self, client)) if ((client->show_hostile < level.time) && !infront(self, client))
{ {
return false; return false;
} }
@ -1199,7 +1199,7 @@ ai_checkattack(edict_t *self, float dist)
} }
else else
{ {
self->show_hostile = (int)level.time + 1; self->show_hostile = level.time + 1;
return false; return false;
} }
} }
@ -1279,7 +1279,7 @@ ai_checkattack(edict_t *self, float dist)
} }
} }
self->show_hostile = (int)level.time + 1; /* wake up other monsters */ self->show_hostile = level.time + 1; /* wake up other monsters */
/* check knowledge of enemy */ /* check knowledge of enemy */
enemy_vis = visible(self, self->enemy); enemy_vis = visible(self, self->enemy);

View file

@ -1238,8 +1238,8 @@ struct edict_s
int max_health; int max_health;
int gib_health; int gib_health;
int deadflag; int deadflag;
int show_hostile;
float show_hostile;
float powerarmor_time; float powerarmor_time;
char *map; /* target_changelevel */ char *map; /* target_changelevel */