GTAForum.nl - Het Nederlandse Grand Theft Auto Forum!: [Tutorial] dcmd en sscanf - GTAForum.nl - Het Nederlandse Grand Theft Auto Forum!

Ga naar de inhoud

GTAGames.nl advertentie
  • (2 pagina's)
  • +
  • 1
  • 2
  • Je kunt geen onderwerp beginnen
  • Je kunt niet reageren

[Tutorial] dcmd en sscanf - Fast Command Processors

Geplaatst op 7 maart 2009 - 19:54     #1 Dit lid is offline   Big Boss 

  • a.k.a. Vince
  • PipPipPipPipPipPipPipPip
  • Groep: Moderators
  • Registratie: 28-februari 05
[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:

Dit bericht is aangepast door Big Boss: 7 maart 2009 - 22:38


GTAGames.nl advertentie

Geplaatst op 7 maart 2009 - 19:55     #2 Dit lid is offline   Big Boss 

  • a.k.a. Vince
  • PipPipPipPipPipPipPipPip
  • Groep: Moderators
  • Registratie: 28-februari 05
[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:

Dit bericht is aangepast door Big Boss: 25 oktober 2009 - 19:54

Geplaatste afbeelding

Geplaatst op 7 maart 2009 - 20:19     #3 Dit lid is offline   Sandra 

  • Pawno-Princess
  • PipPipPipPipPipPipPip
  • Groep: Leden
  • Registratie: 15-juni 07
Duidelijk :)

Maar ga je wel uitleggen hoe je params gebruikt bij dcmd?


Sorry, voorlopig op non-actief

Geplaatst op 5 april 2009 - 10:55     #4 Dit lid is offline   D-V-D-K 

  • Winkel overvaller
  • PipPip
  • Groep: Leden
  • Registratie: 16-februari 09
idd, als er bij stond hoe ik parameters maak had ik wel al mijn stuk of 100 command geconvert :)


Geplaatst op 12 april 2009 - 12:44     #5 Dit lid is offline   Crusher!! 

  • Rednecks baas
  • PipPipPipPip
  • Groep: Leden
  • Registratie: 01-maart 08

Citaat

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


wat bedoel je precies met lengte???


Geplaatst op 12 april 2009 - 12:50     #6 Dit lid is offline   D-V-D-K 

  • Winkel overvaller
  • PipPip
  • Groep: Leden
  • Registratie: 16-februari 09

Bericht weergevenGTA_GAMER_JD zei op 12 Apr 2009, 12:44:33:

Citaat

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


wat bedoel je precies met lengte???


Hoe lang de command is, helloword heeft in dit geval 10 caracters.


Geplaatst op 12 april 2009 - 13:48     #7 Dit lid is offline   Crusher!! 

  • Rednecks baas
  • PipPipPipPip
  • Groep: Leden
  • Registratie: 01-maart 08

Bericht weergevenD-V-D-K zei op 12 Apr 2009, 13:50:30:

Bericht weergevenGTA_GAMER_JD zei op 12 Apr 2009, 12:44:33:

Citaat

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


wat bedoel je precies met lengte???


Hoe lang de command is, helloword heeft in dit geval 10 caracters.


ow,. OKE, bedankt


Geplaatst op 12 april 2009 - 20:04     #8 Dit lid is offline   D-V-D-K 

  • Winkel overvaller
  • PipPip
  • Groep: Leden
  • Registratie: 16-februari 09
Ben pas begonnen aan een nieuwe gamemode, ik snapte dat dcmd met 1 parameter meteen al toen ik het zag :P alleen ga ik nu beetje verder lezen over hoe je meerdere params kan maken, ty voor tut :)


Geplaatst op 8 juli 2009 - 19:20     #9 Dit lid is offline   JoshTheBoss 

  • Auto dealer
  • PipPip
  • Groep: Leden
  • Registratie: 14-maart 09
In 3 worden: super en geweldig!!!! ^_^ ^_^ ^_^

ik ben bezig met het converteren van al mijn commands. :Y :Y

heel erg bedankt _O_ _O_ _O_ _O_ _O_ _O_ _O_ _O_ _O_


Geplaatst op 8 juli 2009 - 19:24     #10 Dit lid is offline   David22 

  • PipPipPipPipPip
  • Groep: Leden
  • Registratie: 06-februari 06
  • Corporation:The Covesight Community

Bericht weergevenBig Boss zei op 7 Mar 2009, 20:54:41:

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 op 12 juli 2009 - 18:37     #11 Dit lid is offline   1112rutger 

  • BMW dealer
  • PipPip
  • Groep: Leden
  • Registratie: 27-januari 07
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 ).

Dit bericht is aangepast door 1112rutger: 12 juli 2009 - 18:54


Geplaatst op 12 juli 2009 - 19:38     #12 Dit lid is offline   Big Boss 

  • a.k.a. Vince
  • PipPipPipPipPipPipPipPip
  • Groep: Moderators
  • Registratie: 28-februari 05
Link geüpdate: http://www.filefront...026061/dcmd.inc

Geplaatste afbeelding

Geplaatst op 13 juli 2009 - 12:11     #13 Dit lid is offline   1112rutger 

  • BMW dealer
  • PipPip
  • Groep: Leden
  • Registratie: 27-januari 07
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 op 13 juli 2009 - 15:12     #14 Dit lid is offline   JoshTheBoss 

  • Auto dealer
  • PipPip
  • Groep: Leden
  • Registratie: 14-maart 09

Bericht weergeven1112rutger zei op 13 Jul 2009, 13:11:01:

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 op 13 juli 2009 - 15:28     #15 Dit lid is offline   1112rutger 

  • BMW dealer
  • PipPip
  • Groep: Leden
  • Registratie: 27-januari 07

Bericht weergevenJoshTheBoss zei op 13 Jul 2009, 16:12:20:

Bericht weergeven1112rutger zei op 13 Jul 2009, 13:11:01:

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


GTAGames.nl advertentie
  • (2 pagina's)
  • +
  • 1
  • 2
  • Je kunt geen onderwerp beginnen
  • Je kunt niet reageren

1 gebruikers lezen dit onderwerp
0 leden, 1 gasten en 0 anonieme leden