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

Тема в разделе "C/C++", создана пользователем By_Surse, 1 янв 2016.

  1. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Пишем сюда полезные функции написанные на SF!
     
  2. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Функция телепортирует игрока в машине
    Использование: InCarDataSync(i,x,y,z); [I - Ид игрока, x,y,z - Координаты для телепортирования]
    void InCarDataSync(int i,float x1,float y1,float z1)
    {
        int icar;
        stRemotePlayer *pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[ i ];
        if(!pPlayer) return;
        icar = pPlayer->pPlayerData->sVehicleID;
        if(!icar) return;
        CVehicle *veh = PEDSELF->GetVehicle();
        if (!veh) return;
        stInCarData sync;
        memset( &sync, 0, sizeof( stInCarData ) );
        sync = pPlayer->pPlayerData->inCarData;
        sync.fPosition[0] = x1;
        sync.fPosition[1] = y1;
        sync.fPosition[2] = z1;
        BitStream CarSync;
        CarSync.Write( ( BYTE ) ID_VEHICLE_SYNC );
        CarSync.Write( ( PCHAR ) &sync, sizeof( stInCarData ) );
        SF->getRakNet()->SendPacket( &CarSync );
    }
    P.S. Функция сама проверяет существует игрок или нет
     
    #2 By_Surse, 1 янв 2016
    Последнее редактирование: 9 янв 2016
    Tray228 нравится это.
  3. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Функция отправляет пулю в указанного игрока
    Использование: BulletData(i); [I - Ид игрока]
    void BulletData(int i)
    {
        stRemotePlayer *pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[ i ];
        if(!pPlayer) return;
        stBulletData sync;
        ZeroMemory(&sync, sizeof(stBulletData));
    
        sync.sTargetID = i;
    
        sync.fOrigin[0] = PEDSELF->GetPosition()->fX;
        sync.fOrigin[1] = PEDSELF->GetPosition()->fY;
        sync.fOrigin[2] = PEDSELF->GetPosition()->fZ;
    
        sync.fTarget[0] = pPlayer->pPlayerData->fOnFootPos[0];
        sync.fTarget[1] = pPlayer->pPlayerData->fOnFootPos[1];
        sync.fTarget[2] = pPlayer->pPlayerData->fOnFootPos[2];
    
        sync.fCenter[0] = 0.0;
        sync.fCenter[1] = 0.0;
        sync.fCenter[2] = 0.5;
    
        sync.byteWeaponID = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
    
        sync.byteType = 1;
    
        BitStream BulletSync;
        BulletSync.Write((BYTE)PacketEnumeration::ID_BULLET_SYNC);
        BulletSync.Write( ( PCHAR ) &sync, sizeof( stBulletData ) );
        SF->getRakNet()->SendPacket( &BulletSync );
    }
    P.S. Функция сама проверяет существует игрок или нет
     
    #3 By_Surse, 1 янв 2016
    Последнее редактирование: 9 янв 2016
  4. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Функция отправляет фейк позицию игрока с помощью синхры
    Использование: OnFootSync(X,Y,Z); [X,Y,Z - Координаты для отправки]
    void OnFootSync(float CX,float CY,float CZ)
    {
        stOnFootData OF;
        memset( &OF, 0, sizeof( stOnFootData ) );
        OF.fPosition[0] = CX;
        OF.fPosition[1] = CY;
        OF.fPosition[2] = CZ;
        BitStream OFsync;
        OFsync.Write( ( BYTE ) ID_PLAYER_SYNC );
        OFsync.Write( ( PCHAR ) &OF, sizeof( stOnFootData ) );
        SF->getRakNet()->SendPacket( &OFsync );
    }
     
    #4 By_Surse, 8 янв 2016
    Последнее редактирование: 9 янв 2016
  5. Gabriel__

    Проверенный

    Регистрация:
    23 июн 2015
    Сообщения:
    419
    Симпатии:
    206
    Функция телепортирует игрока в определенную точку.
    
    void actor_teleport(float x, float y, float z)
    {
        actor_info *self = SF->getGame()->actorInfoGet(ACTOR_SELF, ACTOR_ALIVE);
        self->base.matrix[4 * 3] = x;
        self->base.matrix[4 * 3 + 1] = y;
        self->base.matrix[4 * 3 + 2] = z;
    }
     
    ishi нравится это.
  6. legend2360

    legend2360    ¯\_(°□°)_/¯
    not-set

    Регистрация:
    23 мар 2013
    Сообщения:
    2.573
    Симпатии:
    1.561
    #include "game_api\game_api.h"
    PEDSELF->Teleport(x, y, z);
     
    ZKelo, sire_like_official, Gabriel__ и ещё 1-му нравится это.
  7. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26 окт 2013
    Сообщения:
    3.179
    Симпатии:
    3.086
    bool Driving(int PlayerID)
    {
        if (PlayerID == ACTOR_SELF) PlayerID = SF->getSAMP()->getPlayers()->sLocalPlayerID;
        int state;
        if (PlayerID == SF->getSAMP()->getPlayers()->sLocalPlayerID)
            state = SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->state;
        else
            state = SF->getSAMP()->getPlayers()->pRemotePlayer[PlayerID]->pPlayerData->pSAMP_Actor->pGTA_Ped->state;
        if (state == 50)
            return true;
        else
            return false;
    };
    bool isDriver(int PlayerID)
    {
        if (PlayerID == ACTOR_SELF) PlayerID = SF->getSAMP()->getPlayers()->sLocalPlayerID;
        if (PlayerID == SF->getSAMP()->getPlayers()->sLocalPlayerID)
        {
            if (SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->state == 50)
                if (SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->passengers[0] == SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped)
                    return true;
        }
        else
        {
            if (SF->getSAMP()->getPlayers()->pRemotePlayer[PlayerID]->pPlayerData->pSAMP_Actor->pGTA_Ped->state == 50)
                if (SF->getSAMP()->getPlayers()->pRemotePlayer[PlayerID]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->passengers[0] == SF->getSAMP()->getPlayers()->pRemotePlayer[PlayerID]->pPlayerData->pSAMP_Actor->pGTA_Ped)
                    return true;
        }
        return false;
    };
    float getSkill(int weaponId)
    {
        float Skill = 1000.0f;
        if ((weaponId >= 22) && (weaponId <= 32))
        {
            if (weaponId == 32)
                weaponId -= 4;
            Skill = *(float*)((weaponId - 22) * 4 + 0xB79494);
        }
        return Skill / 10.0f;
    };
        bool IsOnScreen(DWORD OBJECT)
        {
            DWORD dwFunc = FUNC_IsVisible;
            DWORD dwThis = (DWORD)SF->getSAMP()->getInfo()->pPools->pObject->object[OBJECT]->pGTAEntity;
            bool bReturn = false;
            _asm
            {
                mov        ecx, dwThis
                    call    dwFunc
                    mov        bReturn, al
            }
            return bReturn;
        }
     
    By_Surse, Rorian и Gabriel__ нравится это.
  8. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Телепортирует машину игрока
    void VehTP(float x, float y, float z)
    {
        actor_info *self = SF->getGame()->actorInfoGet(VEHICLE_SELF, VEHICLE_ALIVE);
        self->vehicle->base.matrix[4 * 3] = x;
        self->vehicle->base.matrix[4 * 3 + 1] = y;
        self->vehicle->base.matrix[4 * 3 + 2] = z;
    }
     
  9. legend2360

    legend2360    ¯\_(°□°)_/¯
    not-set

    Регистрация:
    23 мар 2013
    Сообщения:
    2.573
    Симпатии:
    1.561
    PEDSELF->GetVehicle()->SetPosition(&CVector(0.0f, 0.0f, 0.0f));
    PEDSELF->GetVehicle()->Teleport(0.0f, 0.0f, 0.0f);
     
  10. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Телепорт по метке!
    
    void mapMenuTeleport ( void )
    {
        if ( (*(int *)0xBA6774 != 0) )
        {
            // ty to Racer_S for this
            float    mapPos[3];
            for ( int i = 0; i < (0xAF * 0x28); i += 0x28 )
            {
                if ( *(short *)(0xBA873D + i) == 4611 )
                {
                    float    *pos = (float *)( 0xBA86F8 + 0x28 + i );
                    mapPos[0] = *pos;
                    mapPos[1] = *( pos + 1 );
                    mapPos[2] = GAME->GetWorld()->FindGroundZForPosition(pos[0], pos[1]) + 2.0f;
                    PEDSELF->Teleport(mapPos[0], mapPos[1], mapPos[2]);
                }
            }
        }
    }
    
     
    #10 By_Surse, 29 фев 2016
    Последнее редактирование модератором: 7 мар 2016
    atiZZZ нравится это.
  11. AWRage

    AWRage Друг форума

    Регистрация:
    10 июл 2015
    Сообщения:
    645
    Симпатии:
    192
    Я думаю, по названиям функций понятно.

    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;
    }
     
  12. Dark_Knight

    Dark_Knight Режим чтения

    Регистрация:
    18 мар 2013
    Сообщения:
    3.364
    Симпатии:
    1.678
    int GetWantedLevel()
    {
    return *(DWORD*)0x58DB60;
    }
    Там байт храниться.
    Так же это всё можно найти в пЛокалПлеер.
     
    AWRage нравится это.
  13. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Получает разрешение экрана.
    Вызов: POINT Screen = get_screen_resolution();
    POINT get_screen_resolution()
    {
        POINT pos;
        pos.x = *(int*)0xC9C040;
        pos.y = *(int*)0xC9C044;
        return pos;
    }
     
  14. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    256
    Симпатии:
    254
    Выдача оружия через эмуляцию RPC
    void emulateRPC_giveweapon(uint32_t weapon_id, uint32_t ammo)
    {
        BitStream bsClass;
        bsClass.Write(uint32_t(weapon_id)); // WeaponID
        bsClass.Write(uint32_t(ammo)); // Ammo
        SF->getRakNet()->emulateRecvRPC(22, &bsClass);
    }
    Смена скина через эмуляцию RPC
    void emulateRPC_setskin(uint32_t player_id, uint32_t skin_id)
    {
        BitStream bsClass;
        bsClass.Write(uint32_t(player_id));
        bsClass.Write(uint32_t(skin_id));
        SF->getRakNet()->emulateRecvRPC(153, &bsClass);
    }
    Отправка фейковой позиции...
    void send_onfootdata(float x, float y, float z)
    {
        if (BS->getPlugin()->actor_driving(-1)) return;
    
        BitStream bsOnfootSync;
        stOnFootData ofSync;
        memset(&ofSync, 0, sizeof(stOnFootData));
    
        ofSync.byteArmor = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.byteArmor;
        ofSync.byteCurrentWeapon = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.byteCurrentWeapon;
        ofSync.byteHealth = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.byteHealth;
        ofSync.byteSpecialAction = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.byteSpecialAction;
        ofSync.fMoveSpeed[0] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fMoveSpeed[0];
        ofSync.fMoveSpeed[1] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fMoveSpeed[1];
        ofSync.fMoveSpeed[2] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fMoveSpeed[2];
        ofSync.fPosition[0] = x;
        ofSync.fPosition[1] = y;
        ofSync.fPosition[2] = z;
        ofSync.fQuaternion[0] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fQuaternion[0];
        ofSync.fQuaternion[1] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fQuaternion[1];
        ofSync.fQuaternion[2] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fQuaternion[2];
        ofSync.fQuaternion[3] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fQuaternion[3];
        ofSync.fSurfingOffsets[0] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fSurfingOffsets[0];
        ofSync.fSurfingOffsets[1] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fSurfingOffsets[1];
        ofSync.fSurfingOffsets[2] = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.fSurfingOffsets[2];
        ofSync.sAnimFlags = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sAnimFlags;
        ofSync.sCurrentAnimationID = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sCurrentAnimationID;
        ofSync.sKeys = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sKeys;
        ofSync.sLeftRightKeys = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sLeftRightKeys;
        ofSync.sSurfingVehicleID = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sSurfingVehicleID;
        ofSync.stSampKeys = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.stSampKeys;
        ofSync.sUpDownKeys = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sUpDownKeys;
    
        bsOnfootSync.Write((BYTE)ID_PLAYER_SYNC);
        bsOnfootSync.Write((PCHAR)&ofSync, sizeof(stOnFootData));
        SF->getRakNet()->SendPacket(&bsOnfootSync);
    }
    Фейк смерть от игрока
    void send_death(uint16_t player_id, uint8_t weapon)
    {
        BitStream bsDeath;
        bsDeath.Write(weapon);
        bsDeath.Write(player_id);
        SF->getRakNet()->SendRPC(RPC_Death, &bsDeath);
    }
     
    Dydaev нравится это.
  15. iAmerican

    Проверенный

    Регистрация:
    17 фев 2014
    Сообщения:
    518
    Симпатии:
    183
    Возвращает ID игрока , на заданном радиусе от прицела.

    void CalcScreenCoors(D3DXVECTOR3 *vecWorld, D3DXVECTOR3 *vecScreen)
    {
    
        D3DXMATRIX    m((float *)(0xB6FA2C));
        DWORD        *dwLenX = (DWORD *)(0xC17044);
        DWORD        *dwLenY = (DWORD *)(0xC17048);
    
        vecScreen->x = (vecWorld->z * m._31) + (vecWorld->y * m._21) + (vecWorld->x * m._11) + m._41;
        vecScreen->y = (vecWorld->z * m._32) + (vecWorld->y * m._22) + (vecWorld->x * m._12) + m._42;
        vecScreen->z = (vecWorld->z * m._33) + (vecWorld->y * m._23) + (vecWorld->x * m._13) + m._43;
    
        double    fRecip = (double)1.0 / vecScreen->z;
        vecScreen->x *= (float)(fRecip * (*dwLenX));
        vecScreen->y *= (float)(fRecip * (*dwLenY));
    }
    
    int GetPlayerTarget(int radius)
    {
        static int iX;
        static int iY;
        for (int i = 0; i < SAMP_MAX_PLAYERS; i++)
        {
            if (SF->getSAMP()->getPlayers()->iIsListed[i] != 1)
                continue;
            if (SF->getSAMP()->getPlayers()->pRemotePlayer[i] == NULL)
                continue;
    
            if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData == NULL || SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor == NULL)
                continue;
    
            D3DXVECTOR3 vecPos;
            vecPos.x = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped->base.matrix[12];
            vecPos.y = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped->base.matrix[13];
            vecPos.z = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped->base.matrix[14];
    
            D3DXVECTOR3 screenPos;
            CalcScreenCoors(&vecPos, &screenPos);
            if (screenPos.z < 1.f)
                continue;
      
                iX = GetSystemMetrics(SM_CXSCREEN) * 0.5299999714f;
                iY = GetSystemMetrics(SM_CYSCREEN) * 0.4f;
    
      
    
            if ((screenPos.x >iX + (radius )) || (screenPos.y > iY + (radius )) || (screenPos.x < iX - (radius )) || (screenPos.y < iY - (radius )))
                continue;
    
            return i;
        }
    
        return -1;
    }
    Использование :

    
    
    static int iID = -1;
    
    iID = GetPlayerTarget(50)
    
    
     
    ufdhbi, CleanLegend и equus нравится это.
  16. Dark_Knight

    Dark_Knight Режим чтения

    Регистрация:
    18 мар 2013
    Сообщения:
    3.364
    Симпатии:
    1.678
    Ты идиот.
    
    bool OnMouseHover(float x, float y, float w, float h) {
        POINT MousePosition = SF->getGame()->getCursorPos();
        return(MousePosition.x >= x && MousePosition.x <= x + w && MousePosition.y >= y && MousePosition.y <= y + h);
    };
     
  17. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    259
    Симпатии:
    306
    3D круг с этой темы - https://blast.hk/threads/25508/

    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];
        }
    }
    пример использования:
    krug3d(X, Y, Z, 3, 0xFF00FF00);
    [​IMG]
    [​IMG]
     
    #17 CleanLegend, 23 окт 2018
    Последнее редактирование: 23 окт 2018
    CatKnight нравится это.
  18. Rzeźnik

    Проверенный

    Регистрация:
    13 мар 2016
    Сообщения:
    182
    Симпатии:
    147
    Эмулирует анимацию стана как при попадании пули в скин.
    Полезно для разработчиков сайлент аимов
    
    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));
        }
    }
    
    Пример:
    EmulateStunShot(228, 24, 42);
    Рассчитывает кватернион поворота к указанному игроку.
    
    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);
    }
    
    Пример:
    
    RotateMeToPlayer(228); // Использовать в хуке онфут даты с блокировкой оригинальной синхры.
    
     
    #18 Rzeźnik, 24 окт 2018
    Последнее редактирование: 24 окт 2018
    Revalto и CleanLegend нравится это.
  19. Rzeźnik

    Проверенный

    Регистрация:
    13 мар 2016
    Сообщения:
    182
    Симпатии:
    147
    Рассчитывет вектор прицеливания камеры к скину указанного игрока, кроме обхода античита на сайлент аим это необходимо для прострела стен на 0.3.7.
    Это потому что далеко не на всех серверах система урона синхрит дамаг обязательно через RPC_GiveTakeDamage
    
    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);
    }
    
    Пример:
    
    AimVectorToPlayer(228); // Использовать в хуке ID_AIM_SYNC с блокировкой оригинального пакета.
    
    Кастомная функция расчёта урона для текущего оружия в руках.
    Та что с мта классов выдаёт почему-то не валидные значения, моя функция умеет выдавать рандомно валидный урон дробовиков с которых любят палить сайлент аим всякие античиты по типу веапон конфига.
    
    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;
    }
    
    Пример:
    
    float WeaponDamage = GetDamage();
    
    Рассчитывает валидный разброс к рандомной части тела и выдаёт валидный бодипарт для RPC_GiveDamage
    Можно использовать для поражения целей внутри транспортных средств почти не трогая сам транспорт либо для раздачи хэдшотов.
    
    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;
    }
    
    Пример:
    
    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
    }
    
    Подмена цели с зелёного треугольника над головой
    
    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;
    }
    
    Пример:
    
    SendFakeWeaponData(228); // Использовать в хуке ID_WEAPONS_UPDATE с блокировкой оригинального пакета
    
    Перезаписывает трассеры пуль в скин указанного игрока, полезно для сайлент аимов чтобы не палится на видеозаписях попадая в стенку.
    
    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);
    }
    
    Пример использования:
    
    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;
        }
    }
    
     
    CleanLegend нравится это.
  20. Rjx13

    Rjx13 Постоянный участник

    Регистрация:
    2 июн 2018
    Сообщения:
    58
    Симпатии:
    23
    В дополнение. Получение уровня усталости

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