[Fix] Sound Bug

11/14/2015 15:04 -Venom'#1
Hallo Flyff Sektion,
wir haben vor kurzem bei Erendora ein kleinen Bug gefunden.
Da ich mir denke das diesen mehrere Leute haben Release ich ihn.

Der Fehler:
Man hört beim stehen keine Sounds wie z.B. beim Waffen anlegen, beim Food anwenden


So nun zum Source Teil:

dsutil.cpp

unter
Code:
		D3DXVECTOR3 vPos = *pvPosition - m_vPosListener;
		double fRadian = sqrt14( 
			fabs ( vPos.x ) * fabs ( vPos.x ) +	fabs ( vPos.z ) * fabs ( vPos.z ) );

		//Radian *= 2.0f;

		if( fRadian > 100.0 )
			return FALSE;
Fügt ihr das ein:
Code:
	else if (fRadian < 0.0)
		{
			D3DVECTOR vec;
			m_pDSListener->GetPosition(&vec);
			pSound->m_pBufferParams[dwIndex].vPosition.x = vec.x;
			pSound->m_pBufferParams[dwIndex].vPosition.y = vec.y;
			pSound->m_pBufferParams[dwIndex].vPosition.z = vec.z;
		}
Somit funktioniert der Sound wieder.
11/14/2015 15:29 TrøublêMakêr#2
else if (fRadian == 0.0) zu else if (fRadian < 0.0)
11/14/2015 22:51 Mike Oxmaul#3
ich frage mich gerade nur, wie du an assembly funktionen von mir kommst?

und wenn dir Timon schenkt, dann fix es auch richtig

bei dir
anstatt
Code:
else if (fRadian < 1.0){
			D3DXVECTOR3 Line1 = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
			D3DXVECTOR3 Line2 = -vPos;
			//Line2 = m_world.m_vCenter - Line2;
			// Nomralize Vectors
			FLOAT vlength = static_cast<FLOAT>(sqrt14((Line2.x * Line2.x) + (Line2.z * Line2.z)));
			Line2 = Line2 / vlength;
			// ¶óµð¾È ±¸Çϱâ 
			FLOAT a = acos(D3DXVec3Dot(&Line1, &Line2));
			//a = ( D3DX_PI * 2.0f ) - a;
			if (vPos.x < 0)
				a = (D3DX_PI * 2.0f) - a;
			a += -m_fTheta;

			vPos.x = (float)((int)(sin(a) * fRadian));	// ¿©±â (int)ij½ºÆÃ ¹Ù²ÙÁö ¸»°Í. (int)¾ÈÇϸé ÄÄÅÍ ¸®º×µÊ.
			vPos.z = (float)((int)(cos(a) * fRadian));
			vPos.y = (float)((int)vPos.y);

			D3DVECTOR v;
			v.x = vPos.x;	// Ȥ½Ã ¸ô¶ó ÀÌ·¸°Ô ÇØºÃ´Ù.
			v.y = vPos.y;
			v.z = vPos.z;
			pSound->m_pBufferParams[dwIndex].vPosition = v;	// D3XVECTOR3¸¦ D3DVECTOR¿¡ ±×´ë·Î ³Ö¾îµµ µÇ³ª?
		}
so
Code:
else if (fRadian > 1.0){
			D3DXVECTOR3 Line1 = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
			D3DXVECTOR3 Line2 = -vPos;
			//Line2 = m_world.m_vCenter - Line2;
			// Nomralize Vectors
			FLOAT vlength = static_cast<FLOAT>(sqrt14((Line2.x * Line2.x) + (Line2.z * Line2.z)));
			Line2 = Line2 / vlength;
			// ¶óµð¾È ±¸Çϱâ 
			FLOAT a = acos(D3DXVec3Dot(&Line1, &Line2));
			//a = ( D3DX_PI * 2.0f ) - a;
			if (vPos.x < 0)
				a = (D3DX_PI * 2.0f) - a;
			a += -m_fTheta;

			vPos.x = (float)((int)(sin(a) * fRadian));	// ¿©±â (int)ij½ºÆÃ ¹Ù²ÙÁö ¸»°Í. (int)¾ÈÇϸé ÄÄÅÍ ¸®º×µÊ.
			vPos.z = (float)((int)(cos(a) * fRadian));
			vPos.y = (float)((int)vPos.y);

			D3DVECTOR v;
			v.x = vPos.x;	// Ȥ½Ã ¸ô¶ó ÀÌ·¸°Ô ÇØºÃ´Ù.
			v.y = vPos.y;
			v.z = vPos.z;
			pSound->m_pBufferParams[dwIndex].vPosition = v;	// D3XVECTOR3¸¦ D3DVECTOR¿¡ ±×´ë·Î ³Ö¾îµµ µÇ³ª?
		}
11/14/2015 22:57 -Venom'#4
Quote:
Originally Posted by Jupsi332 View Post
ich frage mich gerade nur, wie du an assembly funktionen von mir kommst?
Das ganze ist von Wurstbrot.
Und das einzige was er dort getan hat ist das:
Code:
	{
		D3DVECTOR vec;
		m_pDSListener->GetPosition(	&vec );
		pSound->m_pBufferParams[dwIndex].vPosition.x = vec.x;
		pSound->m_pBufferParams[dwIndex].vPosition.y = vec.y;
		pSound->m_pBufferParams[dwIndex].vPosition.z = vec.z;
	}
Oben in den else if (fRadian < 0.0) zu kopieren.

Also ich verstehe nicht was dort von dir sein soll
11/14/2015 23:00 Mike Oxmaul#5
Quote:
Originally Posted by Gentros' View Post
Das ganze ist von Wurstbrot.
Und das einzige was er dort getan hat ist das:
Code:
	{
		D3DVECTOR vec;
		m_pDSListener->GetPosition(	&vec );
		pSound->m_pBufferParams[dwIndex].vPosition.x = vec.x;
		pSound->m_pBufferParams[dwIndex].vPosition.y = vec.y;
		pSound->m_pBufferParams[dwIndex].vPosition.z = vec.z;
	}
Oben in den else if (fRadian < 0.0) zu kopieren.

Also ich versehen ich was dort von dir sein soll
Geht auch nicht um den Fix an sich, den du auch noch falsch gemacht hast, wobei der so wie er in Timons Source ist, auch von mir ist. Nur wieso auch immer er die if verdreht hat
11/15/2015 00:29 Wanetrain#6
Quote:
Originally Posted by Jupsi332 View Post
Geht auch nicht um den Fix an sich, den du auch noch falsch gemacht hast, wobei der so wie er in Timons Source ist, auch von mir ist. Nur wieso auch immer er die if verdreht hat
Aha. Heißt wenn ich eine Konsolen Anwendung mach ist da auch Code von dir enthalten weil ich da zufällig eine Funktion fast gleich hab? mhmm.

@Gentros hab ich es dir nicht letztes mal im Ts schon gesagt? Kannst du besser machen Bub!

PHP Code:
m_pDSListener->GetPosition(    &pSound->m_pBufferParams[dwIndex].vPosition ); 
S'Läuft! :p

@"Jopsii" bei dir kann ich einfach nur lachen. "Code ist von mir" oder sonstiges gibt es nicht, you know? Ich Krall mir deine Files + Deine Homepage und änder da auch nur eine Zeile im Code und schon gehört das zeug rein rechtlich mir. Also who cares?

Das Wort zum Sonntag.

Mfg.
11/15/2015 01:07 Mike Oxmaul#7
Quote:
Originally Posted by Wanetrain View Post
Aha. Heißt wenn ich eine Konsolen Anwendung mach ist da auch Code von dir enthalten weil ich da zufällig eine Funktion fast gleich hab? mhmm.

@Gentros hab ich es dir nicht letztes mal im Ts schon gesagt? Kannst du besser machen Bub!

PHP Code:
m_pDSListener->GetPosition(    &pSound->m_pBufferParams[dwIndex].vPosition ); 
S'Läuft! :p

@"Jopsii" bei dir kann ich einfach nur lachen. "Code ist von mir" oder sonstiges gibt es nicht, you know? Ich Krall mir deine Files + Deine Homepage und änder da auch nur eine Zeile im Code und schon gehört das zeug rein rechtlich mir. Also who cares?

Das Wort zum Sonntag.

Mfg.
Es ging nicht darum das ich rumheulen wollte das es meins ist, das ist mir in sofern eigentlich auch egal. Wundert mich nur woher er die eine Sache her hat die ich dort entdeckt habe, dort weiß ich ganz genau das es die so nicht nochmal gibt.

bei dem 2. ging es mir auch nur darum, weil Timon es ja eigentlich schon drin hat nur die if abfrage um drehen muss, dann würde es auch funktioneren, da er ja Timons source nutzt.

also @Gentros' , ich wollte dein Fix nicht kritisieren, sondern wie gesagt, du hast da was drinne wo ich OT-mäßig nur mein Senf zu geben wollte.
11/15/2015 01:12 Sedrika#8
Quote:
Originally Posted by Jupsi332 View Post
Es ging nicht darum das ich rumheulen wollte das es meins ist, das ist mir in sofern eigentlich auch egal. Wundert mich nur woher er die eine Sache her hat die ich dort entdeckt habe, dort weiß ich ganz genau das es die so nicht nochmal gibt.

bei dem 2. ging es mir auch nur darum, weil Timon es ja eigentlich schon drin hat nur die if abfrage um drehen muss, dann würde es auch funktioneren, da er ja Timons source nutzt.

also @Gentros' , ich wollte dein Fix nicht kritisieren, sondern wie gesagt, du hast da was drinne woher ich mich OT-mäßig nur mein Senf zu geben wollte.
Ich hab es etwas anders gelöst und dennoch die Sounds fixed, ich hab deinen code nie gesehen aber wäre das wenn du es so ähnlich wie ich hast dann auch deiner?

Aber wenn du schon das ganze so aufbringst scheinst du deinen code ja zu verteilen und die denen du das gibst können es wohl nicht für sich behalten ;)
11/15/2015 01:15 Mike Oxmaul#9
Quote:
Originally Posted by Sedrika View Post
Ich hab es etwas anders gelöst und dennoch die Sounds fixed, ich hab deinen code nie gesehen aber wäre das wenn du es so ähnlich wie ich hast dann auch deiner?

Aber wenn du schon das ganze so aufbringst scheinst du deinen code ja zu verteilen und die denen du das gibst können es wohl nicht für sich behalten ;)
Wie gesagt, ich will nicht flamen das es meiner ist, vorallem da ich auch ganicht den Fix meinte, sondern eher das was im oberen teil steht. Wirst du wohl leider recht haben, wieder mal jemand dem man nicht trauen kann leider.
06/19/2016 21:10 Capt. Jack#10
Did noone test this "Fix"?
Quote:
unter
Code:
		D3DXVECTOR3 vPos = *pvPosition - m_vPosListener;
		double fRadian = sqrt14( 
			fabs ( vPos.x ) * fabs ( vPos.x ) +	fabs ( vPos.z ) * fabs ( vPos.z ) );

		//Radian *= 2.0f;

		if( fRadian > 100.0 )
			return FALSE;
Fügt ihr das ein:
Code:
	else if (fRadian < 0.0)
		{
			D3DVECTOR vec;
			m_pDSListener->GetPosition(&vec);
			pSound->m_pBufferParams[dwIndex].vPosition.x = vec.x;
			pSound->m_pBufferParams[dwIndex].vPosition.y = vec.y;
			pSound->m_pBufferParams[dwIndex].vPosition.z = vec.z;
		}
fRadian is calculated with the Pythagorean theorem. It represents the distance between the soundsource and the player.
A sqrt has always a negative and a positive result, but std:sqrt does only return the positive value!
So fRadian can never be smaller than 0.0!

The second Problem is that even if fRadian would get smaller than 0.0 and the else part is hit it would change nothing, because some lines later pSound->m_pBufferParams[dwIndex].vPosition will be overwritten:
Code:
		vPos.x = (float)( (int)(sin( a ) * fRadian ) );	// 여기 (int)캐스팅 바꾸지 말것. (int)안하면 컴터 리붓됨.
		vPos.z = (float)( (int)(cos( a ) * fRadian ) );
		vPos.y = (float)( (int) vPos.y );

		D3DVECTOR v;
		v.x = vPos.x;	// 혹시 몰라 이렇게 해봤다.
		v.y = vPos.y;
		v.z = vPos.z;
		pSound->m_pBufferParams[dwIndex].vPosition = v;	// D3XVECTOR3를 D3DVECTOR에 그대로 넣어도 되나?
I think this would make more sense:
Code:
		D3DXVECTOR3 vPos = *pvPosition - m_vPosListener;
		FLOAT fRadian = sqrt( 
			fabs ( vPos.x ) * fabs ( vPos.x ) +	fabs ( vPos.z ) * fabs ( vPos.z ) );

	//Radian *= 2.0f;

		if( fRadian > 100.0f )
			return FALSE;
#ifdef __SOUND_BUG_FIX
		else if (fRadian == 0.0)
			m_pDSListener->GetPosition(&pSound->m_pBufferParams[dwIndex].vPosition);
		else
#endif // __SOUND_BUG_FIX
		{
			D3DXVECTOR3 Line1 = D3DXVECTOR3( 0.0f, 0.0f, -1.0f );
			D3DXVECTOR3 Line2 = -vPos;
			//Line2 = m_world.m_vCenter - Line2;
			// Nomralize Vectors
			FLOAT vlength = sqrt( ( Line2.x * Line2.x ) + ( Line2.z * Line2.z ) ); 
			Line2 = Line2 / vlength;
			// 라디안 구하기 
			FLOAT a = acos( D3DXVec3Dot( &Line1, &Line2 ) );
			//a = ( D3DX_PI * 2.0f ) - a;
			if( vPos.x < 0 )
				a = ( D3DX_PI * 2.0f ) - a;
			a += -m_fTheta;

			vPos.x = (float)( (int)(sin( a ) * fRadian ) );	// 여기 (int)캐스팅 바꾸지 말것. (int)안하면 컴터 리붓됨.
			vPos.z = (float)( (int)(cos( a ) * fRadian ) );
			vPos.y = (float)( (int) vPos.y );

			D3DVECTOR v;
			v.x = vPos.x;	// 혹시 몰라 이렇게 해봤다.
			v.y = vPos.y;
			v.z = vPos.z;
			pSound->m_pBufferParams[dwIndex].vPosition = v;	// D3XVECTOR3를 D3DVECTOR에 그대로 넣어도 되나?
		}
	}
I tested it but somehow it plays the sound with and without the fix. Perhabs I fixed it somewhere else long time ago.
06/19/2016 21:33 -Venom'#11
It is for Visual Studio 2012+
06/20/2016 00:03 Sedrika#12
Quote:
Originally Posted by Gentros' View Post
It is for Visual Studio 2012+
[Only registered and activated users can see links. Click Here To Register...]
06/20/2016 02:36 Avalion#13
The real fix is actually using a better system to manage sounds and music.:rolleyes: