|
@@ -189,6 +189,31 @@ PlayerData::ActionAnimationDef PlayerData::ActionAnimationList[NumTableActionAni
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
+typedef PlayerData::Sounds playerSoundsEnum;
|
|
|
|
+DefineEnumType(playerSoundsEnum);
|
|
|
|
+
|
|
|
|
+ImplementEnumType(playerSoundsEnum, "enum types.\n"
|
|
|
|
+ "@ingroup PlayerData\n\n")
|
|
|
|
+ {PlayerData::Sounds::FootSoft, "FootSoft","..." },
|
|
|
|
+ {PlayerData::Sounds::FootHard, "FootHard","..." },
|
|
|
|
+ {PlayerData::Sounds::FootMetal, "FootMetal","..." },
|
|
|
|
+ {PlayerData::Sounds::FootSnow, "FootSnow","..." },
|
|
|
|
+ {PlayerData::Sounds::FootShallowSplash, "FootShallowSplash","..." },
|
|
|
|
+ {PlayerData::Sounds::FootWading, "FootWading","..." },
|
|
|
|
+ {PlayerData::Sounds::FootUnderWater, "FootUnderWater","..." },
|
|
|
|
+ {PlayerData::Sounds::FootBubbles, "FootBubbles","..." },
|
|
|
|
+ {PlayerData::Sounds::MoveBubbles, "MoveBubbles","..." },
|
|
|
|
+ {PlayerData::Sounds::WaterBreath, "WaterBreath","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactStart, "ImpactStart","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactHard, "ImpactHard","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactMetal, "ImpactMetal","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactSnow, "ImpactSnow","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactWaterEasy, "ImpactWaterEasy","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactWaterMedium, "ImpactWaterMedium","..." },
|
|
|
|
+ {PlayerData::Sounds::ImpactWaterHard, "ImpactWaterHard","..." },
|
|
|
|
+ {PlayerData::Sounds::ExitWater, "ExitWater","..." },
|
|
|
|
+EndImplementEnumType;
|
|
|
|
+
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
IMPLEMENT_CO_DATABLOCK_V1(PlayerData);
|
|
IMPLEMENT_CO_DATABLOCK_V1(PlayerData);
|
|
@@ -397,7 +422,7 @@ PlayerData::PlayerData()
|
|
boxHeadFrontPercentage = 1;
|
|
boxHeadFrontPercentage = 1;
|
|
|
|
|
|
for (S32 i = 0; i < MaxSounds; i++)
|
|
for (S32 i = 0; i < MaxSounds; i++)
|
|
- sound[i] = NULL;
|
|
|
|
|
|
+ INIT_SOUNDASSET_ARRAY(PlayerSound, i);
|
|
|
|
|
|
footPuffEmitter = NULL;
|
|
footPuffEmitter = NULL;
|
|
footPuffID = 0;
|
|
footPuffID = 0;
|
|
@@ -449,9 +474,13 @@ bool PlayerData::preload(bool server, String &errorStr)
|
|
{
|
|
{
|
|
for( U32 i = 0; i < MaxSounds; ++ i )
|
|
for( U32 i = 0; i < MaxSounds; ++ i )
|
|
{
|
|
{
|
|
- String sfxErrorStr;
|
|
|
|
- if( !sfxResolve( &sound[ i ], sfxErrorStr ) )
|
|
|
|
- Con::errorf( "PlayerData::preload: %s", sfxErrorStr.c_str() );
|
|
|
|
|
|
+ if (getPlayerSound(i) != StringTable->EmptyString())
|
|
|
|
+ {
|
|
|
|
+ _setPlayerSound(getPlayerSound(i), i);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!getPlayerSoundProfile(i))
|
|
|
|
+ Con::errorf("PlayerData::Preload() - unable to find sfxProfile for asset %d %s", i, getPlayerSound(i));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1022,63 +1051,7 @@ void PlayerData::initPersistFields()
|
|
|
|
|
|
addGroup( "Interaction: Sounds" );
|
|
addGroup( "Interaction: Sounds" );
|
|
|
|
|
|
- addField( "FootSoftSound", TypeSFXTrackName, Offset(sound[FootSoft], PlayerData),
|
|
|
|
- "@brief Sound to play when walking on a surface with Material footstepSoundId 0.\n\n" );
|
|
|
|
- addField( "FootHardSound", TypeSFXTrackName, Offset(sound[FootHard], PlayerData),
|
|
|
|
- "@brief Sound to play when walking on a surface with Material footstepSoundId 1.\n\n" );
|
|
|
|
- addField( "FootMetalSound", TypeSFXTrackName, Offset(sound[FootMetal], PlayerData),
|
|
|
|
- "@brief Sound to play when walking on a surface with Material footstepSoundId 2.\n\n" );
|
|
|
|
- addField( "FootSnowSound", TypeSFXTrackName, Offset(sound[FootSnow], PlayerData),
|
|
|
|
- "@brief Sound to play when walking on a surface with Material footstepSoundId 3.\n\n" );
|
|
|
|
-
|
|
|
|
- addField( "FootShallowSound", TypeSFXTrackName, Offset(sound[FootShallowSplash], PlayerData),
|
|
|
|
- "@brief Sound to play when walking in water and coverage is less than "
|
|
|
|
- "footSplashHeight.\n\n"
|
|
|
|
- "@see footSplashHeight\n" );
|
|
|
|
- addField( "FootWadingSound", TypeSFXTrackName, Offset(sound[FootWading], PlayerData),
|
|
|
|
- "@brief Sound to play when walking in water and coverage is less than 1, "
|
|
|
|
- "but > footSplashHeight.\n\n"
|
|
|
|
- "@see footSplashHeight\n" );
|
|
|
|
- addField( "FootUnderwaterSound", TypeSFXTrackName, Offset(sound[FootUnderWater], PlayerData),
|
|
|
|
- "@brief Sound to play when walking in water and coverage equals 1.0 "
|
|
|
|
- "(fully underwater).\n\n" );
|
|
|
|
- addField( "FootBubblesSound", TypeSFXTrackName, Offset(sound[FootBubbles], PlayerData),
|
|
|
|
- "@brief Sound to play when walking in water and coverage equals 1.0 "
|
|
|
|
- "(fully underwater).\n\n" );
|
|
|
|
- addField( "movingBubblesSound", TypeSFXTrackName, Offset(sound[MoveBubbles], PlayerData),
|
|
|
|
- "@brief Sound to play when in water and coverage equals 1.0 (fully underwater).\n\n"
|
|
|
|
- "Note that unlike FootUnderwaterSound, this sound plays even if the "
|
|
|
|
- "player is not moving around in the water.\n" );
|
|
|
|
- addField( "waterBreathSound", TypeSFXTrackName, Offset(sound[WaterBreath], PlayerData),
|
|
|
|
- "@brief Sound to play when in water and coverage equals 1.0 (fully underwater).\n\n"
|
|
|
|
- "Note that unlike FootUnderwaterSound, this sound plays even if the "
|
|
|
|
- "player is not moving around in the water.\n" );
|
|
|
|
-
|
|
|
|
- addField( "impactSoftSound", TypeSFXTrackName, Offset(sound[ImpactSoft], PlayerData),
|
|
|
|
- "@brief Sound to play after falling on a surface with Material footstepSoundId 0.\n\n" );
|
|
|
|
- addField( "impactHardSound", TypeSFXTrackName, Offset(sound[ImpactHard], PlayerData),
|
|
|
|
- "@brief Sound to play after falling on a surface with Material footstepSoundId 1.\n\n" );
|
|
|
|
- addField( "impactMetalSound", TypeSFXTrackName, Offset(sound[ImpactMetal], PlayerData),
|
|
|
|
- "@brief Sound to play after falling on a surface with Material footstepSoundId 2.\n\n" );
|
|
|
|
- addField( "impactSnowSound", TypeSFXTrackName, Offset(sound[ImpactSnow], PlayerData),
|
|
|
|
- "@brief Sound to play after falling on a surface with Material footstepSoundId 3.\n\n" );
|
|
|
|
-
|
|
|
|
- addField( "impactWaterEasy", TypeSFXTrackName, Offset(sound[ImpactWaterEasy], PlayerData),
|
|
|
|
- "@brief Sound to play when entering the water with velocity < "
|
|
|
|
- "mediumSplashSoundVelocity.\n\n"
|
|
|
|
- "@see mediumSplashSoundVelocity\n");
|
|
|
|
- addField( "impactWaterMedium", TypeSFXTrackName, Offset(sound[ImpactWaterMedium], PlayerData),
|
|
|
|
- "@brief Sound to play when entering the water with velocity >= "
|
|
|
|
- "mediumSplashSoundVelocity and < hardSplashSoundVelocity.\n\n"
|
|
|
|
- "@see mediumSplashSoundVelocity\n"
|
|
|
|
- "@see hardSplashSoundVelocity\n");
|
|
|
|
- addField( "impactWaterHard", TypeSFXTrackName, Offset(sound[ImpactWaterHard], PlayerData),
|
|
|
|
- "@brief Sound to play when entering the water with velocity >= "
|
|
|
|
- "hardSplashSoundVelocity.\n\n"
|
|
|
|
- "@see hardSplashSoundVelocity\n");
|
|
|
|
- addField( "exitingWater", TypeSFXTrackName, Offset(sound[ExitWater], PlayerData),
|
|
|
|
- "@brief Sound to play when exiting the water with velocity >= exitSplashSoundVelocity.\n\n"
|
|
|
|
- "@see exitSplashSoundVelocity\n");
|
|
|
|
|
|
+ INITPERSISTFIELD_SOUNDASSET_ENUMED(PlayerSound, playerSoundsEnum, PlayerData::Sounds::MaxSounds, PlayerData, "Sounds related to player interaction.");
|
|
|
|
|
|
endGroup( "Interaction: Sounds" );
|
|
endGroup( "Interaction: Sounds" );
|
|
|
|
|
|
@@ -1303,8 +1276,8 @@ void PlayerData::packData(BitStream* stream)
|
|
stream->write(minImpactSpeed);
|
|
stream->write(minImpactSpeed);
|
|
stream->write(minLateralImpactSpeed);
|
|
stream->write(minLateralImpactSpeed);
|
|
|
|
|
|
- for( U32 i = 0; i < MaxSounds; i++)
|
|
|
|
- sfxWrite( stream, sound[ i ] );
|
|
|
|
|
|
+ for (U32 i = 0; i < MaxSounds; i++)
|
|
|
|
+ PACKDATA_SOUNDASSET_ARRAY(PlayerSound, i);
|
|
|
|
|
|
mathWrite(*stream, boxSize);
|
|
mathWrite(*stream, boxSize);
|
|
mathWrite(*stream, crouchBoxSize);
|
|
mathWrite(*stream, crouchBoxSize);
|
|
@@ -1484,8 +1457,8 @@ void PlayerData::unpackData(BitStream* stream)
|
|
stream->read(&minImpactSpeed);
|
|
stream->read(&minImpactSpeed);
|
|
stream->read(&minLateralImpactSpeed);
|
|
stream->read(&minLateralImpactSpeed);
|
|
|
|
|
|
- for( U32 i = 0; i < MaxSounds; i++)
|
|
|
|
- sfxRead( stream, &sound[ i ] );
|
|
|
|
|
|
+ for (U32 i = 0; i < MaxSounds; i++)
|
|
|
|
+ UNPACKDATA_SOUNDASSET_ARRAY(PlayerSound, i);
|
|
|
|
|
|
mathRead(*stream, &boxSize);
|
|
mathRead(*stream, &boxSize);
|
|
mathRead(*stream, &crouchBoxSize);
|
|
mathRead(*stream, &crouchBoxSize);
|
|
@@ -1932,11 +1905,11 @@ bool Player::onNewDataBlock( GameBaseData *dptr, bool reload )
|
|
SFX_DELETE( mMoveBubbleSound );
|
|
SFX_DELETE( mMoveBubbleSound );
|
|
SFX_DELETE( mWaterBreathSound );
|
|
SFX_DELETE( mWaterBreathSound );
|
|
|
|
|
|
- if ( mDataBlock->sound[PlayerData::MoveBubbles] )
|
|
|
|
- mMoveBubbleSound = SFX->createSource( mDataBlock->sound[PlayerData::MoveBubbles] );
|
|
|
|
|
|
+ if ( mDataBlock->getPlayerSound(PlayerData::MoveBubbles) )
|
|
|
|
+ mMoveBubbleSound = SFX->createSource( mDataBlock->getPlayerSoundProfile(PlayerData::MoveBubbles) );
|
|
|
|
|
|
- if ( mDataBlock->sound[PlayerData::WaterBreath] )
|
|
|
|
- mWaterBreathSound = SFX->createSource( mDataBlock->sound[PlayerData::WaterBreath] );
|
|
|
|
|
|
+ if ( mDataBlock->getPlayerSound(PlayerData::WaterBreath) )
|
|
|
|
+ mWaterBreathSound = SFX->createSource( mDataBlock->getPlayerSoundProfile(PlayerData::WaterBreath) );
|
|
}
|
|
}
|
|
|
|
|
|
mObjBox.maxExtents.x = mDataBlock->boxSize.x * 0.5f;
|
|
mObjBox.maxExtents.x = mDataBlock->boxSize.x * 0.5f;
|
|
@@ -3300,7 +3273,7 @@ void Player::updateMove(const Move* move)
|
|
{
|
|
{
|
|
// exit-water splash sound happens for client only
|
|
// exit-water splash sound happens for client only
|
|
if ( getSpeed() >= mDataBlock->exitSplashSoundVel && !isMounted() )
|
|
if ( getSpeed() >= mDataBlock->exitSplashSoundVel && !isMounted() )
|
|
- SFX->playOnce( mDataBlock->sound[PlayerData::ExitWater], &getTransform() );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile(PlayerData::ExitWater), &getTransform() );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -7060,17 +7033,17 @@ void Player::playFootstepSound( bool triggeredLeft, Material* contactMaterial, S
|
|
// Treading water.
|
|
// Treading water.
|
|
|
|
|
|
if ( mWaterCoverage < mDataBlock->footSplashHeight )
|
|
if ( mWaterCoverage < mDataBlock->footSplashHeight )
|
|
- SFX->playOnce( mDataBlock->sound[ PlayerData::FootShallowSplash ], &footMat );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile( PlayerData::FootShallowSplash ), &footMat );
|
|
else
|
|
else
|
|
{
|
|
{
|
|
if ( mWaterCoverage < 1.0 )
|
|
if ( mWaterCoverage < 1.0 )
|
|
- SFX->playOnce( mDataBlock->sound[ PlayerData::FootWading ], &footMat );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile( PlayerData::FootWading ), &footMat );
|
|
else
|
|
else
|
|
{
|
|
{
|
|
if ( triggeredLeft )
|
|
if ( triggeredLeft )
|
|
{
|
|
{
|
|
- SFX->playOnce( mDataBlock->sound[ PlayerData::FootUnderWater ], &footMat );
|
|
|
|
- SFX->playOnce( mDataBlock->sound[ PlayerData::FootBubbles ], &footMat );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile( PlayerData::FootUnderWater ), &footMat );
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile( PlayerData::FootBubbles ), &footMat );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -7092,7 +7065,7 @@ void Player::playFootstepSound( bool triggeredLeft, Material* contactMaterial, S
|
|
sound = 2;
|
|
sound = 2;
|
|
|
|
|
|
if (sound>=0)
|
|
if (sound>=0)
|
|
- SFX->playOnce(mDataBlock->sound[sound], &footMat);
|
|
|
|
|
|
+ SFX->playOnce(mDataBlock->getPlayerSoundProfile(sound), &footMat);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -7123,7 +7096,7 @@ void Player:: playImpactSound()
|
|
sound = 2; // Play metal;
|
|
sound = 2; // Play metal;
|
|
|
|
|
|
if (sound >= 0)
|
|
if (sound >= 0)
|
|
- SFX->playOnce(mDataBlock->sound[PlayerData::ImpactStart + sound], &getTransform());
|
|
|
|
|
|
+ SFX->playOnce(mDataBlock->getPlayerSoundProfile(PlayerData::ImpactStart + sound), &getTransform());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -7277,11 +7250,11 @@ bool Player::collidingWithWater( Point3F &waterHeight )
|
|
void Player::createSplash( Point3F &pos, F32 speed )
|
|
void Player::createSplash( Point3F &pos, F32 speed )
|
|
{
|
|
{
|
|
if ( speed >= mDataBlock->hardSplashSoundVel )
|
|
if ( speed >= mDataBlock->hardSplashSoundVel )
|
|
- SFX->playOnce( mDataBlock->sound[PlayerData::ImpactWaterHard], &getTransform() );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile(PlayerData::ImpactWaterHard), &getTransform() );
|
|
else if ( speed >= mDataBlock->medSplashSoundVel )
|
|
else if ( speed >= mDataBlock->medSplashSoundVel )
|
|
- SFX->playOnce( mDataBlock->sound[PlayerData::ImpactWaterMedium], &getTransform() );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile(PlayerData::ImpactWaterMedium), &getTransform() );
|
|
else
|
|
else
|
|
- SFX->playOnce( mDataBlock->sound[PlayerData::ImpactWaterEasy], &getTransform() );
|
|
|
|
|
|
+ SFX->playOnce( mDataBlock->getPlayerSoundProfile(PlayerData::ImpactWaterEasy), &getTransform() );
|
|
|
|
|
|
if( mDataBlock->splash )
|
|
if( mDataBlock->splash )
|
|
{
|
|
{
|