GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Leírások/Útmutatók => A témát indította: doboka98 - 2012. Október 14. - 21:20:03

Cím: Hogyan is készül egy /try parancs?
Írta: doboka98 - 2012. Október 14. - 21:20:03
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!
Cím: Hogyan is készül egy /try parancs?
Írta: DrachenGod - 2012. Október 14. - 21:43:07
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.
Cím: Hogyan is készül egy /try parancs?
Írta: doboka98 - 2012. Október 14. - 21:44:21
Idézetet írta: DrachenGod date=1350243787\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic

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.
Cím: Hogyan is készül egy /try parancs?
Írta: Depi - 2012. Október 14. - 22:09:47
128 karaktert írhatsz egyszerre a chatba, szóval annyira még se hülyeség.
Cím: Hogyan is készül egy /try parancs?
Írta: doboka98 - 2012. Október 14. - 22:15:46
Idézetet írta: Draven date=1350245387\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic
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
Cím: Hogyan is készül egy /try parancs?
Írta: Cappsy - 2012. Október 14. - 22:43:43
Majd én  :smokin: :smokin: :smokin:
Egyszer mindent ki kell próbálni!
Cím: Hogyan is készül egy /try parancs?
Írta: doboka98 - 2012. Október 14. - 22:48:22
cappsy, úgy látom mi haverok leszünk :D
Cím: Hogyan is készül egy /try parancs?
Írta: Cappsy - 2012. Október 14. - 22:49:42
Idézetet írta: doboka98 date=1350247702\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic
cappsy, úgy látom mi haverok leszünk :D
 
Mertél volna mást mondani  :facepalm: :facepalm: vagyis írni :)
Cím: Hogyan is készül egy /try parancs?
Írta: instant - 2012. Október 14. - 23:00:10
Szép leírás.
Cím: Hogyan is készül egy /try parancs?
Írta: Zsolesszka - 2012. Október 16. - 10:27:32
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).
Cím: Hogyan is készül egy /try parancs?
Írta: TengeriMalac - 2012. Október 16. - 13:52:11
Idézetet írta: doboka98 date=1350243861\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic
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?
Cím: Hogyan is készül egy /try parancs?
Írta: doboka98 - 2012. Október 16. - 14:38:38
Idézetet írta: TengeriMalac date=1350388331\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic


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? :)
Cím: Hogyan is készül egy /try parancs?
Írta: DrAkE - 2012. Október 16. - 15:23:51
Idézetet írta: doboka98 date=1350391118\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic


 

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).
Cím: Hogyan is készül egy /try parancs?
Írta: Depi - 2012. Október 16. - 17:00:14
Idézetet írta: DrAkE date=1350393831\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic


 

 

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.
Cím: Hogyan is készül egy /try parancs?
Írta: banbence - 2012. Október 18. - 21:31:42
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:
Cím: Hogyan is készül egy /try parancs?
Írta: doboka98 - 2012. Október 19. - 11:57:19
Idézetet írta: banbence date=1350588702\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic
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;
    }
Cím: Hogyan is készül egy /try parancs?
Írta: banbence - 2012. Október 19. - 12:36:30
Nagyon szépen köszönöm!:)
Cím: Hogyan is készül egy /try parancs?
Írta: krisk - 2012. Október 21. - 07:18:28
Idézetet írta: doboka98 date=1350391118\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic


 

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;
    }
Cím: Hogyan is készül egy /try parancs?
Írta: DrAkE - 2012. Október 21. - 20:08:59
Szerintem meg isnull-t kell használni, és megvan oldva a hosszúság problémája is...
Cím: Hogyan is készül egy /try parancs?
Írta: Zsolesszka - 2012. Október 21. - 21:19:39
Idézetet írta: DrAkE date=1350842939\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic
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..
Cím: Hogyan is készül egy /try parancs?
Írta: krisk - 2012. Október 22. - 20:43:30
Idézetet írta: DrAkE date=1350842939\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"28631\" data-ipsquote-contentclass=\"forums_Topic
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.