Üdv mindenki. Ebben a tutorialban egy \"Megijedõ NPC\"-t mutatok be. Ugye elõször is amire szügség lesz:
#define PRESSED(%0) \\
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
stock GetPlayerIDFromName(const playername[], partofname=0)
{
new i;
new playername1[64];
for (i=0;i<MAX_PLAYERS;i++)
{
if (IsPlayerConnected(i))
{
GetPlayerName(i,playername1,sizeof(playername1));
if (strcmp(playername1,playername,true)==0)
{
return i;
}
}
}
new correctsigns_userid=-1;
new tmpuname[128];
new hasmultiple=-1;
if(partofname)
{
for (i=0;i<MAX_PLAYERS;i++)
{
if (IsPlayerConnected(i))
{
GetPlayerName(i,tmpuname,sizeof(tmpuname));
if(!strfind(tmpuname,playername1[partofname],true, 0))
{
hasmultiple++;
correctsigns_userid=i;
}
if (hasmultiple>0)
{
return -2;
}
}
}
}
return correctsigns_userid;
}
Ezeket nem részletezném. Az elsõ a klasszikus PRESSED függvény, a második a GetPlayerIDFromName melynek lényege, hogy névrõl keres rá a játékos ID-jére.
1: Detektáljuk, a játékos mikor céloz és mikor lõ. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_FIRE))
{
//Tehát amikor a játékos nyomja a tûz gombot.
}
if(PRESSED(KEY_HANDBRAKE && IsPlayerInAnyVehicle(playerid) == 0)) //Amikor céloz. Azét kell az IsPlayerInAnyVehicle, mivel a SAMP rendszerében egy gombnak veszi a kéziféket és a célzást.
{
//Tehát amikor a játékos nyomja a célzás gombot és nincs jármûben
}
return 1;
}
2. Adjunk meg néhány információt. Ez a rész az OnPlayerKeyStateChange-részbe fog kerülni
new npc = GetPlayerIDFromName(\"NPC\"); //Lekérjük az NPC nevérõl az ID-jét. Figyelem! Az \"NPC\" részbe az NPC nevét írd.
new Float:x,Float:y,Float:z; //Hozzuk létre az X, Y, Z float típusu változókat.
GetPlayerPos(npc,x,y,z); //Kérjük le az NPC pozícióját. Ez arra lesz jó, hogy megnézd milyen közel vagy az NPC-hez.
new weapon = GetPlayerWeapon(playerid); //Megnézzük a játékosnak milyen fegyvere van.
3. Nézzük meg, hogy az NPC közelébe van-e a játékos, hogy a játékosnál lõfegyver van és, hogy a játékos ránéz-e?
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
new npc = GetPlayerIDFromName(\"NPC\"); //Lekérjük az NPC nevérõl az ID-jét. Figyelem! Az \"NPC\" részbe az NPC nevét írd.
new Float:x,Float:y,Float:z; //Hozzuk létre az X, Y, Z float típusu változókat.
GetPlayerPos(npc,x,y,z); //Kérjük le az NPC pozícióját. Ez arra lesz jó, hogy megnézd milyen közel vagy az NPC-hez.
new weapon = GetPlayerWeapon(playerid); //Megnézzük a játékosnak milyen fegyvere van.
if(IsPlayerInRangeOfPoint(20, x, y, z) && weapon > 10 && GetPlayerTargetPlayer(playerid) == npc) //Megnézzük, hogy a játékos 20 yard távolságon belül van-e a az NPC pozíciójától, hogy lõfegyver van e a játékosnál és, hogy épp az NPC-re néz-e?
{
//Ha igen, csak akkor nézze, hogy a játékos lõ vagy céloz-e.
if(PRESSED(KEY_FIRE))
{
//Tehát amikor a játékos nyomja a tûz gombot.
}
if(PRESSED(KEY_HANDBRAKE && IsPlayerInAnyVehicle(playerid) == 0)) //Amikor céloz. Azét kell az IsPlayerInAnyVehicle, mivel a SAMP rendszerében egy gombnak veszi a kéziféket és a célzást.
{
//Tehát amikor a játékos nyomja a célzás gombot és nincs jármûben
}
}
return 1;
}
4. Utolsó felvonás: Animációk, halál detektálása.
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
new npc = GetPlayerIDFromName(\"NPC\"); //Lekérjük az NPC nevérõl az ID-jét. Figyelem! Az \"NPC\" részbe az NPC nevét írd.
new Float:x,Float:y,Float:z; //Hozzuk létre az X, Y, Z float típusu változókat.
GetPlayerPos(npc,x,y,z); //Kérjük le az NPC pozícióját. Ez arra lesz jó, hogy megnézd milyen közel vagy az NPC-hez.
new weapon = GetPlayerWeapon(playerid); //Megnézzük a játékosnak milyen fegyvere van.
if(IsPlayerInRangeOfPoint(20, x, y, z) && weapon > 10 && GetPlayerTargetPlayer(playerid) == npc) //Megnézzük, hogy a játékos 20 yard távolságon belül van-e a az NPC pozíciójától, hogy lõfegyver van e a játékosnál és, hogy épp az NPC-re néz-e?
{
//Ha igen, csak akkor nézze, hogy a játékos lõ vagy céloz-e.
if(PRESSED(KEY_FIRE))
{
//Tehát amikor a játékos nyomja a tûz gombot.
ApplyAnimation(npc,\"CRACK\",\"crckdeth4\",3.0,0,0,0,1,0);//Rakjuk az NPC-t fekvõ animba.
SetPVarInt(npc, \"death\", 1); //Állítsuk be a death nevû változó értékét 1-re az npc-n.
}
if(PRESSED(KEY_HANDBRAKE && IsPlayerInAnyVehicle(playerid) == 0)) //Amikor céloz. Azét kell az IsPlayerInAnyVehicle, mivel a SAMP rendszerében egy gombnak veszi a kéziféket és a célzást.
{
//Tehát amikor a játékos nyomja a célzás gombot és nincs jármûben
ApplyAnimation(npc,\"ped\",\"handsup\",3.0,0,0,0,1,0);//Rakja fel a kezét az NPC.
}
else
{
//Ha nem céloz a játékos
if(GetPVarInt(npc, \"death\") == 0)//Ha nem halott az NPC
{
ClearAnimations(npc);//Akkor rakja le a kezét. (Vagyis ne legyen rajta anim.)
}
}
}
return 1;
}
Kész! Így néz ki a kód:
#define PRESSED(%0) \\
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
stock GetPlayerIDFromName(const playername[], partofname=0)
{
new i;
new playername1[64];
for (i=0;i<MAX_PLAYERS;i++)
{
if (IsPlayerConnected(i))
{
GetPlayerName(i,playername1,sizeof(playername1));
if (strcmp(playername1,playername,true)==0)
{
return i;
}
}
}
new correctsigns_userid=-1;
new tmpuname[128];
new hasmultiple=-1;
if(partofname)
{
for (i=0;i<MAX_PLAYERS;i++)
{
if (IsPlayerConnected(i))
{
GetPlayerName(i,tmpuname,sizeof(tmpuname));
if(!strfind(tmpuname,playername1[partofname],true, 0))
{
hasmultiple++;
correctsigns_userid=i;
}
if (hasmultiple>0)
{
return -2;
}
}
}
}
return correctsigns_userid;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
new npc = GetPlayerIDFromName(\"NPC\"); //Lekérjük az NPC nevérõl az ID-jét. Figyelem! Az \"NPC\" részbe az NPC nevét írd.
new Float:x,Float:y,Float:z; //Hozzuk létre az X, Y, Z float típusu változókat.
GetPlayerPos(npc,x,y,z); //Kérjük le az NPC pozícióját. Ez arra lesz jó, hogy megnézd milyen közel vagy az NPC-hez.
new weapon = GetPlayerWeapon(playerid); //Megnézzük a játékosnak milyen fegyvere van.
if(IsPlayerInRangeOfPoint(20, x, y, z) && weapon > 10 && GetPlayerTargetPlayer(playerid) == npc) //Megnézzük, hogy a játékos 20 yard távolságon belül van-e a az NPC pozíciójától, hogy lõfegyver van e a játékosnál és, hogy épp az NPC-re néz-e?
{
//Ha igen, csak akkor nézze, hogy a játékos lõ vagy céloz-e.
if(PRESSED(KEY_FIRE))
{
//Tehát amikor a játékos nyomja a tûz gombot.
ApplyAnimation(npc,\"CRACK\",\"crckdeth4\",3.0,0,0,0,1,0);//Rakjuk az NPC-t fekvõ animba.
SetPVarInt(npc, \"death\", 1); //Állítsuk be a death nevû változó értékét 1-re az npc-n.
}
if(PRESSED(KEY_HANDBRAKE && IsPlayerInAnyVehicle(playerid) == 0)) //Amikor céloz. Azét kell az IsPlayerInAnyVehicle, mivel a SAMP rendszerében egy gombnak veszi a kéziféket és a célzást.
{
//Tehát amikor a játékos nyomja a célzás gombot és nincs jármûben
ApplyAnimation(npc,\"ped\",\"handsup\",3.0,0,0,0,1,0);//Rakja fel a kezét az NPC.
}
else
{
//Ha nem céloz a játékos
if(GetPVarInt(npc, \"death\") == 0)//Ha nem halott az NPC
{
ClearAnimations(npc);//Akkor rakja le a kezét. (Vagyis ne legyen rajta anim.)
}
}
}
return 1;
}
Ugye nem is volt olyan nehéz?
Ha bármi hibát találnál benne, válaszban írd meg, köszönöm!
Eredeti:http://forum.sa-mp.com/showthread.php?t=176153 Fordította, Átalakította: vortexY