Информация Полезные функции

CleanLegend

Известный
Всефорумный модератор
476
928
3D круг с этой темы - https://blast.hk/threads/25508/

C++:
void krug3d(float x, float y, float z, float radius, D3DCOLOR Color)
{
    float enpos[3];
    float screen[2],screen2[2];
    float step = M_PI * 2.0 / 2047;
    for (float rot = 0; rot < (M_PI * 2.0); rot += step)
    {
        enpos[0] = radius * cos(rot) + x;
        enpos[1] = radius * sin(rot) + y;
        enpos[2] = z;
        SF->getGame()->convert3DCoordsToScreen(enpos[0], enpos[1], enpos[2], &screen[0], &screen[1]);
        if (screen[0] != NULL && screen2[0]!= NULL)
            SF->getRender()->DrawLine(screen[0], screen[1], screen2[0], screen2[1], 2, Color);
        screen2[0] = screen[0];
        screen2[1] = screen[1];
    }
}
пример использования:
C++:
krug3d(X, Y, Z, 3, 0xFF00FF00);
YD2nQwC.png

qwGQACq.png
 
Последнее редактирование:

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эмулирует анимацию стана как при попадании пули в скин.
Полезно для разработчиков сайлент аимов
C++:
int GetWeaponFlag(int weaponID)
{
    if (weaponID == 24 || weaponID == 25 || weaponID == 27) return 140;
    else if (weaponID == 34 || weaponID == 33) return 75;
    return -1;
}
void EmulateStunShot(WORD playerId, int weapon_id, int damage_per_hit)
{
    int stun_weapon = GetWeaponFlag(weapon_id);
    if (stun_weapon != -1)
    {
        actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[playerId]->pPlayerData->pSAMP_Actor->pGTA_Ped;
        if (actorInfo == nullptr) return;
        CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
        if (Ped == nullptr) return;
        CEntity *Entity = Ped->GetDamageEntity();
        CWeapon *Wep = PEDSELF->GetWeapon((eWeaponType)weapon_id);
        if (Entity == nullptr || Wep == nullptr) return;
        Wep->GenerateDamageEvent(Ped, Entity, (eWeaponType)weapon_id,
        damage_per_hit, PED_PIECE_RIGHT_ARM, GetWeaponFlag(weapon_id));
    }
}
Пример:
C++:
EmulateStunShot(228, 24, 42);
Рассчитывает кватернион поворота к указанному игроку.
C++:
void RotateQuaternion(float angle_radian, float *quat_w, float *quat_x)
{
    *quat_x = -1 * sinf(angle_radian / 2.0f);
    *quat_w = cosf(angle_radian / 2.0f);
}
void RotateMeToPlayer(WORD player)
{
    stOnFootData ft = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData; BitStream bs;
    actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[player]->pPlayerData->pSAMP_Actor->pGTA_Ped;
    if (actor_info == nullptr) return;
    CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo); CVector pers;
    if (Ped == nullptr) return;
    Ped->GetTransformedBonePosition(BONE_RIGHTWRIST, &pers);
    float angle = -1 * atan2(pers.fX - PEDSELF->GetPosition()->fX, pers.fY - PEDSELF->GetPosition()->fY);
    RotateQuaternion(angle, &ft.fQuaternion[0], &ft.fQuaternion[3]);
    bs.Write((BYTE)ID_PLAYER_SYNC);
    bs.Write((PCHAR)&ft, sizeof(stOnFootData));
    SF->getRakNet()->SendPacket(&bs);
}
Пример:
C++:
RotateMeToPlayer(228); // Использовать в хуке онфут даты с блокировкой оригинальной синхры.
 
Последнее редактирование:

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Рассчитывет вектор прицеливания камеры к скину указанного игрока, кроме обхода античита на сайлент аим это необходимо для прострела стен на 0.3.7.
Это потому что далеко не на всех серверах система урона синхрит дамаг обязательно через RPC_GiveTakeDamage
C++:
inline float vect3_length(const float in[3])
{
    return sqrtf(in[0] * in[0] + in[1] * in[1] + in[2] * in[2]);
}
inline void vect3_copy(const float in[3], float out[3])
{
    memcpy(out, in, sizeof(float) * 3);
}
void AimVectorToPlayer(WORD player)
{
    stAimData aim = SF->getSAMP()->getPlayers()->pLocalPlayer->aimData;
    actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[player]->pPlayerData->pSAMP_Actor->pGTA_Ped;
    float matched_pos[3], AimVector[3];
    vect3_copy(actorInfo->base.matrix + 12, matched_pos);
    float* fPos = actorInfo->base.matrix + 12;
    for (int i = 0; i < 3; ++i)
    {
        AimVector[i] = matched_pos[i] - aim.vecAimPos[i];
        aim.vecAimf1[i] = AimVector[i] / vect3_length(AimVector);
        aim.vecAimPos[i] = fPos[i];
    }
    aim.vecAimPos[2] += 0.2f;
    BitStream bs;
    bs.Write((BYTE)ID_AIM_SYNC);
    bs.Write((PCHAR)&aim, sizeof(stAimData));
    SF->getRakNet()->SendPacket(&bs);
}
Пример:
C++:
AimVectorToPlayer(228); // Использовать в хуке ID_AIM_SYNC с блокировкой оригинального пакета.
Кастомная функция расчёта урона для текущего оружия в руках.
Та что с мта классов выдаёт почему-то не валидные значения, моя функция умеет выдавать рандомно валидный урон дробовиков с которых любят палить сайлент аим всякие античиты по типу веапон конфига.
C++:
int GetRandom(int *operand)
{
    LARGE_INTEGER start, end, freq;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&start);
    int diff = operand[1] - operand[0];
    QueryPerformanceCounter(&end);
    srand((end.QuadPart - start.QuadPart) * 1000000 / freq.QuadPart);
    int random = (rand()) / RAND_MAX;
    int r = random * diff;
    return operand[0] + r;
}
float CalculateDamage(void)
{
    WORD gun = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
    float dmg = 0.0f;
    if (gun == 24 || gun == 38) dmg = 46.200000762939453125f;
    if (gun == 22 || gun == 29) dmg = 8.25f;
    if (gun == 23) dmg = 13.200000762939453125f;
    if (gun == 28 || gun == 32) dmg = 6.6000003814697265625f;
    if (gun == 30 || gun == 31) dmg = 9.90000057220458984375f;
    if (gun == 33) dmg = 24.7500019073486328125f;
    if (gun == 34) dmg = 41.25f;
    if (gun == 25 || gun == 26)
    {
        int shotrandom[2] = { 8, 15 };
        switch (GetRandom(shotrandom))
        {
        case 8:
            dmg = 26.4000015258789f;
            break;
        case 9:
            dmg = 29.70000171661377f;
            break;
        case 10:
            dmg = 33.00000190734863f;
            break;
        case 11:
            dmg = 36.30000209808349f;
            break;
        case 12:
            dmg = 39.60000228881836f;
            break;
        case 13:
            dmg = 42.90000247955322f;
            break;
        case 14:
            dmg = 46.20000267028808f;
            break;
        case 15:
            dmg = 49.50000286102295f;
            break;
        }
    }
    if (gun == 27)
    {
        int shotrandom[2] = { 5, 8 };
        switch (GetRandom(shotrandom))
        {
        case 5:
            dmg = 24.75000143051147f;
            break;
        case 6:
            dmg = 29.70000171661376f;
            break;
        case 7:
            dmg = 34.65000200271606f;
            break;
        case 8:
            dmg = 39.60000228881835f;
            break;
        }
    }
    return dmg;
}
Пример:
C++:
float WeaponDamage = GetDamage();
Рассчитывает валидный разброс к рандомной части тела и выдаёт валидный бодипарт для RPC_GiveDamage
Можно использовать для поражения целей внутри транспортных средств почти не трогая сам транспорт либо для раздачи хэдшотов.
C++:
byte CalculateSpreadOffset(WORD targetID, float *target_pos, float *out_spread)
{
    actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[targetID]->pPlayerData->pSAMP_Actor->pGTA_Ped;
    if (actorInfo == nullptr) return 255;
    CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
    if (Ped == nullptr) return 255;
    int random_bone;
    byte player_state = SF->getSAMP()->getPlayers()->pRemotePlayer[targetID]->pPlayerData->bytePlayerState;
    if (player_state == PLAYER_STATE_ONFOOT)
    {
        CVector rbody; byte bodyIDs[10] = { 1, 2, 3, 4, 5, 8, 21, 31, 41, 51 };
        random_bone = bodyIDs[rand() % 9];
        Ped->GetTransformedBonePosition((eBone)random_bone, &rbody);
        out_spread[0] = rbody.fX - target_pos[0];
        out_spread[1] = rbody.fY - target_pos[1];
        out_spread[2] = rbody.fZ - target_pos[2];
    }
    else if (player_state == PLAYER_STATE_DRIVER || player_state == PLAYER_STATE_PASSENGER)
    {
        byte bodyIDs[3] = { 8, 7, 6 }; CVector head;
        random_bone = bodyIDs[rand() % 2];
        Ped->GetTransformedBonePosition((eBone)random_bone, &head);
        out_spread[0] = head.fX - target_pos[0];
        out_spread[1] = head.fY - target_pos[1];
        out_spread[2] = head.fZ - target_pos[2];
        return 9;
    }
    if (random_bone == 5 || random_bone == 8 || random_bone == 7 || random_bone == 6) return 9;
    if (random_bone == 4 || random_bone == 21 || random_bone == 3 || random_bone == 31) return 3;
    if (random_bone == 2 || random_bone == 1) return 4;
    if (random_bone == 34 || random_bone == 33 || random_bone == 35 || random_bone == 32 || random_bone == 36) return 5;
    if (random_bone == 24 || random_bone == 23 || random_bone == 25 || random_bone == 22 || random_bone == 26) return 6;
    if (random_bone == 43 || random_bone == 44 || random_bone == 42 || random_bone == 41) return 7;
    if (random_bone == 53 || random_bone == 54 || random_bone == 52 || random_bone == 51) return 8;
    return 255;
}
Пример:
C++:
WORD targetID = ид игрока;
if (SF->getSAMP()->getPlayers()->iIsListed[targetID] && SF->getSAMP()->getPlayers()->IsPlayerDefined(targetID, true))
{
    float TargetPos[3], Spread[3]; // В Spread будет записан рассчитаный разброс
    switch (SF->getSAMP()->getPlayers()->pRemotePlayer[targetID]->pPlayerData->bytePlayerState)
    {
    case PLAYER_STATE_ONFOOT:
        for (short x = 0; x < 3; x++)
            targetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[targetID]->pPlayerData->fOnFootPos[x];
        break;
    case PLAYER_STATE_DRIVER:
        for (short x = 0; x < 3; x++)
            targetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[targetID]->pPlayerData->inCarData.fPosition[x];
        break;
    case PLAYER_STATE_PASSENGER:
        for (short x = 0; x < 3; x++)
            targetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[targetID]->pPlayerData->passengerData.fPosition[x];
        break;
    }
    byte BodyPart = CalculateSpreadOffset(targetID, TargetPos, Spread);
    SF->getSAMP()->sendGiveDamage(targetID, урон, SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon, BodyPart);
    // Шлём Bullet Sync с нашим Spread
}
Подмена цели с зелёного треугольника над головой
C++:
struct stWeaponData
{
    WORD index;
    WORD iTargetID;
    BYTE slot;
    BYTE weapon;
    WORD ammo;
};
bool SendFakeWeaponData(WORD targetID)
{
    byte cam = SF->getSAMP()->getPlayers()->pLocalPlayer->aimData.byteCamMode;
    if (cam != 53 && cam != 46) return false;
    if (!SF->getSAMP()->getPlayers()->iIsListed[targetID] || !SF->getSAMP()->getPlayers()->IsPlayerDefined(targetID, true))
    return false;
    byte state = SF->getSAMP()->getPlayers()->pRemotePlayer[CS->cfg.LastTargetID]->pPlayerData->bytePlayerState;
    if (state != PLAYER_STATE_PASSENGER && state != PLAYER_STATE_DRIVER)
    {
        BitStream bs; stWeaponData wdata; ZeroMemory(&wdata, sizeof(stWeaponData));
        wdata.index = targetID; wdata.iTargetID = targetID;
        wdata.slot = PEDSELF->GetCurrentWeaponSlot();
        wdata.weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
        wdata.ammo = PEDSELF->GetWeapon(PEDSELF->GetCurrentWeaponSlot())->GetAmmoTotal();
        bs.Write((BYTE)ID_WEAPONS_UPDATE);
        bs.Write((PCHAR)&wdata, sizeof(stWeaponData));
        SF->getRakNet()->SendPacket(&bs);
    }
    return false;
}
Пример:
C++:
SendFakeWeaponData(228); // Использовать в хуке ID_WEAPONS_UPDATE с блокировкой оригинального пакета

Перезаписывает трассеры пуль в скин указанного игрока, полезно для сайлент аимов чтобы не палится на видеозаписях попадая в стенку.
C++:
CPed* LastPed = nullptr;
CPed* TargetPed = nullptr;
void DeleteGameHooks(bool FindPlayerPed, bool AddTrace)
{
    if (FindPlayerPed)
    {
        byte Prologue[6] = { 0x8B, 0x44, 0x24, 0x04, 0x85, 0xC0 }; DWORD old_prot;
        VirtualProtect((void*)0x56E210, 6, PAGE_EXECUTE_READWRITE, &old_prot);
        memcpy((void*)0x56E210, Prologue, 6);
        VirtualProtect((void*)0x56E210, 6, old_prot, &old_prot);
    }
    if (AddTrace)
    {
        byte Prologue[5] = { 0x83, 0xEC, 0x1C, 0x33, 0xC9 }; DWORD old_prot;
        VirtualProtect((void*)0x723750, 5, PAGE_EXECUTE_READWRITE, &old_prot);
        memcpy((void*)0x723750, Prologue, 5);
        VirtualProtect((void*)0x723750, 5, old_prot, &old_prot);
    }
}
bool GetTargetPos(CVector *vec)
{
    if (TargetPed == nullptr) return false;
    else
    {
        vec = TargetPed->GetPosition();
        return true;
    }
    return false;
}
bool SetTargetPed(WORD playerId)
{
    if (!SF->getSAMP()->getPlayers()->iIsListed[playerId] || !SF->getSAMP()->getPlayers()->IsPlayerDefined(playerId, true))
    return false;
    else
    {
        actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[playerId]->pPlayerData->pSAMP_Actor->pGTA_Ped;
        if (actorInfo == nullptr) return false;
        CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
        if (Ped == nullptr) return false;
        TargetPed = Ped;
        return true;
    }
    return false;
}
CPed* __cdecl FindPlayerPed(int number)
{
    DeleteGameHooks(true, false);
    LastPed = ((CPed*(__cdecl *)(int))0x56E210)(number);
    SF->getGame()->createHook((void*)0x56E210, &FindPlayerPed, DETOUR_TYPE_JMP, 6);
    return LastPed;
}
void __cdecl AddTrace(CVector *start, CVector *end, float radius, unsigned int time, unsigned char transparency)
{
    if ((TargetPed != nullptr && LastedPed != nullptr) && LastPed == TargetPed)
    {
        CVector NewDirection;
        if (GetTargetPos(&NewDirection))
        {
            end->fX = NewDirection.fX;
            end->fY = NewDirection.fY;
            end->fZ = NewDirection.fZ;
        }
    }
    DeleteGameHooks(false, true);
    ((void(__cdecl *)(CVector *, CVector *, float, unsigned int, unsigned char))0x723750)(start, end, radius, time, transparency);
    SF->getGame()->createHook((void*)0x723750, &AddTrace, DETOUR_TYPE_JMP, 5);
}
void __stdcall Destructor()
{
    DeleteGameHooks(true, true);
}
Пример использования:
C++:
SetTargetPed(bullet.sTargetID); // Вызываем в хуке ID_BULLET_SYNC перед отправкой пули
void __stdcall mainloop(void)
{
    static bool init = false;
    if(!init)
    {
        if (GAME == nullptr) return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return;
        if(!SF->getSAMP()->IsInitialized()) return;
        SF->getGame()->registerGameDestructorCallback(Destructor);
        SF->getGame()->createHook((void*)0x56E210, &FindPlayerPed, DETOUR_TYPE_JMP, 6);
        SF->getGame()->createHook((void*)0x723750, &AddTrace, DETOUR_TYPE_JMP, 5);
        init = true;
    }
}
 

Rjx13

Известный
Проверенный
224
160
Я думаю, по названиям функций понятно.

C++:
int GetWeaponID()
{
    return PEDSELF->GetWeapon(PEDSELF->GetCurrentWeaponSlot())->GetType();
}

eWeaponState GetWeaponState()
{
    return PEDSELF->GetWeapon(PEDSELF->GetCurrentWeaponSlot())->GetState();
}

int GetAmmoInClip()
{
    return PEDSELF->GetWeapon(PEDSELF->GetCurrentWeaponSlot())->GetAmmoInClip();
}

int GetAmmoTotal()
{
    return PEDSELF->GetWeapon(PEDSELF->GetCurrentWeaponSlot())->GetAmmoTotal();
}

int GetWantedLevel()
{
    return *(DWORD*)0x58DB60;
}
В дополнение. Получение уровня усталости

Код:
int GetSprintLevel()
{
    float sprintLocalPlayer = *(float*)0xB7CDB4;
    return (sprintLocalPlayer / 31.47000244 + 4.78) / 1.040;
}
 

f0Re3t

Poh production
Друг
876
807
Функция разбивает расстояние между 2 векторами на кучу векторов с некоторым шагом.
Использование: split(float x0, float y0, float z0, float x1, float y1, float z1, float step)
x0, y0, z0 - начальные координаты (первый вектор)
x1, y1, z1 - конечные координаты (второй вектор)
step - шаг, с которым будет поделено расстояние между векторами.
Возвращает вектор с разбитым расстоянием.
C++:
std::vector <CVector> split(float x0, float y0, float z0, float x1, float y1, float z1, float step)
{
    CVector direction = { x1 - x0, y1 - y0, z1 - z0 };
    float distance = direction.Normalize();
    std::vector <CVector> path;
    CVector begin = { x0, y0, z0 };
    CVector cursor = { x0, y0, z0 };
    path.push_back(cursor);
    while ((cursor - begin).Length() < distance)
    {
        cursor = cursor + direction * step;
        path.push_back(cursor);
    }
    return path;
}
 

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Работа с регистром (Подсмотрел с коллизи Фипа)
C++:
#pragma once
#include <windows.h>
#pragma comment(lib, "advapi32.lib")
namespace Register {

    namespace Write {
        bool Bool(HKEY &key, const char *name, const bool &value)
        {
            static DWORD val;
            val = value;
            return RegSetValueExA(key, name, 0, REG_DWORD, (BYTE *)&val, 1) == ERROR_SUCCESS;
        }

        bool Int(HKEY &key, const char *name, const int &value)
        {
            static DWORD val;
            val = value;
            return RegSetValueExA(key, name, 0, REG_DWORD, (BYTE *)&val, 4) == ERROR_SUCCESS;
        }

  
        bool String(HKEY &key, const char *name, const char *value, int dwBufLen) {
            return RegSetValueExA(key, name, 0, REG_SZ, (BYTE *)value, dwBufLen) == ERROR_SUCCESS;
        }
    }

    namespace Read {
        bool Bool(HKEY &key, const char *name, bool &value)
        {
            static DWORD val = 0, type = REG_DWORD, size = 4;
            bool result = RegQueryValueExA(key, name, NULL, &type, (BYTE *)&val, &size) == ERROR_SUCCESS;
            value = val != 0;
            return result;
        }

        bool Int(HKEY &key, const char *name, int &value)
        {
            static DWORD val = 0, type = REG_DWORD, size = 4;
            bool result = RegQueryValueExA(key, name, NULL, &type, (BYTE *)&val, &size) == ERROR_SUCCESS;
            value = val;
            return result;
        }

    
        bool String(HKEY &key, char* name, char *to, DWORD dwBufLen)
        {
            static DWORD dwType = REG_SZ;
            return RegQueryValueExA(key, name, NULL, &dwType, (BYTE *)to, &dwBufLen) == ERROR_SUCCESS;
        }
    }
}
Намного удобнее и больше функционала https://blast.hk/threads/13855/
 
  • Нравится
Реакции: Rjx13 и Stiopko

CleanLegend

Известный
Всефорумный модератор
476
928
Полезные функции для работы с памятью:

C++:
void WriteMemory(void *address, void *bytes, int byteSize)
{
    DWORD NewProtection;
    VirtualProtect(address, byteSize, PAGE_EXECUTE_READWRITE, &NewProtection);
    memcpy(address, bytes, byteSize);
    VirtualProtect(address, byteSize, NewProtection, &NewProtection);
}

C++:
void nop_(PVOID address, int bytes) {
    DWORD NewProtection;
    VirtualProtect(address, bytes, PAGE_EXECUTE_READWRITE, &NewProtection);
    memset(address, 0x90, bytes);
    VirtualProtect(address, bytes, NewProtection, &NewProtection);
}

пример:

C++:
WriteMemory((void*)0x004BA3B9, (uint8_t *)"\xE9\xA7\x03\x00\x00", 5); // адрес в котором будем изменять память, какие байты пойдут туда, размер(количество байт)

nop_((void*)(0x004BA3B9), 1); адрес, количество нопов
 
Последнее редактирование:

iAmerican

Известный
Друг
615
257
C++:
std::string formatString(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    std::vector<char> v(1024);
    while (true)
    {
        va_list args2;
        va_copy(args2, args);
        int res = vsnprintf(v.data(), v.size(), fmt, args2);
        if ((res >= 0) && (res < static_cast<int>(v.size())))
        {
            va_end(args);
            va_end(args2);
            return std::string(v.data());
        }
        size_t size;
        if (res < 0)
            size = v.size() * 2;
        else
            size = static_cast<size_t>(res) + 1;
        v.clear();
        v.resize(size);
        va_end(args2);
    }
}

Не совсем для SF , но может кому и пригодиться.
Для тех кому не нравится форматировать строки через массив чар.

Автор вроде как : 5nw .

Пример :

C++:
int iA = 1;
float fA = 2.0;
std::string sA = "privet";

std::string myVar = formatString("int : %i , float : %f , string : %s",iA,fA,sA);
 

Rjx13

Известный
Проверенный
224
160
Включение/выключение рендера чата и клавиш "T", "F6":
C++:
static bool state = true;
static bool vp = false;
void sampChatVisible() {
    state ^= true;
    DWORD sampBase = SF->getSAMP()->getSAMPAddr();
    DWORD temp;

    DWORD chatKeyT = sampBase + 0x5DAF4 + 0x11;
    DWORD chatKeyF6 = sampBase + 0x5D891;
    DWORD chatRender = sampBase + 0x63D70;

    if (!vp) {
        VirtualProtect((void*)chatKeyT, 0x1, PAGE_EXECUTE_READWRITE, &temp);
        VirtualProtect((void*)chatKeyF6, 0x1, PAGE_EXECUTE_READWRITE, &temp);
        VirtualProtect((void*)chatRender, 0x1, PAGE_EXECUTE_READWRITE, &temp);
        vp = true;
    }
  
    *(byte*)chatKeyT = state ? 0x75 : 0xEB;
    *(byte*)chatKeyF6 = state ? 0x8B : 0xC3;
    *(byte*)chatRender = state ? 0x55 : 0xC3;
    SF->getSAMP()->getChat()->m_nPrevScrollBarPosition = 1;
}

Поддержка русских букв ImGui для VS2013 и прочих, где нету литералов по типу u8:
C++:
#pragma execution_character_set("utf-8")
 
У

Удалённый пользователь 123482

Гость
Получает скорость машины по её ID
C++:
FLOAT GetVehicleSpeed(INT ID)
{
    if (SF->getSAMP()->getVehicles()->iIsListed[ID] && SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID] != NULL && SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID]->pGTA_Vehicle != NULL)
    {
        CVector VectorSpeed;

        VectorSpeed.fX -= SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID]->pGTA_Vehicle->speed[0];
        VectorSpeed.fY -= SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID]->pGTA_Vehicle->speed[1];
        VectorSpeed.fZ -= SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID]->pGTA_Vehicle->speed[2];

        return sqrt((VectorSpeed.fX * VectorSpeed.fX) + (VectorSpeed.fY * VectorSpeed.fY) + (VectorSpeed.fZ * VectorSpeed.fZ)) * 100.0F;
    }
}
 

Cake_

Известный
Проверенный
263
313
Преобразование RGBA в ImVec4
C++:
const ImVec4& RGBAToImVec4(const uint8 &r, const uint8 &g, const uint8 &b, const uint8 &a) {
    static float it = 1. / 255;
    return ImVec4(r*it, g*it, b*it, a*it);
}

Преобразование RGBA в float
C++:
#define RGBA_TO_FLOAT(r,g,b,a) (float)r/255.0f, (float)g/255.0f, (float)b/255.0f, (float)a/255.0f
 
У

Удалённый пользователь 123482

Гость
Возвращает позицию кости по ID игрока.
C++:
GetBonePos(ID, eBone, TRUE);
C++:
GetBonePos(ID, eBone, FALSE);
C++:
CVector GetBonePos(INT ID, eBone eBone, BOOL isOnScreen = TRUE)
{
    if (SF->getSAMP()->getPlayers()->iIsListed[ID] != 1) return CVector(0.0F, 0.0F, 0.0F);
    if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID] == NULL) return CVector(0.0F, 0.0F, 0.0F);
    if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData == NULL) return CVector(0.0F, 0.0F, 0.0F);
    if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->pSAMP_Actor == NULL) return CVector(0.0F, 0.0F, 0.0F);
    if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->pSAMP_Actor->pGTA_Ped == NULL) return CVector(0.0F, 0.0F, 0.0F);

    if (isOnScreen)
    {
        CVector BonePosition;
        CVector2D BonePositionOnScreen;

        GAME->GetPools()->GetPed((DWORD*)SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->pSAMP_Actor->pGTA_Ped)->GetTransformedBonePosition(eBone, &BonePosition);
        SF->getGame()->convert3DCoordsToScreen(BonePosition.fX, BonePosition.fY, BonePosition.fZ, &BonePositionOnScreen.fX, &BonePositionOnScreen.fY);

        return CVector(BonePositionOnScreen.fX, BonePositionOnScreen.fY, 0.0F);
    }
    else
    {
        CVector BonePosition;
        GAME->GetPools()->GetPed((DWORD*)SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->pSAMP_Actor->pGTA_Ped)->GetTransformedBonePosition(eBone, &BonePosition);

        return CVector(BonePosition.fX, BonePosition.fY, BonePosition.fZ);
    }
}
 
  • Нравится
Реакции: Cake_
У

Удалённый пользователь 123482

Гость
Получение позиции радара.
C++:
CVector2D GetRadarPosition()
{
    FLOAT Result[] = { 0.0F, 0.0F };
    SF->getGame()->convertGameCoordsToWindow(*(FLOAT*)0x858A10, (448.0F - *(FLOAT*)0x866B70), &Result[0], &Result[1]);

    return CVector2D(Result[0], Result[1]);
}

Получение размера радара.
C++:
CVector2D GetRadarSize()
{
    FLOAT Result[] = { 0.0F, 0.0F };
    SF->getGame()->convertGameCoordsToWindow(*(FLOAT*)0x00866B78, *(FLOAT*)0x00866B74, &Result[0], &Result[1]);

    return CVector2D(Result[0], Result[1]);
}

Получение названия оружия по ID игрока.
-1 = Локальный игрок.

C++:
[/SIZE]
CONST CHAR* Weapons[] =
{
    { "Fist" },
    { "Brass Knuckles" },
    { "Golf Club" },
    { "Nitestick" },
    { "Knife" },
    { "Baseball Bat" },
    { "Shovel" },
    { "Pool Cue" },
    { "Katana" },
    { "Chainsaw" },
    { "Dildo 1" },
    { "Dildo 2" },
    { "Vibe 1" },
    { "Vibe 2" },
    { "Flowers" },
    { "Cane" },
    { "Grenade" },
    { "Teargas" },
    { "Molotov Cocktail" },
    { "NULL" },
    { "NULL" },
    { "NULL" },
    { "Pistol" },
    { "Silenced Pistol" },
    { "Desert Eagle" },
    { "Shotgun" },
    { "Sawn-Off Shotgun" },
    { "SPAZ12" },
    { "Micro UZI" },
    { "MP5" },   
    { "AK47" },
    { "M4" },
    { "Tech9" },
    { "Country Rifle" },
    { "Sniper Rifle" },
    { "Rocket Launcher" },
    { "Heat Seeking RPG" },
    { "Flame Thrower" },
    { "Minigun" },
    { "Remote Explosives" },
    { "Detonator" },
    { "Spray Can" },
    { "Fire Extinguisher" },
    { "Camera" },
    { "NV Goggles" },
    { "IR Goggles" },
    { "Parachute" }
};
[SIZE=3]
C++:
std::string GetWeaponName(INT ID = -1 /* -1 = LocalPlayer */)
{
    if (ID == -1)
        return Weapons[SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon];
    else
        return Weapons[SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->onFootData.byteCurrentWeapon];
}

Получение названия машины по её ID.
-1 = Машина локального игрока.

C++:
CHAR Vehicles[][212] = {
    { "Landstalker" },
    { "Bravura" },
    { "Buffalo" },
    { "Linerunner" },
    { "Perrenial" },
    { "Sentinel" },
    { "Dumper" },
    { "Firetruck" },
    { "Trashmaster" },
    { "Stretch" },
    { "Manana" },
    { "Infernus" },
    { "Voodoo" },
    { "Pony" },
    { "Mule" },
    { "Cheetah" },
    { "Ambulance" },
    { "Leviathan" },
    { "Moonbeam" },
    { "Esperanto" },
    { "Taxi" },
    { "Washington" },
    { "Bobcat" },
    { "MrWhoopee" },
    { "BFInjection" },
    { "Hunter" },
    { "Premier" },
    { "Enforcer" },
    { "Securicar" },
    { "Banshee" },
    { "Predator" },
    { "Bus" },
    { "Rhino" },
    { "Barracks" },
    { "Hotknife" },
    { "Trailer1" },
    { "Previon" },
    { "Coach" },
    { "Cabbie" },
    { "Stallion" },
    { "Rumpo" },
    { "RCBandit" },
    { "Romero" },
    { "Packer" },
    { "Monster" },
    { "Admiral" },
    { "Squalo" },
    { "Seasparrow" },
    { "Pizzaboy" },
    { "Tram" },
    { "Trailer2" },
    { "Turismo" },
    { "Speeder" },
    { "Reefer" },
    { "Tropic" },
    { "Flatbed" },
    { "Yankee" },
    { "Caddy" },
    { "Solair" },
    { "BerkleyRCVan" },
    { "Skimmer" },
    { "PCJ-600" },
    { "Faggio" },
    { "Freeway" },
    { "RCBaron" },
    { "RCRaider" },
    { "Glendale" },
    { "Oceanic" },
    { "Sanchez" },
    { "Sparrow" },
    { "Patriot" },
    { "Quad" },
    { "Coastguard" },
    { "Dinghy" },
    { "Hermes" },
    { "Sabre" },
    { "Rustler" },
    { "ZR-350" },
    { "Walton" },
    { "Regina" },
    { "Comet" },
    { "BMX" },
    { "Burrito" },
    { "Camper" },
    { "Marquis" },
    { "Baggage" },
    { "Dozer" },
    { "Maverick" },
    { "NewsChopper" },
    { "Rancher" },
    { "FBIRancher" },
    { "Virgo" },
    { "Greenwood" },
    { "Jetmax" },
    { "Hotring" },
    { "Sandking" },
    { "Blista Compact" },
    { "Police Maverick" },
    { "Boxville" },
    { "Benson" },
    { "Mesa" },
    { "RCGoblin" },
    { "HotringRacer A" },
    { "HotringRacer B" },
    { "BloodringBanger" },
    { "Rancher" },
    { "SuperGT" },
    { "Elegant" },
    { "Journey" },
    { "Bike" },
    { "MountainBike" },
    { "Beagle" },
    { "Cropdust" },
    { "Stunt" },
    { "Tanker" },
    { "Roadtrain" },
    { "Nebula" },
    { "Majestic" },
    { "Buccaneer" },
    { "Shamal" },
    { "Hydra" },
    { "FCR-900" },
    { "NRG-500" },
    { "HPV1000" },
    { "CementTruck" },
    { "TowTruck" },
    { "Fortune" },
    { "Cadrona" },
    { "FBITruck" },
    { "Willard" },
    { "Forklift" },
    { "Tractor" },
    { "Combine" },
    { "Feltzer" },
    { "Remington" },
    { "Slamvan" },
    { "Blade" },
    { "Freight" },
    { "Streak" },
    { "Vortex" },
    { "Vincent" },
    { "Bullet" },
    { "Clover" },
    { "Sadler" },
    { "FiretruckLA" },
    { "Hustler" },
    { "Intruder" },
    { "Primo" },
    { "Cargobob" },
    { "Tampa" },
    { "Sunrise" },
    { "Merit" },
    { "Utility" },
    { "Nevada" },
    { "Yosemite" },
    { "Windsor" },
    { "MonsterA" },
    { "MonsterB" },
    { "Uranus" },
    { "Jester" },
    { "Sultan" },
    { "Stratum" },
    { "Elegy" },
    { "Raindance" },
    { "RC Tiger" },
    { "Flash" },
    { "Tahoma" },
    { "Savanna" },
    { "Bandito" },
    { "FreightFlat" },
    { "StreakCarriage" },
    { "Kart" },
    { "Mower" },
    { "Duneride" },
    { "Sweeper" },
    { "Broadway" },
    { "Tornado" },
    { "AT-400" },
    { "DFT-30" },
    { "Huntley" },
    { "Stafford" },
    { "BF-400" },
    { "Newsvan" },
    { "Tug" },
    { "Trailer 3" },
    { "Emperor" },
    { "Wayfarer" },
    { "Euros" },
    { "Hotdog" },
    { "Club" },
    { "FreightCarriage" },
    { "Trailer3" },
    { "Andromada" },
    { "Dodo" },
    { "RCCam" },
    { "Launch" },
    { "PoliceCar(LSPD)" },
    { "PoliceCar(SFPD)" },
    { "PoliceCar(LVPD)" },
    { "PoliceRanger" },
    { "Picador" },
    { "S.W.A.T.Van" },
    { "Alpha" },
    { "Phoenix" },
    { "Glendale" },
    { "Sadler" },
    { "LuggageTrailerA" },
    { "LuggageTrailerB" },
    { "StairTrailer" },
    { "Boxville" },
    { "FarmPlow" },
    { "UtilityTrailer" }
};
C++:
CONST CHAR* GetVehicleName(INT ID = -1)
{
    if (ID == -1)
    {
        if (SF->getSAMP()->getVehicles()->pSAMP_Vehicle[SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID] == NULL) return "";
        if (SF->getSAMP()->getVehicles()->pSAMP_Vehicle[SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID]->pGTA_Vehicle == NULL) return "";

        return Vehicles[SF->getSAMP()->getVehicles()->pSAMP_Vehicle[SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID]->pGTA_Vehicle->base.model_alt_id - 400];
    }
    else
    {
        if (SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID] == NULL) return "";
        if (SF->getSAMP()->getVehicles()->pSAMP_Vehicle[ID]->pGTA_Vehicle == NULL) return "";

        return Weapons[SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->onFootData.byteCurrentWeapon];
    }
}
 
Последнее редактирование модератором: