[Tutorial] ZCMD + sscanf
#1



Geschreven door Danny.


Waarschuwing: Voor deze tutorial is al een zekere kennis van de PAWN taal nodig.
Hallo beste lezers!

In deze tutorial ga ik jullie uitleggen hoe je ZCMD goed gebruikt, en hoe je dat doet in
combinatie met sscanf. ZCMD is hййl simpel, maar helaas zie ik toch nog mensen die strcmp of DCMD
gebruiken. Er lijkt een zekere 'drempel' te bestaan tussen andere command processors en ZCMD. Dat is zonde, want ZCMD is een stuk sneller, en ook helemaal niet moeilijk! Dat geld ook voor sscanf. Besides that was ik verveeld en wou ik eens een tut schrijven

- Wat heb je nodig voordat je begint met lezen.

Voordat je kunt beginnen heb je een paar bestanden nodig om de methodes te laten werken:

ZCMD download link(s):

Quote:
Download
Zet bovenaan het script dat deze functies gaat gebruiken #include <zcmd>.
Dowload deze (https://sampforum.blast.hk/showthread.php?tid=120356) plugin. Laad de plugin in je server door in je server.cfg achter
het lijntje 'plugins' 'sscanf' te zetten. Staat het lijnte 'plugins' nog niet in je server.cfg, geen zorgen! Zet hem er gewoon bij.


1) ZCMD

- Wat is het?

ZCMD is een command processor. Een command processor is een verwerker van commando's.
Er zijn een boel command processors maar, ZCMD is op dit moment de meest gebruikte.
ZCMD is gemaakt door Zeex en staat dan ook voor Zeex-Command.

- Hoe werkt het?

ZCMD is zoals ik eerder al zei erg simpel, het is zelfs simpeler dan strcmp!

Voorbeeld van een klassiek strcmp command is:

Код:
if(!strcmp(cmdtext, "/doeiets", true, 8))
{
	SendClientMessage(playerid, COLOR,"Je hebt iets gedaan!");
	return 1;
}

// Inderdaad een droog command :/
ZCMD is een stuk simpeler. Als je een command wilt aanmaken zet je gewoon op een plaats in het script
(niet in een callback!) neer CMD:<typhierjecmdnaam>:

Код:
CMD:doeiets(playerid, params[])
{
	SendClientMessage(playerid, COLOR,"Je hebt iets gedaan!");
	return 1;
}
Het command ingame is nu gewoon '/doeiets'

Zo, dat is makkelijk, niet dan?
ZCMD heeft verder geen definitie in OnPlayerCommandText nodig.

2) Sscanf

- Wat is het?

Sscanf is de moderne vervanger van strtok, net zoals ZCMD strcmp en DCMD vervangt.
Strtok 'splijt' een string, zodat je met strcmp commands kan maken met meerdere parameters.
Sscanf is gecodeerd door ******.

- Hoe werkt het?

Hier heb ik een voorbeeldje van een simpel strcmp command met strtok:

Код:
 if(strcmp(cmd, "/doeiets", true) == 0)
    {
        new tmp[30],cmdtext[256],idk;
        tmp = strtok(cmdtext, idx);
 
        new giveplayerid= strval(tmp);
 
        if(IsPlayerConnected(giveplayerid))
        {
            SendClientMessage(giveplayerid, 0xFFFF00AA, "Een andere speler heeft iets bij je gedaan!"); 
        } // Dat klinkt bijna seksueel :O
        return 1;
    }
Verder wil ik niet zoveel aandacht aan strtok besteden.
Strtok is sloom, oud, en is veel typwerk in vergelijking met sscanf.
Een ZCMD command met sscanf ziet er zo uit:

Код:
CMD:doeiets(playerid, params[])
{
	new str[128];
	new str2[128];
	if(sscanf(params,"is",giveplayerid,str2)) return SendClientMessage(playerid, COLOR, "/doeiets [giveplayerid]"); // de benodigde info is niet ingevoerd, dus er word een message verstuurd.
        SendClientMessage(giveplayerid,COLOR,"Een andere speler heeft iets bij je gedaan!");
	format(str, sizeof str,"%s",str2);
	SendClientMessage(giveplayerid, str);
	return 1;
}
Je ziet dus dat er word gekeken of de benodigde data allemaal is ingevuld. Zo nee, stuur een bericht.
Sscanf splijt dus de 'grote' string genaamd params in stukken en geeft die stukken in feite door aan giveplayerid en str2. De i en s tussen haakjes geven de datatypes aan van de stukken die gespleten moeten worden, in dit geval integer en string. Een lijstje met alle datatypes kan je hieronder vinden (auteur: ******):

Код:
Specifier(s)			Name				Example values
	i, d			Integer				1, 42, -10
	c			Character			a, o, *
	l			Logical				true, false
	b			Binary				01001, 0b1100
	h, x			Hex				1A, 0x23
	o			Octal				045 12
	n			Number				42, 0b010, 0xAC, 045
	f			Float				0.7, -99.5
	g			IEEE Float			0.7, -99.5, INFINITY, -INFINITY, NAN, NAN_E
	u			User name/id (bots and players)	******, 0
	q			Bot name/id			ShopBot, 27
	r			Player name/id			******, 42
Omdat deze string nu gespleten is kun je hier iets mee doen, net als je hierboven ziet.
Strtok werkt eigelijk hetzelfde, maar sscanf is simpelweg beter.


Dit was het al weer voor deze keer, heb je vragen wees dan niet bang om een reply te plaatsen, ik zal je helpen
Klopt er info niet of heb je commetaar? Dat kan je ook gewoon posten, dan zal ik de inhoud van deze tut herzien.
Reply
#2

Nice, heel netjes uitgelegd, maar 1 vraagje:
Edit: nevermind :P

-J
Reply
#3

Quote:
Originally Posted by Jantjuh
Посмотреть сообщение
Nice, heel netjes uitgelegd, maar 1 vraagje:
Edit: nevermind :P

-J
Thanks, als je een vraag hebt mag je die altijd stellen hoor
Reply
#4

Perfecte tut, EN in het Nederlands! kan gewoon niet beter!! +1
Reply
#5

Kheb de tutorial nog even geлdit om bepaalde dingen beter uit te leggen/meer info toe te voegen.

Quote:
Originally Posted by dahley5
Посмотреть сообщение
Perfecte tut, EN in het Nederlands! kan gewoon niet beter!! +1
Bedankt, ik hoop dat het je heeft geholpen
Reply
#6

Ik heb een vraagje: Waarom werkt deze code niet?
Код:
if(strcmp(cmdtext, "/jail", true) == 0)
    {
        new tmp[256],cmd[256],idx;
        tmp = strtok(cmd, idx);

        new giveplayerid= strval(tmp);

        if(IsPlayerConnected(giveplayerid))
        {
            SendClientMessage(giveplayerid, COLOR_RED, "You are jailed by an officer.");
            SetPlayerInterior(giveplayerid, 5);
			SetPlayerVirtualWorld(giveplayerid, 1);
			SetPlayerPos(giveplayerid, 318.76, 317.24, 1001.48);
			(PlayerInfo[playerid][pJail] = 1);
        } 
        return 1;
    }
Reply
#7

Quote:
Originally Posted by [PC]henkie[NL]
Посмотреть сообщение
Ik heb een vraagje: Waarom werkt deze code niet?
Код:
if(strcmp(cmdtext, "/jail", true) == 0)
    {
        new tmp[256],cmd[256],idx;
        tmp = strtok(cmd, idx);

        new giveplayerid= strval(tmp);

        if(IsPlayerConnected(giveplayerid))
        {
            SendClientMessage(giveplayerid, COLOR_RED, "You are jailed by an officer.");
            SetPlayerInterior(giveplayerid, 5);
			SetPlayerVirtualWorld(giveplayerid, 1);
			SetPlayerPos(giveplayerid, 318.76, 317.24, 1001.48);
			(PlayerInfo[playerid][pJail] = 1);
        } 
        return 1;
    }
Код:
if(strcmp(cmdtext, "/jail", true) == 0)
    {
        new tmp[256],cmd[256],idx;
        tmp = strtok(cmd, idx);

        new giveplayerid = strval(tmp);

        if(IsPlayerConnected(giveplayerid))
        {
            SendClientMessage(giveplayerid, COLOR_RED, "You are jailed by an officer.");
            SetPlayerInterior(giveplayerid, 5);
			SetPlayerVirtualWorld(giveplayerid, 1);
			SetPlayerPos(giveplayerid, 318.76, 317.24, 1001.48);
			PlayerInfo[playerid][pJail] = 1;
        } 
        return 1;
    }
Reply
#8

Huh, ik kan niet het verschil ontdekken, wat had ik fout gedaan?
Reply
#9

Quote:
Originally Posted by [PC]henkie[NL]
Посмотреть сообщение
Huh, ik kan niet het verschil ontdekken, wat had ik fout gedaan?
pawn Код:
(PlayerInfo[playerid][pJail] = 1);
Dat had jy in jouw command staan. Die andere aardige knul (weet zn naam niet :$) had die '( & )' weg gehaald
Reply
#10

Het werkt niet, als ik /jail 0 gebruik, zegt het server:unknown command.
als ik /jail doe, wordt ik wel gejailed :S
Reply
#11

en ja hoor zoals gewoonlijk helpt danny me weer enorm!
nice tutorial man thx
nu weet ik het nut van zcmd en sscanf thx!
Reply
#12

Hopateee deze gaat in mijn favorieten.

Edit: Download link doet het niet.
Reply
#13

Ik heb de ZCMD download links geupdate naar die uit het topic, maar die van sscanf ben ik nog aan het zoeken.

(Not sure if ... links in the OP of the sscanf release topic are the new ones ... OR JUST OUTDATED)
Reply
#14

Waarom werkt dit niet?

Код:
CMD:god(playerid, params[]) 
{ 
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,0xFF0000AA,"Mag jij niet!."); 
    if(GodMode[playerid] == 0) //god mode not set, lets set it 
    { 
        SetPlayerHealth(playerid, INFINITY);    //set the health to infinity 
        GodMode[playerid] = 1;    //set godmode to true 
        SendClientMessage(playerid, 0xFF0000FF, "Godmode aan"); 
    } 
    else if(GodMode[playerid] == 1) //god mode set .. lets unset it 
    { 
        SetPlayerHealth(playerid, 100.0);    //set health to 100% 
        GodMode[playerid] = 0;    //set godmode to false 
        SendClientMessage(playerid, 0xFF0000FF, "Godmode uit"); 
    } 
    return 1; 
}
Zegt gewoon unknown command
Reply
#15

Check even of je wel ZCMD hebt geinclude en of je wel hebt gecompiled. Check ook wat je bij return hebt bij OnPlayerCommandText.
Reply
#16

congratulations! + rep
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)