// Raycast utilizando `setTicks` para gerenciar os ciclos
function performRaycast(start, end, flags = -1, ignoreEntity = 0) {
return new Promise((resolve) => {
const handle = StartShapeTestLosProbe(start.x, start.y, start.z, end.x, end.y, end.z, flags, ignoreEntity, 7);
// Usar ticks para verificar o resultado
const tick = setTick(() => {
const [ready, hit, hitPosition, normal, entityHit] = GetShapeTestResult(handle);
if (ready>1) {
clearTick(tick); // Para o loop de ticks quando o resultado estiver pronto
resolve({
hit,
hitPosition,
normal,
entityHit,
});
}else{
if(ready == 0){
console.error("handle " + handle + " inválido para o RayCast !")
clearTick(tick);
resolve({
hit,
});
}
}
});
});
}
// Uso no jogo
setTick(async () => {
const ped = PlayerPedId();
const [x, y, z] = GetEntityCoords(ped, true); // Coordenadas do Ped
const [fx, fy, fz] = GetEntityForwardVector(ped); // Vetor para onde o Ped está olhando
// Calcula as coordenadas na frente do Ped
const frenteX = x + fx * 10;
const frenteY = y + fy * 10;
const frenteZ = z + fz * 10;
// Define os vetores de início e fim do raycast
const start = { x: x, y: y, z: z };
const end = { x: frenteX, y: frenteY, z: frenteZ };
// Desenha uma linha para visualizar o raycast (apenas para fins de debug)
DrawLine(x,y, z, frenteX,frenteY, frenteZ, 255, 255,0,255);
// Faz o raycast
const raycastResult = await performRaycast(start, end);
// Verifica o resultado
if (raycastResult.hit) {
console.log('Objeto atingido:', raycastResult.entityHit);
console.log('Posição de impacto:', raycastResult.hitPosition);
console.log('Normal da superfície:', raycastResult.normal);
} else {
console.log('Nenhum objeto atingido.');
}
})
1: colisões com o mundo2: Veículos4: Pedestres8: Colisões com ped em ragdolls (O raycast detectará corpos animados ou personagens que estejam em estado de física (ragdoll), ou seja, em queda ou sem controle de movimento.).16: Objetos32: Colisões com água. 64: Colisões com vidro.128: Colisões com rios.256: Colisões com vegetação (foliage).-1: Qualquer colisãoPara testar múltiplos tipos, some o valor das flags escolhidas (exceto a flag -1).
0 para nenhum).2 se teste foi concluído com sucesso 0 caso ainda não esteja concuído o raycast(aguardar próximo frame), 1 se o HANLDE informado não existir.1 se houve colisão, 0 caso contrário.