[Ajuda] FCNPC nгo ataca quando hб mais de 1 jogador
#1

Tou tendo um problema com o sistema de zumbis que fiz para o meu gamemode, ainda estou aprendendo sobre as funзхes do FCNPC e no momento sу tive problema com este sistema aqui:

Resumindo, o sistema ele faz uma checagem se o jogador estiver num raio de 15.0 da posiзao do Zumbi e se estiver o NPC irб atй a coordenada do jogador, se o jogador estiver num raio 1.0 ele o ataca.

Funciona perfeitamente, sempre que estou jogando sozinho os zumbis me atacam, mas quando hб mais de 1 jogador ele fica encarando o jogador mas nгo faz nada, o interessante й que se eu bem proximo desse jogador ele ataca, mas se o jogador ficar afastado de outro jogador o zumbi nгo faz nada.

Dei uma estudada nas funзхes do tуpico do FCNPC, mas realmente Nгo sei arrumar =/

Aqui estб o todo o script dos zumbis

PHP код:
// # Callbacks e Stocks #
stock CriarZumbis()
{
    new 
str[30];
    for(new 
0MAX_ZUMBISi++)    
    {
        
format(strsizeof(str), "Zombie_%i"i);
        
FCNPC_Create(str);
    }
    return 
1;
}
public 
RespawnZumbis()
{
    for(new 
0MAX_ZUMBISi++)
    {
        if(
FCNPC_IsDead(i))
        {
            
FCNPC_Respawn(i);
        }
    }
    print(
"| INFO |: Os Zumbis foram respawnados.");
    return 
1;
}
public 
FCNPC_OnDeath(npcidkilleridweaponid)
{
    if(
killerid != INVALID_PLAYER_ID && IsPlayerConnected(killerid))
    {
        
pInfo[killerid][pZombieKills]++;
        
GameTextForPlayer(killerid"~w~(Zombie Kill)~n~+5 EXP"25003);
        
AddEXP(killerid5);
    }
    return 
1;
}
public 
FCNPC_OnCreate(npcid)
{
    new 
rand random(sizeof(ZumbiSpawns));
    
FCNPC_Spawn(npcid162ZumbiSpawns[rand][0],ZumbiSpawns[rand][1], ZumbiSpawns[rand][2]);
    
FCNPC_SetInvulnerable(npcidfalse); 
    return 
1;
}
public 
FCNPC_OnSpawn(npcid)
{
    
SetPlayerAttachedObject(npcid0290820.08000.06900.0000180.00000.099988.90001.28601.12801.15400xFFFFFFFF0xFFFFFFFF); 
    
SetPlayerAttachedObject(npcid1290710.10600.03590.0259, -88.99990.900088.69991.00000.64891.14400xFFFFFFFF0xFFFFFFFF); 
    return 
1;
}
public 
FCNPC_OnUpdate(npcid)
{
    foreach(new 
Player)
    {
        if(!
IsPlayerNPC(i) && IsPlayerConnected(i)) 
        {
            new 
Float:zP[3], Float:pP[3];
            
GetPlayerPos(npcidzP[0], zP[1], zP[2]); // pega coordenada do Zumbi
            
GetPlayerPos(ipP[0], pP[1], pP[2]); // Pega Coordenada do Player
            
if(IsPlayerInRangeOfPoint(i15.0zP[0], zP[1], zP[2])) FCNPC_GoTo(npcidpP[0], pP[1], pP[2], MOVE_TYPE_RUN0.5false0.0true); // se o jogador estiver no raio de 15.0 da posiзгo do zumbi, o npc irб caminhar atй a posiзгo do jogador
            
if(IsPlayerInRangeOfPoint(i1.0zP[0], zP[1], zP[2])) // Se o jogador estiver a 1.0 da posiзao do zumbi
            
{
                
FCNPC_Stop(npcid); // Para o FCNPC_GoTo
                
FCNPC_MeleeAttack(npcid, -1true); // Ataque, velocidade -1, true = ataque especial
            
}
            else 
FCNPC_StopAttack(npcid); // Caso ele jб nгo esteja proximo do jogador ele para o Ataque
        
}
    }
    return 
1;

OBS: Sу nгo coloquei a Array ZumbiSpawns pois tinha muitas coordenadas de locais onde os zumbis nascem


Reply
#2

Coloca return 1 dps do melee attack pq ele й ordenado a bater, mas como o foreach й mais rбpido que o anim, se tiver outro player fora do range do zumbi rapidamente ele й ordenado a parar de bater, entгo um return ali resolve seu problema, boa sorte.
Reply
#3

Quote:
Originally Posted by n0minal
Посмотреть сообщение
Coloca return 1 dps do melee attack pq ele й ordenado a bater, mas como o foreach й mais rбpido que o anim, se tiver outro player fora do range do zumbi rapidamente ele й ordenado a parar de bater, entгo um return ali resolve seu problema, boa sorte.
Eu coloquei deste jeito:

PHP код:
public FCNPC_OnUpdate(npcid)
{
    foreach(new 
Player)
    {
        if(!
IsPlayerNPC(i) && IsPlayerConnected(i))
        {
            new 
Float:zP[3], Float:pP[3];
            
GetPlayerPos(npcidzP[0], zP[1], zP[2]);
            
GetPlayerPos(ipP[0], pP[1], pP[2]);
            if(
IsPlayerInRangeOfPoint(i15.0zP[0], zP[1], zP[2])) FCNPC_GoTo(npcidpP[0], pP[1], pP[2], MOVE_TYPE_RUN0.5false0.0true);
            if(
IsPlayerInRangeOfPoint(i1.0zP[0], zP[1], zP[2])) 
            {
                
FCNPC_Stop(npcid);
                
FCNPC_MeleeAttack(npcid, -1true);
                return 
1;
            }
            else 
FCNPC_StopAttack(npcid);
        }
    }
    return 
1;

O Zumbi agora estб socando mesmo com mais de 1 jogador, porйm ele sу estб me atacando, continua encarando o outro jogador mas nгo o ataca

Se liga, atй gravei aqui:

https://www.youtube.com/watch?v=ctRcVMgL5Cg
Reply
#4

n sei se fara grande diferenзa mas nao custa tentar:

PHP код:
public FCNPC_OnUpdate(npcid

    foreach(new 
Player
    { 
        if(!
IsPlayerNPC(i) && IsPlayerConnected(i))  
        { 
            new 
Float:zP[3], Float:pP[3]; 
            
GetPlayerPos(npcidzP[0], zP[1], zP[2]); // pega coordenada do Zumbi 
            
GetPlayerPos(ipP[0], pP[1], pP[2]); // Pega Coordenada do Player 
            
if(IsPlayerInRangeOfPoint(i15.0zP[0], zP[1], zP[2])) 
            {
                
// se o jogador estiver no raio de 15.0 da posiзгo do zumbi, o npc irб caminhar atй a posiзгo do jogador 
                
FCNPC_GoTo(npcidpP[0], pP[1], pP[2], MOVE_TYPE_RUN0.5false0.0true); 
            }
            else if(
IsPlayerInRangeOfPoint(i1.0zP[0], zP[1], zP[2])) // Se o jogador estiver a 1.0 da posiзao do zumbi 
            

                
FCNPC_Stop(npcid); // Para o FCNPC_GoTo 
                
FCNPC_MeleeAttack(npcid, -1true); // Ataque, velocidade -1, true = ataque especial 
            

            else 
FCNPC_StopAttack(npcid); // Caso ele jб nгo esteja proximo do jogador ele para o Ataque 

        

    } 
    return 
1

Reply
#5

Quote:
Originally Posted by JPedro
Посмотреть сообщение
Eu coloquei deste jeito:

PHP код:
public FCNPC_OnUpdate(npcid)
{
    foreach(new 
Player)
    {
        if(!
IsPlayerNPC(i) && IsPlayerConnected(i))
        {
            new 
Float:zP[3], Float:pP[3];
            
GetPlayerPos(npcidzP[0], zP[1], zP[2]);
            
GetPlayerPos(ipP[0], pP[1], pP[2]);
            if(
IsPlayerInRangeOfPoint(i15.0zP[0], zP[1], zP[2])) FCNPC_GoTo(npcidpP[0], pP[1], pP[2], MOVE_TYPE_RUN0.5false0.0true);
            if(
IsPlayerInRangeOfPoint(i1.0zP[0], zP[1], zP[2])) 
            {
                
FCNPC_Stop(npcid);
                
FCNPC_MeleeAttack(npcid, -1true);
                return 
1;
            }
            else 
FCNPC_StopAttack(npcid);
        }
    }
    return 
1;

O Zumbi agora estб socando mesmo com mais de 1 jogador, porйm ele sу estб me atacando, continua encarando o outro jogador mas nгo o ataca

Se liga, atй gravei aqui:

https://www.youtube.com/watch?v=ctRcVMgL5Cg
Isso porque ele ataca o menor id que estiver mais perto, faz uma verificaзгo de qual player estб mais perto na hora de atacar
Reply
#6

Quote:
Originally Posted by PT
Посмотреть сообщение
n sei se fara grande diferenзa mas nao custa tentar:

PHP код:
public FCNPC_OnUpdate(npcid

    foreach(new 
Player
    { 
        if(!
IsPlayerNPC(i) && IsPlayerConnected(i))  
        { 
            new 
Float:zP[3], Float:pP[3]; 
            
GetPlayerPos(npcidzP[0], zP[1], zP[2]); // pega coordenada do Zumbi 
            
GetPlayerPos(ipP[0], pP[1], pP[2]); // Pega Coordenada do Player 
            
if(IsPlayerInRangeOfPoint(i15.0zP[0], zP[1], zP[2])) 
            {
                
// se o jogador estiver no raio de 15.0 da posiзгo do zumbi, o npc irб caminhar atй a posiзгo do jogador 
                
FCNPC_GoTo(npcidpP[0], pP[1], pP[2], MOVE_TYPE_RUN0.5false0.0true); 
            }
            else if(
IsPlayerInRangeOfPoint(i1.0zP[0], zP[1], zP[2])) // Se o jogador estiver a 1.0 da posiзao do zumbi 
            

                
FCNPC_Stop(npcid); // Para o FCNPC_GoTo 
                
FCNPC_MeleeAttack(npcid, -1true); // Ataque, velocidade -1, true = ataque especial 
            

            else 
FCNPC_StopAttack(npcid); // Caso ele jб nгo esteja proximo do jogador ele para o Ataque 
        

    } 
    return 
1

Valeu por tentar ajudar mas agora voltou um antigo problema que eu jб tinha arrumado , quando o NPC estб bem proximo do jogador ele fica pegando e mudando de вngulo e o NPC fica girando e nem ataca , o FCNC_Stop faz ele parar com o GoTo e para tambйm com a mudanзa de вngulo, ai ele consegue atacar
Reply
#7

Quote:
Originally Posted by n0minal
Посмотреть сообщение
Isso porque ele ataca o menor id que estiver mais perto, faz uma verificaзгo de qual player estб mais perto na hora de atacar
Como eu faзo essa verificaзгo?, diminuindo o raio do isplayerinrangeofpoint?

Esses putos npcs tгo dando uma trabalheira
Reply
#8

PHP код:
new Perseguindo [MAX_BOTS]; 
Reply
#9

Quote:
Originally Posted by JPedro
Посмотреть сообщение
Como eu faзo essa verificaзгo?, diminuindo o raio do isplayerinrangeofpoint?

Esses putos npcs tгo dando uma trabalheira
Os "zombies" ou npcs ou la como queira chamar vai ser sempre o sistema que mais trabalho lhe vai dar.
Quer pelos bugs, crash's etc...

Se habitua :P
Reply
#10

Existe uma include do ipsBruno que fixa a parte do zumbi flutuar quando estiver em baixo de uma ponte por exemplo. Chama-se gotofixz.

Nгo precisa usar MapAndreas se vai usar o ColAndreas.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)