// # Callbacks e Stocks #
stock CriarZumbis()
{
new str[30];
for(new i = 0; i < MAX_ZUMBIS; i++)
{
format(str, sizeof(str), "Zombie_%i", i);
FCNPC_Create(str);
}
return 1;
}
public RespawnZumbis()
{
for(new i = 0; i < MAX_ZUMBIS; i++)
{
if(FCNPC_IsDead(i))
{
FCNPC_Respawn(i);
}
}
print("| INFO |: Os Zumbis foram respawnados.");
return 1;
}
public FCNPC_OnDeath(npcid, killerid, weaponid)
{
if(killerid != INVALID_PLAYER_ID && IsPlayerConnected(killerid))
{
pInfo[killerid][pZombieKills]++;
GameTextForPlayer(killerid, "~w~(Zombie Kill)~n~+5 EXP", 2500, 3);
AddEXP(killerid, 5);
}
return 1;
}
public FCNPC_OnCreate(npcid)
{
new rand = random(sizeof(ZumbiSpawns));
FCNPC_Spawn(npcid, 162, ZumbiSpawns[rand][0],ZumbiSpawns[rand][1], ZumbiSpawns[rand][2]);
FCNPC_SetInvulnerable(npcid, false);
return 1;
}
public FCNPC_OnSpawn(npcid)
{
SetPlayerAttachedObject(npcid, 0, 2908, 2, 0.0800, 0.0690, 0.0000, 180.0000, 0.0999, 88.9000, 1.2860, 1.1280, 1.1540, 0xFFFFFFFF, 0xFFFFFFFF);
SetPlayerAttachedObject(npcid, 1, 2907, 1, 0.1060, 0.0359, 0.0259, -88.9999, 0.9000, 88.6999, 1.0000, 0.6489, 1.1440, 0xFFFFFFFF, 0xFFFFFFFF);
return 1;
}
public FCNPC_OnUpdate(npcid)
{
foreach(new i : Player)
{
if(!IsPlayerNPC(i) && IsPlayerConnected(i))
{
new Float:zP[3], Float:pP[3];
GetPlayerPos(npcid, zP[0], zP[1], zP[2]); // pega coordenada do Zumbi
GetPlayerPos(i, pP[0], pP[1], pP[2]); // Pega Coordenada do Player
if(IsPlayerInRangeOfPoint(i, 15.0, zP[0], zP[1], zP[2])) FCNPC_GoTo(npcid, pP[0], pP[1], pP[2], MOVE_TYPE_RUN, 0.5, false, 0.0, true); // 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(i, 1.0, zP[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, -1, true); // 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;
}
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.
|
public FCNPC_OnUpdate(npcid)
{
foreach(new i : Player)
{
if(!IsPlayerNPC(i) && IsPlayerConnected(i))
{
new Float:zP[3], Float:pP[3];
GetPlayerPos(npcid, zP[0], zP[1], zP[2]);
GetPlayerPos(i, pP[0], pP[1], pP[2]);
if(IsPlayerInRangeOfPoint(i, 15.0, zP[0], zP[1], zP[2])) FCNPC_GoTo(npcid, pP[0], pP[1], pP[2], MOVE_TYPE_RUN, 0.5, false, 0.0, true);
if(IsPlayerInRangeOfPoint(i, 1.0, zP[0], zP[1], zP[2]))
{
FCNPC_Stop(npcid);
FCNPC_MeleeAttack(npcid, -1, true);
return 1;
}
else FCNPC_StopAttack(npcid);
}
}
return 1;
}
public FCNPC_OnUpdate(npcid)
{
foreach(new i : Player)
{
if(!IsPlayerNPC(i) && IsPlayerConnected(i))
{
new Float:zP[3], Float:pP[3];
GetPlayerPos(npcid, zP[0], zP[1], zP[2]); // pega coordenada do Zumbi
GetPlayerPos(i, pP[0], pP[1], pP[2]); // Pega Coordenada do Player
if(IsPlayerInRangeOfPoint(i, 15.0, zP[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(npcid, pP[0], pP[1], pP[2], MOVE_TYPE_RUN, 0.5, false, 0.0, true);
}
else if(IsPlayerInRangeOfPoint(i, 1.0, zP[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, -1, true); // 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;
}
Eu coloquei deste jeito:
PHP код:
Se liga, atй gravei aqui: https://www.youtube.com/watch?v=ctRcVMgL5Cg |
n sei se fara grande diferenзa mas nao custa tentar:
PHP код:
|
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
|
new Perseguindo [MAX_BOTS];
Como eu faзo essa verificaзгo?, diminuindo o raio do isplayerinrangeofpoint?
Esses putos npcs tгo dando uma trabalheira ![]() |