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