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

-raymond-

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

jenekbueno

Известный
157
69
в собейте, во входящих рпц, в частности RPC_ClientMessage при попытке перезаписать битстрим - краш, как я понял если длина новой строки больше чем старой, то поэтому крашит, в сф траблов не было с этим, кто понимает в чем проблема, помогите
 

Roger571

Известный
58
31
в собейте, во входящих рпц, в частности RPC_ClientMessage при попытке перезаписать битстрим - краш, как я понял если длина новой строки больше чем старой, то поэтому крашит, в сф траблов не было с этим, кто понимает в чем проблема, помогите
ClientMessage
Нужно записывать не только самому строку, но и ее новую длину dwStrLen (strlen)
 

jenekbueno

Известный
157
69
да неужели?) я как будто бы незнал)

upload_2018-10-20_10-4-53.png
 

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

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 в прошлое положение?