I've started doing reverse engineering stuff a while ago, I've done some things that I can share with you.

A video if you want to hear the sound:
(sorry for that weird noise, also the sh** quality)
Let's start with the outer interface side.
CPSOuterInterface, Functions To Use:
Code:
class CPSOuterInterface
{
public:
static CPSOuterInterface* GetOuterInterface();
void WriteMessage(CPSOuterInterface* obj, const wchar_t* message, unsigned int color);
};
CPSOuterInterface, Functions, Inner Code:
We can find these by tracing anything in-game messages that might represent to this function. I used the normal login message, "Requesting User Confirmation". After we find the function, we can see 2 arguments pushed which are the message and the color and "ECX" touched right before the call.
Since "this" memory address is dynamic, we have to find a pointer/function to get to it. There's already a pointer for it. And here comes the Cheat Engine. We found it, it's "0xEECEA4".
Now we can write a clean code:
Code:
CPSOuterInterface* CPSOuterInterface::GetOuterInterface()
{
return *reinterpret_cast<CPSOuterInterface**>(0xEECEA4);
}
void CPSOuterInterface::WriteMessage(const wchar_t* message, unsigned int color)
{
reinterpret_cast<void(__thiscall*)(CPSOuterInterface*, const wchar_t*, unsigned int)>(0x008613B0)(this, message, color);
}
Code:
CPSOuterInterface::GetOuterInterface()->WriteMessage(L"Hello World!", D3DCOLOR_ARGB(255, 76, 255, 0));
Let's finish with the sound body.
CGEffSoundBody, Functions To Use:
Code:
class CGEffSoundBody
{
public:
CGEffSoundBody* GetSoundBody();
void DoSound(CGEffSoundBody* obj, const wchar_t* code);
};
CGEffSoundBody, Functions, Inner Code:
Same thing as I said above since both functions are quite easy to find. Tracing, Debugging, Analyzing, Coding. "this" is dynamic, Cheat Engine, pointer found, coding time.
Code:
CGEffSoundBody* CGEffSoundBody::GetSoundBody()
{
CGEffSoundBody* body = *reinterpret_cast<CGEffSoundBody**>(0x0110AAD8);
return body;
}
void CGEffSoundBody::DoSound(const wchar_t* code)
{
reinterpret_cast<void(__thiscall*)(CGEffSoundBody*, const wchar_t*)>(0x00A72D40)(this, code);
}
Code:
CGEffSoundBody::GetSoundBody()->DoSound(L"snd_quest");
License:
We're hacking and talking about license?!
Thanks:
- florian0
(unfortunately there's no love emojis here)
Finalization:
Hope you won't just copy paste this into your project files, try to understand how things go. Good luck.






