Другое С/С++ Вопрос - Ответ

CleanLegend

Известный
Всефорумный модератор
477
935
Как проверить то что игрок стреляет?
можно в этой структуре
C++:
SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->onFootData.stSampKeys.keys_primaryFire
либо через эту структуру, но её нет в SF
C++:
g_Players->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->pedFlags.bFiringWeapon
еще можно через анимку
 
  • Нравится
Реакции: Musaigen

ЯedЯuM

Malware Maker
242
302
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Musaigen

abobusnik
Проверенный
1,607
1,365
Как можно получить id транспорта имея его vehicle_info?

И ещё, как проверить, то что игрок водит любую машину?
 
Последнее редактирование:

ЯedЯuM

Malware Maker
242
302
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как можно получить id транспорта имея его vehicle_info?

И ещё, как проверить, то что игрок водит любую машину?
Получение samp vehicle ида по vehicle_info
C++:
WORD GetVehicleIdFromStruct(vehicle_info *vif)
{
    if (vif == nullptr) return 65535;
    for (WORD v = 0; v < 2000; v++)
    {
        if (vif == SF->getSAMP()->getVehicles()->pGTA_Vehicle[v]) return v;
    }
    return 65535;
}
Проверка игрока на вождение
C++:
bool IsPlayerDriving(WORD playerId)
{
    if (!SF->getSAMP()->getPlayers()->iIsListed[playerId]) return false;
    if (SF->getSAMP()->getPlayers()->sLocalPlayerID == playerId)
    {

        if (SF->getGame()->getCurrentState() == CHEAT_STATE_VEHICLE &&
        (SF->getSAMP()->getVehicles()->iIsListed[SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID] &&
        SF->getSAMP()->getVehicles()->iIsListed2[SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID]))
        return true;
    }
    else
    {
        if (SF->getSAMP()->getPlayers()->pRemotePlayer[playerId]->pPlayerData->bytePlayerState == PLAYER_STATE_DRIVER)
        return true;
    }
    return false;
}
 
Последнее редактирование:
  • Нравится
Реакции: Musaigen

-raymond-

Известный
110
9
пуля не отправляется через стену

C++:
void BulletData(uint16_t id)
{
    stBulletData sync;
    ZeroMemory(&sync, sizeof(stBulletData));

    stRemotePlayer *pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[id];
    if (!pPlayer) return;

    float aimHit[3] = { PEDSELF->GetPosition()->fX, PEDSELF->GetPosition()->fY, PEDSELF->GetPosition()->fZ };
    float bodyPos[3] = { pPlayer->pPlayerData->fOnFootPos[0], pPlayer->pPlayerData->fOnFootPos[1], pPlayer->pPlayerData->fOnFootPos[2] };
    float hitPos[3] = { 0.0, 0.0, 0.5 };

    sync.fOrigin[0] = aimHit[0];
    sync.fOrigin[1] = aimHit[1];
    sync.fOrigin[2] = aimHit[2];
    sync.fTarget[0] = bodyPos[0];
    sync.fTarget[1] = bodyPos[1];
    sync.fTarget[2] = bodyPos[2];
    sync.fCenter[0] = hitPos[0];
    sync.fCenter[1] = hitPos[1];
    sync.fCenter[2] = hitPos[2];

    sync.byteWeaponID = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
    sync.byteType = 1;
    sync.sTargetID = id;

    BitStream BulletSync;
    BulletSync.Write((BYTE)PacketEnumeration::ID_BULLET_SYNC);
    BulletSync.Write((PCHAR)&sync, sizeof(stBulletData));
    SF->getRakNet()->SendPacket(&BulletSync);
    UpdateAmmo();
}

inline void SendTakeDamageRPC(uint32_t TargetID, unsigned int weapon_id, int damage)
{
    BitStream bs;
    bs.Write(true);
    bs.Write(TargetID);
    bs.Write((float)damage);
    bs.Write(weapon_id);
    bs.Write(3);
    SF->getRakNet()->SendRPC(RPCEnumeration::RPC_GiveTakeDamage, &bs);
}
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) // SAMP ID цели
{
    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);
}
void SendFakeParameters(int id)
{
    AimVectorToPlayer(id);
    BulletData(id);
    SendTakeDamageRPC(id, SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon, 11);
}
 

ЯedЯuM

Malware Maker
242
302
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
пуля не отправляется через стену

C++:
void BulletData(uint16_t id)
{
    stBulletData sync;
    ZeroMemory(&sync, sizeof(stBulletData));

    stRemotePlayer *pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[id];
    if (!pPlayer) return;

    float aimHit[3] = { PEDSELF->GetPosition()->fX, PEDSELF->GetPosition()->fY, PEDSELF->GetPosition()->fZ };
    float bodyPos[3] = { pPlayer->pPlayerData->fOnFootPos[0], pPlayer->pPlayerData->fOnFootPos[1], pPlayer->pPlayerData->fOnFootPos[2] };
    float hitPos[3] = { 0.0, 0.0, 0.5 };

    sync.fOrigin[0] = aimHit[0];
    sync.fOrigin[1] = aimHit[1];
    sync.fOrigin[2] = aimHit[2];
    sync.fTarget[0] = bodyPos[0];
    sync.fTarget[1] = bodyPos[1];
    sync.fTarget[2] = bodyPos[2];
    sync.fCenter[0] = hitPos[0];
    sync.fCenter[1] = hitPos[1];
    sync.fCenter[2] = hitPos[2];

    sync.byteWeaponID = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
    sync.byteType = 1;
    sync.sTargetID = id;

    BitStream BulletSync;
    BulletSync.Write((BYTE)PacketEnumeration::ID_BULLET_SYNC);
    BulletSync.Write((PCHAR)&sync, sizeof(stBulletData));
    SF->getRakNet()->SendPacket(&BulletSync);
    UpdateAmmo();
}

inline void SendTakeDamageRPC(uint32_t TargetID, unsigned int weapon_id, int damage)
{
    BitStream bs;
    bs.Write(true);
    bs.Write(TargetID);
    bs.Write((float)damage);
    bs.Write(weapon_id);
    bs.Write(3);
    SF->getRakNet()->SendRPC(RPCEnumeration::RPC_GiveTakeDamage, &bs);
}
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) // SAMP ID цели
{
    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);
}
void SendFakeParameters(int id)
{
    AimVectorToPlayer(id);
    BulletData(id);
    SendTakeDamageRPC(id, SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon, 11);
}
Ясен трясен, во-первых тебе нужно sync.fOrigin[2] = aimHit[2]; рандомить немного чтобы античит на сало не выебал
Во-вторых у тебя разброс не может быть таким - его спалит любой античит старый, зайди в тему SF полезные функции в этом же разделе, я там вылаживал свою функу расчёта валидного разброса до нужной части тела.
И к слову, ты получаешь пешую позицию жертвы но не проверяешь пешком ли она, если будет в тачке будут траблы, нужно и для тачки позицию брать если чел в каре
 
Последнее редактирование:

-raymond-

Известный
110
9
на сервере без античита все равно не проходит пуля через стену
а как зарандомить aimhit[2]?
C++:
void SendFakeParameters(int id)
{
    float TargetPos[3], Spread[3]; // В Spread будет записан рассчитаный разброс
    switch (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->bytePlayerState)
    {
    case PLAYER_STATE_ONFOOT:
        for (short x = 0; x < 3; x++)
            TargetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->fOnFootPos[x];
        break;
    case PLAYER_STATE_DRIVER:
        for (short x = 0; x < 3; x++)
            TargetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->inCarData.fPosition[x];
        break;
    case PLAYER_STATE_PASSENGER:
        for (short x = 0; x < 3; x++)
            TargetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->passengerData.fPosition[x];
        break;
    }
    byte BodyPart = CalculateSpreadOffset(id, TargetPos, Spread);

    AimVectorToPlayer(id);

    SendTakeDamageRPC(id, SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon, CalculateDamage(), BodyPart);
BulletData(id);
}
 

CleanLegend

Известный
Всефорумный модератор
477
935
пуля не отправляется через стену


inline void SendTakeDamageRPC(uint32_t TargetID, unsigned int weapon_id, int damage)
{
BitStream bs;
bs.Write(true);
bs.Write(TargetID);
bs.Write((float)damage);
bs.Write(weapon_id);
bs.Write(3);
SF->getRakNet()->SendRPC(RPCEnumeration::RPC_GiveTakeDamage, &bs);
}
[/code]
Исправь первый параметр на false
 

ЯedЯuM

Malware Maker
242
302
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как получить координату определенной кости игрока?
C++:
actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[идИгрока]->pPlayerData->pSAMP_Actor->pGTA_Ped;
if (actorInfo == nullptr) return;
CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
if (Ped == nullptr) return;
CVector bonePos;
Ped->GetTransformedBonePosition(BONE_RIGHTWRIST, &bonePos);
 

-raymond-

Известный
110
9
в общем, узнал что на сервере такое условие
если камера смотрит больше чем на два метра от точки попадания пули, то кик
так вот, как мне направить камеру именно в те координаты куда должна попасть пуля

C++:
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);
}
void SendFakeDamage(int id)
{
    float TargetPos[3], Spread[3];
    switch (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->bytePlayerState)
    {
    case PLAYER_STATE_ONFOOT:
        for (short x = 0; x < 3; x++)
            TargetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->fOnFootPos[x];
        break;
    case PLAYER_STATE_DRIVER:
        for (short x = 0; x < 3; x++)
            TargetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->inCarData.fPosition[x];
        break;
    case PLAYER_STATE_PASSENGER:
        for (short x = 0; x < 3; x++)
            TargetPos[x] = SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->passengerData.fPosition[x];
        break;
    }

    byte BodyPart = CalculateSpreadOffset(id, TargetPos, Spread);

    AimVectorToPlayer(id);
    BulletData(TargetPos, Spread, 1, id);
    SendTakeDamageRPC(id, SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon, 16.0, BodyPart);
}
 

CleanLegend

Известный
Всефорумный модератор
477
935
в общем, узнал что на сервере такое условие
если камера смотрит больше чем на два метра от точки попадания пули, то кик
так вот, как мне направить камеру именно в те координаты куда должна попасть пуля

C++:
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 направляет синхру прицеливания в сторону игрока, по другому сервер не может проверять, так что этого достаточно
 

-raymond-

Известный
110
9
я отправляю синхру на координаты игрока, а не на те координаты куда попадет пуля, поэтому меня кикает, потому что условие в античите такое
просто мне нужно узнать в какие координаты попадет пуля
 

ЯedЯuM

Malware Maker
242
302
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я отправляю синхру на координаты игрока, а не на те координаты куда попадет пуля, поэтому меня кикает, потому что условие в античите такое
просто мне нужно узнать в какие координаты попадет пуля
Ну так возьми координаты кости к которой у тебя высчитывает разброс