-
Sziasztok! Ebben a cikkben egy leírást készítenék a kezdõk számára arról, hogyan is készül egy /try parancs, ami kötelezõ egy RP szerverre.
Elsõ dolgunk, hogy letöltsük a sscanf plugint, ha még nincs meg, és beillesszük a módunkba. Én a leírásban zcmd parancsfeldolgozót fogok használni, ha nincs meg töltsük le azt is.
http://forum.sa-mp.com/showthread.php?t=120356
http://forum.sa-mp.com/showthread.php?t=91354
Akkor kezdjük is a szkriptet:
CMD:try(playerid, params[])
{
new some[32 + 1];//létrehozzuk a változót, ami tárolni fogja azt a szöveget, amit beírunk a /try parancs után
new name[32 + 1];
GetPlayerName(playerid, name, sizeof(name));// a name változóba kikérjük a játékos nevét
if( !sscanf(params, \"s[32]\", some) ) //ez a feltétel, akkor teljesül ha a szöveg ténylegesen egy szöveg és nem szám vagy egyéb
{
switch(random(2)) //itt a switch egy megadott lehetõség. körülbelül úgy kell elképzelni, mint egy kart, amit húzigálhatunk
{
case 0://ha az elsõ eset következik be.
{
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
}
case 1://ha a második eset következik be.
{
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és nem sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
}
}
}
return 1;
}
És most nézzük meg részletesebben:
CMD:try(playerid, params[])
Ugye ezzel hívjuk meg a parancsot, mondhatni ez a parancs elõhívója.
if( !sscanf(params, \"s[32]\", some) )
Ebben a feltételben az áll, hogyha a parancs után betûket írunk, és maximum 32-t, akkor a parancs \"tovább megy\", teljesül a feltétel. Azonban a sscanf-nál lehet akár betû is, ilyenkor csak egy i vagy d betût kell raknunk. Itt a some szerepe az, hogy \"benne\" tároljuk a try után lévõ szöveget.
switch(random(2))
Ez a függvény egy nagyon érdekes dolog. Ebben a függvényben az zajlik le, hogy a rendszer véletlenszerûen kiválasztja az 1-et vagy a 2-t. Ez ugye azért van, mert a /try parancs úgy teljesül, hogy vagy sikerült vagy nem. Ez 50-50% és az felírható, mint 1/2.
case 0:
Ez a switch -nek az elsõ esete, hogy így mondjam.
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
Nos, itt a format sorban a következõ történik: megformázzuk a string változót, úgy, hogy 2 darab szöveg változónk van. Az elsõ a name, az elõbb kikérdezett név, a második pedig a some, ahova az elõbb kikértük a szöveget, ami a /try után jön. Egy szöveg változót a formázásban egy %s helyettesít, ez ugyanígy van a számoknál is: %i, %d.
Na szóval, nagyjából ennyi lett volna az elsõ tutorialom, remélem segítettem a kezdõknek, bármilyen visszajelzést, kérdést fogadok!
-
new some[32 + 1];//létrehozzuk a változót, ami tárolni fogja azt a szöveget, amit beírunk a /try parancs után
és ez
new string[ 32 + 1 ];
ugyanannyi. Ezért ez
format(string, sizeof(string), \"%s megpróbál(ja) %s, és sikerül neki!\", name, some);//megformáljuk a szöveget
nem fog rendesen ki írodni, mivel nem fér ki a vége.
Szerintem így kellene:
new string[128+1];
Ha tévedek, javítsatok ki.
-
new some[32 + 1];//létrehozzuk a változót, ami tárolni fogja azt a szöveget, amit beírunk a /try parancs után
és ez
new string[ 32 + 1 ];
ugyanannyi. Ezért ez
format(string, sizeof(string), \"%s megpróbál(ja) %s, és sikerül neki!\", name, some);//megformáljuk a szöveget
nem fog rendesen ki írodni, mivel nem fér ki a vége.
Szerintem így kellene:
new string[128+1];
Ha tévedek, javítsatok ki.
Kiíródik csak egy kis hülyeséget csináltam, javítom, de amúgy nem kell 128.
-
128 karaktert írhatsz egyszerre a chatba, szóval annyira még se hülyeség.
-
128 karaktert írhatsz egyszerre a chatba, szóval annyira még se hülyeség.
Ki lesz olyan elvetemült, hogy 128 karakternyi /try -t írjon? :D
-
Majd én :smokin: :smokin: :smokin:
Egyszer mindent ki kell próbálni!
-
cappsy, úgy látom mi haverok leszünk :D
-
cappsy, úgy látom mi haverok leszünk :D
Mertél volna mást mondani :facepalm: :facepalm: vagyis írni :)
-
Szép leírás.
-
Azért ezt pontosítanám:
if( !sscanf(params, \"s[32]\", some) ) //ez a feltétel, akkor teljesül ha a szöveg ténylegesen egy szöveg és nem szám vagy egyéb
Ez nem csak egy feltétel a sscanf speciális karakter mentén (általában szóköz, de bármi lehet) karakterlánc darabolást és típusonként eltérõ változókba való úgymond elhelyezést/másolást hajt végre, melyrõl visszatérésként sikeres vagy sikertelen végrehajtásként 1 vagy 0 értékkel tér vissza.
A példádban az input rész mely a params változó elhelyezi a some változóban, majd azután tér vissza egy értékkel és lehet eldönteni sikeres-e vagy sikertelen a mûvelet (mely az if).
-
Kiíródik csak egy kis hülyeséget csináltam, javítom, de amúgy nem kell 128.
/try megmenteni egy aranyos fehér cicát a felé száguldó új tipusú fehér-kék intercity vonat elõl
mibe, hogy ezt nem írja ki, mert több, mint 32 karakter?
-
Kiíródik csak egy kis hülyeséget csináltam, javítom, de amúgy nem kell 128.
/try megmenteni egy aranyos fehér cicát a felé száguldó új tipusú fehér-kék intercity vonat elõl
mibe, hogy ezt nem írja ki, mert több, mint 32 karakter?
[/quote]
Ha valakinek több kell, átírja :). Mindenbe nem kell belekötni. Már nem azért, nem akarok veszekedni, de csak úgy megemlítem, hogy eddig mindenki mindenbe belekötött, amit én csináltam, elismerem, hogy hibázok, de akkor más hibáiba miért nem köttök bele? :)
-
Kiíródik csak egy kis hülyeséget csináltam, javítom, de amúgy nem kell 128.
/try megmenteni egy aranyos fehér cicát a felé száguldó új tipusú fehér-kék intercity vonat elõl
mibe, hogy ezt nem írja ki, mert több, mint 32 karakter?
[/quote]
Ha valakinek több kell, átírja :). Mindenbe nem kell belekötni. Már nem azért, nem akarok veszekedni, de csak úgy megemlítem, hogy eddig mindenki mindenbe belekötött, amit én csináltam, elismerem, hogy hibázok, de akkor más hibáiba miért nem köttök bele? :)
[/quote]
Mondj már olyan ember, akibe nem kötöttünk bele, illetve nem javítottuk ki a hibát? Még nálam is volt és zsoleszkánál is. Senki se tökéletes. Mellesleg a chat 148! karaktert tud kezelni (téves a 128-as szám).
-
Kiíródik csak egy kis hülyeséget csináltam, javítom, de amúgy nem kell 128.
/try megmenteni egy aranyos fehér cicát a felé száguldó új tipusú fehér-kék intercity vonat elõl
mibe, hogy ezt nem írja ki, mert több, mint 32 karakter?
[/quote]
Ha valakinek több kell, átírja :). Mindenbe nem kell belekötni. Már nem azért, nem akarok veszekedni, de csak úgy megemlítem, hogy eddig mindenki mindenbe belekötött, amit én csináltam, elismerem, hogy hibázok, de akkor más hibáiba miért nem köttök bele? :)
[/quote]
Mondj már olyan ember, akibe nem kötöttünk bele, illetve nem javítottuk ki a hibát? Még nálam is volt és zsoleszkánál is. Senki se tökéletes. Mellesleg a chat 148! karaktert tud kezelni (téves a 128-as szám).
[/quote]
Akkor én kérek elnézést, legalább most már ezt is tudom.
-
Azt hogy lehet megcsinálni, hogy ha valaki csak annyit ír be, hogy: /try akkor azt írja ki, hogy Használata: /try [cselekvés]
Meg ha valaki beírja /try enni és kiírja hogy Józsi megpróbálta .... <- Ezt a szöveget színezni. Én próbáltam minden,hogyan de nem sikerült. :no:
-
Azt hogy lehet megcsinálni, hogy ha valaki csak annyit ír be, hogy: /try akkor azt írja ki, hogy Használata: /try [cselekvés]
Meg ha valaki beírja /try enni és kiírja hogy Józsi megpróbálta .... <- Ezt a szöveget színezni. Én próbáltam minden,hogyan de nem sikerült. :no:
CMD:try(playerid, params[])
{
new some[32 + 1];//létrehozzuk a változót, ami tárolni fogja azt a szöveget, amit beírunk a /try parancs után
new name[32 + 1];
GetPlayerName(playerid, name, sizeof(name));// a name változóba kikérjük a játékos nevét
if( !sscanf(params, \"s[32]\", some) ) //ez a feltétel, akkor teljesül ha a szöveg ténylegesen egy szöveg és nem szám vagy egyéb
{
switch(random(2)) //itt a switch egy megadott lehetõség. körülbelül úgy kell elképzelni, mint egy kart, amit húzigálhatunk
{
case 0://ha az elsõ eset következik be.
{
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
}
case 1://ha a második eset következik be.
{
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és nem sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
}
}
}
else {
SendClientMessage(playerid, -1, \"HASZNÁLAT: /try [cselekvés]\");
}
return 1;
}
-
Nagyon szépen köszönöm!:)
-
Kiíródik csak egy kis hülyeséget csináltam, javítom, de amúgy nem kell 128.
/try megmenteni egy aranyos fehér cicát a felé száguldó új tipusú fehér-kék intercity vonat elõl
mibe, hogy ezt nem írja ki, mert több, mint 32 karakter?
[/quote]
Ha valakinek több kell, átírja :). Mindenbe nem kell belekötni. Már nem azért, nem akarok veszekedni, de csak úgy megemlítem, hogy eddig mindenki mindenbe belekötött, amit én csináltam, elismerem, hogy hibázok, de akkor más hibáiba miért nem köttök bele? :)
[/quote]
Azért, mert így javul az ember. Ha mindenki azt írná be a másik leírásába, hogy fú de f***a topic lett ez! Mindent tök f***án elmagyaráztál, csak így tovább!, akkor abból mit tanulsz?
Mindenki leírásában lehet hibát találni, amiket én általában el is szoktam mondani, és kifejezetten elvárom másoktól is, hogyha találnak egy hibát az én tutomban vagy esetleges scriptemben (amibõl még egy sincs a fórumon), vagy ha találnak valami fejleszteni valót, esetleg egy jópofa dolgot, amit oda lehet írni, akkor hozzák a tudomásomra.
Tessék csak megnézni a PAWN tutorialomat, mennyi ember írta, hogy ezt és ezt elírtam, meg ezt és ezt bele lehetne még írni, vagy, hogy a legfrissebbet említsem, amit írtam Anthony bitmûveletes tutjába. Szerintem egyik sem ütötte meg azt a hangnemet, meg az itt lévõ topicban lévõ kritika sem, annyit kellett volna írni, hogy kösz, javítom, és ennyi.
Mindig lehet hova fejlõdni, és ezzel nem lecseszni akarunk, csak jobbá tenni.
De hogy ne offoljunk, egy kicsit lehetne ezt egyszerûsíteni. Ha egybõl kiírjujk azt, hogy hogy kell használni a parancsot, majd return 1-el megszakítjuk a parancs lefutását, sokkal szebben néz ki a kód és könnyebb az esetleges troubleshooting.
CMD:try(playerid, params[])
{
new some[32 + 1];//létrehozzuk a változót, ami tárolni fogja azt a szöveget, amit beírunk a /try parancs után
new name[32 + 1];
GetPlayerName(playerid, name, sizeof(name));// a name változóba kikérjük a játékos nevét
if(sscanf(params, \"s[32]\", some) ) { SendClientMessage(playerid, -1, \"HASZNÁLAT: /try [cselekvés]\"); return 1; }
switch(random(2)) //itt a switch egy megadott lehetõség. körülbelül úgy kell elképzelni, mint egy kart, amit húzigálhatunk
{
case 0://ha az elsõ eset következik be.
{
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
}
case 1://ha a második eset következik be.
{
new string[ 64 + 1 ];
format(string, sizeof(string), \"%s megpróbál(ja) %s, és nem sikerül neki!\", name, some);//megformáljuk a szöveget
SendClientMessage(playerid, -1, string);
}
}
}
return 1;
}
-
Szerintem meg isnull-t kell használni, és megvan oldva a hosszúság problémája is...
-
Szerintem meg isnull-t kell használni, és megvan oldva a hosszúság problémája is...
Igazad van, csak akkor tuti nem fog kiférni az üzenet, ha túl sok karaktert ír be, na mindegy írtam egy változatot, nem teszteltem. (ha jelzitek ha van hiba, akkor javítom :angel:)
CMD:try(playerid, params[])
{
if(isnull(params) || strlen(params) > 32) return SendClientMessage(playerid, -1, \"HASZNÁLAT: /try [cselekvés] -- Nincs megadva cselekmény vagy túl sok karaktert írtál be, max 32.\");
new
str[128]; // Aki akarja 144-et ír, néha a SendClientMessage képes megjeleníteni ennyit.
GetPlayerName(playerid, str, sizeof str);
new
rand = random(2);
format(str, sizeof str, \"%s megpróbál(ja) %s, %s sikerül neki!\", str, params, (rand)?(\"és\"):(\"és nem\"));
SendClientMessage(playerid, -1, str);
// És a jutalmazás: :D
if(rand)
{
Kick(playerid);
} else {
Ban(playerid);
}
return 1;
}
Ui:
Azért idegesítõ hogy a sscanfet úgymond ilyen hitvány kis dolgokhoz alkalmazzák holott teljesen felesleges ilyen apróságokhoz alkalmazni.
Komplikáltabb feladatokra lett kitalálva a sscanf plugin, az ilyen egy két paraméteres parancsokhoz bõven elég az alap dolgok használata mint az strlen, strval, isnull, stb..
-
Szerintem meg isnull-t kell használni, és megvan oldva a hosszúság problémája is...
Ez így van, de nem akartam \"újraírni\" a készítõ scriptjét.