Browse Source

Restore room sound type (#304)

opforfixed
Roman Chistokhodov 2 years ago
parent
commit
1e9123bbb2
  1. 21
      dlls/player.cpp
  2. 3
      dlls/player.h
  3. 24
      dlls/sound.cpp

21
dlls/player.cpp

@ -127,9 +127,9 @@ TYPEDESCRIPTION CBasePlayer::m_playerSaveData[] =
//DEFINE_FIELD( CBasePlayer, m_flStopExtraSoundTime, FIELD_TIME ), //DEFINE_FIELD( CBasePlayer, m_flStopExtraSoundTime, FIELD_TIME ),
//DEFINE_FIELD( CBasePlayer, m_fKnownItem, FIELD_INTEGER ), // reset to zero on load //DEFINE_FIELD( CBasePlayer, m_fKnownItem, FIELD_INTEGER ), // reset to zero on load
//DEFINE_FIELD( CBasePlayer, m_iPlayerSound, FIELD_INTEGER ), // Don't restore, set in Precache() //DEFINE_FIELD( CBasePlayer, m_iPlayerSound, FIELD_INTEGER ), // Don't restore, set in Precache()
//DEFINE_FIELD( CBasePlayer, m_pentSndLast, FIELD_EDICT ), // Don't restore, client needs reset DEFINE_FIELD( CBasePlayer, m_pentSndLast, FIELD_EDICT ),
//DEFINE_FIELD( CBasePlayer, m_flSndRoomtype, FIELD_FLOAT ), // Don't restore, client needs reset DEFINE_FIELD( CBasePlayer, m_SndRoomtype, FIELD_INTEGER ),
//DEFINE_FIELD( CBasePlayer, m_flSndRange, FIELD_FLOAT ), // Don't restore, client needs reset DEFINE_FIELD( CBasePlayer, m_flSndRange, FIELD_FLOAT ),
//DEFINE_FIELD( CBasePlayer, m_fNewAmmo, FIELD_INTEGER ), // Don't restore, client needs reset //DEFINE_FIELD( CBasePlayer, m_fNewAmmo, FIELD_INTEGER ), // Don't restore, client needs reset
//DEFINE_FIELD( CBasePlayer, m_flgeigerRange, FIELD_FLOAT ), // Don't restore, reset in Precache() //DEFINE_FIELD( CBasePlayer, m_flgeigerRange, FIELD_FLOAT ), // Don't restore, reset in Precache()
//DEFINE_FIELD( CBasePlayer, m_flgeigerDelay, FIELD_FLOAT ), // Don't restore, reset in Precache() //DEFINE_FIELD( CBasePlayer, m_flgeigerDelay, FIELD_FLOAT ), // Don't restore, reset in Precache()
@ -3019,6 +3019,7 @@ void CBasePlayer::Spawn( void )
pev->fov = m_iFOV = 0;// init field of view. pev->fov = m_iFOV = 0;// init field of view.
m_iClientFOV = -1; // make sure fov reset is sent m_iClientFOV = -1; // make sure fov reset is sent
m_ClientSndRoomtype = -1;
m_flNextDecalTime = 0;// let this player decal as soon as he spawns. m_flNextDecalTime = 0;// let this player decal as soon as he spawns.
@ -3171,6 +3172,8 @@ int CBasePlayer::Restore( CRestore &restore )
pev->fixangle = TRUE; // turn this way immediately pev->fixangle = TRUE; // turn this way immediately
m_ClientSndRoomtype = -1;
// Copied from spawn() for now // Copied from spawn() for now
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
@ -3555,6 +3558,7 @@ void CBasePlayer::ForceClientDllUpdate( void )
m_iClientBattery = -1; m_iClientBattery = -1;
m_iClientHideHUD = -1; // Vit_amiN: forcing to update m_iClientHideHUD = -1; // Vit_amiN: forcing to update
m_iClientFOV = -1; // Vit_amiN: force client weapons to be sent m_iClientFOV = -1; // Vit_amiN: force client weapons to be sent
m_ClientSndRoomtype = -1;
m_iTrain |= TRAIN_NEW; // Force new train message. m_iTrain |= TRAIN_NEW; // Force new train message.
m_fWeapon = FALSE; // Force weapon send m_fWeapon = FALSE; // Force weapon send
m_fKnownItem = FALSE; // Force weaponinit messages. m_fKnownItem = FALSE; // Force weaponinit messages.
@ -3563,7 +3567,6 @@ void CBasePlayer::ForceClientDllUpdate( void )
memset( m_rgAmmoLast, 0, sizeof( m_rgAmmoLast )); // a1ba: Force update AmmoX memset( m_rgAmmoLast, 0, sizeof( m_rgAmmoLast )); // a1ba: Force update AmmoX
// Now force all the necessary messages // Now force all the necessary messages
// to be sent. // to be sent.
UpdateClientData(); UpdateClientData();
@ -4340,6 +4343,16 @@ void CBasePlayer::UpdateClientData( void )
m_flNextSBarUpdateTime = gpGlobals->time + 0.2f; m_flNextSBarUpdateTime = gpGlobals->time + 0.2f;
} }
// Send new room type to client.
if (m_ClientSndRoomtype != m_SndRoomtype)
{
m_ClientSndRoomtype = m_SndRoomtype;
MESSAGE_BEGIN(MSG_ONE, SVC_ROOMTYPE, NULL, edict());
WRITE_SHORT((short)m_SndRoomtype); // sequence number
MESSAGE_END();
}
// Send the current bhopcap state. // Send the current bhopcap state.
if( !m_bSentBhopcap ) if( !m_bSentBhopcap )
{ {

3
dlls/player.h

@ -127,8 +127,9 @@ public:
int m_afButtonReleased; int m_afButtonReleased;
edict_t *m_pentSndLast; // last sound entity to modify player room type edict_t *m_pentSndLast; // last sound entity to modify player room type
float m_flSndRoomtype; // last roomtype set by sound entity int m_SndRoomtype; // last roomtype set by sound entity
float m_flSndRange; // dist from player to sound entity float m_flSndRange; // dist from player to sound entity
int m_ClientSndRoomtype;
float m_flFallVelocity; float m_flFallVelocity;

24
dlls/sound.cpp

@ -814,7 +814,7 @@ public:
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
float m_flRadius; float m_flRadius;
float m_flRoomtype; int m_Roomtype;
}; };
LINK_ENTITY_TO_CLASS( env_sound, CEnvSound ) LINK_ENTITY_TO_CLASS( env_sound, CEnvSound )
@ -822,7 +822,7 @@ LINK_ENTITY_TO_CLASS( env_sound, CEnvSound )
TYPEDESCRIPTION CEnvSound::m_SaveData[] = TYPEDESCRIPTION CEnvSound::m_SaveData[] =
{ {
DEFINE_FIELD( CEnvSound, m_flRadius, FIELD_FLOAT ), DEFINE_FIELD( CEnvSound, m_flRadius, FIELD_FLOAT ),
DEFINE_FIELD( CEnvSound, m_flRoomtype, FIELD_FLOAT ), DEFINE_FIELD( CEnvSound, m_Roomtype, FIELD_INTEGER ),
}; };
IMPLEMENT_SAVERESTORE( CEnvSound, CPointEntity ) IMPLEMENT_SAVERESTORE( CEnvSound, CPointEntity )
@ -836,7 +836,7 @@ void CEnvSound::KeyValue( KeyValueData *pkvd )
} }
if( FStrEq( pkvd->szKeyName, "roomtype" ) ) if( FStrEq( pkvd->szKeyName, "roomtype" ) )
{ {
m_flRoomtype = atof( pkvd->szValue ); m_Roomtype = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
} }
@ -902,7 +902,7 @@ void CEnvSound::Think( void )
{ {
// this is the entity currently affecting player, check // this is the entity currently affecting player, check
// for validity // for validity
if( pPlayer->m_flSndRoomtype != 0 && pPlayer->m_flSndRange != 0 ) if( pPlayer->m_SndRoomtype != 0 && pPlayer->m_flSndRange != 0 )
{ {
// we're looking at a valid sound entity affecting // we're looking at a valid sound entity affecting
// player, make sure it's still valid, update range // player, make sure it's still valid, update range
@ -914,11 +914,11 @@ void CEnvSound::Think( void )
else else
{ {
// current sound entity affecting player is no longer valid, // current sound entity affecting player is no longer valid,
// flag this state by clearing room_type and range. // flag this state by clearing source handle and range.
// NOTE: we do not actually change the player's room_type // NOTE: we do not actually change the player's room_type
// NOTE: until we have a new valid room_type to change it to. // NOTE: until we have a new valid room_type to change it to.
pPlayer->m_flSndRange = 0; pPlayer->m_flSndRange = 0;
pPlayer->m_flSndRoomtype = 0; pPlayer->m_pentSndLast = 0;
goto env_sound_Think_slow; goto env_sound_Think_slow;
} }
} }
@ -938,18 +938,10 @@ void CEnvSound::Think( void )
{ {
// new entity is closer to player, so it wins. // new entity is closer to player, so it wins.
pPlayer->m_pentSndLast = ENT( pev ); pPlayer->m_pentSndLast = ENT( pev );
pPlayer->m_flSndRoomtype = m_flRoomtype; pPlayer->m_SndRoomtype = m_Roomtype;
pPlayer->m_flSndRange = flRange; pPlayer->m_flSndRange = flRange;
// send room_type command to player's server. // New room type is sent to player in CBasePlayer::UpdateClientData.
// this should be a rare event - once per change of room_type
// only!
//CLIENT_COMMAND( pentPlayer, "room_type %f", m_flRoomtype );
MESSAGE_BEGIN( MSG_ONE, SVC_ROOMTYPE, NULL, pentPlayer ); // use the magic #1 for "one client"
WRITE_SHORT( (short)m_flRoomtype ); // sequence number
MESSAGE_END();
// crank up nextthink rate for new active sound entity // crank up nextthink rate for new active sound entity
// by falling through to think_fast... // by falling through to think_fast...

Loading…
Cancel
Save