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

Geplaatst:
  • Auteur
comment_1293154

[Tutorial]sscanf

Nu gaan we dus verder met sscanf. sscanf is eigenlijk het omgekeerde van format. format zet variabelen in een string, sscanf haalt deze er uit.

In tegenstelling tot dcmd heeft sscanf wél een hele hoop code :7 .

Maar niet getreurd, ik heb er een include van gemaakt! Als je dcmd al gedefined had in je script, kan je dat nu weer weghalen.

>> DOWNLOAD: dcmd.inc (uploadffs.com)

Zet de include in de ..\pawno\include folder. Zet dan bovenaan je gamemode (bij de andere includes):

#include <dcmd>

Het kan handig zijn om dit lijstje alvast ergens bij je commando's te plakken, zo kan je makkelijk zien wat je nodig hebt.

/*
De format codes zijn:

c - Een karakter (letter)
d, i - Een integer.
h, x - Een Hex nummer (bv. kleur: 0xFFFF99FF).
f - Een float.
s - Een string.
z - Een optionele string.
u - Speler. Gebruikt (een deel van) de naam of het playerid en geeft het playerid als de speler online is.
*/

Ik ga weer werken aan de hand van een voorbeeld:

Het commando: /kick [Playerid/PartOfName][Reden]

Hiervoor ga ik even plaatscode.be gebruiken, omdat het een beetje te lang is om hier te plaatsen:

http://www.plaatscode.be/109328/

if(sscanf(params, "uz", otherplayer, reason))

Hier halen we alle gegevens uit params (dit is alles wat na het commando wordt ingetypt). De u is het playerid, en de z is de (optionele) reden. Het playerid (u) wordt opgeslagen in otherplayer en de reden in reason.

Nu we het playerid hebben opgeslagen, kunnen we dat gaan gebruiken;

We zenden de speler eerst een bericht dat hij gekicked is. Daarna wordt nog een bericht aan de hele server gestuurd dat die speler gekicked is en vervolgens wordt de speler er uitgeschopt.

Hier kan je dus snel en gemakkelijk heel lange commando's mee maken,

bv /giveweapon [playerid][weaponid][ammo] of /jail [playerid][time][reason]

<hr noshade size="3" color="orange" width="100%">

Dit is de eerste keer dat ik zo'n tutorial schrijf (m'n vingers doen onderhand pijn van het typen), dus ik hoop dat ik een beetje duidelijk ben geweest. Mocht er nog informatie missen dan hoor ik graag.

Problemen kunnen tevens in dit topic.

Laatst geüpdate:

Bewerkt: door Big Boss

  • 4 weken later...
  • 2 maanden later...
Geplaatst:
comment_1407849
Dit betekent dat je al je commands nu ook in een apart bestand kan zetten (daar ben ik nog niet achter, helaas).

Voor degene die nog wil weten hoe dit werkt: zet simpelweg al je commands (dcmd_cmd, etc) in een include, en zet bovenaan je script #include <naam van de file>. Dan kan je al je commands in een apart bestand zetten :Y

Geplaatst:
comment_1411575

Ik snap het totaal van dat DCMD gebeuren maar toch krijg ik errors:

project.pwn(449) : error 017: undefined symbol "dcmd_kick"
project.pwn(460) : error 017: undefined symbol "sscanf"
project.pwn(467) : error 017: undefined symbol "giveplayerid"
project.pwn(483) : error 017: undefined symbol "giveplayerid"
project.pwn(488) : warning 225: unreachable code
project.pwn(705) : warning 203: symbol is never used: "PlayerInfo"

Geen idee wat ik fout doe, want ik heb de DCMD van een andere tut. gebruikt als #include. ( aangezien de bovenstaande URL het niet doet ).

Bewerkt: door 1112rutger

Geplaatst:
comment_1412125

Ik krijg het volgende:

project.pwn(268) : warning 202: number of arguments does not match definition
project.pwn(452) : error 017: undefined symbol "dcmd_kick"
project.pwn(463) : error 017: undefined symbol "params"
project.pwn(469) : error 017: undefined symbol "getplayerid"
project.pwn(485) : error 017: undefined symbol "giveplayerid"
project.pwn(490) : warning 225: unreachable code
project.pwn(707) : warning 203: symbol is never used: "PlayerInfo"

Geen idee wat ik moet doen.. :(

Geplaatst:
comment_1412326
Ik krijg het volgende:

project.pwn(268) : warning 202: number of arguments does not match definition
project.pwn(452) : error 017: undefined symbol "dcmd_kick"
project.pwn(463) : error 017: undefined symbol "params"
project.pwn(469) : error 017: undefined symbol "getplayerid"
project.pwn(485) : error 017: undefined symbol "giveplayerid"
project.pwn(490) : warning 225: unreachable code
project.pwn(707) : warning 203: symbol is never used: "PlayerInfo"

Geen idee wat ik moet doen.. :(

Laat je hele code zien, dan zal ik proberen hem te verbeteren. :Y :Y :Y :Y :Y

Geplaatst:
comment_1412340
Ik krijg het volgende:

project.pwn(268) : warning 202: number of arguments does not match definition
project.pwn(452) : error 017: undefined symbol "dcmd_kick"
project.pwn(463) : error 017: undefined symbol "params"
project.pwn(469) : error 017: undefined symbol "getplayerid"
project.pwn(485) : error 017: undefined symbol "giveplayerid"
project.pwn(490) : warning 225: unreachable code
project.pwn(707) : warning 203: symbol is never used: "PlayerInfo"

Geen idee wat ik moet doen.. :(

Laat je hele code zien, dan zal ik proberen hem te verbeteren. :Y :Y :Y :Y :Y

Ik heb gewoon de code gecopy paste om in mijn eigen script te bekijken;

http://www.plaatscode.be/109328/ .

Geplaatst:
comment_1412356
Ik krijg het volgende:

project.pwn(268) : warning 202: number of arguments does not match definition
project.pwn(452) : error 017: undefined symbol "dcmd_kick"
project.pwn(463) : error 017: undefined symbol "params"
project.pwn(469) : error 017: undefined symbol "getplayerid"
project.pwn(485) : error 017: undefined symbol "giveplayerid"
project.pwn(490) : warning 225: unreachable code
project.pwn(707) : warning 203: symbol is never used: "PlayerInfo"

Geen idee wat ik moet doen.. :(

Laat je hele code zien, dan zal ik proberen hem te verbeteren. :Y :Y :Y :Y :Y

Ik heb gewoon de code gecopy paste om in mijn eigen script te bekijken;

http://www.plaatscode.be/109328/ .

EDIT: Ten eerste, heb je dcmd en sscanf. zo nee, download dit en stop het bij je includes. boven aan je script onde "#include <a_samp>" doe je dit: #include <dcmd>

dcmd.rar

Als je dcmd hebt maar nog niet helemaal snapt ga dan naar HIER.

Dan als je het snapt, probeer dan je hele code opnieuw door te kijken voor fouten. Ik zag er een, en dat was:

if(!IsPlayerConnected(giveplayerid)) // Als de ingevoerde speler niet online is ...
	{
			SendClientMessage(playerid, 0xFF0000FF, "Speler niet actief!");
			return 1;
	}

het probleem hier is dat je de spelerid hebt opgeslagen in "otherplayer", en niet in "giveplayerid". dus dit moet zijn:

if(!IsPlayerConnected(otherplayer)) // Als de ingevoerde speler niet online is ...
	{
			SendClientMessage(playerid, 0xFF0000FF, "Speler niet actief!");
			return 1;
	}

Ik hoop dat je hiermee wat verder komt, zo nee stuur dan een pm en dan help ik je verder.

Bewerkt: door JoshTheBoss

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.