Portal SAMP
[Ajuda] GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE - 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] GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE (/showthread.php?tid=241)



GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE - annety - 27/10/2020

Pessoal como muitos de vocês devem saber nenhum client mobile tem acesso a questões de mira, detectar quem um player estar mirando
Seja esse target um player ou um ator

Eu tentei contornar isso com:

Código:
public OnPlayerUpdate(playerid)
{
    new playerAim = GetPlayerTargetPlayerEx(playerid);
    if(playerAim != 65535) {
        format(dmgstring, sizeof(dmgstring), "PLAYER AIM PLAYER: [%i]", playerAim);
        SendClientMessage(playerid,COLOR_PARAMEDIC,dmgstring);
        // func
        return true;
    }
    else if(playerAim == 65535) { // else pra só rodar o loop do actor se já não tiver mirando em player
        new actorAim = GetPlayerTargetDynamicActorEx(playerid);
        if(actorAim != 65535)
        {
            format(dmgstring, sizeof(dmgstring), "PLAYER AIM ACTOR: [%i]", actorAim);
            SendClientMessage(playerid,COLOR_PARAMEDIC,dmgstring);
            // func
            return true;
        }
    }
}

Código:
forward GetPlayerTargetPlayerEx(playerid);
public GetPlayerTargetPlayerEx(playerid) {
    new x = 65535;
    foreach(new targetid : Player)
    {
        if(IsPlayerFacingPlayer(playerid, targetid, 25.0)) {
            x = targetid;
            return true;
        }
    }
    return x;
}
forward GetPlayerTargetDynamicActorEx(playerid);
public GetPlayerTargetDynamicActorEx(playerid) {
    new x = 65535;
    foreach(new targetid : Actor)
    {
        if(IsPlayerFacingActor(playerid, targetid, 25.0)) {
            x = targetid;
            return true;
        }
    }
    return x;
}
stock static IsAngleInRangeOfAngle(Float:a1, Float:a2, Float:range = 10.0)
{
    a1 -= a2;
    if((a1 < range) && (a1 > -range)) return true;
    return false;
}
stock IsPlayerFacingPlayer(playerid, targetid, Float:range =  10.0)
{
    new Float:pos[3];
    GetPlayerPos(targetid, pos[0], pos[1], pos[2]);

    return IsPlayerFacingPoint(playerid, pos[0], pos[1], range);
}
stock IsPlayerFacingActor(playerid, targetid, Float:range =  10.0)
{
    new Float:pos[3];
    GetDynamicActorPos(targetid, pos[0], pos[1], pos[2]);

    return IsPlayerFacingPoint(playerid, pos[0], pos[1], range);
}
stock IsPlayerFacingPoint(playerid, Float:x, Float:y, Float:range = 10.0)
{
    new Float:pos[3];
    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);

    new Float:facing;
    GetPlayerFacingAngle(playerid, facing);

    new Float:angle;

    if( pos[1] > y ) angle = (-acos((pos[0] - x) / floatsqroot((pos[0] - x)*(pos[0] - x) + (pos[1] - y)*(pos[1] - y))) - 90.0);
    else if( pos[1] < y && pos[0] < x ) angle = (acos((pos[0] - x) / floatsqroot((pos[0] - x)*(pos[0] - x) + (pos[1] - y)*(pos[1] - y))) - 450.0);
    else if( pos[1] < y ) angle = (acos((pos[0] - x) / floatsqroot((pos[0] - x)*(pos[0] - x) + (pos[1] - y)*(pos[1] - y))) - 90.0);

    return (IsAngleInRangeOfAngle(-angle, facing, range));
}


Algumas vezes está detectando, mas muitas vezes está errando, alguém mais experiente poderia me ajudar?


RE: GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE - ForT - 28/10/2020

você está usando foreach(new targetid : Player) em ambas as funções, não deveria fazer um loop nos actors criados na função GetPlayerTargetDynamicActorEx?
Código PHP:
GetPlayerTargetDynamicActorEx(playerid) {
    for (new actors Streamer_GetUpperBound(STREAMER_TYPE_ACTOR) + 1eactors; ++e)
    {
        if(IsValidDynamicActor(e) && IsPlayerFacingActor(playeride25.0)) {
            return e;
        }
    }
    return INVALID_ACTOR_ID;




RE: GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE - annety - 28/10/2020

(28/10/2020 03:19)ForT Escreveu: você está usando foreach(new targetid : Player) em ambas as funções, não deveria fazer um loop nos actors criados na função GetPlayerTargetDynamicActorEx?
Código PHP:
GetPlayerTargetDynamicActorEx(playerid) {
    for (new actors Streamer_GetUpperBound(STREAMER_TYPE_ACTOR) + 1eactors; ++e)
    {
        if(IsValidDynamicActor(e) && IsPlayerFacingActor(playeride25.0)) {
            return e;
        }
    }
    return INVALID_ACTOR_ID;


Ah foi um erro na hora de copiar, no meu código já tava
if(IsPlayerFacingActor(playerid, targetid, 25.0)) {

mas obg, de um ++



Não tá detectando quando tá mirando pra outro player ou pra um actor, só as vezes do nada printa um monte de:
PLAYER AIM PLAYER: [1]


RE: GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE - annety - 31/10/2020

será que a galera do open.mp tem a base disso aqui?
pq eles tiveram que fazer GetPlayerTargetPlayer e GetPlayerTargetDynamicActor funcionar né...

---

edit:

bruno já me explicou que não, vou esperar ter suporte mesmo Smile


RE: GetPlayerTargetPlayer && GetPlayerTargetDynamicActor SAMP MOBILE - L10motos - 25/12/2023

Pensei em ressuscitar esse topico, pq passo pelo mesmo problema, alguém mais experiente consegue me ajudar?