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

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

  1. By_Surse

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Пишем сюда полезные функции !
     
    #1 By_Surse, 1 янв 2016
    Последнее редактирование модератором: 17 май 2019
  2. By_Surse

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Функция телепортирует игрока в машине
    Использование: 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

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Функция отправляет пулю в указанного игрока
    Использование: 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

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Функция отправляет фейк позицию игрока с помощью синхры
    Использование: 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
    madrasso нравится это.
  5. Gabriel__

    Проверенный

    Регистрация:
    23 июн 2015
    Сообщения:
    414
    Симпатии:
    211
    Функция телепортирует игрока в определенную точку.
    
    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 Up to June 2019
    not-set

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

    SR_team BH Team
    BH Team

    Регистрация:
    26 окт 2013
    Сообщения:
    3.199
    Симпатии:
    3.206
    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;
        }
     
    SiTrak, By_Surse, Rorian и ещё 1-му нравится это.
  8. By_Surse

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Телепортирует машину игрока
    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 Up to June 2019
    not-set

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

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Телепорт по метке!
    
    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
    Сообщения:
    644
    Симпатии:
    195
    Я думаю, по названиям функций понятно.

    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.358
    Симпатии:
    1.694
    int GetWantedLevel()
    {
    return *(DWORD*)0x58DB60;
    }
    Там байт храниться.
    Так же это всё можно найти в пЛокалПлеер.
     
    AWRage нравится это.
  13. By_Surse

    By_Surse Свой человек

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

    By_Surse Свой человек

    Регистрация:
    6 июл 2015
    Сообщения:
    306
    Симпатии:
    280
    Выдача оружия через эмуляцию 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
    Сообщения:
    574
    Симпатии:
    237
    Возвращает 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)
    
    
     
    Azller Lollison, ufdhbi, CleanLegend и ещё 1-му нравится это.
  16. Dark_Knight

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

    Регистрация:
    18 мар 2013
    Сообщения:
    3.358
    Симпатии:
    1.694
    Ты идиот.
    
    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
    Сообщения:
    314
    Симпатии:
    591
    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
    Mozze.cpp и CatKnight нравится это.
  18. ЯedЯuM

    ЯedЯuM Malware Maker

    Регистрация:
    13 мар 2016
    Сообщения:
    282
    Симпатии:
    292
    Эмулирует анимацию стана как при попадании пули в скин.
    Полезно для разработчиков сайлент аимов
    
    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 ЯedЯuM, 24 окт 2018
    Последнее редактирование: 24 окт 2018
    Revalto и CleanLegend нравится это.
  19. ЯedЯuM

    ЯedЯuM Malware Maker

    Регистрация:
    13 мар 2016
    Сообщения:
    282
    Симпатии:
    292
    Рассчитывет вектор прицеливания камеры к скину указанного игрока, кроме обхода античита на сайлент аим это необходимо для прострела стен на 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

    Проверенный

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

    int GetSprintLevel()
    {
        float sprintLocalPlayer = *(float*)0xB7CDB4;
        return (sprintLocalPlayer / 31.47000244 + 4.78) / 1.040;
    }
     
    Mozze.cpp нравится это.
  21. f0Re3t

    f0Re3t #u3_HeDP_DHa
    Проверенный

    Регистрация:
    16 апр 2017
    Сообщения:
    401
    Симпатии:
    257
    Функция разбивает расстояние между 2 векторами на кучу векторов с некоторым шагом.
    Использование: split(float x0, float y0, float z0, float x1, float y1, float z1, float step)
    x0, y0, z0 - начальные координаты (первый вектор)
    x1, y1, z1 - конечные координаты (второй вектор)
    step - шаг, с которым будет поделено расстояние между векторами.
    Возвращает вектор с разбитым расстоянием.
    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;
    }
     
    Rinat_Namazov, Rjx13 и CleanLegend нравится это.
  22. ЯedЯuM

    ЯedЯuM Malware Maker

    Регистрация:
    13 мар 2016
    Сообщения:
    282
    Симпатии:
    292
    Намного удобнее и больше функционала https://blast.hk/threads/13855/
     
    Rjx13 и Stiopko нравится это.
  23. CleanLegend

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

    Регистрация:
    28 мар 2013
    Сообщения:
    314
    Симпатии:
    591
    Полезные функции для работы с памятью:

    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);
    }
    void nop_(PVOID address, int bytes) {
        DWORD NewProtection;
        VirtualProtect(address, bytes, PAGE_EXECUTE_READWRITE, &NewProtection);
        memset(address, 0x90, bytes);
        VirtualProtect(address, bytes, NewProtection, &NewProtection);
    }
    пример:

    WriteMemory((void*)0x004BA3B9, (uint8_t *)"\xE9\xA7\x03\x00\x00", 5); // адрес в котором будем изменять память, какие байты пойдут туда, размер(количество байт)
    
    nop_((void*)(0x004BA3B9), 1); адрес, количество нопов
     
    #23 CleanLegend, 28 мар 2019
    Последнее редактирование: 28 мар 2019
    Mozze.cpp, checkdasound, cakebou и 2 другим нравится это.
  24. iAmerican

    Друг

    Регистрация:
    17 фев 2014
    Сообщения:
    574
    Симпатии:
    237
    
    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 .

    Пример :

    int iA = 1;
    float fA = 2.0;
    std::string sA = "privet";
    
    std::string myVar = formatString("int : %i , float : %f , string : %s",iA,fA,sA);
     
    cakebou, SiTrak, Mozze.cpp и ещё 1-му нравится это.
  25. Rjx13

    Проверенный

    Регистрация:
    2 июн 2018
    Сообщения:
    155
    Симпатии:
    87
    Включение/выключение рендера чата и клавиш "T", "F6":
    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:
    #pragma execution_character_set("utf-8")
     
    _=Gigant=_, Revalto, cakebou и ещё 1-му нравится это.
  26. Mozze.cpp

    Mozze.cpp Нахуй эти шарпы, у меня есть плюсы.
    Проверенный

    Регистрация:
    18 фев 2017
    Сообщения:
    233
    Симпатии:
    116
    Получает скорость машины по её ID
    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;
        }
    }
     
    Rjx13 и CleanLegend нравится это.
  27. cakebou

    cakebou Знающий

    Регистрация:
    4 апр 2017
    Сообщения:
    249
    Симпатии:
    40
    Преобразование RGBA в ImVec4
    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
    #define RGBA_TO_FLOAT(r,g,b,a) (float)r/255.0f, (float)g/255.0f, (float)b/255.0f, (float)a/255.0f
     
    _=Gigant=_, Mozze.cpp, Rjx13 и 2 другим нравится это.
  28. cakebou

    cakebou Знающий

    Регистрация:
    4 апр 2017
    Сообщения:
    249
    Симпатии:
    40
    Возвращает дистанцию между двумя экранными точками
    inline float GetDistance2D(float* first_operand, float* two_operand)
    {
        return sqrt((two_operand[0] - first_operand[0]) * (two_operand[0] - first_operand[0])
            + (two_operand[1] - first_operand[1]) * (two_operand[1] - first_operand[1]));
    }
     
  29. Mozze.cpp

    Mozze.cpp Нахуй эти шарпы, у меня есть плюсы.
    Проверенный

    Регистрация:
    18 фев 2017
    Сообщения:
    233
    Симпатии:
    116
    Возвращает позицию кости по ID игрока.
    GetBonePos(ID, eBone, TRUE);
    GetBonePos(ID, eBone, FALSE);
    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);
        }
    }
     
    cakebou нравится это.
  30. Mozze.cpp

    Mozze.cpp Нахуй эти шарпы, у меня есть плюсы.
    Проверенный

    Регистрация:
    18 фев 2017
    Сообщения:
    233
    Симпатии:
    116
    Получение позиции радара.
    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]);
    }

    Получение размера радара.
    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 = Локальный игрок.

    [/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]
    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 = Машина локального игрока.

    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" }
    };
    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];
        }
    }
     
    #30 Mozze.cpp, 17 май 2019
    Последнее редактирование: 17 май 2019
    cakebou и CleanLegend нравится это.
  31. cakebou

    cakebou Знающий

    Регистрация:
    4 апр 2017
    Сообщения:
    249
    Симпатии:
    40
    Длина вектор
    float VectorLength( const Vector4D& v ) {
            return sqrt( v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w );
        }
     
    Mozze.cpp нравится это.
  32. cakebou

    cakebou Знающий

    Регистрация:
    4 апр 2017
    Сообщения:
    249
    Симпатии:
    40
    Текст внизу экрана без эмуляции опкода из CLEO
    #define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
    
    void AddMessageJumpQ(char *text, unsigned int time, unsigned short flag, bool bPreviousBrief)
    {
        ((void(__cdecl *)(char *, unsigned int, unsigned short, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
    }
     
  33. Mozze.cpp

    Mozze.cpp Нахуй эти шарпы, у меня есть плюсы.
    Проверенный

    Регистрация:
    18 фев 2017
    Сообщения:
    233
    Симпатии:
    116
    GAME->GetHud()->SetHelpMessage(CHAR* String);
    GAME->GetHud()->SetBigMessage(CHAR* String);
     
  34. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    80
    Симпатии:
    58
    const char* getPlayerWeapon(int iPlayerID)
    {
        if (g_Players == NULL || iPlayerID < 0 || iPlayerID > SAMP_MAX_PLAYERS)
            return NULL;
    
        if (iPlayerID < 0 || iPlayerID > SAMP_MAX_PLAYERS)
            return NULL;
    
        if (g_Players->pRemotePlayer[iPlayerID] == NULL)
            return NULL;
    
        if (g_Players->pRemotePlayer[iPlayerID]->pPlayerData == NULL)
            return NULL;
    
        for (int wep = 0; weapon_list[wep].name != nullptr; wep++)
        {
            const struct weapon_entry *weapon = &weapon_list[wep];
    
            if (weapon->id == g_Players->pRemotePlayer[iPlayerID]->pPlayerData->onFootData.byteCurrentWeapon)
            {
                return weapon->name;
            }
        }
        return NULL;
    }
    here if someone need to get current player weapon name
    usage: ("%s", getPlayerWeapon(playerid));

    Target Selector with multiple options for samp

    void renderTargetSelector(int PlayerID, byte BONE_ID_BOX, byte BONE_ID_TARGET, byte BONE_ID_MY, byte HP_BAR_BONE, float box_width, float box_add_x_pos, float box_height, float box_add_y_pos
        , bool DrawLine, bool DrawBox, bool bShowTargetPos, int pos_text_add_x, int pos_text_add_y, bool AddHealthBar, bool bShowHPValue, float hp_bar_width, float hp_bar_height
        , bool bCopyTargetRotation, bool bFollowTarget
        , D3DCOLOR COLOR_HP_BAR, D3DCOLOR COLOR_POS_TEXT, D3DCOLOR COLOR_SAME, D3DCOLOR COLOR_BOX, D3DCOLOR COLOR_LINE
        , bool bUseSameColors, bool bUseTargetColor, bool bUseCustomColors)
    {
        traceLastFunc("renderTargetSelector()");
    
        if (cheat_state->_generic.cheat_panic_enabled)
            return;
    
        if (!pGameInterface)
            return;
    
        if (!g_dwSAMP_Addr || !g_SAMP || !g_Players)
            return;
    
        if (gta_menu_active())
            return;
    
        actor_info * me = actor_info_get(ACTOR_SELF, NULL);
        actor_info * target = getGTAPedFromSAMPPlayerID(PlayerID);
    
        if (!me)
            return;
    
        if (!target)
            return;
    
        CPed *pPedTarget = pGameInterface->GetPools()->GetPed((DWORD*)target);
        CPed *pPedSelf = pGameInterface->GetPools()->GetPed((DWORD*)me);
    
        D3DXVECTOR3 box_get_vec, target_vec_box_set, target_pos_get, render_pos, hp_bar_check, hp_bar_render;
        CVector target_bone_for_box_vec = GetBonePosition(PlayerID, BONE_ID_BOX);
        CVector target_mainbone_vec = GetBonePosition(PlayerID, BONE_ID_TARGET);
        CVector target_hpbar_bone_vec = GetBonePosition(PlayerID, HP_BAR_BONE); // hp bar set
        CVector my_bone_vec = GetBonePosition(ACTOR_SELF, BONE_ID_MY);
    
        float * f_pos = &target->base.matrix[4 * 3];
    
        box_get_vec.x = CVecToD3DXVEC(target_bone_for_box_vec).x;
        box_get_vec.y = CVecToD3DXVEC(target_bone_for_box_vec).y;
        box_get_vec.z = CVecToD3DXVEC(target_bone_for_box_vec).z;
        CalcScreenCoors(&box_get_vec, &target_vec_box_set);
    
        D3DCOLOR color_target = samp_color_get(PlayerID);
    
        if (render)
        {
    
            if (bShowTargetPos)
            {
                char print_pos[128];
                target_pos_get.x = f_pos[0];
                target_pos_get.y = f_pos[1];
                target_pos_get.z = f_pos[2];
                CalcScreenCoors(&target_pos_get, &render_pos);
    
                if (render_pos.z < 1.0f)
                {
                    sprintf(print_pos, "Pos X %0.02f Y %0.02f Z %0.02f", target_pos_get.x, target_pos_get.y, target_pos_get.z);
    
                    if (bUseSameColors)
                    {
                        pD3DFont_3DInformer->PrintShadow(render_pos.x + pos_text_add_x, render_pos.y + pos_text_add_y, COLOR_SAME, print_pos);
                    }
                    else if (bUseTargetColor)
                    {
                        pD3DFont_3DInformer->PrintShadow(render_pos.x + pos_text_add_x, render_pos.y + pos_text_add_y, color_target, print_pos);
                    }
                    else if (bUseCustomColors)
                    {
                        pD3DFont_3DInformer->PrintShadow(render_pos.x + pos_text_add_x, render_pos.y + pos_text_add_y, COLOR_POS_TEXT, print_pos);
                    }
                }
            }
    
            if (bUseSameColors)
            {
                if (DrawBox)
                    render->D3DBox(target_vec_box_set.x + box_add_x_pos, target_vec_box_set.y + box_add_y_pos, box_width, box_height, COLOR_SAME);
    
                if (DrawLine)
                    render->DrawLine(CVecToD3DXVEC(target_mainbone_vec), CVecToD3DXVEC(my_bone_vec), COLOR_SAME);
            }
            else if (bUseTargetColor)
            {
                if (DrawBox)
                    render->D3DBox(target_vec_box_set.x + box_add_x_pos, target_vec_box_set.y + box_add_y_pos, box_width, box_height, color_target);
    
                if (DrawLine)
                    render->DrawLine(CVecToD3DXVEC(target_mainbone_vec), CVecToD3DXVEC(my_bone_vec), color_target);
            }
            else if (bUseCustomColors)
            {
                if (DrawBox)
                    render->D3DBox(target_vec_box_set.x + box_add_x_pos, target_vec_box_set.y + box_add_y_pos, box_width, box_height, COLOR_BOX);
    
                if (DrawLine)
                    render->DrawLine(CVecToD3DXVEC(target_mainbone_vec), CVecToD3DXVEC(my_bone_vec), COLOR_LINE);
            }
    
            if (AddHealthBar)
            {
                hp_bar_check.x = CVecToD3DXVEC(target_hpbar_bone_vec).x;
                hp_bar_check.y = CVecToD3DXVEC(target_hpbar_bone_vec).y;
                hp_bar_check.z = CVecToD3DXVEC(target_hpbar_bone_vec).z;
                CalcScreenCoors(&hp_bar_check, &hp_bar_render);
    
                char hp_bar[128];
                float hp_bar_lenght = g_Players->pRemotePlayer[PlayerID]->pPlayerData->fActorHealth + hp_bar_width;
              
                if (bShowHPValue)
                    _snprintf_s(hp_bar, sizeof(hp_bar) - 1, "%u", g_Players->pRemotePlayer[PlayerID]->pPlayerData->onFootData.byteHealth);
    
                if (bUseCustomColors)
                {
                    render->D3DBox(hp_bar_render.x, hp_bar_render.y, hp_bar_lenght, hp_bar_height, COLOR_HP_BAR);
                    if(bShowHPValue)
                        pD3DFont_Nametags->PrintShadow(hp_bar_render.x + hp_bar_lenght, hp_bar_render.y, COLOR_HP_BAR, hp_bar);
                }
                else if (bUseTargetColor)
                {
                    render->D3DBox(hp_bar_render.x, hp_bar_render.y, hp_bar_lenght, hp_bar_height, color_target);
                    if (bShowHPValue)
                        pD3DFont_Nametags->PrintShadow(hp_bar_render.x + hp_bar_lenght, hp_bar_render.y, color_target, hp_bar);
                }
                else if (bUseSameColors)
                {
                    render->D3DBox(hp_bar_render.x, hp_bar_render.y, hp_bar_lenght, hp_bar_height, COLOR_SAME);
                    if (bShowHPValue)
                        pD3DFont_Nametags->PrintShadow(hp_bar_render.x + hp_bar_lenght, hp_bar_render.y, COLOR_SAME, hp_bar);
    
                }
            }
        }
    
        if (bCopyTargetRotation)
        {
            vect3_copy(&target->fCurrentRotation, &me->fCurrentRotation);
        }
    
        if (bFollowTarget)
        {
            float follow_pos_copy[3];
            vect3_copy(&target->base.matrix[4 * 3], follow_pos_copy);
    
            follow_pos_copy[2] -= 1.0f;
    
            cheat_actor_teleport(me, follow_pos_copy, gta_interior_id_get());
        }
    }
     
    Mozze.cpp нравится это.