Portal SAMP
[Ajuda] Pegar angulo entre um objeto e uma coordenada - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Pegar angulo entre um objeto e uma coordenada (/showthread.php?tid=1804)



Pegar angulo entre um objeto e uma coordenada - Jogador - 02/11/2021

Eu preciso fazer com que o valor Z de um objeto anexado aponte para uma coordena (Objeto ID: 1318)
Ja tentei de varias maneiras, procurei por SetObjectLookAt, GetAngleBeetwenPoints, GetAngleFrom/ToPoint e até FindRotation mas não condegui achar o que eu queria.
O objetivo é fazer esse objeto sempre apontar para a coordenada marcada no minimapa.
Ultimo código que tentei:
Código:
:
GetAngleToXY(Float:X, Float:Y, Float:CurrentX, Float:CurrentY, &Float:Angle)
{
 Angle = atan2(Y-CurrentY, X-CurrentX);
 Angle = floatsub(Angle, 90.0);
 if(Angle < 0.0) Angle = floatadd(Angle, 360.0);
}



RE: Pegar angulo entre um objeto e uma coordenada - MrThúúG - 02/11/2021

Poste o seu SetPlayerAttachedObject para eu ver uma coisa.


RE: Pegar angulo entre um objeto e uma coordenada - Jogador - 02/11/2021

(02/11/2021 17:40)MrThúúG Escreveu: Poste o seu SetPlayerAttachedObject para eu ver uma coisa.
Código:
#include <a_samp>
#include <streamer>
#include <zcmd>

main() { print("| INFO | A sua gamemode foi carregada!"); }

new GPS_OBJ[MAX_PLAYERS];

public OnPlayerUpdate(playerid)
{
 if(IsValidDynamicObject(GPS_OBJ[playerid]))
 {
  new
   Float:X = GetPVarFloat(playerid, "GPS:X"),
   Float:Y = GetPVarFloat(playerid, "GPS:Y"),
   Float:CurrentX, Float:CurrentY, Float:angle
  ;

  GetVehiclePos(GetPlayerVehicleID(playerid), CurrentX, CurrentY, angle);
  GetAngleToXY(X, Y, CurrentX, CurrentY, angle);
  Streamer_SetFloatData(0, GPS_OBJ[playerid], E_STREAMER_ATTACH_R_Z, angle);
 }
 return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
 if(IsValidDynamicObject(GPS_OBJ[playerid]))
 {
  DestroyDynamicObject(GPS_OBJ[playerid]);
 }
 return 1;
}

public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
{
 SetPVarInt(playerid, "OnClick", 1);
 SetPVarFloat(playerid, "GPS:X", fX);
 SetPVarFloat(playerid, "GPS:Y", fY);
 return 1;
}

CMD:gps(playerid, params[])
{
 if(GetPlayerVehicleSeat(playerid) == 0)
 {
  new vehicleid = GetPlayerVehicleID(playerid);
  if(IsValidDynamicObject(GPS_OBJ[playerid]))
  {
   DestroyDynamicObject(GPS_OBJ[playerid]);
   SendClientMessage(playerid, 0x00FF00FF, "| INFO | {FFFFFF}O GPS do seu veiculo foi desativado!");
  }
  else
  {
   if(GetPVarInt(playerid, "OnClick") == 1)
   {
    GPS_OBJ[playerid] = CreateDynamicObject(1318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, playerid);
    AttachDynamicObjectToVehicle(GPS_OBJ[playerid], vehicleid, 0.0, 0.0, 1.0, 0.0, -90.0, 0.0);
    SendClientMessage(playerid, 0x00FF00FF, "| INFO | {FFFFFF}O GPS do seu veiculo foi ativado!");
   }
   else SendClientMessage(playerid, 0xFF0000FF, "| GPS | {FFFFFF}Voce precisa marcar o local no GPS!");
  }
 }
 else SendClientMessage(playerid, 0xFF0000FF, "| ERRO | {FFFFFF}Voce precisa estar dentro de um veiculo!");
 return 1;
}

GetAngleToXY(Float:X, Float:Y, Float:CurrentX, Float:CurrentY, &Float:Angle)
{
 Angle = atan2(Y-CurrentY, X-CurrentX);
 Angle = floatsub(Angle, 90.0);
 if(Angle < 0.0) Angle = floatadd(Angle, 360.0);
}



RE: Pegar angulo entre um objeto e uma coordenada - MrThúúG - 02/11/2021

Vou tentar fazer aqui... uma dica não use coisas em public OnPlayerUpdate(playerid) causa lag no servidor.


RE: Pegar angulo entre um objeto e uma coordenada - MrThúúG - 04/11/2021

Código PHP:
#include <a_samp>
#include <streamer>
#include <zcmd>
#include <sscanf2>

new GPS_OBJ[MAX_PLAYERS];
new 
GPS_TIMER[MAX_PLAYERS];

stock Float:GetAbsoluteAngle(Float:angle)
{
    while(
angle 0.0) {
        
angle += 360.0;
    }
    while(
angle 360.0) {
        
angle -= 360.0;
    }
    return 
angle-90;
}
stock Float:GetAngleToPoint(Float:fPointXFloat:fPointYFloat:fDestXFloat:fDestY)
{
    return 
GetAbsoluteAngle(-(90.0-(atan2((fDestY fPointY),(fDestX fPointX)))));
}

forward ATTGPS(playerid);
public 
ATTGPS(playerid)
{
    
DestroyDynamicObject(GPS_OBJ[playerid]);
    new 
Float:GetPVarFloat(playerid"GPS:X");
    new 
Float:GetPVarFloat(playerid"GPS:Y");
    new 
Float:CurrentXFloat:CurrentY,Float:CurrentZ;
    new 
Float:angle;
    
GetVehiclePos(GetPlayerVehicleID(playerid), CurrentXCurrentYCurrentZ);
    
angle GetAngleToPoint(XYCurrentXCurrentY);
    
GPS_OBJ[playerid] = CreateDynamicObject(1318CurrentXCurrentYCurrentZ0.00.00.000playerid,-1.0);
    
MoveDynamicObject(GPS_OBJ[playerid], CurrentXCurrentY,CurrentZ0.51.0, -90.0angle);
}

public 
OnPlayerExitVehicle(playeridvehicleid)
{
    if(
IsValidDynamicObject(GPS_OBJ[playerid]))
    {
        
DestroyDynamicObject(GPS_OBJ[playerid]);
    }
    return 
1;
}

public 
OnPlayerClickMap(playeridFloat:fXFloat:fYFloat:fZ)
{
    
SetPVarInt(playerid"OnClick"1);
    
SetPVarFloat(playerid"GPS:X"fX);
    
SetPVarFloat(playerid"GPS:Y"fY);
    return 
1;
}

CMD:gps(playeridparams[])
{
    if(
GetPlayerVehicleSeat(playerid) == 0)
    {
        if(
IsValidDynamicObject(GPS_OBJ[playerid]))
        {
            
DestroyDynamicObject(GPS_OBJ[playerid]);
            
SendClientMessage(playerid0x00FF00FF"| INFO | {FFFFFF}O GPS do seu veiculo foi desativado!");
            
KillTimer(GPS_TIMER[playerid]);
        }
        else
        {
            if(
GetPVarInt(playerid"OnClick") == 1)
            {
                
GPS_TIMER[playerid] = SetTimerEx"ATTGPS"1000true"d"playerid);
                
SendClientMessage(playerid0x00FF00FF"| INFO | {FFFFFF}O GPS do seu veiculo foi ativado!");
            }
            else 
SendClientMessage(playerid0xFF0000FF"| GPS | {FFFFFF}Voce precisa marcar o local no GPS!");
        }
    }
    else 
SendClientMessage(playerid0xFF0000FF"| ERRO | {FFFFFF}Voce precisa estar dentro de um veiculo!");
    return 
1;