Jump to content

[Tutorial] dcmd en sscanf


Big Boss

Recommended Posts

[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
Link to comment
Delen op andere websites

[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
Link to comment
Delen op andere websites

  • 4 weken later...
  • 2 maanden later...
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

Link to comment
Delen op andere websites

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
Link to comment
Delen op andere websites

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.. :(

Link to comment
Delen op andere websites

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

Link to comment
Delen op andere websites

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/ .

Link to comment
Delen op andere websites

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...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

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

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...