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

walkerdev

Новичок
7
0
SAMPFuncs - управление выносливостью игрока


Функции get/set:
float getFloatFromMemory(unsigned char* memoryAddress) {
    float* floatPtr = reinterpret_cast<float*>(memoryAddress);
    return *floatPtr;
}
void setFloatToMemory(unsigned char* memoryAddress, float value) {
    float* floatPtr = reinterpret_cast<float*>(memoryAddress);
    *floatPtr = value * 31.47000244;
}


Пример использования:
    unsigned char* memoryAddress = reinterpret_cast<unsigned char*>(0xB7CDB4);

    float value = 0.0f;

    if (type >= 20) value = 100.0f;
    else if (type >= 10 && type <= 19) value = 0.0f;
    else if (type >= 4 && type <= 9) value = -10.0f;
    else value = -100.0f;

    setFloatToMemory(memoryAddress, value);
    float floatValue = getFloatFromMemory(memoryAddress);
type - в моем случае переменная, которая передается из pawn-кода, отвечающая за выносливость игрока.
 
  • Bug
Реакции: Smeruxa

nullptr-

Известный
22
3
Функция позволяет получить id игрока через указатель педа. Полезно когда нужно получить игроков в стриме.
C++:
for (CPed* pPed : CPools::ms_pPedPool)
{
    short id = SAMP::Pools::Player::Find(pPed);
    if (id == -1)
        continue;
}

C++:
short SAMP::Pools::Player::Find(CPed* pPed)
{
    // pPlayer PlayerPool
    // Pools + 0x8   DL
    // Pools + 0x18 R1
    // Pools + 0x8   R2
    // Pools + 0x8   R3
    // Pools + 0x8   R4
    // Pools + 0x4   R5

    if (!m_pPlayer || !pPed)
        return -1;

    static const std::uintptr_t uiOffsets[] =
    {
       0x137C0, // DL
       0x10420, // R1
       0x104C0, // R2
       0x13570, // R3
       0x13890, // R4
       0x138C0  // R5
    };

    return reinterpret_cast<short(__thiscall*)(void*, CPed*)>(GetModule() + uiOffsets[GetVersion()])(pPlayer, pPed);
}
 

undefine

Участник
51
25
Функция позволяет получить id игрока через указатель педа. Полезно когда нужно получить игроков в стриме.
C++:
for (CPed* pPed : CPools::ms_pPedPool)
{
    short id = SAMP::Pools::Player::Find(pPed);
    if (id == -1)
        continue;
}

C++:
short SAMP::Pools::Player::Find(CPed* pPed)
{
    // pPlayer PlayerPool
    // Pools + 0x8   DL
    // Pools + 0x18 R1
    // Pools + 0x8   R2
    // Pools + 0x8   R3
    // Pools + 0x8   R4
    // Pools + 0x4   R5

    if (!m_pPlayer || !pPed)
        return -1;

    static const std::uintptr_t uiOffsets[] =
    {
       0x137C0, // DL
       0x10420, // R1
       0x104C0, // R2
       0x13570, // R3
       0x13890, // R4
       0x138C0  // R5
    };

    return reinterpret_cast<short(__thiscall*)(void*, CPed*)>(GetModule() + uiOffsets[GetVersion()])(pPlayer, pPed);
}
а смысл? эта функция есть в сампапи
 
  • Нравится
Реакции: вайега52

nullptr-

Известный
22
3
а смысл? эта функция есть в сампапи
1789841174137.png
1789841143965.png
 

nullptr-

Известный
22
3
так можно сделать на сампапи одновременно поддерживание всех версий
можешь сделать. где ты в samp-api видишь поддержку r2 и r4 версии? насколько я помню в samp-api чтобы изменить версию сампа нужно перекомпилировать проект
 

undefine

Участник
51
25
можешь сделать. где ты в samp-api видишь поддержку r2 и r4 версии? насколько я помню в samp-api чтобы изменить версию сампа нужно перекомпилировать проект
у r2 ваще отличия в оффсетах нету, это вроде все те же оффсеты r1, а r4 никому нахуй не нужнен

изменить версию сампа нужно перекомпилировать проект
бред, очень много готовых репозиториев которые используют все версии одновременно
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
418
882
у r2 ваще отличия в оффсетах нету, это вроде все те же оффсеты r1, а r4 никому нахуй не нужнен


бред, очень много готовых репозиториев которые используют все версии одновременно
У r2 оффсеты отличаются. Мне нужен r4. Самп апи можно рантайм юзать все поддерживаемые версии
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
418
882
хз, всегда сампапи от р1 подходил спокойно под р2
В каких-то моментах - не отрицаю, сам юзал специфические оффсеты для патчей, которые подходили под r1/r3 сразу, но все же, не все подойдут. В том же примере чела есть небольшие смещения на пару байт