Roger571
Известный
- 58
- 31
bits->Reset();
Как проверить, что определённый игрок афк?
// sf
if(SF->getSAMP()->getPlayers()->pRemotePlayer[ид игрока]->pPlayerData->iAFKState)
{
}
// собейт
if(g_Players->pRemotePlayer[ид игрока]->pPlayerData->iAFKState)
{
}
не помогло)bits->Reset();
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++: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(); }
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);
}
Поставил, все равно нет попадания свозь стенуПеред этим тебе необходимо отправить аим синхру
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); }
Полный код в студию, надеюсь ты рпц урона после пули не забыл?Поставил, все равно нет попадания свозь стену
можно в этой структуреКак проверить то что игрок стреляет?
SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->onFootData.stSampKeys.keys_primaryFire
g_Players->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->pedFlags.bFiringWeapon
Что мешает записывать в массив старый вектор перед отправкой?можешь скинуть код который будет возвращать aim sync в прошлое положение?
Получение samp vehicle ида по vehicle_infoКак можно получить id транспорта имея его vehicle_info?
И ещё, как проверить, то что игрок водит любую машину?
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;
}
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;
}
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);
}