Jump to content
xP3NG3Rx

c++ [C++] Small RE for mss sound scripts

Recommended Posts

Hi everyone.

I'd like to share a small guide for the official .mss file. It is a new Token in the sound script files which is controlling the volume, if the Token has been set of course.
Couple of sound scripts are using this option:

Spoiler

956164a68a.png

0.0.) Make a backup of your files.
0.1.) Copying the codes from the board brings some invisible white characters with it, paste first into notepad++ and remove all the "?" characters.
1.0.) Open MilesLib/Type.h.
1.1.) Add the following variable to the two structured types by name: TSoundData and TSoundInstance.

		float fSoundVolume;

2.0.) Open MilesLib/Type.cpp.
2.1.) In the function by name "NSound::LoadSoundInformationPiece" look for the following code:

	int iCount;
	if (!rkTextFileLoader.GetTokenInteger("sounddatacount", &iCount))
	{
		SetResultString((strResult + " File format error, SoundDataCount Unable to find.").c_str());
		return false;
	}

2.2.) Paste the following below of it:

	float fVolume = 0.0f;
	if (rkTextFileLoader.GetTokenFloat("soundpositionenable", &fVolume))
	{
		SetResultString((strResult + " SoundPosition has checked.").c_str());
	}
	else
	{
		SetResultString((strResult + " SoundPosition has not checked.").c_str());
	}

2.3.) Bit scrolled down extend the for cycle like this:

	for (DWORD i = 0; i < rSoundDataVector.size(); ++i)
	{
		//Some random stuff
		//{}
		rSoundDataVector[i].fSoundVolume = fVolume;
	}

2.4.) At the bottom of the file you will find this function: "NSound::DataToInstance", extend the for cycle with this line:

		rSoundInstance.fSoundVolume = c_rSoundData.fSoundVolume;

3.0.) Open the MilesLib/SoundManager.h.
3.1.) Add a new argument to the definition of the "PlaySound2D" function:

void PlaySound2D(const char * c_szFileName, float fVolume = 0.0f);

4.0.) Open the MilesLib/SoundManager.cpp.
4.1.) Replace the function "PlaySound2D" with this:

void CSoundManager::PlaySound2D(const char * c_szFileName, float fVolume)
{
	if (0.0f == GetSoundVolume())
		return;

	ISoundInstance * pInstance;
	if (!GetSoundInstance2D(c_szFileName, &pInstance))
		return;

	float fNewVolume = fVolume;
	if (fVolume == 0.0f)
		fNewVolume = GetSoundVolume();
	pInstance->SetVolume(fNewVolume);
	pInstance->Play(1);
}

4.2.) Replace this function "CSoundManager::UpdateSoundInstance" with this:
<!> Attention: Of this function you will find two, be sure you will replace the correct one, check the arguments! I think the second one is not in used at all <!>

void CSoundManager::UpdateSoundInstance(float fx, float fy, float fz, DWORD dwcurFrame, const NSound::TSoundInstanceVector * c_pSoundInstanceVector, BOOL bCheckFrequency)
{
	for (DWORD i = 0; i < c_pSoundInstanceVector->size(); ++i)
	{
		const NSound::TSoundInstance & c_rSoundInstance = c_pSoundInstanceVector->at(i);
		if (c_rSoundInstance.dwFrame == dwcurFrame)
		{
			if (0.0f == c_rSoundInstance.fSoundVolume)
			{
				//Tracenf("PLAY SOUND %s", c_rSoundInstance.strSoundFileName.c_str());
				PlayCharacterSound3D(fx, fy, fz, c_rSoundInstance.strSoundFileName.c_str(), bCheckFrequency);
			}
			else
			{
				PlaySound2D(c_rSoundInstance.strSoundFileName.c_str(), c_rSoundInstance.fSoundVolume);
			}
		}
	}
}

 

Any problem occurs, post a comment below.

  • Love 14

Share this post


Link to post

Doubt any player listens to mob sounds in 2019 but thanks for sharing :P 

  • Love 5

Share this post


Link to post

Thanks for sharing it Penger :)
it solves a little problem in my client !

  • Love 1

Share this post


Link to post

@xP3NG3Rx Love you bro! :) Thanks for making client better. 

Btw. I'm not 100% sure if I extended two functions by the right way. Can you check it please?

Spoiler

bool NSound::LoadSoundInformationPiece(const char * c_szFileName, NSound::TSoundDataVector & rSoundDataVector, const char * c_szPathHeader)
{
	std::string strResult;
	strResult = c_szFileName;

	CTextFileLoader* pkTextFileLoader=CTextFileLoader::Cache(c_szFileName);
	if (!pkTextFileLoader)
		return false;

	CTextFileLoader& rkTextFileLoader=*pkTextFileLoader;
	if (rkTextFileLoader.IsEmpty())
	{
		SetResultString((strResult + " Ŕбâżë ĆÄŔĎŔ» ż­ Ľö ľřŔ˝").c_str());
		return false;
	}

	rkTextFileLoader.SetTop();

	int iCount;
	if (!rkTextFileLoader.GetTokenInteger("sounddatacount", &iCount))
	{
		SetResultString((strResult + " ĆÄŔĎ Ć÷¸ä żˇ·Ż, SoundDataCount¸¦ ĂŁŔ» Ľö ľřŔ˝").c_str());
		return false;
	}

	//START OF NEW MSS TOKEN SCRIPT
	float fVolume = 0.0f;

	if (rkTextFileLoader.GetTokenFloat("soundpositionenable", &fVolume))
	{
		SetResultString((strResult + " SoundPosition has checked.").c_str());
	}
	else
	{
		SetResultString((strResult + " SoundPosition has not checked.").c_str());
	}
	//END OF NEW MSS TOKEN SCRIPT

	rSoundDataVector.clear();
	rSoundDataVector.resize(iCount);

	char szSoundDataHeader[32+1];
	for (DWORD i = 0; i < rSoundDataVector.size(); ++i)
	{
		_snprintf(szSoundDataHeader, sizeof(szSoundDataHeader), "sounddata%02d", i);
		CTokenVector * pTokenVector;
		if (!rkTextFileLoader.GetTokenVector(szSoundDataHeader, &pTokenVector))
		{
			SetResultString((strResult + " ĆÄŔĎ Ć÷¸ä żˇ·Ż: " + szSoundDataHeader + " ¸¦ ĂŁŔ» Ľö ľřŔ˝").c_str());
			return false;
		}

		if (2 != pTokenVector->size())
		{
			SetResultString((strResult + " ĆÄŔĎ Ć÷¸ä żˇ·Ż: ş¤ĹÍ Ĺ©±â°ˇ 2°ˇ ľĆ´Ô").c_str());
			return false;
		}

		rSoundDataVector[i].fTime = (float) atof(pTokenVector->at(0).c_str());
		if (c_szPathHeader)
		{
			rSoundDataVector[i].strSoundFileName = c_szPathHeader;
			rSoundDataVector[i].strSoundFileName += pTokenVector->at(1).c_str();
		}
		else
		{
			rSoundDataVector[i].strSoundFileName = pTokenVector->at(1).c_str();
		}

		//START OF NEW MSS TOKEN SCRIPT
		rSoundDataVector[i].fSoundVolume = fVolume;
		//END OF NEW MSS TOKEN SCRIPT
	}

	SetResultString((strResult + " şŇ·ŻżČ").c_str());
	return true;
}

 

Spoiler

void NSound::DataToInstance(const TSoundDataVector & c_rSoundDataVector, TSoundInstanceVector * pSoundInstanceVector)
{
	if (c_rSoundDataVector.empty())
		return;

	DWORD dwFPS = 60;
	const float c_fFrameTime = 1.0f / float(dwFPS);

	pSoundInstanceVector->clear();
	pSoundInstanceVector->resize(c_rSoundDataVector.size());
	for (DWORD i = 0; i < c_rSoundDataVector.size(); ++i)
	{
		const TSoundData & c_rSoundData = c_rSoundDataVector[i];
		TSoundInstance & rSoundInstance = pSoundInstanceVector->at(i);

		rSoundInstance.dwFrame = (DWORD) (c_rSoundData.fTime / c_fFrameTime);
		rSoundInstance.strSoundFileName = c_rSoundData.strSoundFileName;

		//START OF NEW MSS TOKEN SCRIPT
		rSoundInstance.fSoundVolume = c_rSoundData.fSoundVolume;
		//END OF NEW MSS TOKEN SCRIPT
	}
}

 

Thanks for your answer! Keep the good work up!

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.