From 6078d31f12fd15bee3a9a461a6abc0edc3d4787d Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 17 May 2023 08:59:26 -0700 Subject: [PATCH] NSMonster: add methods SetEyePos, and cvar r_showViewCone. --- src/client/defs.h | Bin 7871 -> 8913 bytes src/shared/NSMonster.h | 5 ++++ src/shared/NSMonster.qc | 40 ++++++++++++++++++++++++++++-- src/shared/NSSurfacePropEntity.h | 2 ++ src/shared/NSSurfacePropEntity.qc | 6 +++++ src/shared/NSTalkMonster.qc | 2 ++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/client/defs.h b/src/client/defs.h index af8514dfa06a0a737924286757dfa51e35e78e3f..26202817ea2267786b1b0f4b686b5a167ffade43 100644 GIT binary patch delta 1055 zcmaJ=!D`z;5bd$jv4@<8oFrSer3OmD@ga?UD74i0(2FrYJ4;y9v}7YrXU4&CHvp-;+PHpFhs(sTKDn2?{cKv)hD}8ZAj_x|mYA6{#Fj zZ{+Wd%KQvSjs|;~R>l$@pRC#_9r3Zfxzd|LMj)t2P1RnN%IGqpyfC7|?+2+j)$Q^B zq86Fj0dQovHifZA#8t7q6`}v#_gY9g?v64(IVU(bWrW^LWl@Q-?|Wq>DwVeMzPFWj zD|M#QT_NnXHDz6Pbrrii>zEr=Z0qtB@`U z=^-(jcS7?7SswWIL7$0szepU`wEoQ0xohLzRMYDzIlxwR(SrB$$xC>30Y zIq$?5*$C$bb?c!%ExC7Yzh)o+O<+R%b#Cmvuo?Aez>=mI7V&1&$P5M@y4Nj~Nn{M< zGkuR$9VP+hpJr=`HV%voIV=yri#PEwrqK%uj#e5ZAvy~_uIKM*M9Etqa-{i$&tm;f z!j5xOJZy{(&Yh##vFAWEfHwA7+Dd-q&DRGDLy>spTImefSg%QiDrkdUjmF|J9+xKu zA5*`tnuUY2eHG>gcudqf%8CrB-FQ7x9IJtMKo*AO4FU++!)sUu$OuEelL>B0rJEZT oATJi~#bL#~#roM;jxypk|8J;ApI$lLW;#2l7LI>?JDa`y3n|P$>Hq)$ delta 12 TcmccUy5Dv~li21dQnnlbCYuET 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); }