NSRenderableEntity: add new overridable method (void) HandleAnimEvent(float, int string)

Also fix the mouth-flapping on NSTalkMonster.
This commit is contained in:
Marco Cawthorne 2022-09-10 09:39:51 -07:00
parent 30a482e80e
commit 6c7e3e8c06
Signed by: eukara
GPG key ID: CE2032F0A2882A22
5 changed files with 101 additions and 5 deletions

View file

@ -743,7 +743,7 @@ NSMonster::Physics(void)
frame1time += frametime;
processmodelevents(modelindex, frame, m_flBaseTime,
frame1time, Game_ServerModelEvent);
frame1time, HandleAnimEvent);
}
void

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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);
}
/*