Получение 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);
}
Ясен трясен, во-первых тебе нужно sync.fOrigin[2] = aimHit[2]; рандомить немного чтобы античит на сало не выебалпуля не отправляется через стену
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); }
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);
}
Исправь первый параметр на falseпуля не отправляется через стену
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]
а как зарандомить aimhit[2]?
int a = 1 + rand() % 100;
float r_float; // 0.00 to 1.00
r_float = a / 100.0;
как получить координату определенной кости игрока?
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);
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);
}
Функция AimVectorToPlayer направляет синхру прицеливания в сторону игрока, по другому сервер не может проверять, так что этого достаточнов общем, узнал что на сервере такое условие
если камера смотрит больше чем на два метра от точки попадания пули, то кик
так вот, как мне направить камеру именно в те координаты куда должна попасть пуля
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); }
Ну так возьми координаты кости к которой у тебя высчитывает разброся отправляю синхру на координаты игрока, а не на те координаты куда попадет пуля, поэтому меня кикает, потому что условие в античите такое
просто мне нужно узнать в какие координаты попадет пуля
У тебя есть функа для отправки вектора, просто вместо координат педа поставь туда от коститак я получу кординаты кости относительно игрока, и как мне их реализовать в аим синхре?