Sziasztok!
Ebben a topicban szeretnék bemutatni pár pawno kódot, azokat jellemezve, részletesen leírva mi-mit jelent.
Kezdjük is el. Elsõ kódunk a SendClientMessage
SendClientMessage(playerid, -1, \"www.sampforum.hu\");
Mit csinál a kód: Üzenetet küld annak a játékosnak aki beírja a hozzá kapcsolt parancsot. Pl.: /help
playerid - a játékos aki beírja a parancsot
-1 - Ez egy színkód, jelen esetben fehér. Lehet ez bármilyen, akár kóddal, akár definiálva írod be
idézõ jelbe írt szöveg - ezt az üzenetet fogja megkapni az, aki beírja a kódhoz kapcsolt parancsot
SendClientMessageToAll:
SendClientMessageToAll(-1, \"www.sampforum.hu\");
Mit csinál a kód: Minden játékosnak küld egy üzenetet, ha beírjuk a hozzá kapcsolt parancsot. Pl.: /reklám
-1 - Színkód, jelen esetben fehér
idézõ jelben írt szöveg: ezt az ütenetet kapják meg a playerek
if(IsPlayerInRangeOfPoint( playerid, 1.0, x,y,z))
Mit csinál a kód: Helyhez köt egy parancsot. Csak az adott helyen tudod használni
playerid - játékos aki beírja
1.0 - ez a kör sugarát jelenti, ami megadja, hogy mekkora távolságban használhasd a parancsot az adott helytõl
x,y,z - ide kerül a koordináta, ahol szeretnéd, hogy használható legyen a parancs
CreateObject(363, 1036.17, 1264.66, 21.19, 0.00, 0.00, 0.00);
Mi is ez a kód: Ezzel a kóddal tudsz objecteket létrehozni
elsõ 3 szám amit , választ el - az object helye (koordináta) ahol el fog helyezkedni
a dupla szóköz utáni 3 szám , elválasztva: forgástengelyek.
CreateVehicle(599, -756.3206, 2761.6204, 45.8912, 88.8508, -1, -1, 100);
Mi is ez a kód: Ezzel a kóddal jármûveket tehetsz le a mapon
elsõ szám (599) - kocsi id-je
következõ 3 szám , elválasztva: kocsi spawnolási helye (ide teszi le a kocsit)
-1, -1 - kocsi színe (wikin tudsz nézni színeket) ez jelen esetben fehér
Most akkor nézzünk egy egyszerû parancsot ezeknek a kódoknak a felhasználásával és egy fegyver adó kóddal:
CMD:lopfegyver(playerid, params[]) //parancs amit be kell írni
{ //megnyitjuk a parancsot
if(IsPlayerInRangeOfPoint(playerid, 30.0, 1237, 843, 1274)) //helyhez kötjük a parancsot
{ //megnyitjuk az if függvényt, ez arra jó, hogy csak akkor adja oda a fegyvert a játékosnak ha jó helyen írja be a parancsot
GivePlayerWeapon(playerid,WEAPON_MP5,100); //adunk egy MP5-t a játékosnak
SendClientMessageToAll(KEK, \"Valaki lopott egy MP5-t a fegyverraktárból!\"); //értesítjük a többi játékost a lopásról
SendClientMessage(playerid, KEK, \"Elloptál egy MP5-t a fegyverraktárból, most menekülj!\"); //közöljük a játékossal a lopás sikerességét
} //lezárjuk az if függvényt
else //az else szó megfelel nagyjából a magyar \"ha nem\" kifejezésnek, vagyis ezzel azt állítjuk be, hogy mi történjen, ha nem jó helyen írja be a parancsot valaki!
{ //megnyitás...
SendClientMessage(playerid, KEK, \"Nem vagy a fegyverraktárban!\"); //ez közli a játékossal, hogy nem megfelelõ helyen írta be a parancsot
} //zárás...
return 1; //lezárjuk a parancsot
} //lezárjuk a parancsot
Most, hogy láttuk, hogy is mûködnek ezek a parancsok a gyakorlatba, mutatok egy újabb kódot, részletesen elmagyarázva:
public OnPlayerDeath(playerid, killerid, reason) //playerid=meghalt játékos killerid=gyilkosa reason=indok/ok (igazából azt fejezi ki, hogy miért halt meg a játékos)
{
new string[32]; //errõl késõbb lesz szó!
GivePlayerMoney(killerid, 1000); //killerid=itt azt jelenti hogy ki kapja a pénzt, jelen esetben a gyilkos| 1000=pénz összege amit kap a gyilkos
format(string, sizeof(string), \"Jelenleg %d Ft-od van.\", GetPlayerMoney(killerid)); //ezt a sort lentebb hosszabban elmagyarázom
SendClientMessage(killerid, 0xFFFFFFFF, string); //ezzel már tisztába vagyunk, de leírom. Ez küldi az értesítést a gyilkosnak, hogy mennyi pénze van!
}
/* Vissza térve a
format(string, sizeof(string), \"Jelenleg %d Ft-od van.\", GetPlayerMoney(killerid));
sorra...Ami itt nekünk fontos most, az a \"%d\". Nos ez a jel mindig számot, mennyiséget fejez ki.
Hogy milyen mennyiséget is? Miután beírtuk a \"\"Jelenleg %d Ft-od van.\" szöveget, vesszõvel elválasztva
beírjuk, hogy pontosan minek az értékét is írja ki a \"%d\". Jelen esetben a GetPlayerMoney kódot
használjuk, mivel ez kéri le a játékos pénzét.
Csak zárójelbe megjegyezném, hogy ha elõtte mondjuk írunk egy
#define gyilkospenz GetPlayerMoney(killerid);
definíciót, akkor a GetPlayerMoney(killerid); helyére elég annyit írni, hogy gyilkospenz,
mivel definiálva van, vagyis ugyanazt jelenti.*/
Az elõzõ kódomban ígértem, hogy részletesen kitérek a string és %d részekre:
Hogy mik is ezek? - Igazából pontos magyar megfogalmazást nem tudok rá mondani, de talán az lenne rá a legjobb hogy változók!
Hol veszed hasznát? - Például egy olyan kódnál amit az elõbb bemutattam, vagy bármi olyannál, aminél nem tudsz megadni pontos összeget, mert az változhat!
Mostantól hívjuk õket a rendes nevükön! A Format Stringek fajtái:
- %b Számokat illeszt be bináris számrendszerben
- %c Beillesz egy egyedüli karaktert.
- %d Egész számokat illeszt be.
- %f Beilleszt egy lebegõpontos számot.
- %i Beilleszt egy egész számot.
- %s Beilleszt egy stringet.
- %x Beilleszt egy számot a hexadecimális(16-os) számrendszerbõl!
- %% Beilleszt egy szót!
A placeholdereket(ezeknek a format stringeknek az értelmezõi, mint a kódomban a getmoney) ugyanolyan sorrendben kell beírni vagy szakszóval \"rögzíteni\" mint amilyen sorrendben van a szövegben a format string. Erre vegyünk egy egyszerû példát:
new S[128]; //vegyünk fel azt az értéket amire szükségünk lesz
format(S, sizeof(S), \"%s adott neked $%d Ft-ot.\", Jatekosnev, Penz); //persze itt a Jatekosnev és a Penz szavak már értelmezve lettek
Feleslegesnek érzem, aki beírja eme függvényeket a googlebe ugyan olyan leírást kap róluk. Másrészrõl azzal érvelsz, hogy te az érthetõségre törekedsz akkor ezeket elmagyarázhatnád bõvebben is akár linkelhetnél róla leírást, mert egy kezdõ nem feltétlen biztos, hogy megérti a lent felsorolásra kerülõ dolgokat:
- Ez inkább tanács: Miért akarsz belemenni a függvények / eljárásokba, ha az alapokat amik a legfontosabbak a változókat nem tudják még és csak azt írod, hogy \'errõl majd késõbb lesz szó\'
-Ha ZCMD-vel dolgozol írd le a mûködését, vagy ahogy említettem legalább linkelj róla egy leírást amiben szemlélteted a használatát. Mivel õk kezdõk ezért azt se tudják, hogy eszik vagy isszák.
SendClientMessageToAll(KEK, \"Valaki lopott egy MP5-t a fegyverraktárból!\");
-Tapasztalatból mondom, ha elõzõleg egy makróban nem defineolod a színt, a kezdõ egybõl azzal jön, hogy errort kapott erre a sorra.
-\" %f Beilleszt egy lebegõpontos számot.\" ez is inkább észrevétel volna, a kezdõknek fingjuk sincs mit jelent a lebegõpontos változó, inkább szebb és magyarosabb, ha azt mondod tizedes tört és tudják mirõl van szó.
- \"%s Beilleszt egy stringet.\" Szintén inkább mondd azt helyette, hogy karakter láncot (Emlékszem januárban kezdtem scriptelni és én se vágtam az idegen/szakszavakat)
- %x Beilleszt egy számot a hexadecimális(16-os) számrendszerbõl! - Valóban helyes a megfogalmazás ugyanis értéket is lehet binárisan lehet számot hex-be konvertálni, de egy kezdõ számára ez nem mondd semmit. A leggyakrabban ezt színkódok formájában nyilvánul meg, és ha elmondásod szerint az egyszerûségre és a könnyen érthetõségre törekedsz akkor, inkább mondd azt, hogy egy \'színkód formátumot\' vagy valami hasonlót illeszt be és akkor mindenki számára érthetõ lesz.
Hibák:
else //az else szó megfelel nagyjából a magyar \"ha nem\" kifejezésnek, vagyis ezzel azt állítjuk be, hogy mi történjen, ha nem jó helyen írja be a parancsot valaki!
-Az else szó jelentése nem azt jelenti \"ha nem\", hanem azt, hogy \"ellentétbe\". Ha leírást készítesz valamirõl akkor saját magad is légy tisztába a fogalmakkal.
CreateObject(363, 1036.17, 1264.66, 21.19, 0.00, 0.00, 0.00);
- Drawdistance kihagyva (magyarázatnál)
CreateVehicle(599, -756.3206, 2761.6204, 45.8912, 88.8508, -1, -1, 100);
- Az kocsi angele (avagy ha jól tudom magyarul kb az, hogy merre nézzen a kocsi) kihagyva, ugyan úgy ahogy a kocsi respawnolási ideje (magyarázatnál)
return 1; //lezárjuk a parancsot
-Ez a visszatérés és nem a lezárás, van közte különbség.
-\"Az elõzõ kódomban ígértem, hogy részletesen kitérek a string és %d részekre:
Hogy mik is ezek? - Igazából pontos magyar megfogalmazást nem tudok rá mondani, de talán az lenne rá a legjobb hogy változók!\"
Helytelen, ezek string valamint output formátumok (lásd: http://wiki.sa-mp.com/wiki/Printf)
- \" %% Beilleszt egy szót!\" Tudtommal ez egy %-jelet illeszt be (de ebben nem vagyok biztos és lehet én tudom rosszul)
Ha most azt gondolod, hogy kioktatni akartalak, ne érts félre, mert nem. De a megfogalmazás sokat számít az érthetõség szempontjából és voltak hibáid is és ezeket akartam javítani. Sok sikert a továbbiakban ennek a folytatásához, de véleményem szerint csak szélmalom harcot folytatsz mivel egy függvény leírásánál sokkal tagoltabban paraméterenként elmagyarázzák a dolgot, inkább változókra, megformázásokra és hasonlókra térj ki, hasznosabb. ;)