я кажись понял
global::g_pOnColorChanged = reinterpret_cast<oOnColorChanged>(util::FPat("client.dll", "83 F9 01 0F 85 ? ? ? ? 48 8B C4 55 48 8D 68 B8 48 81 EC 40 01 00 00 48 89 58 08 48 8D ? ? ? ? ? 48 89 70 10 48 8D 5C 24 60 48 89 78 18 48 8D ? ? ? ? ? 48 8B ? ? ? ? ? 48 89 44 24 50 48 8D ? ? ? ? ? 48 89 44 24 68 48 8D ? ? ? ? ? 48 89 45 80"));
void SetEntityRenderColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
if (!this->DoesExists()) return;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 1) = g;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 2) = b;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 3) = a;
global::g_pOnColorChanged(CEntityIdentity);
}
global::g_pOnColorChanged = reinterpret_cast<oOnColorChanged>(util::FPat("client.dll", "83 F9 01 0F 85 ? ? ? ? 48 8B C4 55 48 8D 68 B8 48 81 EC 40 01 00 00 48 89 58 08 48 8D ? ? ? ? ? 48 89 70 10 48 8D 5C 24 60 48 89 78 18 48 8D ? ? ? ? ? 48 8B ? ? ? ? ? 48 89 44 24 50 48 8D ? ? ? ? ? 48 89 44 24 68 48 8D ? ? ? ? ? 48 89 45 80"));
void SetEntityRenderColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
if (!this->DoesExists()) return;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 1) = g;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 2) = b;
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 3) = a;
global::g_pOnColorChanged(*reinterpret_cast<uintptr_t*>(CEntityIdentity));
}
скажу честно увидев бы я такой код я бы выстрелил себе в голову
ну да кстати так оно и есть по факту. я чет сначала не заметил что он не дереференсит в конце))
ток конечно не стоит ваще так писать, код "*reinterpret_cast<uintptr_t*>(CEntityIdentity)" дублировать везде.
auto CBaseEntity = *reinterpret_cast<uintptr_t*>(CEntityIdentity);
*reinterpret_cast<unsigned char*>(CBaseEntity + global::offsets::m_clrRender + 0) = r;
*reinterpret_cast<unsigned char*>(CBaseEntity + global::offsets::m_clrRender + 1) = g;
*reinterpret_cast<unsigned char*>(CBaseEntity + global::offsets::m_clrRender + 2) = b;
*reinterpret_cast<unsigned char*>(CBaseEntity + global::offsets::m_clrRender + 3) = a;
global::g_pOnColorChanged(CBaseEntity);
код с r g b a тоже не надо дублировать ->
auto CBaseEntity = *reinterpret_cast<uintptr_t*>(CEntityIdentity);
*reinterpret_cast<int*>(CBaseEntity + global::offsets::m_clrRender) = r | (g << 8) | (b << 16) | (a << 24);
global::g_pOnColorChanged(CBaseEntity);
ну и кастить тоже ничего не надо. и КЛАССЫ ебаные пора уже начать юзать
->
CEntityIdentity_someInstance->GetEntity()->ChangeColor(r, g, b, a);
...
//CBaseEntity::InvokeColorChangedCallback vvv
global::g_pOnColorChanged(this);
//CBaseEntity::ChangeColor vvv
Member<int>(m_clrRender) = r | (g << 8) | (b << 16) | (a << 24);
InvokeColorChangedCallback();
и вообще будь прототип функции правильный, не
typedef __int64(__fastcall* oOnColorChanged)(__int64);
а
typedef __int64(__fastcall* oOnColorChanged)(C_BaseEntity*);
такой хуйни бы не случилось. тебе бы(к морфлингу обращаюсь) не дало айдентити засунуть как CBaseEntity* в аргумент.
типы в С++ нужны чтобы как раз такой хуйни не происходило. юзая везде некий абстрактный __int64 ты получишь пизды в виде багов.
в общем реальный "фикс" его кода это начать использовать классы.