Jump to content

ZCMD + SSCANF.


Guest PlayON

Recommended Posts

ZCMD + SSCANF

The best there is

Informatii

ZCMD a fost creat de Zeex si este cel mai rapid pocesor de informatii, proceseaza multi mai rapid decat DCMD, YCMD, sau vechea metoda strcmp.

SSCANF a fost creat de cel mai bun scripter, si aici nu glumesc, este cel mai bun scripter in domeniul SA-MPului, a creat acest system pentru a facilita folosirea parametriilor de catre utilizator, are isnull, IsPlayerConnected, are strval are stringuri, are tot ce iti trebuie, si formateaza totul fara ca tu sa dai strval ca sa afli ceva. Are ceva foarte frumos de exemplu, sa gasesti numele playerului, ID, ETC.

Ai nevoie de urmatoarele

ZCMD trebe pus in > Server/Pawno/Includes

SSCANF <-Copy + Paste in GM, FS.

FormMessage, FormMessageForAllEx Trebuie adaugate undeva sub #include <ZCMD>

foreach by Y_Less <- pawno/includes

Sa incepem...

Deci, noi vrem sa facem o comanda GOTO, care salase jucatorul respectiv sa se duca la unu sau sa lase sa vine el la el.

Pasul 1:

Trebuie sa includem ZCMD.Acest cod vine sus de tot, dedesupt de #include <a_samp>

#include < ZCMD >
Acuma sa creem variabila cu care vom verifica GOTO Activat sau dezactivat.Acest cod vine pus undeva dedesupt de #include <a_samp> NU VINE PUS INTRUN PUBLIC!(ADICA public OnGameModeInit() ) de exemplu.
new pGoto[ MAX_PLAYERS] ;
Intreaga comanda: Aceasta este comanda intreaga.O voi explica linie cu linie.
CMD:goto(playerid, params[])
{
	new string[256];
	if ( sscanf( params, "u", params[ 0 ]) )return SendClientMessage(playerid, COLOR_ORANGE, "You can use /pgoto <on/off> to disable enable people to come to you"),SendUsage( playerid, "/goto <id>" );
	if (pGoto[ params[ 0 ] ] == 0 && IsPlayerAdmin( playerid ) ) return format(string,sizeof( string ), "%s has the goto turned off.", PlayerName2( params[ 0 ])),SendClientMessage(playerid, COLOR_RED, string );
	new Float:ParamX, Float:ParamY, Float:ParamZ, Float:ParamVX, Float:ParamVY, Float:ParamVZ;

	if (IsPlayerInAnyVehicle( playerid ) )
	{
		SetCameraBehindPlayer( playerid );
		GetVehiclePos( GetPlayerVehicleID( params[ 0 ] ), ParamVX, ParamVY, ParamVZ );
		SetVehiclePos( GetPlayerVehicleID( playerid ), ParamVX+2, ParamVY+2, ParamVZ );
		LinkVehicleToInterior( GetPlayerVehicleID( playerid ), GetPlayerInterior( params[ 0 ] ));
	}
	else
	{
		SetCameraBehindPlayer( playerid );
		GetPlayerPos( params[ 0 ], ParamX, ParamY, ParamZ );
		SetPlayerPos( playerid, ParamX+2, ParamY+2, ParamZ );
		SetPlayerInterior( playerid, GetPlayerInterior( params[ 0 ] ));
	}
	FormMessageForAllEx(playerid,COLOR_GREEN, "%s went to %s!",PlayerName2( playerid ), PlayerName2( params[ 0 ] ));
	FormMessage( params[ 0 ], COLOR_GREEN, "%s came to you!",PlayerName2( playerid ));
	FormMessage( playerid, COLOR_GREEN, "You went to %s!",PlayerName2( params[ 0 ] ));

	return 1;
}
Codul de mai jos este sa verifice automat daca playerul este conectat si daca a scris bine numele lui sau nu. "u" inseamna ID Playerului sau Numele lui si daca nu scrie bine va da mesajul: USAGE: /goto <id>. params[ 0 ] se va folosi daca vrem sa luam numele la player, sau sai facem ceva la cel care sa teleportat.
if ( sscanf( params, "u", params[ 0 ]) )return SendClientMessage(playerid, COLOR_ORANGE, "You can use /pgoto <on/off> to disable enable people to come to you"),SendUsage( playerid, "/goto <id>" );
Codul de mai jos va verifica daca playerul are /pgoto on sau off, daca are OFF nu te vei puteas teleporta la el doar daca esti logat ca admin de RCON.
f (pGoto[ params[ 0 ] ] == 0 && IsPlayerAdmin( playerid ) ) return format(string,sizeof( string ), "%s has the goto turned off.", PlayerName2( params[ 0 ])),SendClientMessage(playerid, COLOR_RED, string );
De aceea am pus && IsPlayerAdmin( playerid ) pentru ca  && verifica daca are cel la care vrei sa te teleportezi are /pgoto off SI verifica si daca esti admin.Si daca esti admin va sari peste acel "check" si te va teleporta instat :).
if (pGoto[ params[ 0 ] ] == 0 && IsPlayerAdmin( playerid ) ) 
Cu acestea vom lua coordonatele lui player si ma voi teleporta la el!
new Float:ParamX, Float:ParamY, Float:ParamZ, Float:ParamVX, Float:ParamVY, Float:ParamVZ;
Codul de mai jos verifica daca sunt intr-un vehicul eu ca sa ma duc cu tot cu vehicol la player.
if (IsPlayerInAnyVehicle( playerid ) )
    {
        SetCameraBehindPlayer( playerid );
        GetVehiclePos( GetPlayerVehicleID( params[ 0 ] ), ParamVX, ParamVY, ParamVZ );
        SetVehiclePos( GetPlayerVehicleID( playerid ), ParamVX+2, ParamVY+2, ParamVZ );
        LinkVehicleToInterior( GetPlayerVehicleID( playerid ), GetPlayerInterior( params[ 0 ] ));
    }
    else
    {
        SetCameraBehindPlayer( playerid );
        GetPlayerPos( params[ 0 ], ParamX, ParamY, ParamZ );
        SetPlayerPos( playerid, ParamX+2, ParamY+2, ParamZ );
        SetPlayerInterior( playerid, GetPlayerInterior( params[ 0 ] ));
    }
Dupa cum vedeti am pus un if (IsPlayerInAnyVehicle( playerid ) ) Acesta verifica daca este in masina iar acel }else{ verifica daca este in picioare, adica e opusul la if (IsPlayerInAnyVehicle( playerid ) ) Cu codurile de mai jos vom trimite mesaj la cel ce a fost teleportat, la cel la care s-a teleportat si la toti adminii RCON cu exceptia TA, ca sa nu vezi doua mesaje.
FormMessageForAllEx(playerid,COLOR_GREEN, "%s went to %s!",PlayerName2( playerid ), PlayerName2( params[ 0 ] ));
FormMessage( params[ 0 ], COLOR_GREEN, "%s came to you!",PlayerName2( playerid ));
FormMessage( playerid, COLOR_GREEN, "You went to %s!",PlayerName2( params[ 0 ] ));
Codul de mai jos va trimite un mesaj catre toti adminii de pe server, DOAR CEI LOGATI CA RCON DACA VREI SA SCHIMBATI CU PROPRIUL VOSTRU SISTEM DE ADMIN SCHIMBAT IsPlayerAdmin( playerid ) cu ce aveti voi gen PlayerInfo[ playerid ][ Level ].
FormMessageForAllEx(playerid,COLOR_GREEN, "%s went to %s!",PlayerName2( playerid ), PlayerName2( params[ 0 ] ));
Codul de mai jos va trimite un mesaj la cel la care te-ai teleportat, care il va instiinta ca te-ai teleportat la el. Dupa cum vedeti nu este ( playerid, ci este ( params[ 0 ] cea ce vam expliat mai sus ca vom folosi params[ 0 ] pentru a trimite mesaje id care a fost insertat la /goto <id>.
FormMessage( params[ 0 ], COLOR_GREEN, "%s came to you!",PlayerName2( playerid ));
Iar codul de mai jos pur si simply iti va da de stire ca te-ai teleportat la acel player...
FormMessage( playerid, COLOR_GREEN, "You went to %s!",PlayerName2( params[ 0 ] ));
Sa nu uitam de comanda /pgoto.Comanda este mai jos si este explicata! COMANDA:
CMD:pgoto(playerid, params[])
{

    if ( sscanf( params, "s", params[ 0 ]) )return SendUsage( playerid, "/pgoto <on/off> ");
    
    if ( strcmp( params[ 0 ], "ON", true) == 0 )
    {
        if (pGoto[ playerid ] == 1)return SendError(playerid, "Goto already turned ON!");
        pGoto[ playerid ] = 1;
        SendClientMessage(playerid, COLOR_GREEN, "Goto turned ON, players can now come to you!");
	}
    else if ( strcmp( params[ 0 ], "OFF", true) == 0 )
    {
        if (pGoto[ playerid ] == 0)return SendError(playerid, "Goto already turned OFF!");
        pGoto[ playerid ] = 0;
        SendClientMessage(playerid, COLOR_GREEN, "Goto turned OFF, players cannot come to you anymore");
    }
    else SendUsage( playerid, "/pgoto <on/off> ");
    return 1;
}
Deci dupa cum vedeti de data asta am folosit  "s" nu "u".Deoarece vrem sa verificam daca a insertat un string adica un On Off si daca a insertat altceva inafara de On Off va primit mesajul "USAGE: /pgoto [on/off]. Nu vom folosi "u" deoarece nu avem de ce ....ce sa verificam? care player? Niciunu. :)Iar de data asta cu params[ 0 ] nu mai verificam daca player bla bla, ci sa verifiam daca a insertat ON sau OFF, explicatia este mai jos.
if ( sscanf( params, "s", params[ 0 ]) )return SendUsage( playerid, "/pgoto <on/off> ");
Codul de mai jos va verifica daca a scris ON sau OFF, daca a scris ON va seta pGoto la 1, cea ce insemana ca va fi Activat ca sa lase playerii sa vina.Si daca scri OFF nu va lasa pe nimeni sa vina la tine!
 if ( strcmp( params[ 0 ], "ON", true) == 0 )
    {
        if (pGoto[ playerid ] == 1)return SendError(playerid, "Goto already turned ON!");
        pGoto[ playerid ] = 1;
        SendClientMessage(playerid, COLOR_GREEN, "Goto turned ON, players can now come to you!");
    }
    else if ( strcmp( params[ 0 ], "OFF", true) == 0 )
    {
        if (pGoto[ playerid ] == 0)return SendError(playerid, "Goto already turned OFF!");
        pGoto[ playerid ] = 0;
        SendClientMessage(playerid, COLOR_GREEN, "Goto turned OFF, players cannot come to you anymore");
    }
Iar utima bucatica de cod de mai jos, va da "USAGE: /pgoto [ on/ off ]" deoarece a insertat altceva inafara de ON sau OFF!
else SendUsage( playerid, "/pgoto <on/off> ");

Si am cam terminat, va rog sa-mi scuzati scrisul incorect dar am folosit o tastatura cu butoane groase si eu eram obisnuit pe plata gen de la laptop.Sper ca v-am ajutat!!!

Totul a fost facut de mine inafara de ZCMD si SSCANF au fost facute de ZeeX si Y_Less, comenzile au fost super usoare de facut, am facut si FormMessageForAllEx tot eu dar cu ideea pornita de la FormMessage al lui Y_Less in subiectul Code Optimizations, care ma ajutat enorm.

Dupa cum vedeti ZCMD este mult mai usor de folosit, decat DCMD sau STRTOK, variantele vechi.

Astept pareri si daca aveti erori, greseli raportati aici va rog!

Uitati aici alte tipuri de folosit a SSCANF si ZCMD, erori vor fi daca postati aceste comenzi in gamemodul vostru deoarece nu aveti definit P_DATA etc..

Link to comment
Share on other sites

  • Replies 107
  • Created
  • Last Reply

Top Posters In This Topic

Nu vad sa fi postat toata lista de 'format' (id|hx|c|f|p|\|u|sz)

Dar e bun,bv  :D

Puteai sa folosesti niste functii normale,ca nu toti le au,si nu toti inteleg ceva din ele xD(ma refer la FormMessage,FormMessageForAllEx...)

Link to comment
Share on other sites

Nu vad sa fi postat toata lista de 'format' (id|hx|c|f|p|\|u|sz)

Dar e bun,bv  :D

Puteai sa folosesti niste functii normale,ca nu toti le au,si nu toti inteleg ceva din ele xD(ma refer la FormMessage,FormMessageForAllEx...)

Eh, imi era lene sa fac new string...format...sendclient..

Dar am explicat ce face :D

Link to comment
Share on other sites

Daca invatati ZCMD si SSCANF viata o sa va fie mult mai usoara.

De exemplu versiunea foarte farte veche ba chiar prima, o comanda /ban avea injur de 200 de linii.Variante medie adica strtok si dcmd avea vreo 50

Iar dupa cum vedeti ZCMD si SSCANF au doar, cat? 10 linii.Economisire de timp si foarte utilitar.

Link to comment
Share on other sites

  • 1 month later...

Chiar foarte usoara viata pe zcmd + sscanf.

1. Comenzile pe zcmd + sscanf au un timp de raspuns foarte rapid.

2. Reducerea liniilor in GM + ca ruleaza mult mai bine.

3. Parerea mea este ca pe sscanf + zcmd e mai ordonat.

Deci inainte de zcmd + sscanf aveam gm-ul la 35000 linii , iar acum dupa ce am trecut toate comenzile pe zcmd + sscanf ... 23500 linii, este totusi o economisire de linii.

Link to comment
Share on other sites

Am updatat topicul, avea un aspect infect din care pana si eu intelegeam cu greu.

Am adaugam culori sa arata impecabil de frumos, am labartat (labartzat) ca sa se inteleaga mai bine.

LaZ mersi.

Link to comment
Share on other sites

  • 3 months later...

Ma scuzati ca dau bump la thread, care e destul de vechi ...

Deci, m`am apucat si eu de ZCMD, am observat ca e mai usor ca strcmp, asa ca, am decis sa raman la ZCMD dar am o intrebare ...

Cum pot pune 2 comenzi intr`una? Exemplu: /sethealth si /sh sa aiba acelasi efect ... /sh sa fie o prescurtare de la /sethealth ?

Se poate sa fac asa ceva, fara sa fiu nevoit sa fac 2 comenzi?

La strcmp era ceva de genu:

if (strcmp("/sethealth", cmdtext, true) || if (strcmp("/sh", cmdtext, true)

asa ceva vreau si eu sa fac dar in zcmd.

Multam

Link to comment
Share on other sites

Ma scuzati ca dau bump la thread, care e destul de vechi ...

Deci, m`am apucat si eu de ZCMD, am observat ca e mai usor ca strcmp, asa ca, am decis sa raman la ZCMD dar am o intrebare ...

Cum pot pune 2 comenzi intr`una? Exemplu: /sethealth si /sh sa aiba acelasi efect ... /sh sa fie o prescurtare de la /sethealth ?

Se poate sa fac asa ceva, fara sa fiu nevoit sa fac 2 comenzi?

La strcmp era ceva de genu:

if (strcmp("/sethealth", cmdtext, true) || if (strcmp("/sh", cmdtext, true)

asa ceva vreau si eu sa fac dar in zcmd.

Multam

Deci tu ai facut comanda CMD:sethealth da?

Eh acuma trebuie sa faci asa: CMD:sh(playerid,paramas[]) return cmd_sethealth(playerid,paramas[]);  si gata ;)

Link to comment
Share on other sites

Deci, banuisec ca, imi zici sa fac asa:

CMD:ann( playerid, params[] )
{
	return cmd_announce;
}

Dar primesc eroarea asta ...

E:\Server Stabil !\samp03csvr_win32\filterscripts\Login.pwn(378) : error 076: syntax error in the expression, or invalid function call

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

Link to comment
Share on other sites

Deci, banuisec ca, imi zici sa fac asa:

CMD:ann( playerid, params[] )
{
	return cmd_announce;
}

Dar primesc eroarea asta ...

E:\Server Stabil !\samp03csvr_win32\filterscripts\Login.pwn(378) : error 076: syntax error in the expression, or invalid function call

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

CMD:ann( playerid, params[] ) return return cmd_announce(playerid,params);

Link to comment
Share on other sites

Gata, am reusit si eu, mersi SonGoKu ... dar acu' am o alta intrebare legata de comanda asta /announce:

Am asa comanda:

CMD:announce( playerid, params[ ] )
{
	if ( GetPVarInt( playerid, "Level" ) < 3 )
		return 1;

 	if ( sscanf( params, "u", params[ 0 ] ) )
	    return SendClientMessage( playerid, -1, ""COL_LIGHTBLUE"Usage:{FFFFFF} /an(nounce) <text>");

	new String[ 128 ];

    format( String, sizeof String, ""COL_LIGHTBLUE"Admin announce{FFFFFF}: "COL_RED"%s",
				params[ 0 ] );
	SendClientMessageToAll( -1, String );
	return 1;
}

Problema e ca, atunci folosesc /ann blabla, imi apare ceva de genu... antonio112:ylabla ...apare 'y' ala, in loc de prima litera . Ce`am gresit in comanda ?

Multam.

Link to comment
Share on other sites

if ( GetPVarInt( playerid, "Level" ) < 3 )
		return 1;
Ar cam trebui schimbat cu:
if ( GetPVarInt( playerid, "Level" ) < 3 )
		return SendClientMessage( playerid, -1, "Not allowed!");

Nu neaparat, sincer eu folosesc return 1 deoarece nu vreau ca la fiecare comanda de admin, playerii sa primeasca mesaj gen "Trebuie sa fii admin pentru a folosi aceasta comanda.", ceea ce mi se pare foarte enervant ... plus ca, nu vreau sa stie toti playerii comenziile adminilor ...

LaZ, zici ca e string ... si ar trebui sa folosesc %s ? hai ca incerc sa vad daca merge.

Edit: Merge, mersi fain ... Este vreun link, ceva de unde pot afla si eu ce inseamna toate acele: %s, %u, %i ? Mersi.

ps: Zh3r0, zici si mie daca e bun sistemul ala ce ti`am trimis PM ? Ai timp ?:> Mersi

Link to comment
Share on other sites

  • 4 weeks later...

Pana acum cateva zile foloseam o metoda similara cu cea al lui Zh3r0 de verificare a parametrilor, adica:

if ( sscanf( cmdtext, "u", cmdtext[ 0 ] ) )
    return ...
Dintr-un motiv sau altul, luam crash cand tastam o comanda facuta asa. Rareori, dar nu era prea bine. Ar fi indicat sa folositi o variabila, cel putin nu am mai avut nicio problema de cand folosesc aceasta metoda:
new var;
if ( sscanf( cmdtext, "d", var ) )
    return ...
else
{
    Kick( var );
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.