Portal SAMP
[Ajuda] FCNPC: npc atirar no player realista. - 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] FCNPC: npc atirar no player realista. (/showthread.php?tid=3180)



FCNPC: npc atirar no player realista. - zBL4CK - 14/01/2023

Bom pessoal estou a dias tentando fazer um sistema de npc para vigiar um local.

OBJETIVO: Bom o intuito é quando o player se aproximar do local onde o npc(que esta de guarda), o npc comece a atirar no player. porem ele só atire no player somente se o player estiver no campo de visão do npc ou seja: caso o npc esteja de frente pro player mas se tiver algum obstáculo(Parede) a frente do npc, o npc não atire no player. só atire se não houver obstáculos a frente entre o npc e o player.

Bom ja li e re-li praticamente toda a documentação do FCNPC, algumas funções infelizmente estão faltando a descrição/informação, e as funções que tem la não atendem o que desejo por exemplo(Função que detecte se o player esta no campo de visão do npc, e uma função que detecte se á obstáculos entre o player e o npc).

tem a função:

Código PHP:
FCNPC_AimAtPlayer(npcidplayeridbool:shoot falseshoot_delay = -1bool:set_angle trueFloat:offset_x 0.0Float:offset_y 0.0Float:offset_z 0.0Float:offset_from_x 0.0Float:offset_from_y 0.0Float:offset_from_z 0.0between_check_mode FCNPC_ENTITY_MODE_AUTObetween_check_flags FCNPC_ENTITY_CHECK_ALL

porem independente onde o player esteja o npc fica atirando sem parar.

se alguém souber como faço para contornar isso, e que atenda o objetivo que foi citado acima, ficarei grato! 


darei ++rep para quem ajudar.


RE: FCNPC: npc atirar no player realista. - xbruno1000x - 14/01/2023

Test LOS é a função que normalmente detecta isso para 3D text label e outras coisas do SA-MP. Infelizmente, me parece que o FCNPC não tem isso nativamente, então terá que usar uma alternativa.

Uma alternativa que posso te dar é utilizar a include 3dTryg. Me parece que ela tem algumas funções que detectam proximidade de paredes, talvez seja possível utilizá-la para fazer o NPC parar de atirar quando ele estiver proximo da parede.


RE: FCNPC: npc atirar no player realista. - zBL4CK - 14/01/2023

(14/01/2023 18:11)xbruno1000x Escreveu: Uma alternativa que posso te dar é utilizar a include 3dTryg. Me parece que ela tem algumas funções que detectam proximidade de paredes, talvez seja possível utilizá-la para fazer o NPC parar de atirar quando ele estiver proximo da parede.

Bom man ai que tá, e se tiver objetos ao redor do npc? acredito que pela logica acusaria impedindo o npc de atirar independentemente se o player estiver de frente ao npc.

bom eu andei vasculhando a internet e vi que o plugin colandreas possui funcionalidades que atendem o que preciso e bom eu li a documentação e a função:

Código PHP:
CA_RayCastLine 

Acredito que ajude, eu estou fazendo gambiarras, caso funcione eu compartilharei o feedback aki, caso isso ajude alguém futuramente!


RE: FCNPC: npc atirar no player realista. - xbruno1000x - 14/01/2023

Espero que funcione. Possível eu sei que é, pois o servidor WTLS utiliza esse mesmo sistema que você deseja fazer.

Se quiser dar uma olhada no sistema deles, o ip é s2.gta-multiplayer.cz:7777. Basta fazer uma missão ou assaltar uma loja.


RE: FCNPC: npc atirar no player realista. - zBL4CK - 15/01/2023

(14/01/2023 18:57)xbruno1000x Escreveu: Espero que funcione. Possível eu sei que é, pois o servidor WTLS utiliza esse mesmo sistema que você deseja fazer.

Se quiser dar uma olhada no sistema deles, o ip é s2.gta-multiplayer.cz:7777. Basta fazer uma missão ou assaltar uma loja.

Sim, eu estou tendo como base esse sistema desse servidor.

Consegui resolver e vou compartilhar caso alguém tenha o mesmo problema futuramente.

Necessário:

FCNPC
ColAndreas (É de grande importância que você siga as etapas de instalação do plugin veja aqui!)

Após spawnar o npc utilize este código:

Objetivo do código: Detectar se á um objeto entre o npc e um player que o npc está mirando.
Código:
public FCNPC_OnUpdate(npcid) {
    if(FCNPC_IsAiming(npcid)) {    
        new Float:Posnpc[3], Float:PosPlayer[3], Float:PosColl[3], wall;
        FCNPC_GetPosition(npcid, Posnpc[0], Posnpc[1], Posnpc[2]);
        GetPlayerPos(FCNPC_GetAimingPlayer(npcid), PosPlayer[0], PosPlayer[1], PosPlayer[2]);
        wall = CA_RayCastLine(Posnpc[0], Posnpc[1], Posnpc[2], PosPlayer[0], PosPlayer[1], PosPlayer[2], PosColl[0], PosColl[1], PosColl[2]);
        if(wall != 0) {
            if(FCNPC_IsShooting(npcid) == true)    FCNPC_AimAtPlayer(npcid, FCNPC_GetAimingPlayer(npcid), false, 500);
        } else {
            if(FCNPC_IsShooting(npcid) == false) FCNPC_AimAtPlayer(npcid, FCNPC_GetAimingPlayer(npcid), true, 500);        
        }
    }
    return 1;
}

se alguém achar que este código poderia ser melhorado/otimizado e quiser atualiza-lo, fique a vontade!