ncWeapon: move AnimEvent 5000 into ncRenderableEntity, allow fireinfo to control those for the viewmodel in ncWeapon fireInfos

This commit is contained in:
Marco Cawthorne 2025-02-07 22:15:11 -08:00
parent 475000a1b8
commit 0d86ba22e9
4 changed files with 55 additions and 33 deletions

View file

@ -213,6 +213,13 @@ private:
#ifdef CLIENT
float m_netEffects;
/* muzzle cache */
string m_muzzPartSmoke;
vector m_muzzOffset;
vector m_muzzRelativeOffset;
float m_fiJointMuzzle; /* World Model only */
float m_fiJointBarrel; /* View Model only */
nonvirtual void _UpdateGeomset();
#endif
};

View file

@ -985,6 +985,35 @@ ncRenderableEntity::HandleAnimEvent(float flTimeStamp, int iCode, string strData
StartSound(substring(strData, 1, -1), CHAN_VOICE, 0, true);
else
StartSound(strData, CHAN_VOICE, 0, true);
#endif
break;
case 5000: /* view model muzzle special */
#ifdef CLIENT
vector muzzlePos = g_vec_null;
if (m_fiJointBarrel > 0) {
muzzlePos = gettaginfo(pSeat->m_eViewModel, m_fiJointBarrel);
} else {
vector camPos = pSeat->m_eViewModel.origin;
muzzlePos = camPos + anglesToForward(pSeat->m_eViewModel.angles) * m_muzzRelativeOffset[0];
muzzlePos += anglesToRight(pSeat->m_eViewModel.angles) * m_muzzRelativeOffset[1];
muzzlePos += anglesToUp(pSeat->m_eViewModel.angles) * m_muzzRelativeOffset[2];
}
muzzlePos += anglesToForward(pSeat->m_eViewModel.angles) * m_muzzOffset[0];
muzzlePos += anglesToRight(pSeat->m_eViewModel.angles) * m_muzzOffset[1];
muzzlePos += anglesToUp(pSeat->m_eViewModel.angles) * m_muzzOffset[2];
ncRenderableEntity viewModel = (ncRenderableEntity)pSeat->m_eViewModel;
EV_MuzzleFlash_CreateAtPos(pSeat->m_eViewModel, muzzlePos, 1.0, viewModel.m_iMuzzleModel);
if (STRING_SET(m_muzzPartSmoke)) {
setproperty(VF_ANGLES,g_view.GetCameraAngle());
setproperty(VF_ORIGIN, g_view.GetCameraOrigin());
pointparticles(particleeffectnum(m_muzzPartSmoke), muzzlePos, g_vec_null, 1);
}
#endif
break;
case 5004: /* view model sound? */

View file

@ -369,8 +369,6 @@ private:
bool m_fiCocks;
string m_fiSndCock;
float m_fiJointMuzzle; /* World Model only */
float m_fiJointBarrel; /* View Model only */
string m_fiBrassDef;
float m_fiBrassDelay;

View file

@ -128,6 +128,11 @@ ncWeapon::GetWeaponState(void)
void
ncWeapon::UpdateFireInfoCache(void)
{
#ifdef CLIENT
ncRenderableEntity viewModelRight = (ncRenderableEntity)pSeat->m_eViewModel;
ncRenderableEntity viewModelLeft = (ncRenderableEntity)pSeat->m_eViewModelL;
#endif
string ammoPerShot = GetSubDefString(m_strLastFireInfo, "ammoPerShot");
string reloadSpeed = GetSubDefString(m_strLastFireInfo, "reloadTime");
m_fiDetonateOnFire = GetSubDefString(m_strLastFireInfo, "detonateOnFire");
@ -158,9 +163,22 @@ ncWeapon::UpdateFireInfoCache(void)
/* firing cosmetics */
#ifdef CLIENT
setmodel(pSeat->m_eViewModel, GetSubDefString(m_strLastFireInfo, "model_view"));
pSeat->m_eViewModel.declclass = declclass;
viewModelLeft.declclass = viewModelRight.declclass = declclass;
m_fiJointMuzzle = gettagindex(pSeat->m_eViewModel, GetSubDefString(m_strLastFireInfo, "muzzle"));
viewModelLeft.m_fiJointMuzzle = viewModelRight.m_fiJointMuzzle = m_fiJointMuzzle;
m_fiJointBarrel = gettagindex(pSeat->m_eViewModel, GetSubDefString(m_strLastFireInfo, "barrel"));
viewModelLeft.m_fiJointBarrel = viewModelRight.m_fiJointBarrel = m_fiJointBarrel;
m_muzzPartSmoke = GetSubDefString(m_strLastFireInfo, "smoke_muzzle");
viewModelLeft.m_muzzPartSmoke = viewModelRight.m_muzzPartSmoke = m_muzzPartSmoke;
m_muzzOffset = GetSubDefVector(m_strLastFireInfo, "muzzleOffset");
viewModelLeft.m_muzzOffset = viewModelRight.m_muzzOffset = m_muzzOffset;
m_muzzRelativeOffset = GetSubDefVector(m_strLastFireInfo, "muzzleRelativeOffset");
viewModelLeft.m_muzzRelativeOffset = viewModelRight.m_muzzRelativeOffset = m_muzzRelativeOffset;
// printf("%S %S %d\n", pSeat->m_eViewModel.model, GetSubDefString(m_strLastFireInfo, "barrel"), m_fiJointBarrel);
#endif
@ -518,37 +536,7 @@ void
ncWeapon::HandleAnimEvent(float timeStamp, int eventCode, string dataString)
{
switch (eventCode) {
case 5000:
string muzzModel = GetSubDefString(m_strLastFireInfo, "model_flash");
string partSmoke = GetSubDefString(m_strLastFireInfo, "smoke_muzzle");
vector muzzOffset = GetSubDefVector(m_strLastFireInfo, "muzzleOffset");
vector muzzlePos = g_vec_null;
if (m_fiJointBarrel > 0) {
muzzlePos = gettaginfo(pSeat->m_eViewModel, m_fiJointBarrel);
} else {
vector muzzOfs = GetSubDefVector(m_strLastFireInfo, "muzzleRelativeOffset");
vector camPos = pSeat->m_eViewModel.origin;
muzzlePos = camPos + anglesToForward(pSeat->m_eViewModel.angles) * muzzOfs[0];
muzzlePos += anglesToRight(pSeat->m_eViewModel.angles) * muzzOfs[1];
muzzlePos += anglesToUp(pSeat->m_eViewModel.angles) * muzzOfs[2];
}
muzzlePos += anglesToForward(pSeat->m_eViewModel.angles) * muzzOffset[0];
muzzlePos += anglesToRight(pSeat->m_eViewModel.angles) * muzzOffset[1];
muzzlePos += anglesToUp(pSeat->m_eViewModel.angles) * muzzOffset[2];
if (STRING_SET(muzzModel)) {
EV_MuzzleFlash_CreateAtPos(pSeat->m_eViewModel, muzzlePos, 1.0, getmodelindex(muzzModel));
}
if (STRING_SET(partSmoke)) {
setproperty(VF_ANGLES,g_view.GetCameraAngle());
setproperty(VF_ORIGIN, g_view.GetCameraOrigin());
pointparticles(particleeffectnum(partSmoke), muzzlePos, g_vec_null, 1);
}
break;
default:
super::HandleAnimEvent(timeStamp, eventCode, dataString);
}