Further fixes for fixbot navigation

This commit is contained in:
BjossiAlfreds 2020-01-15 17:22:27 +00:00
parent 632d972c78
commit 4eac902f4e

View file

@ -1,4 +1,4 @@
/* ======================================================================= /* ==============================================================
* *
* Fixbot * Fixbot
* *
@ -10,6 +10,10 @@
#define MZ2_fixbot_BLASTER_1 MZ2_HOVER_BLASTER_1 #define MZ2_fixbot_BLASTER_1 MZ2_HOVER_BLASTER_1
#define FIXBOT_MAX_STUCK_FRAMES 10
#define FIXBOT_GOAL_TIMEOUT 15
#define FIXBOT_WELD_GOAL_TIMEOUT 15
qboolean visible(edict_t *self, edict_t *other); qboolean visible(edict_t *self, edict_t *other);
qboolean infront(edict_t *self, edict_t *other); qboolean infront(edict_t *self, edict_t *other);
@ -178,8 +182,7 @@ make_bot_goal(edict_t *self)
ent->think = bot_goal_think; ent->think = bot_goal_think;
ent->nextthink = level.time + FRAMETIME; ent->nextthink = level.time + FRAMETIME;
ent->touch_debounce_time = level.time + FIXBOT_GOAL_TIMEOUT;
gi.linkentity(ent);
return ent; return ent;
} }
@ -198,9 +201,9 @@ landing_goal(edict_t *self)
} }
ent = make_bot_goal(self); ent = make_bot_goal(self);
VectorSet(ent->mins, -32, -32, -24); VectorSet(ent->mins, -32, -32, -24);
VectorSet(ent->maxs, 32, 32, 24); VectorSet(ent->maxs, 32, 32, 24);
gi.linkentity(ent);
AngleVectors(self->s.angles, forward, right, up); AngleVectors(self->s.angles, forward, right, up);
VectorMA(self->s.origin, 32, forward, end); VectorMA(self->s.origin, 32, forward, end);
@ -210,6 +213,7 @@ landing_goal(edict_t *self)
end, self, MASK_MONSTERSOLID); end, self, MASK_MONSTERSOLID);
VectorCopy(tr.endpos, ent->s.origin); VectorCopy(tr.endpos, ent->s.origin);
gi.linkentity(ent);
self->goalentity = self->enemy = ent; self->goalentity = self->enemy = ent;
self->monsterinfo.currentmove = &fixbot_move_landing; self->monsterinfo.currentmove = &fixbot_move_landing;
@ -232,6 +236,7 @@ takeoff_goal(edict_t *self)
VectorSet(ent->mins, -32, -32, -24); VectorSet(ent->mins, -32, -32, -24);
VectorSet(ent->maxs, 32, 32, 24); VectorSet(ent->maxs, 32, 32, 24);
gi.linkentity(ent);
AngleVectors(self->s.angles, forward, right, up); AngleVectors(self->s.angles, forward, right, up);
VectorMA(self->s.origin, 32, forward, end); VectorMA(self->s.origin, 32, forward, end);
@ -241,6 +246,7 @@ takeoff_goal(edict_t *self)
end, self, MASK_MONSTERSOLID); end, self, MASK_MONSTERSOLID);
VectorCopy(tr.endpos, ent->s.origin); VectorCopy(tr.endpos, ent->s.origin);
gi.linkentity(ent);
self->goalentity = self->enemy = ent; self->goalentity = self->enemy = ent;
self->monsterinfo.currentmove = &fixbot_move_takeoff; self->monsterinfo.currentmove = &fixbot_move_takeoff;
@ -291,7 +297,7 @@ void
roam_goal(edict_t *self) roam_goal(edict_t *self)
{ {
trace_t tr; trace_t tr;
vec3_t forward, right, up; vec3_t forward;
vec3_t end; vec3_t end;
edict_t *ent; edict_t *ent;
vec3_t dang; vec3_t dang;
@ -304,11 +310,7 @@ roam_goal(edict_t *self)
return; return;
} }
whichvec[0] = 0; VectorClear(whichvec);
whichvec[1] = 0;
whichvec[2] = 0;
ent = make_bot_goal(self);
oldlen = 0; oldlen = 0;
@ -325,13 +327,13 @@ roam_goal(edict_t *self)
dang[YAW] -= 30 * (i - 6); dang[YAW] -= 30 * (i - 6);
} }
AngleVectors(dang, forward, right, up); AngleVectors(dang, forward, NULL, NULL);
VectorMA(self->s.origin, 8192, forward, end); VectorMA(self->s.origin, 8192, forward, end);
tr = gi.trace(self->s.origin, NULL, NULL, end, self, MASK_SHOT); tr = gi.trace(self->s.origin, NULL, NULL, end, self, MASK_SHOT);
VectorSubtract(self->s.origin, tr.endpos, vec); VectorSubtract(self->s.origin, tr.endpos, vec);
len = VectorNormalize(vec); len = VectorLength(vec);
if (len > oldlen) if (len > oldlen)
{ {
@ -340,7 +342,10 @@ roam_goal(edict_t *self)
} }
} }
ent = make_bot_goal(self);
VectorCopy(whichvec, ent->s.origin); VectorCopy(whichvec, ent->s.origin);
gi.linkentity(ent);
self->goalentity = self->enemy = ent; self->goalentity = self->enemy = ent;
self->monsterinfo.currentmove = &fixbot_move_turn; self->monsterinfo.currentmove = &fixbot_move_turn;
@ -404,7 +409,7 @@ use_scanner(edict_t *self)
{ {
VectorSubtract(self->s.origin, self->goalentity->s.origin, vec); VectorSubtract(self->s.origin, self->goalentity->s.origin, vec);
if (VectorLength(vec) < 32) if (self->goalentity->touch_debounce_time < level.time || VectorLength(vec) < 32)
{ {
self->goalentity->nextthink = level.time + 0.1; self->goalentity->nextthink = level.time + 0.1;
self->goalentity->think = G_FreeEdict; self->goalentity->think = G_FreeEdict;
@ -418,15 +423,21 @@ use_scanner(edict_t *self)
VectorSubtract(self->s.origin, self->s.old_origin, vec); VectorSubtract(self->s.origin, self->s.old_origin, vec);
if (VectorLength(vec) > 0) if (VectorLength(vec) == 0)
{ {
self->touch_debounce_time = level.time + 1; self->count++;
}
else
{
self->count = 0;
} }
if (self->touch_debounce_time < level.time) if (self->count > FIXBOT_MAX_STUCK_FRAMES)
{ {
/* bot is stuck, get new goalentity */ /* bot is stuck, get new goalentity */
self->count = 0;
if (strcmp(self->goalentity->classname, "bot_goal") == 0) if (strcmp(self->goalentity->classname, "bot_goal") == 0)
{ {
self->goalentity->nextthink = level.time + 0.1; self->goalentity->nextthink = level.time + 0.1;
@ -436,7 +447,7 @@ use_scanner(edict_t *self)
else if (strcmp(self->goalentity->classname, "object_repair") == 0) else if (strcmp(self->goalentity->classname, "object_repair") == 0)
{ {
/* don't try to go for welding targets again for a while */ /* don't try to go for welding targets again for a while */
self->fly_sound_debounce_time = level.time + 10; self->fly_sound_debounce_time = level.time + FIXBOT_WELD_GOAL_TIMEOUT;
} }
self->monsterinfo.currentmove = &fixbot_move_stand; self->monsterinfo.currentmove = &fixbot_move_stand;