[Ajuda] Detectar вngulos em volta de veнculo - [BEP]AcerPilot - 05.07.2011
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.
Re: [Ajuda] Detectar вngulos em volta de veнculo -
Josma_cmd - 05.07.2011
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).
Re: [Ajuda] Detectar вngulos em volta de veнculo -
Macintosh - 05.07.2011
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 .
Re: [Ajuda] Detectar вngulos em volta de veнculo -
Shadoww5 - 05.07.2011
Isto deve ajudar:
PHP код:
stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius)
{
new Float:camera_x,Float:camera_y,Float:camera_z,Float:vector_x,Float:vector_y,Float:vector_z;
GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z);
GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z);
new Float:vertical, Float:horizontal;
switch (GetPlayerWeapon(playerid))
{
case 34,35,36:
{
if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true;
return false;
}
case 30,31: {vertical = 4.0; horizontal = -1.6;}
case 33: {vertical = 2.7; horizontal = -1.0;}
default: {vertical = 6.0; horizontal = -2.2;}
}
new Float:angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0;
new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees);
GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees));
if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true;
return false;
}
Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ)
{
new Float:TGTDistance;
TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ));
new Float:tmpX, Float:tmpY, Float: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:x2, Float:y2, Float:X, Float:Y) {
new Float:DX, Float:DY;
new Float:angle;
DX = floatabs(floatsub(x2,X));
DY = floatabs(floatsub(y2,Y));
if (DY == 0.0 || DX == 0.0)
{
if(DY == 0 && DX > 0) angle = 0.0;
else if(DY == 0 && DX < 0) angle = 180.0;
else if(DY > 0 && DX == 0) angle = 90.0;
else if(DY < 0 && DX == 0) angle = 270.0;
else if(DY == 0 && DX == 0) angle = 0.0;
}
else
{
angle = atan(DX/DY);
if(X > x2 && Y <= y2) angle += 90.0;
else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle);
else if(X < x2 && Y >= y2) angle -= 90.0;
else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle);
}
return floatadd(angle, 90.0);
}
stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance)
{
x += (distance * floatsin(-angle, degrees));
y += (distance * floatcos(-angle, degrees));
}
Re: [Ajuda] Detectar вngulos em volta de veнculo - [BEP]AcerPilot - 05.07.2011
Obrigado Shadow, mas creio que consegui. Jб utilizo essas funзхes. Qualquer coisa, volto a postar aqui.
Re: [Ajuda] Detectar вngulos em volta de veнculo - [BEP]AcerPilot - 05.07.2011
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?
Re: [Ajuda] Detectar вngulos em volta de veнculo -
Ricop522 - 05.07.2011
floatround(1,989010989010989);
Re: [Ajuda] Detectar вngulos em volta de veнculo - [BEP]AcerPilot - 05.07.2011
Hum, nгo pensei no floatround. Vou tentar, obrigado Ricop.
Re: [Ajuda] Detectar вngulos em volta de veнculo -
Shadoww5 - 05.07.2011
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 ?