[HL25] Backport flesh hit sound fix

This commit is contained in:
Joël Troch 2024-08-28 10:10:34 +02:00
parent 32b8903f58
commit ae20553127
3 changed files with 23 additions and 6 deletions

View file

@ -66,6 +66,7 @@ float EV_HLDM_PlayTextureSound(int idx, pmtrace_t* ptr, float* vecSrc, float* ve
{
// hit the world, try to play sound based on texture material type
char chTextureType = CHAR_TEX_CONCRETE;
cl_entity_t* cl_entity = NULL;
float fvol;
float fvolbar;
const char* rgsz[4];
@ -84,12 +85,7 @@ float EV_HLDM_PlayTextureSound(int idx, pmtrace_t* ptr, float* vecSrc, float* ve
chTextureType = 0;
// Player
if (entity >= 1 && entity <= gEngfuncs.GetMaxClients())
{
// hit body
chTextureType = CHAR_TEX_FLESH;
}
else if (entity == 0)
if (entity == 0)
{
// get texture from entity or world (world is ent(0))
pTextureName = (char*)gEngfuncs.pEventAPI->EV_TraceTexture(ptr->ent, vecSrc, vecEnd);
@ -118,6 +114,20 @@ float EV_HLDM_PlayTextureSound(int idx, pmtrace_t* ptr, float* vecSrc, float* ve
chTextureType = PM_FindTextureType(szbuffer);
}
}
else
{
// JoshA: Look up the entity and find the EFLAG_FLESH_SOUND flag.
// This broke at some point then TF:C added prediction.
//
// It used to use Classify of pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE
// to determine what sound to play, but that's server side and isn't available on the client
// and got lost in the translation to that.
// Now the server will replicate that state via an eflag.
cl_entity = gEngfuncs.GetEntityByIndex(entity);
if (cl_entity && !!(cl_entity->curstate.eflags & EFLAG_FLESH_SOUND))
chTextureType = CHAR_TEX_FLESH;
}
switch (chTextureType)
{

View file

@ -117,6 +117,7 @@
// entity flags
#define EFLAG_SLERP 1 // do studio interpolation of this entity
#define EFLAG_FLESH_SOUND 2 // JoshA: Whether this entity should sound like flesh. (ie. pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE)
//
// temp entity events

View file

@ -1418,6 +1418,12 @@ int AddToFullPack(struct entity_state_s* state, int e, edict_t* ent, edict_t* ho
state->health = ent->v.health;
}
CBaseEntity* pEntity = static_cast<CBaseEntity*>(GET_PRIVATE(ent));
if (pEntity && pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE)
state->eflags |= EFLAG_FLESH_SOUND;
else
state->eflags &= ~EFLAG_FLESH_SOUND;
return 1;
}