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:fPointX, Float:fPointY, Float:fDestX, Float:fDestY) { return GetAbsoluteAngle(-(90.0-(atan2((fDestY - fPointY),(fDestX - fPointX))))); }
forward ATTGPS(playerid); public ATTGPS(playerid) { DestroyDynamicObject(GPS_OBJ[playerid]); new Float:X = GetPVarFloat(playerid, "GPS:X"); new Float:Y = GetPVarFloat(playerid, "GPS:Y"); new Float:CurrentX, Float:CurrentY,Float:CurrentZ; new Float:angle; GetVehiclePos(GetPlayerVehicleID(playerid), CurrentX, CurrentY, CurrentZ); angle = GetAngleToPoint(X, Y, CurrentX, CurrentY); GPS_OBJ[playerid] = CreateDynamicObject(1318, CurrentX, CurrentY, CurrentZ, 0.0, 0.0, 0.0, 0, 0, playerid,-1.0); MoveDynamicObject(GPS_OBJ[playerid], CurrentX, CurrentY,CurrentZ, 0.5, 1.0, -90.0, angle); }
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) { if(IsValidDynamicObject(GPS_OBJ[playerid])) { DestroyDynamicObject(GPS_OBJ[playerid]); SendClientMessage(playerid, 0x00FF00FF, "| INFO | {FFFFFF}O GPS do seu veiculo foi desativado!"); KillTimer(GPS_TIMER[playerid]); } else { if(GetPVarInt(playerid, "OnClick") == 1) { GPS_TIMER[playerid] = SetTimerEx( "ATTGPS", 1000, true, "d", playerid); 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; }
|