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

ЯedЯuM

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

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

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


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
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как получить координату определенной кости игрока?
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

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

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
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я отправляю синхру на координаты игрока, а не на те координаты куда попадет пуля, поэтому меня кикает, потому что условие в античите такое
просто мне нужно узнать в какие координаты попадет пуля
Ну так возьми координаты кости к которой у тебя высчитывает разброс
 

-raymond-

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

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
так я получу кординаты кости относительно игрока, и как мне их реализовать в аим синхре?
У тебя есть функа для отправки вектора, просто вместо координат педа поставь туда от кости
 

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как установить метку на карте по координатам
C++:
if ((*(int *)0xBA6774 != 0))
        {
            for (int i = 0; i < (0xAF * 0x28); i += 0x28)
            {
                if (*(short *)(0xBA873D + i) == 4611)
                {
                    float *pos = (float *)(0xBA86F8 + 0x28 + i);
                    pos[0] = 1000.0f; // X
                    pos[1] = 1000.0f; // Y
                }
            }
        }