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

LaRossa

Потрачен
429
117
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как проверить, что определённый игрок афк?
 

jenekbueno

Известный
157
69
не помогло)

upd:
логично что крашит, ведь изначально numberOfBitsOfData до перезаписи меньше из за длины строки, а если длина строки больше, то и размер больше будет, поэтому и крашит.
просто перезаписывать не получается, крашит, хз шо делать вот
 
Последнее редактирование:

-raymond-

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

C++:
void BulletData(float aimHit[3], float bodyPos[3], float hitPos[3], BYTE hitType, uint16_t id)
{
    stBulletData sync;
    ZeroMemory(&sync, sizeof(stBulletData));

    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.byteType = hitType;
    sync.sTargetID = id;

    sync.byteWeaponID = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;

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

ЯedЯuM

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

C++:
void BulletData(float aimHit[3], float bodyPos[3], float hitPos[3], BYTE hitType, uint16_t id)
{
    stBulletData sync;
    ZeroMemory(&sync, sizeof(stBulletData));

    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.byteType = hitType;
    sync.sTargetID = id;

    sync.byteWeaponID = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;

    BitStream BulletSync;
    BulletSync.Write((BYTE)PacketEnumeration::ID_BULLET_SYNC);
    BulletSync.Write((PCHAR)&sync, sizeof(stBulletData));
    SF->getRakNet()->SendPacket(&BulletSync);
    UpdateAmmo();
}
Перед этим тебе необходимо отправить аим синхру
C++:
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 = ASF->getSAMP()->getPlayers()->pLocalPlayer->aimData;
    actor_info* actorInfo = ASF->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));
    ASF->getRakNet()->SendPacket(&bs);
}
 

-raymond-

Известный
110
9
Перед этим тебе необходимо отправить аим синхру
C++:
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 = ASF->getSAMP()->getPlayers()->pLocalPlayer->aimData;
    actor_info* actorInfo = ASF->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));
    ASF->getRakNet()->SendPacket(&bs);
}
Поставил, все равно нет попадания свозь стену
 

-raymond-

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

CleanLegend

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

Musaigen

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

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

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как можно получить 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);
}