Jump to content
Geplaatst:
comment_1293152

[Tutorial] dcmd en sscanf



Fast Command Processors

Introductie

Wat is dcmd?

dcmd is ontwikkeld door DracoBlue, van het SA-MP forum.

Vroeger (en nu nog altijd) werd er heel veel gebruik gemaakt van de strtok functie. Die werd al standaard meegeleverd met het lvdm script dat bij de server bestanden zit.

Echter, deze methode is TRAAG en INGEWIKKELD in vergelijking met dcmd.

Hoe werkt het?

Simpel gezegd, definiëer je eerst wat dcmd is door een #define toe te voegen bovenaan, daarna kan je het gewoon gebruiken.

Geen geknoei meer met strtok, etc. Immers, alles wat nog achter een commando wordt ingetypt, wordt AUTOMATISCH opgeslagen in de variabele params.


Tutorial

dcmd definiëren

Plak deze regel bovenaan bij je defines (zorg dat het allemaal op 1 regel staat, anders werkt het niet):

#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1

Dan zijn we klaar voor dit deel. :) Voor de duidelijkheid: Hier hoef je dus niets van te snappen of aan te veranderen.

Commando's maken

Hoe maak je nu de commando's?

Wel, het is heel makkelijk om bestaande commando's om te zetten in dcmd formaat. Laat ik een voorbeeld nemen:

public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/helloworld", cmdtext, true) == 0)
{
	GameTextForPlayer(playerid, "~w~Hello World!", 3000, 5);
	return 1;
}
return 0;
}

In dcmd wordt dit:

public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(helloworld, 10, cmdtext);
return 0;
}

dcmd_helloworld(playerid, params[])
{
#pragma unused params 
GameTextForPlayer(playerid, "~w~Hello World!", 3000, 5);
return 1;
}

Zoals je ziet staat het eigenlijke commando nu BUITEN de callback OnPlayerCommandText. Dit betekent dat je al je commands nu ook in een apart bestand kan zetten (daar ben ik nog niet achter, helaas). Zo heb je niet zo'n hele hoop code hebt in je gamemode.

Even de uitleg erbij:

dcmd(helloworld, 10, cmdtext);
dcmd(commando, lengte, cmdtext);

Simpel gezegd zet je dus dcmd neer, open het haakje, zet je commando neer zonder de '/', zet daarachter de lengte van het commando (opnieuw zonder de slash), gevolgd door cmdtext, het afsluitende haakje en de puntkomma.

dcmd_helloworld(playerid, params[]) 
// dcmd_commando(playerid, params[])
{
#pragma unused params  
// params wordt hier niet gebruikt, d.i. om warnings te vermijden

GameTextForPlayer(playerid, "~w~Hello World!", 3000, 5); 
return 1; 
}

Nu vraag je je zeker af: Hoe werken die params dan?

Als je maar 1 parameter (meestal het playerid) nodig hebt, kun je zoiets maken:

dcmd_freeze(playerid, params[])
{
if(!strlen(params))
{
	SendClientMessage(playerid, 0xFF0000FF, "GEBRUIK: /freeze [playerid]");
	return 1;
}
new otherplayer = strval(params); // Sla het playerid op in [i]otherplayer[/i]
TogglePlayerControllable(otherplayer, false);
return 1;
}

Dit is dus dcmd, als je dit gesnapt hebt, kun je verder gaan met de rest van de tutorial. Zoniet, probeer wat uit tot je het snapt, of vraag het hier. :cya:

Laatst geüpdate:

Bewerkt: door Big Boss

Featured Replies

  • 2 maanden later...
Geplaatst:
comment_1532780

update :-O Der is alweer een snellere command processor uit! zcmd.

Bron?

Edit: al gevonden :7

Bron.

ZCMD werkt hetzelfde als DCMD, met als verschil dit:

This is just a little include that uses OnPlayerCommandText() to process player commands. Each command has its own function like in dcmd, but zcmd does not pass through all of them until it finds the right one because it just calls them directly via CallLocalFunction(). Such method is much faster in most cases (see speed test results).

Verder kan je ZCMD hetzelfde gebruiken als DCMD, maar ook op de volgende manier:

COMMAND:mycommand(playerid, params[]) // or CMD:mycommand(playerid, params[]) 
{
   // Do something
   return 1; 
}

Ik denk dus dat het voor kleine scripts weinig uitmaakt wat je gebruikt, maar dat het voor (hele) grote scripts beter is ZCMD te gebruiken...

Edit #2:

Je kan ook niet meer op deze twee manieren controleren of er params ingevoerd zijn:

    if (!params[0])
   {
       // no parameters 
   }

   if (!strlen(params))
   {
       // no parameters 
   }

Maar het MOET op de volgende manier:

    if (isnull(params))
   {
       // no parameters
   }

Bewerkt: door David22

  • 1 maand later...
  • 7 maanden later...
Geplaatst:
comment_1718839

Sorry voor de bump, maar ik wil toch even wat duidelijk maken.

Ten eerste: DCMD mag misschien wel gemakkelijker zijn, het is in ieder geval trager dan strcmp! Hoe ik dat weet? Klik hier voor een snelheidstest.

Dan nu de betere methode: ZCMD. ZCMD werkt snel en gemakkelijk. Voorbeeldje:

// DCMD:

public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(test, 4, cmdtext[]);
return 1;
}

dcmd_test(playerid, params[])
{
// Command
return 1;
}

// ------------------------------------------

// ZCMD:

COMMAND:test(playerid, params[])
{
// Command
return 1;
}

Dus misschien wordt het tijd om je tutorial te updaten. :puh:

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

Recent actief 0

  • Er zijn hier geen geregistreerde gebruikers aanwezig.