[Tutorial] Como fazer um NPC
#1

Ola >: ) Este tutorial й feito pelo kc, estou sу a traduzilo. Espero que gostem.

Criar o .rec
Primeiro de tudo, precisamos do "playback" que й a gravaзгo do nosso npc, sem isso,
o NPC nunca iria trabalhar.
Comeзa o um server, entra na rcon ("/rcon login <a_tua_rcon_pass>") e inicia o fs
chamado npc_record ("/rcon loadfs npc_record")
Agora hб 3 commandos para gravar um NPC, no filterscript npc_record.
  • /vrecord <nome> - Para comeзares a gravar enquanto estбs num vehiculo.
  • /ofrecord <nome> - Para comeзares a gravar enquanto nгo estбs num vehiculo.
  • /stoprecord - Para parares de gravar o teu NPC.
Neste tutorial vamos gravar um NPC a conduzir um vehiculo. Por isso entra num vehiculo e faz /vrecord mynpc
NOTA: Precisas de estar loggado rcon, para comeзares a gravar.
Coduzes um bocado... quando acabares faz /stoprecord.
Fecha o jogo, vai a pasta "scriptfiles", deve estar ai um ficheiro chamado mynpc.rec.
Mete o mynpc.rec dentro deste directorio: <O teu directorio do SA-MP>/npcmodes/recordings/
Ja estб? Muito bem! Agora ja temos o nosso NPC gravado, e no local certo.

Controlar o NPC
Ja viste que dentro do directorio "npcmodes" estгo la varios scripts. Sгo "mini" scripts que
controlam o que o teu NPC faz.
Vamos la criar o script do NPC.
Comeзa um novo ficheiro pawno, e cola isto
pawn Код:
#define RECORDING "mynpc" //This is the filename of your recording without the extension.
#define RECORDING_TYPE 1 //1 for in vehicle and 2 for on foot.

#include <a_npc>
main(){}
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);

#if RECORDING_TYPE == 1
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
public OnNPCExitVehicle() StopRecordingPlayback();
#else
public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif
Pode parecer um bocado confuso.
Vamos la entгo rever.
pawn Код:
#define RECORDING "mynpc" //Vai ser o nome, do .rec que gravamos
Como o comentario, vai ser o nome do .rec mais sem a extensгo .rec

pawn Код:
#define RECORDING_TYPE 1 //1 para dentro do vehicle, 2 para se o bot estiver a pй

pawn Код:
#include <a_npc>
Vamos fazer include do que precisamos para criar o NPC

pawn Код:
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Faz o loop, quando o record playback acaba, comeзa a reproduzir gravaзгo outra vez

pawn Код:
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Quando o bot entra comeзa a reproduzir a gravaзгo


pawn Код:
public OnNPCExitVehicle() StopRecordingPlayback();
Quando o NPC sai do vehicle, para de reproduzir a gravaзгo



pawn Код:
public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Quando o NPC faz spawn, comeзa a reproduzir a gravaзгo

Como vкs й facil. Agora grava o teu "mynpc.pwn" em <O teu directorio do SA-MP>/npcmodes.

Connectar o teu NPC
Fecha o mynpc.pwn, e abra o teu GameMode ou abra um Filterscript.
pawn Код:
ConnectNPC("Dave","mynpc");
Agora vamos usar o ConnectNPC, sugero que ponham dentro do OnGameModeInit ex:
pawn Код:
public OnGameModeInit()
{
print("my gamemode");
ConnectNPC("MyFirstNPC","mynpc");
return 1;
}
Ou se for um Filterscript
pawn Код:
public OnFilterScriptInit()
{
print("my filterscript");
ConnectNPC("MyFirstNPC","mynpc");
return 1;
}
Como criamos o NPC dentro de um vehiculo precisamos de criar um vehiculo.
NOTA: SE ESTБS A CRIAR UM NPC NUM VEHICULO, PASSA ESTE PASSO.
pawn Код:
new MyFirstNPCVehicle; //Global variable!
public OnGameModeInit()
{
print("my gamemode");
ConnectNPC("MyFirstNPC","mynpc");
MyFirstNPCVehicle = CreateVehicle(400, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000);
return 1;
}
Ou se й um Filterscript
pawn Код:
new MyFirstNPCVehicle; //Global variable!
public OnFilterScriptInit()
{
print("my filterscript");
ConnectNPC("MyFirstNPC","mynpc");
MyFirstNPCVehicle = CreateVehicle(400, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000);
return 1;
}
A posiзгo do vehiculo nгo interessa, porque na gravaзгo o bot vai teletransportar para o sitio onde foi gravado.

Sу mais uma coisa antes de poderes testar, temos de po-lo num vehiculo.E
Eu fiz no OnPlayerSpawn.
NOTA: SE O TEU NPC NГO USA VEHICULO, PASSA ESTE PASSO.
pawn Код:
public OnPlayerSpawn(playerid)
{
if(IsPlayerNPC(playerid)) //Checka se o player que fez spawn й um NPC
{
new npcname[MAX_PLAYER_NAME];
GetPlayerName(playerid, npcname, sizeof(npcname)); //Getar o nome do NPC
if(!strcmp(npcname, "MyFirstNPC", true)) //Checkar se o nome do NPC й MyFirstNPC
{
PutPlayerInVehicle(playerid, MyFirstNPCVehicle, 0); //Por o NPC que criarmos dentro de um vehiculo
}
return 1;
}
//Other stuff for normal players goes here!
return 1;
}
Se quiseres adicionar mais do que 1 NPC
pawn Код:
public OnPlayerSpawn(playerid)
{
if(IsPlayerNPC(playerid)) //Checka se o player que fez spawn й um NPC
{
new npcname[MAX_PLAYER_NAME];
GetPlayerName(playerid, npcname, sizeof(npcname)); //Getar o nome do NPC
if(!strcmp(npcname, "MyFirstNPC", true)) //Checkar se o nome do NPC й MyFirstNPC
{
PutPlayerInVehicle(playerid, MyFirstNPCVehicle, 0); //Por o NPC que criarmos dentro de um vehiculo
return 1;
}
if(!strcmp(npcname, "MySecondNPC", true))
{
PutPlayerInVehicle(playerid, AnotherVehicleID, 0);
return 1;
}
return 1;
}
//Other stuff for normal players goes here!
return 1;
}
Faz compile, vai dentro do jogo e testa.
Vкs o NPC? Parabens! Acabas-te de criar o teu primeiro NPC!
Nгo trabalha? Posta aqui o problema, e vamos falar sobre ele para tentar arranjalo!

Problemas comuns
O meu NPC desconecta, logo que entra
Pode ser um anti cheat, ou o player tem de registrar ou й kickado. Adiciona
[pawn]
if(IsPlayerNPC(playerid)) return 1;

O meu NPC nгo entra
Mais provavel й porque o server tem password.

Nгo consigo que o npc_record faзa load
Ja estб loaded, ou entгo nгo estб criado.

O npc sу fica parado no spawn
Revolta a ver o OnPlayerSpawn

Espero que gostem
Isto foi feito por kc.
Eu sу traduzi.
Reply
#2

Belo Tutorial First rsrs ^^
Reply
#3

Obrigado, ja falei com o Roam, ele vai fazer sticky.
Reply
#4

Nгo tinha jб tutoriais desses aqui?
Mais parabйns, ficou legal
Reply
#5

Bom tutorial, mas jб existe vбrios praticamente iguais.
Eu tenho uma dъvida quanto a NPC, sei que ocupa slot e dependendo das aзхes do NPC ele ocupa processo na CPU, mas e se ele ficar apenas andando? bom, vou pegar um VPS e terei 6GB de ram, nгo preciso me preocupar com isso mas eu quero algo realmente sem lag

Outra pergunta, no GTA OFF os NPC's param antes de te atropelar (alguns rs) tem alguma forma de fazer isso?

vlw.
Reply
#6

Sim Caio, mais esse estб totalmente explicado, gostei rsrs .

@OFF
Fire, porque nгo visita mais frequentemente nossa board? Estamos precisando de mais programadores experientes como vocк! =)

@EDIT
Mittos, nгo sei se tem como mais poderias fazer uma comparaзгo entre a posiзгo do veiculo e do player no caso NPC.

pawn Код:
new Float:pX, Float:pY, Float:pZ, Float:vX, Float:vY, Float:vZ;
GetPlayerPos(playerid, pX, pY, pZ); // No caso ali no playerid mudarб para a define de seu NPC.
GetVehiclePos(vehicle, vX, vY, vZ); // Irб pegar a posiзгo do veiculo.
if(floatabs(pX - vX) // Seria algo assim.. :]

E use floatabs para comparar .

Isso й um exemplo nгo vem me tirar ¬¬.
Reply
#7

Quote:
Originally Posted by Shickcard
Посмотреть сообщение
Sim Caio, mais esse estб totalmente explicado, gostei rsrs .

@OFF
Fire, porque nгo visita mais frequentemente nossa board? Estamos precisando de mais programadores experientes como vocк! =)

@EDIT
Mittos, nгo sei se tem como mais poderias fazer uma comparaзгo entre a posiзгo do veiculo e do player no caso NPC.

pawn Код:
new Float:pX, Float:pY, Float:pZ, Float:vX, Float:vY, Float:vZ;
GetPlayerPos(playerid, pX, pY, pZ); // No caso ali no playerid mudarб para a define de seu NPC.
GetVehiclePos(vehicle, vX, vY, vZ); // Irб pegar a posiзгo do veiculo.
if(floatabs(pX - vX) // Seria algo assim.. :]

E use floatabs para comparar .
Sem chance -q
meu GM tem quase mil linhas e nгo uso timer algum, nem para paydya. E nгo serб por isso que vou adicionar timer rs

Sou anti timer :/
Reply
#8

Quote:
Originally Posted by MiTToS
Посмотреть сообщение
Sem chance -q
meu GM tem quase mil linhas e nгo uso timer algum, nem para paydya. E nгo serб por isso que vou adicionar timer rs

Sou anti timer :/
OnPlayerUpdate

pawn Код:
new Float:x,Float:y,Float:z;
for(new i = 0;i < MAX_PLAYERS;i++)
{
    if(IsPlayerNPC(i))
    {
        GetVehiclePos(GetPlayerVehicleID(i),x,y,z);
        for(new j = 0; j<MAX_PLAYERS;j++)
        {
            if(IsPlayerInRangeOfPoint(j,5.0,x,y,z))
            {
                //Seu codigo aqui. Exemplo: SetPlayerVelocity
            }
        }
    }
}
@Luis: Se usar alguns includes que fizeram release, pode totalmente controlar.
Reply
#9

Quote:
Originally Posted by Caio_Cartaxo
Посмотреть сообщение
Nгo tinha jб tutoriais desses aqui?
Tem sim... se nгo me engano foi o Sucre que postou.
Reply
#10

Quote:
Originally Posted by FireCat
Посмотреть сообщение
OnPlayerUpdate

pawn Код:
new Float:x,Float:y,Float:z;
for(new i = 0;i < MAX_PLAYERS;i++)
{
    if(IsPlayerNPC(i))
    {
        GetVehiclePos(GetPlayerVehicleID(i),x,y,z);
        for(new j = 0; j<MAX_PLAYERS;j++)
        {
            if(IsPlayerInRangeOfPoint(j,5.0,x,y,z))
            {
                //Seu codigo aqui. Exemplo: SetPlayerVelocity
            }
        }
    }
}
@Luis: Se usar alguns includes que fizeram release, pode totalmente controlar.
Puts, OnPlayerUpDate seguido de dois timers, um checa os NPC e o outro checa os players, isso nгo presta

Serб que vocк pode me passar essas includes que dк para controlar os NPC? nunca vi elas ^^
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)