[Tutorial] Crear NPC (bots) + sus funciones.
#1

En este tutorial vamos a aprender a como realizar NPCs (bots) que parezcan que tenga vida propia.

  • Crear bot
  • Como ponerlo en el servidor
  • Funciones y callbacks para NPCs

Crear bot

їQuй necesitaremos para grabarlo?
  • npc_record
Nota: Tambiйn podemos usar otro grabador de NPC, pero este es el que viene por defecto en SA:MP

їComo grabar?
  • Cargamos el filterscript:
    Aсadimos 'npc_record' a la lнnea 'filterscripts' de nuestro server.cfg y guardamos...
  • Abrimos nuestro servidor, entramos....
    Una vez dentro, deberemos de logearnos como administrador RCON (contraseсa en server.cfg) con el siguiente comando: /rcon login contraseсa
  • Una vez ya logeados como admin RCON... podremos ejecutar los cmds siguientes:

/vrecord [nombre]
  • [nombre] se refiere al nombre del archivo que tendremos posteriormente (.rec)
  • /vrecord servirб para grabar en vehнculo, es decir, que si queremos crear un NPC/bot que controle un vehнculo, deberemos subirnos a uno, y empezar a grabar desde el vehнculo con este comando.
Nota: Para el comando /vrecord se necesitarб estar en un vehнculo.

/ofrecord [nombre]
  • [nombre] se refiere al nombre del archivo que tendremos posteriormente (.rec)
  • /ofrecord servirб para grabar a pie, es decir para correr, saltar, andar, hacer animaciones, todo lo que hagamos serб reproducido despuйs.

/stoprecord [nombre]
  • Cuando hayamos terminado de grabar, usaremos este comando, para paralizar la grabaciуn y obtener asн el archivo .rec.

Explicaciуn: para crear un bot, necesitaremos grabarlo, lo que haremos serб ejecutar uno de esos 2 comandos (depende de lo que queramos), y entonces estaremos grabando, desde el momento que ejecutamos el comando, hasta el momento que paralizamos la grabaciуn (/stoprecord), el recorrido, animaciones, etc serбn grabados en un archivo .rec para despuйs ser reproducido como si fuera un jugador normal.



Como ponerlo en el servidor...

Una vez ya grabado, saldremos del servidor e iremos a la carpeta 'scriptfiles' del servidor en el que hemos grabado.

Allн encontraremos un archivo con el nombre que introducimos anteriormente, con la extensiуn .rec

Copiamos ese archivo a la carpeta... npcmodes/recordings/
Una vez allн abrimos pawno.exe (.../pawno/pawno.exe), y daremos crearemos un nuevo archivo.

Borramos todo, y empezamos a crearlo...
pawn Код:
#include <a_npc>
main(){}

#define REC_NAME "test" // Aquн deberбn de poner el nombre del archivo .rec
#define NPC_TYPE 0 // 0 serб a pie, cambiamos a 1 si grabemos en vehнculo.

public OnRecordingPlaybackEnd() //Cuando la reproducciуn del bot ha terminado..
{
StartRecordingPlayback(NPC_TYPE, REC_NAME); //Volvemos a empezarla...
return 1;
}

#if NPC_TYPE == 0

public OnNPCSpawn() //Cuando el bot spawnea
{
StartRecordingPlayback(NPC_TYPE, REC_NAME); //Comenzamos la reproducciуn del bot.
return 1;
}

#else

public OnNPCEnterVehicle(vehicleid, seatid) //Cuando el bot entra a un vehнculo
{
StartRecordingPlayback(NPC_TYPE, REC_NAME);
return 1;
}

public OnNPCExitVehicle() //Cuando el bot sale de un vehнculo
{
StopRecordingPlayback();
return 1;
}
#endif
Bien, ahora guardamos este .pwn en .../npcmodes con cualquier nombre (despuйs serб usado).

Bien, una vez compilado y guardado, abrimos el FS/GM donde haremos que el NPC comienze.

Ahora, conectaremos el NPC al servidor:
pawn Код:
new NPC_Veh; //Solo si nuestro NPC fue grabado en un vehнculo.

public OnGameModeInit()
{
  ConnectNPC("nombre", "script"); //en nombre se pone el nombre del NPC, y en script el nombre del .amx/.pwn que creemos anteriormente
NPC_Veh = CreateVehicle(400, 0.0, 0.0, 0.0, 0.0, -1, -1, 5000); //Si el NPC va en vehнculo, crearemos el vehнculo del NPC...
  return 1;
}
Una vez que tengamos esto, nuestro NPC, ya se conectarб, pero aъn no aparecerб... para evitar registros, diбlogos etc, haremos los siguiente: en todas las siguientes callbacks pondremos arriba:
pawn Код:
if(IsPlayerNPC(playerid)) return 1;
  • OnPlayerConnect
  • OnPlayerDisconnect
  • OnPlayerRequestClass
  • OnPlayerRequestSpawn
Como en este ejemplo:
pawn Код:
public OnPlayerConnect(playerid)
{
    if(IsPlayerNPC(playerid)) return 1;
//siempre poner arriba del todo, antes de las demбs funciones
    return 1;
}
Ese cуdigo harб que si el jugador es un NPC, no se cumpla las funciones de OnPlayerConnect, para asн evitar registros etc.


Ahora nos dirigiremos a OnPlayerSpawn
pawn Код:
public OnPlayerSpawn(playerid)
{
  if(IsPlayerNPC(playerid))
  {
    new npcname[24];
    GetPlayerName(playerid, npcname, 24);
    if(!strcmp(npcname, "nombre", true)) //En nombre el name del NPC
    {
      //Aquн podremos darle demбs funciones, como SetPlayerSkin, etc.
      PutPlayerInVehicle(playerid, NPC_Veh, 0); // Si grabemos el NPC dentro de un vehнculo, lo introducimos a el.
    }
    return 1;
  }
  //Lo otro para players normales va aquн!
  return 1;
}
Compilamos, y ya deberнa de empezar nuestro NPC.



Funciones y callbacks para NPCs

Las siguientes funciones y callbacks solo funcionarбn si las introducimos en el .pwn del NPC (.../npcmodes/name.pwn)

Funciones:

ConnectNPC(name[], script[])
  • Conecta un NPC.
  • name[] : Nombre del NPC
  • script[] : Nombre del archivo .amx en /npcmodes
GetDistanceFromMeToPoint(Float:x, Float:y, Float:z, Float:Distance)
  • Obtiene la distancia que hay entre el NPC y un punto determinado.
  • Float:x : Coordenada X
  • Float:y : Coordenada Y
  • Float:z : Coordenada Z
  • Float:Distance : Donde el valor serб devuelto
GetMyFacingAngle(Float:Angle)
  • Obtiene el бngulo del NPC.
  • Float:Angle : Donde el valor serб devuelto
GetMyPos(Float:x, Float:y, Float:z)
  • Obtiene la posiciуn del NPC.
  • Float:x : Donde el valor X serб devuelto
  • Float:y : Donde el valor Y serб devuelto
  • Float:z : Donde el valor Z serб devuelto
PauseRecordingPlayback()
  • Sirve para pausar la reproducciуn del NPC.
  • Esta funciуn no tiene parбmetros
ResumeRecordingPlayback()
  • Sirve para reanudar la reproducciуn del NPC, si antes habнa sido pausada.
  • Esta funciуn no tiene parбmetros
SendChat(msg[])
  • Envнa un mensaje como si el NPC lo hubiera escrito.
  • msg[] : El mensaje.
SendCommand(commandtext[])
  • Esta funciуn hace que el NPC ejecute un comando.
  • commandtext[] : El comando.
SetMyFacingAngle(Float:ang)
  • Esta funciуn cambia el бngulo del NPC.
  • Float:ang : El бngulo nuevo.
SetMyPos(Float:x, Float:y, Float:z)
  • Cambia las coordenadas al NPC.
  • Float:x : Coordenada X
  • Float:y : Coordenada Y
  • Float:z : Coordenada Z
StartRecordingPlayback(playbacktype, recordname[])
  • Comienza a reproducirse el NPC.
  • playbacktype : el tipo de grabaciуn
  • recordname[] : Nombre del archivo .rec
StopRecordingPlayback()
  • Paraliza por completo el NPC.
  • Esta funciуn no tiene parбmetros.


Otro

Como forzar a un NPC reproducir una animaciуn.

Tambiйn editar 'maxnpc' en server.cfg al nъmero mбximo de NPCs que quieran conectar, ya que si no el NPC no podrб conectar. (Gracias a EnzoMetlc por recordarmelo)


Saludos y espero que os haya servido!
Reply
#2

Buen tuto.

Pero te faltу mencionar que no deben tener el '
maxnpc' en el "server.cfg" en "0".
Por que ese pequeсo detalle me cabreу por 4 meses ¬¬.

Saludos.
Reply
#3

Muy bueno

+rep
Reply
#4

Muy bueno adri1!

He creado un "creador de peatones"

https://sampforum.blast.hk/showthread.php?tid=470399

Saludos.
Reply
#5

Adri1, impecable! Lo probarй! .


Una pregunta їSi quiero crear + de 1 NPC, cуmo lo empleo?їHago los mismo dos veces?
Reply
#6

buen tuto C: +Rep
Reply
#7

Encontrй un pequeсo error en el post:

Quote:
Originally Posted by adri1
Посмотреть сообщение
GetMyPos(Float:PosX, Float:PosY, Float:PosZ)
  • Obtiene el бngulo del NPC.
  • Float:PosX: Donde el valor PosX serб devuelto
  • Float:PosY: Donde el valor PosY serб devuelto
  • Float:PosZ: Donde el valor PosZ serб devuelto
No lo creo e_e...
Reply
#8

Quote:
Originally Posted by EnzoMetlc
Посмотреть сообщение
Encontrй un pequeсo error en el post:




No lo creo e_e...
Gracias, ya lo edito, y de paso dejo un ejemplo de que se puede hacer con esto:
[ame="http://www.youtube.com/watch?v=uBrsdBh3Ko8"]*******[/ame]
Reply
#9

exelente casi igual que el juego
Reply
#10

Quote:
Originally Posted by adri1
Посмотреть сообщение
En este tutorial vamos a aprender a como realizar NPCs (bots) que parezcan que tenga vida propia.

  • Crear bot
  • Como ponerlo en el servidor
  • Funciones y callbacks para NPCs

Crear bot

їQuй necesitaremos para grabarlo?
  • npc_record
Nota: Tambiйn podemos usar otro grabador de NPC, pero este es el que viene por defecto en SA:MP

їComo grabar?
  • Cargamos el filterscript:
    Aсadimos 'npc_record' a la lнnea 'filterscripts' de nuestro server.cfg y guardamos...
  • Abrimos nuestro servidor, entramos....
    Una vez dentro, deberemos de logearnos como administrador RCON (contraseсa en server.cfg) con el siguiente comando: /rcon login contraseсa
  • Una vez ya logeados como admin RCON... podremos ejecutar los cmds siguientes:

/vrecord [nombre]
  • [nombre] se refiere al nombre del archivo que tendremos posteriormente (.rec)
  • /vrecord servirб para grabar en vehнculo, es decir, que si queremos crear un NPC/bot que controle un vehнculo, deberemos subirnos a uno, y empezar a grabar desde el vehнculo con este comando.
Nota: Para el comando /vrecord se necesitarб estar en un vehнculo.

/ofrecord [nombre]
  • [nombre] se refiere al nombre del archivo que tendremos posteriormente (.rec)
  • /ofrecord servirб para grabar a pie, es decir para correr, saltar, andar, hacer animaciones, todo lo que hagamos serб reproducido despuйs.

/stoprecord [nombre]
  • Cuando hayamos terminado de grabar, usaremos este comando, para paralizar la grabaciуn y obtener asн el archivo .rec.

Explicaciуn: para crear un bot, necesitaremos grabarlo, lo que haremos serб ejecutar uno de esos 2 comandos (depende de lo que queramos), y entonces estaremos grabando, desde el momento que ejecutamos el comando, hasta el momento que paralizamos la grabaciуn (/stoprecord), el recorrido, animaciones, etc serбn grabados en un archivo .rec para despuйs ser reproducido como si fuera un jugador normal.



Como ponerlo en el servidor...

Una vez ya grabado, saldremos del servidor e iremos a la carpeta 'scriptfiles' del servidor en el que hemos grabado.

Allн encontraremos un archivo con el nombre que introducimos anteriormente, con la extensiуn .rec

Copiamos ese archivo a la carpeta... npcmodes/recordings/
Una vez allн abrimos pawno.exe (.../pawno/pawno.exe), y daremos crearemos un nuevo archivo.

Borramos todo, y empezamos a crearlo...
pawn Код:
#include <a_npc>
main(){}

#define REC_NAME "test" // Aquн deberбn de poner el nombre del archivo .rec
#define NPC_TYPE 0 // 0 serб a pie, cambiamos a 1 si grabemos en vehнculo.

public OnRecordingPlaybackEnd() //Cuando la reproducciуn del bot ha terminado..
{
StartRecordingPlayback(NPC_TYPE, REC_NAME); //Volvemos a empezarla...
return 1;
}

#if NPC_TYPE == 0

public OnNPCSpawn() //Cuando el bot spawnea
{
StartRecordingPlayback(NPC_TYPE, REC_NAME); //Comenzamos la reproducciуn del bot.
return 1;
}

#else

public OnNPCEnterVehicle(vehicleid, seatid) //Cuando el bot entra a un vehнculo
{
StartRecordingPlayback(NPC_TYPE, REC_NAME);
return 1;
}

public OnNPCExitVehicle() //Cuando el bot sale de un vehнculo
{
StopRecordingPlayback();
return 1;
}
#endif
Bien, ahora guardamos este .pwn en .../npcmodes con cualquier nombre (despuйs serб usado).

Bien, una vez compilado y guardado, abrimos el FS/GM donde haremos que el NPC comienze.

Ahora, conectaremos el NPC al servidor:
pawn Код:
new NPC_Veh; //Solo si nuestro NPC fue grabado en un vehнculo.

public OnGameModeInit()
{
  ConnectNPC("nombre", "script"); //en nombre se pone el nombre del NPC, y en script el nombre del .amx/.pwn que creemos anteriormente
NPC_Veh = CreateVehicle(400, 0.0, 0.0, 0.0, 0.0, -1, -1, 5000); //Si el NPC va en vehнculo, crearemos el vehнculo del NPC...
  return 1;
}
Una vez que tengamos esto, nuestro NPC, ya se conectarб, pero aъn no aparecerб... para evitar registros, diбlogos etc, haremos los siguiente: en todas las siguientes callbacks pondremos arriba:
pawn Код:
if(IsPlayerNPC(playerid)) return 1;
  • OnPlayerConnect
  • OnPlayerDisconnect
  • OnPlayerRequestClass
  • OnPlayerRequestSpawn
Como en este ejemplo:
pawn Код:
public OnPlayerConnect(playerid)
{
    if(IsPlayerNPC(playerid)) return 1;
//siempre poner arriba del todo, antes de las demбs funciones
    return 1;
}
Ese cуdigo harб que si el jugador es un NPC, no se cumpla las funciones de OnPlayerConnect, para asн evitar registros etc.


Ahora nos dirigiremos a OnPlayerSpawn
pawn Код:
public OnPlayerSpawn(playerid)
{
  if(IsPlayerNPC(playerid))
  {
    new npcname[24];
    GetPlayerName(playerid, npcname, 24);
    if(!strcmp(npcname, "nombre", true)) //En nombre el name del NPC
    {
      //Aquн podremos darle demбs funciones, como SetPlayerSkin, etc.
      PutPlayerInVehicle(playerid, NPC_Veh, 0); // Si grabemos el NPC dentro de un vehнculo, lo introducimos a el.
    }
    return 1;
  }
  //Lo otro para players normales va aquн!
  return 1;
}
Compilamos, y ya deberнa de empezar nuestro NPC.



Funciones y callbacks para NPCs

Las siguientes funciones y callbacks solo funcionarбn si las introducimos en el .pwn del NPC (.../npcmodes/name.pwn)

Funciones:

ConnectNPC(name[], script[])
  • Conecta un NPC.
  • name[] : Nombre del NPC
  • script[] : Nombre del archivo .amx en /npcmodes
GetDistanceFromMeToPoint(Float, Float:y, Float:z, Floatistance)
  • Obtiene la distancia que hay entre el NPC y un punto determinado.
  • Float : Coordenada X
  • Float:y : Coordenada Y
  • Float:z : Coordenada Z
  • Floatistance : Donde el valor serб devuelto
GetMyFacingAngle(Float:Angle)
  • Obtiene el бngulo del NPC.
  • Float:Angle : Donde el valor serб devuelto
GetMyPos(Float, Float:y, Float:z)
  • Obtiene la posiciуn del NPC.
  • Float : Donde el valor X serб devuelto
  • Float:y : Donde el valor Y serб devuelto
  • Float:z : Donde el valor Z serб devuelto
PauseRecordingPlayback()
  • Sirve para pausar la reproducciуn del NPC.
  • Esta funciуn no tiene parбmetros
ResumeRecordingPlayback()
  • Sirve para reanudar la reproducciуn del NPC, si antes habнa sido pausada.
  • Esta funciуn no tiene parбmetros
SendChat(msg[])
  • Envнa un mensaje como si el NPC lo hubiera escrito.
  • msg[] : El mensaje.
SendCommand(commandtext[])
  • Esta funciуn hace que el NPC ejecute un comando.
  • commandtext[] : El comando.
SetMyFacingAngle(Float:ang)
  • Esta funciуn cambia el бngulo del NPC.
  • Float:ang : El бngulo nuevo.
SetMyPos(Float, Float:y, Float:z)
  • Cambia las coordenadas al NPC.
  • Float : Coordenada X
  • Float:y : Coordenada Y
  • Float:z : Coordenada Z
StartRecordingPlayback(playbacktype, recordname[])
  • Comienza a reproducirse el NPC.
  • playbacktype : el tipo de grabaciуn
  • recordname[] : Nombre del archivo .rec
StopRecordingPlayback()
  • Paraliza por completo el NPC.
  • Esta funciуn no tiene parбmetros.


Otro

Como forzar a un NPC reproducir una animaciуn.

Tambiйn editar 'maxnpc' en server.cfg al nъmero mбximo de NPCs que quieran conectar, ya que si no el NPC no podrб conectar. (Gracias a EnzoMetlc por recordarmelo)


Saludos y espero que os haya servido!

bonito ahora funcionaria mejor si cambias y colocas esto pollito ve
#define NPC_TYPE 2
#if NPC_TYPE == 2
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)