Eredeti téma:http://forum.sa-mp.com/index.php?topic=119947.0
A leírást \"kc\" írta. Magyarosítás: [RKS]Ricsi. Forrás: 
Creating NPCs/*
Kiegészíteném a leírást azzal,hogy létezik egy plugin,ami nagyban megkönnyíti az NPC készítését és kezelését is.
http://forum.sa-mp.com/showthread.php?t=174671Figyelem!0.3c verzión NEM mûködik!
*/ 
NPC készítés
Ebben a leírásban bemutatom nektek, hogyan kell \"NPC\", botokat, szerver által vezényelt játékosokat készíteni.
Felvenni a lejátszófájlt
Elõször nekünk fel kell venni az NPC használatát a .rec fájlt. A szervereden jelentkezz be RCON adminisztrátornak. Ha megvan, töltsd be a NPC felvétel szkriptet: \"/rcon loadfs npc_record\". Itt most tudunk három parancsot használni, melyek az NPC felvételéhez szükségesek. 
- /vrecord [fájlnév] - Elindít egy felvételt, amikor az NPC jármût vezet.
- /ofrecord [fájlnév] - Elindít egy felvételt, amikor az NPC gyalog közlekedik.
- /stoprecord - Leállítja az aktuálisan futó felvételt.
Ebben a leírásban, készítünk egy NPC-t, mely jármût vezet. A szervereden, gépeld a /vrecord [fájlnév] parancsot: /vrecord mynpc.
Vedd fel azt az útvonalat, ahol szeretnéd, hogy az NPC játékosod mozogjon. Ha megvan, gépeld a /stoprecord parancsot. A szervermappád, szkriptfájljai mappában lesz egy \"fájlnév.rec\" fájl. Esetünkben \"mynpc.rec\". Helyezd át ezt a fájlt, a szervermappa/npcmodes/recordings mappába.
Eddig felvettük az NPC-d útvonalát, és áthelyeztük a megfelelõ mappába.
Irányítani az NPC-t
Az npcmodes mappában sok fájlt vehettél észre, ezek az NPC viselkedését szolgálják. Most hozzunk létre egy NPC-t!
Hozz létre egy új Pawn szkript fájlt, és írd bele ( érdemes az elejéhez írni ): 
#define RECORDING \"mynpc\" // Ez az NPC-d neve, melyet felvettél
#define RECORDING_TYPE 1 // Az NPC közlekedése, 1 ha jármût vezet, 2 ha gyalogol
#include <a_npc> // Az NPC függvénykönyvtár beágyazása
public OnRecordingPlaybackEnd ( )
{
  StartRecordingPlayback ( RECORDING_TYPE, RECORDING );
  return 0;
}
#if RECORDING_TYPE == 1 // Ha az NPC típusa jármûves vezetõ
  public OnNPCEnterVehicle ( vehicleid, seatid )
  {
    StartRecordingPlayback ( RECORDING_TYPE, RECORDING );
    return 0;
  }
  public OnNPCExitVehicle ( )
  {
    StopRecordingPlayback ( );
    return 0;
  }
#else // Viszont ha gyalogos
  public OnNPCSpawn ( )
  {
    StartRecordingPlayback ( RECORDING_TYPE, RECORDING );
    return 0;
  }
#endif
 Most vegyük át hogy a kódban szereplõ algoritmusoknak mi a szerepe! 
#define RECORDING \"mynpc\" // Ez annak a fájlnak a neve, melyet te felvettél a szerveren a .rec fájl
 A .rec fájl neve amit felvettünk a szerveren. Itt a neve \"mynpc\", és ezért lett a neve \"mynpc\". 
#define RECORDING_TYPE 1 // Az NPC játékos típusa, ha 1 autót vezet, ha 2 gyalogos
 Az NPC típus definiálása 
#include <a_npc>
 SA-MP, NPC függvénykönyvtárak beágyazása. 
public OnRecordingPlaybackEnd ( )
{
  StartRecordingPlayback ( RECORDING_TYPE, RECORDING );
  return 1;
}
 Ez a kód sor eléri, hogy elindítja az NPC feladatait. Ha az NPC befejezte a neki felvett feladatokat, elkezdi újra. 
public OnNPCEnterVehicle ( vehicleid, seatid )
{
  StartRecordingPlayback ( RECORDING_TYPE, RECORDING );
  return 1;
}
 Ez elindítja a paraméterek közt megadott felvételt, amikor az NPC egy jármûbe ül. 
public OnNPCExitVehicle ( )
{
  StopRecordingPlayback ( );
  return 1;
}
 Ha az NPC elhagyja az egyik jármût, abbahagyja a felvételt. 
public OnNPCSpawn ( )
{
  StartRecordingPlayback ( RECORDING_TYPE, RECORDING );
  return 1;
}
 Amikor az NPC elkezdi a játékot, a paraméterek közt megadott NPC fájl nevét meghívja (elindítja ).
Mint látod ez egyszerû. Ha megvan, fordítsd le a szkriptet.
Ha valamilyen hibát ír ki, akkor nézd át a forráskódot, nem-e hagytál el valahonnan zárójelet, stb.
Ezt a szkriptet tedd be a szervermappa/npcmodes mappába.
Csatlakoztatni az NPC-t
A ConnectNPC ( ) függvény csatlakoztatja az NPC-nket a szerverhez. 
ConnectNPC ( \"Dave\", \"mynpc\" );
 
 \"Dave\" - Az NPC játékos neve. Az NPC játékosokat a nevük alapján lehet megkülönböztetni.
 \"mynpc\" - Az NPC játékos .AMX szkriptje, melyet behelyeztünk a szervermappa/npcmodes mappába.
public OnGameModeInit ( )
{
  print ( \"my gamemode\" );
  ConnectNPC ( \"MyFirstNPC\", \"mynpc\" );
  return 1;
}
 NPC játékos hozzáadása a játékhoz, OnGameModeInit ( ) függvényben. 
public OnFilterScriptInit ( )
{
  print ( \"my filterscript\" );
  ConnectNPC ( \"MyFirstNPC\", \"mynpc\" );
  return 1;
}
 Most, hogy meghatároztuk, hogy a NPC játékos jármût vezessen, már csak adni kell neki egy eszközt, amit vezethet.
Ha az NPC játékosod nincs jármûben, hagyd ki ezt a részt! 
new MyFirstNPCVehicle; // Globális változó
public OnGameModeInit ( )
{
  print ( \"my gamemode\" );
  ConnectNPC ( \"MyFirstNPC\", \"mynpc\" );
  MyFirstNPCVehicle = AddStaticVehicle ( 400, 0.0, 0.0, 5.0, 0.0, 3, 3 );
  return 1;
}
 A NPC játékosnak adunk egy jármût. 
new MyFirstNPCVehicle; // Globális változó
public OnFilterScriptInit ( )
{
  print ( \"my filterscript\" );
  ConnectNPC ( \"MyFirstNPC\", \"mynpc\" );
  MyFirstNPCVehicle = CreateVehicle ( 400, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000 );
  return 1;
}
 Ha az NPC jármûve nem az NPC játékos helyzeténél van, akkor a jármû az NPC játékoshoz kerül.
Most, hogy az NPC jármûve az NPC játékosnál van, már csak bele kell õt tenni. Ha az NPC játékosod gyalogos, hagyd ki ezt a lépést! 
public OnPlayerSpawn ( playerid )
{
  if ( IsPlayerNPC ( playerid ) ) // Ellenõrzi a szerver, hogy a játékos NPC játékos-e
  {
    new npcname [ MAX_PLAYER_NAME ]; // Létrehozunk egy változót, ami az NPC játékos nevét tárolja
    GetPlayerName ( playerid, npcname, sizeof ( npcname ) ); // A szerver lekéri az NPC játékos nevét, eltárolja a változóba
    if ( !strcmp ( npcname, \"MyFirstNPC\", true ) ) // Összehasonlítja a játékos nevét a \"MyFirstNPC\" névvel
    {
      PutPlayerInVehicle ( playerid, MyFirstNPCVehicle, 0 ); // Beletesszük a játékost az NPC játékos jármûvébe
    }
    return 1;
  }
  // Ha a játékos normális játékos, azaz nem NPC játékos, azok funkciói itt lesznek
  return 1;
}
 Ha kettõ, vagy több NPC-t akarsz a szerveredre, akkor külön neveket kell adni, és vigyázni rá, hogy ne keveredjenek egymás funkciói. Itt egy példa, ami kettõ NPC játékost hoz létre: 
public OnPlayerSpawn ( playerid )
{
  if ( IsPlayerNPC ( playerid ) ) // Ellenõrzi a szerver, hogy a játékos NPC játékos-e
  {
    new npcname [ MAX_PLAYER_NAME ]; // Létrehozunk egy változót
    GetPlayerName ( playerid, npcname, sizeof ( npcname ) ); // Megkeressük az NPC játékos nevét
    if ( !strcmp ( npcname, \"MyFirstNPC\", true ) ) // Összehasonlítsuk a játékos nevét a \"MyFirstNPC\" névvel
    {
      PutPlayerInVehicle ( playerid, MyFirstNPCVehicle, 0 ); // Beletesszük a játékost, a jármûbe
      return 1; // Visszatérési érték
    }
    if ( !strcmp ( npcname, \"MySecondNPC\", true ) ) // Ellenõrzik a következõ névvel
    {
      PutPlayerInVehicle(playerid, AnotherVehicleID, 0); // Betesszük õt a jármûbe
      return 1; // Visszatérési érték
    }
    return 1; // Visszatérési érték
  }
  // Azok a játékosok, melyek nem NPC-k, azok funkciói ide jönnek
  return 1;
}
 Fordítsd le a szkriptet, és készen vagy!
Problémák
- Az NPC elhagyja a szervert:
Valami törli, vagy kárt okoz az NPC-dben. 
if ( IsPlayerNPC ( playerid ) ) return 1;
 - Az NPC-d egyátalán nem csatlakozik a szerverhez:
Lehetséges, hogy a szervered jelszóval van védve, ezért nem tud felcsatlakozni.
- Nem tölti be a felvételt készítõ szkriptet:
Próbáld meg újra betölteni a szkriptet, vagy szerezd be újra.
- Az NPC-m áll a kezdõhelyén, és nem csinál semmit.
Menny vissza az OnPlayerSpawn ( ) függvényhez, és nézd meg hogy mindent rendben írtál-e meg.
- Az NPC-t RC5 verzióban készítettem, és most nem mûködik:
A server.cfg-nél egy változó: 
maxnpc number_goes_here
 Ezt írd be a server.cfg-be, ha nem lett volna ott, és az értékét írd 0-ra: 
maxnpc number_goes_here 0