[Tutorial] Como fazer um NPC

23 de mar. de 2012.
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 Code:
#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 Code:
#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 Code:
#define RECORDING_TYPE 1 //1 para dentro do vehicle, 2 para se o bot estiver a pé


pawn Code:
#include <a_npc>
Vamos fazer include do que precisamos para criar o NPC
pawn Code:
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Faz o loop, quando o record playback acaba, começa a reproduzir gravação outra vez
pawn Code:
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Quando o bot entra começa a reproduzir a gravação
pawn Code:
public OnNPCExitVehicle() StopRecordingPlayback();
Quando o NPC sai do vehicle, para de reproduzir a gravação
pawn Code:
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 Code:
ConnectNPC("Dave","mynpc");
Agora vamos usar o ConnectNPC, sugero que ponham dentro do OnGameModeInit ex:
pawn Code:
public OnGameModeInit() {   print("my gamemode");   ConnectNPC("MyFirstNPC","mynpc");   return 1; }

Ou se for um Filterscript

pawn Code:
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 Code:
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 Code:
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 Code:
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 Code:
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. 

0 comentários:

Postar um comentário