From 6c7e3e8c06323cfa63704182e03180a911feb4b7 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Sat, 10 Sep 2022 09:39:51 -0700 Subject: [PATCH] NSRenderableEntity: add new overridable method (void) HandleAnimEvent(float, int string) Also fix the mouth-flapping on NSTalkMonster. --- src/shared/NSMonster.qc | 2 +- src/shared/NSRenderableEntity.h | 3 ++ src/shared/NSRenderableEntity.qc | 62 +++++++++++++++++++++++++++++++- src/shared/NSTalkMonster.h | 3 ++ src/shared/NSTalkMonster.qc | 36 +++++++++++++++++-- 5 files changed, 101 insertions(+), 5 deletions(-) diff --git a/src/shared/NSMonster.qc b/src/shared/NSMonster.qc index 73b62f2f..528134ab 100644 --- a/src/shared/NSMonster.qc +++ b/src/shared/NSMonster.qc @@ -743,7 +743,7 @@ NSMonster::Physics(void) frame1time += frametime; processmodelevents(modelindex, frame, m_flBaseTime, - frame1time, Game_ServerModelEvent); + frame1time, HandleAnimEvent); } void diff --git a/src/shared/NSRenderableEntity.h b/src/shared/NSRenderableEntity.h index c86b43d0..d07d5e27 100644 --- a/src/shared/NSRenderableEntity.h +++ b/src/shared/NSRenderableEntity.h @@ -147,6 +147,9 @@ class NSRenderableEntity:NSEntity nonvirtual float(void) GetBoneControl4; nonvirtual float(void) GetBoneControl5; + /* model events */ + virtual void(float, int, string) HandleAnimEvent; + #ifdef CLIENT nonvirtual void(void) RenderFXPass; #else diff --git a/src/shared/NSRenderableEntity.qc b/src/shared/NSRenderableEntity.qc index 41ce6164..ed1b808a 100644 --- a/src/shared/NSRenderableEntity.qc +++ b/src/shared/NSRenderableEntity.qc @@ -510,7 +510,7 @@ NSRenderableEntity::predraw(void) frame1time += frametime; processmodelevents(modelindex, frame, m_flBaseTime, - frame1time, ClientGame_ModelEvent); + frame1time, HandleAnimEvent); if (alpha > 0.0) { /* TODO: Move this somewhere more sane */ @@ -660,6 +660,66 @@ NSRenderableEntity::GetBoneControl5(void) return m_flBoneControl5; } +void +NSRenderableEntity::HandleAnimEvent(float flTimeStamp, int iCode, string strData) +{ + switch(iCode) { +#ifdef CLIENT + case 1004: /* plays a sound on CHAN_BODY */ + if (substring(strData, 0, 1) == "*") + sound(self, CHAN_BODY, substring(strData, 1, -1), 1.0f, ATTN_NORM); + else + sound(self, CHAN_BODY, strData, 1.0f, ATTN_NORM); + break; + case 1008: /* plays a sound on CHAN_VOICE */ + if (substring(strData, 0, 1) == "*") + sound(self, CHAN_VOICE, substring(strData, 1, -1), 1.0f, ATTN_NORM); + else + sound(self, CHAN_VOICE, strData, 1.0f, ATTN_NORM); + break; + #if 0 + case 5004: /* view model sound? */ + localsound(strData, CHAN_AUTO, 1.0); + break; + case 5001: /* muzzle flash on attachment 0 */ + pSeat->m_eMuzzleflash.alpha = 1.0f; + pSeat->m_eMuzzleflash.scale = 0.25; + pSeat->m_eMuzzleflash.skin = pSeat->m_iVMBones; + break; + case 5011: /* muzzle flash on attachment 1 */ + pSeat->m_eMuzzleflash.alpha = 1.0f; + pSeat->m_eMuzzleflash.scale = 0.25; + pSeat->m_eMuzzleflash.skin = pSeat->m_iVMBones + 1; + break; + case 5021: /* muzzle flash on attachment 2 */ + pSeat->m_eMuzzleflash.alpha = 1.0f; + pSeat->m_eMuzzleflash.scale = 0.25; + pSeat->m_eMuzzleflash.skin = pSeat->m_iVMBones + 2; + break; + case 5031: /* muzzle flash on attachment 3 */ + pSeat->m_eMuzzleflash.alpha = 1.0f; + pSeat->m_eMuzzleflash.scale = 0.25; + pSeat->m_eMuzzleflash.skin = pSeat->m_iVMBones + 3; + break; + #endif +#else + case 1003: /* trigger SSQC entity with specific targetname */ + for (entity f = world; (f = find(f, ::targetname, strData));) { + NSEntity trigger = (NSEntity)f; + if (trigger.Trigger != __NULL__) { + trigger.Trigger(self, TRIG_TOGGLE); + NSLog("^2%s^7::^3ModelEvent^7: " \ + "Calling trigger '%s'\n", + self.classname, strData); + } + } + break; +#endif + default: + NSLog("Unknown model event: %f %i %S", flTimeStamp, iCode, strData); + } +} + #ifdef SERVER void NSRenderableEntity::Save(float handle) diff --git a/src/shared/NSTalkMonster.h b/src/shared/NSTalkMonster.h index 77d69af0..a961d4bf 100644 --- a/src/shared/NSTalkMonster.h +++ b/src/shared/NSTalkMonster.h @@ -126,6 +126,9 @@ class NSTalkMonster:NSMonster virtual void(void) ProcessWordQue; virtual void(float,float) ReceiveEntity; #endif + + /* model events */ + virtual void(float, int, string) HandleAnimEvent; }; #ifdef CLIENT diff --git a/src/shared/NSTalkMonster.qc b/src/shared/NSTalkMonster.qc index e16faaeb..e7cb940d 100644 --- a/src/shared/NSTalkMonster.qc +++ b/src/shared/NSTalkMonster.qc @@ -58,6 +58,21 @@ NSTalkMonster::NSTalkMonster(void) #endif } +void +NSTalkMonster::HandleAnimEvent(float flTimeStamp, int iCode, string strData) +{ + switch(iCode) { +#ifdef SERVER + case 1005: /* plays a dialogue sentence. monsters only right now */ + NSTalkMonster targ = (NSTalkMonster)self; + targ.Sentence(strData); + break; +#endif + default: + super::HandleAnimEvent(flTimeStamp, iCode, strData); + } +} + #ifdef SERVER void NSTalkMonster::Save(float handle) @@ -778,11 +793,25 @@ NSTalkMonster::Sentence(string msg) float NSTalkMonster::predraw(void) { - float render; - render = super::predraw(); + //float render; + //render = super::predraw(); + + /* TODO: this is from NSRenderableEntity, shoul make these nonvirtual methods */ + { + RenderFXPass(); + RenderDebugSkeleton(); + + if (serverkeyfloat(SERVERKEY_PAUSESTATE) != 1) + frame1time += frametime; + + processmodelevents(modelindex, frame, m_flBaseTime, + frame1time, HandleAnimEvent); + } /* TODO end */ /* mouth flapping action */ bonecontrol5 = getchannellevel(this, CHAN_VOICE) * 20; + print(sprintf("voice: %f\n", bonecontrol5)); + m_flBaseTime = frame1time; ProcessWordQue(); @@ -803,7 +832,8 @@ NSTalkMonster::predraw(void) m_bWasPaused = true; } - return render; + addentity(this); + return (PREDRAW_NEXT); } /*