ClientSDK setAvatar function

dedmen

TeamSpeak Developer
Contributor
Joined
Mar 28, 2016
Messages
530
Reaction score
584
Points
197
You can use this code to set your Avatar on 3.0.19.3 win32 client.
I am using this to auto-reset my avatar when some Serveradmin deletes it.
Just pass the full image path to the path argument.
Your image has to have the correct size. Meaning no bigger than 300x300 and the filesize has to be small enough that you are allowed to upload it.


Code:
void setAvatar(std::string path) {


    char buff[128];
    typedef void*(__thiscall *makeQstring)(const char* buff, const char *some);

    HINSTANCE hGetProcIDDLL = GetModuleHandle(L"Qt5Core");
    uintptr_t tsProc = (uintptr_t)GetModuleHandle(L"ts3client_win32.exe");

    /* get pointer to the function in the dll*/
    FARPROC lpfnGetProcessID = GetProcAddress(HMODULE(hGetProcIDDLL), "??0QString@@QAE@PBD@Z");

    makeQstring makeString = (makeQstring) lpfnGetProcessID;
    auto str = makeString(buff, path.c_str());

    auto pt = *((uintptr_t*) ((*((uintptr_t*) (0x97DE24-0xF0000+ tsProc))) + 4));    //pt is array of 16 elements. One element is different than others.
    
    uintptr_t foundAvManager = 0x0;
    for (int it = 0; it < 16; it++) {
        uintptr_t element = *((uintptr_t*)(pt + 0x4 * it));
        int foundcount = 0;
        for (int i = 0; i < 16; i++) {
            uintptr_t element2 = *((uintptr_t*) (pt + 0x4 * i));
            if (element2 == element)
                foundcount++;
        }
        if (foundcount == 1) {
            foundAvManager = element;
            break;
        }
    }
    if (!foundAvManager) return;

    auto avManager = *((uintptr_t*) (foundAvManager + 0x10));//0x30 corresponds to the element 0x30/4 that is different than the others


    typedef uintptr_t(__thiscall *setAvatar)(uintptr_t avatarManager, void* some, char some2);
    setAvatar setAv = (setAvatar) (0x002EF2C0-0xF0000 + tsProc);
    setAv(avManager, buff, 1);
}
 

ehthe

Retired Staff
Contributor
Joined
Apr 26, 2015
Messages
1,029
Reaction score
896
Points
216
You can do that with the sdk
Code:
ts3Functions.sendFile(serverConnectionHandlerID, 0, "", "/avatar", 1, 0, "/path/to/avatar, &onresult, NULL);
ts3Functions.setClientSelfVariableAsString(serverConnectionHandlerID, CLIENT_FLAG_AVATAR, image_md5);
 

dedmen

TeamSpeak Developer
Contributor
Joined
Mar 28, 2016
Messages
530
Reaction score
584
Points
197
But that way you'd need a md5 hasher.
 
Top