[Ajuda] Detectar вngulos em volta de veнculo
#1

Estou fazendo dois sistemas para meu server. Um й de estourar pneus ao atirar nos mesmos de um veнculo, mesmo sem ninguйm dentro, que ainda estб em fase de planejamento, e outro й o de explodir o veнculo atirando no tanque. Nгo me perguntem como eu sei como detectar cada tanque, nгo vou dizer. O que eu preciso saber й como descobrir se o jogador estб de frente para o lado em que o tanque estб. Vou ilustrar:



Para quem nгo entedeu minhas incrнveis habilidades no Paint: o retвngulo 'Car' й o carro, e a meia-lua й o raio de onde quero detectar se o player estб olhando.

Preciso descobrir como detectar se o jogador estб olhando/mirando naquela meia-lua A, para nгo poder acertar o tanque pelo farol, estando na frente do carro, por exemplo.
Reply
#2

Se entendi bem vocк quer verificar se o player estб virado pro lado do Tank, vocк poderia usar GetVehicleZAngle e GetPlayerFacingAngle, pra verificar por exemplo Veiculo virado a 180є o player deverб tar virado a -90є.
Enfim, acho que funciona desta maneira mas como implementar isso ao cуdigo й a questгo, boa sorte(como se eu acreditasse em sorte).
Reply
#3

Use a funзгo GetVehicleZAngle e GetPlayerFacingAngle para detectar o angulo do veнculo.
Por exemplo.: Veiculo - 180 Graus, Player - 90 Graus = Carro Explodido com tiro no tanque .

Crйditos.: Me and Josma_CMD .
Reply
#4

Isto deve ajudar:

PHP код:
stock IsPlayerAimingAt(playeridFloat:xFloat:yFloat:zFloat:radius
{
    new 
Float:camera_x,Float:camera_y,Float:camera_z,Float:vector_x,Float:vector_y,Float:vector_z;
    
GetPlayerCameraPos(playeridcamera_xcamera_ycamera_z);
    
GetPlayerCameraFrontVector(playeridvector_xvector_yvector_z);
    new 
Float:verticalFloat:horizontal;
    switch (
GetPlayerWeapon(playerid)) 
    {
        case 
34,35,36
        {
            if (
DistanceCameraTargetToLocation(camera_xcamera_ycamera_zxyzvector_xvector_yvector_z) < radius) return true;
            return 
false;
        }
        case 
30,31: {vertical 4.0horizontal = -1.6;}
        case 
33: {vertical 2.7horizontal = -1.0;}
        default: {
vertical 6.0horizontal = -2.2;}
    }
    new 
Float:angle GetPointAngleToPoint(00floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0;
    new 
Float:resize_xFloat:resize_yFloat:resize_z floatsin(angle+verticaldegrees);
    
GetXYInFrontOfPoint(resize_xresize_yGetPointAngleToPoint(00vector_xvector_y)+horizontalfloatcos(angle+verticaldegrees));
    if (
DistanceCameraTargetToLocation(camera_xcamera_ycamera_zxyzresize_xresize_yresize_z) < radius) return true;
    return 
false;
}
Float:DistanceCameraTargetToLocation(Float:CamXFloat:CamYFloat:CamZFloat:ObjXFloat:ObjYFloat:ObjZFloat:FrXFloat:FrYFloat:FrZ
{
    new 
Float:TGTDistance;
    
TGTDistance floatsqroot((CamX ObjX) * (CamX ObjX) + (CamY ObjY) * (CamY ObjY) + (CamZ ObjZ) * (CamZ ObjZ));
    new 
Float:tmpXFloat:tmpYFloat:tmpZ;
    
tmpX FrX TGTDistance CamX;
    
tmpY FrY TGTDistance CamY;
    
tmpZ FrZ TGTDistance CamZ;
    return 
floatsqroot((tmpX ObjX) * (tmpX ObjX) + (tmpY ObjY) * (tmpY ObjY) + (tmpZ ObjZ) * (tmpZ ObjZ));
}
stock Float:GetPointAngleToPoint(Float:x2Float:y2Float:XFloat:Y) {
    new 
Float:DXFloat:DY;
    new 
Float:angle;
    
DX floatabs(floatsub(x2,X));
    
DY floatabs(floatsub(y2,Y));
    if (
DY == 0.0 || DX == 0.0
    {
        if(
DY == && DX 0angle 0.0;
        else if(
DY == && DX 0angle 180.0;
        else if(
DY && DX == 0angle 90.0;
        else if(
DY && DX == 0angle 270.0;
        else if(
DY == && DX == 0angle 0.0;
    }
    else 
    {
        
angle atan(DX/DY);
        if(
x2 && <= y2angle += 90.0;
        else if(
<= x2 && y2angle floatsub(90.0angle);
        else if(
x2 && >= y2angle -= 90.0;
        else if(
>= x2 && y2angle floatsub(270.0angle);
    }
    return 
floatadd(angle90.0);
}
stock GetXYInFrontOfPoint(&Float:x, &Float:yFloat:angleFloat:distance
{
    
+= (distance floatsin(-angledegrees));
    
+= (distance floatcos(-angledegrees));

Reply
#5

Obrigado Shadow, mas creio que consegui. Jб utilizo essas funзхes. Qualquer coisa, volto a postar aqui.
Reply
#6

Espero que nгo seja double post porque nгo vi a hora do ъltimo post hehe

Eu usei as dicas de vocкs e tentei estabelecer uma relaзгo. Segundo Shickcard, se o carro estiver a 180 graus, o jogador tem que estar a 90 graus, ou seja, metade do вngulo do carro. Entгo, tentei estabelecer uma relaзгo fazendo o seguinte: peguei o вngulo do jogador e do carro e fiz uma verificaзгo. Se o вngulo do carro divido pelo вngulo do jogador for igual a 2, seria porque o tanque estaria no campo de visгo do jogador, possibilitando a explosгo. Mas percebi tambйm que, se o carro estiver a 181 graus por exemplo, e o jogador a 91, e eu dividir, vai retornar 1,989010989010989. Preciso de um jeito eficiente de verificar se o tanque do carro estб no campo de visгo do jogador. Sugestхes?
Reply
#7

floatround(1,989010989010989);
Reply
#8

Hum, nгo pensei no floatround. Vou tentar, obrigado Ricop.
Reply
#9

Postei o link da funзгo mas nгo sei usб-la e nem sei a logica que vocкs estгo usando ...

Poderiam me explicar as duas coisas ?
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)