diff --git a/src/client/defs.h b/src/client/defs.h index af8514df..26202817 100644 Binary files a/src/client/defs.h and b/src/client/defs.h differ diff --git a/src/shared/NSMonster.h b/src/shared/NSMonster.h index 14618fa9..cfc9f2da 100644 --- a/src/shared/NSMonster.h +++ b/src/shared/NSMonster.h @@ -261,6 +261,8 @@ private: /* animation cycles */ float m_flAnimTime; + PREDICTED_VECTOR_N(view_ofs) + nonvirtual void _LerpTurnToEnemy(float); #endif @@ -382,6 +384,9 @@ public: #endif #ifdef CLIENT + nonvirtual void _RenderDebugViewCone(); + + /** overrides */ virtual void customphysics(void); virtual float predraw(void); virtual void ReceiveEntity(float,float); diff --git a/src/shared/NSMonster.qc b/src/shared/NSMonster.qc index 85a09f65..4f030450 100644 --- a/src/shared/NSMonster.qc +++ b/src/shared/NSMonster.qc @@ -344,13 +344,13 @@ NSMonster::SeeThink(void) /* first, is the potential enemy in our field of view? */ makevectors(angles); - vector v = normalize(w.origin - origin); + vector v = normalize(w.origin - GetEyePos()); float flDot = v * v_forward; if (flDot < SeeFOV()/180) continue; - traceline(origin, w.origin, MOVE_EVERYTHING, this); + traceline(GetEyePos(), w.origin, MOVE_EVERYTHING, this); /* we have line of sight with the player */ if (trace_fraction == 1.0f || trace_ent == w) { @@ -926,6 +926,7 @@ NSMonster::EvaluateEntity(void) EVALUATE_VECTOR(angles, 1, MONFL_CHANGED_ANGLES_Y) EVALUATE_VECTOR(angles, 2, MONFL_CHANGED_ANGLES_Z) EVALUATE_FIELD(modelindex, MONFL_CHANGED_MODELINDEX) + EVALUATE_VECTOR(view_ofs, 2, MONFL_CHANGED_MODELINDEX) EVALUATE_FIELD(solid, MONFL_CHANGED_SOLID) EVALUATE_FIELD(movetype, MONFL_CHANGED_FLAGS) EVALUATE_FIELD(flags, MONFL_CHANGED_FLAGS) @@ -973,6 +974,7 @@ NSMonster::SendEntity(entity ePEnt, float flChanged) SENDENTITY_ANGLE(angles[1], MONFL_CHANGED_ANGLES_Y) SENDENTITY_ANGLE(angles[2], MONFL_CHANGED_ANGLES_Z) SENDENTITY_SHORT(modelindex, MONFL_CHANGED_MODELINDEX) + SENDENTITY_BYTE(view_ofs[2], MONFL_CHANGED_MODELINDEX) SENDENTITY_BYTE(solid, MONFL_CHANGED_SOLID) SENDENTITY_BYTE(movetype, MONFL_CHANGED_FLAGS) SENDENTITY_INT(flags, MONFL_CHANGED_FLAGS) @@ -1027,6 +1029,8 @@ NSMonster::predraw(void) frame2time = frame1time; } + _RenderDebugViewCone(); + return render; } @@ -1045,6 +1049,7 @@ NSMonster::ReceiveEntity(float flNew, float flChanged) READENTITY_ANGLE(angles[1], MONFL_CHANGED_ANGLES_Y) READENTITY_ANGLE(angles[2], MONFL_CHANGED_ANGLES_Z) READENTITY_SHORT(modelindex, MONFL_CHANGED_MODELINDEX) + READENTITY_BYTE(view_ofs[2], MONFL_CHANGED_MODELINDEX) READENTITY_BYTE(solid, MONFL_CHANGED_SOLID) READENTITY_BYTE(movetype, MONFL_CHANGED_FLAGS) READENTITY_INT(flags, MONFL_CHANGED_FLAGS) @@ -1081,6 +1086,37 @@ NSMonster::ReceiveEntity(float flNew, float flChanged) setorigin(this, origin); } + +void +NSMonster::_RenderDebugViewCone(void) +{ + vector v; + float flDot; + vector testOrg; + + if (autocvar(r_showViewCone, 0) == 0) + return; + + makevectors(angles); + testOrg = pSeat->m_ePlayer.origin; + v = normalize(testOrg - GetEyePos()); + flDot = v * v_forward; + + /* not inside our FoV at all */ + if (flDot < 90.0f/180) { + drawcone(GetEyePos(), angles, 16, 60, 90, [0.25,0,0], 0.25f); + return; + } + + traceline(GetEyePos(), testOrg, MOVE_EVERYTHING, this); + + /* we have line of sight with the client */ + if (trace_fraction == 1.0f || trace_ent == pSeat->m_ePlayer) { + drawcone(GetEyePos(), angles, 16, 60, 90, [1,0,0], 0.75f); + } else { /* in FoV, no line of sight */ + drawcone(GetEyePos(), angles, 16, 60, 90, [1,1,1], 0.25f); + } +} #endif #ifdef CLIENT diff --git a/src/shared/NSSurfacePropEntity.h b/src/shared/NSSurfacePropEntity.h index 0b503e27..1b2027b1 100644 --- a/src/shared/NSSurfacePropEntity.h +++ b/src/shared/NSSurfacePropEntity.h @@ -159,6 +159,8 @@ public: /* misc 'being' methods */ /** Returns the absolute world position of where the eyes are located. */ nonvirtual vector GetEyePos(void); + /** Sets the relative position of the eyes */ + nonvirtual void SetEyePos(vector); }; #ifdef CLIENT diff --git a/src/shared/NSSurfacePropEntity.qc b/src/shared/NSSurfacePropEntity.qc index ccb30656..a76e5342 100644 --- a/src/shared/NSSurfacePropEntity.qc +++ b/src/shared/NSSurfacePropEntity.qc @@ -39,6 +39,12 @@ NSSurfacePropEntity::GetEyePos(void) return origin + view_ofs; } +void +NSSurfacePropEntity::SetEyePos(vector value) +{ + view_ofs = value; +} + void NSSurfacePropEntity::Spawned(void) { diff --git a/src/shared/NSTalkMonster.qc b/src/shared/NSTalkMonster.qc index ceaad199..676f6f59 100644 --- a/src/shared/NSTalkMonster.qc +++ b/src/shared/NSTalkMonster.qc @@ -826,6 +826,8 @@ NSTalkMonster::predraw(void) } addentity(this); + _RenderDebugViewCone(); + return (PREDRAW_NEXT); }