Big Boss Geplaatst: 7 maart 2009 Rapport Share Geplaatst: 7 maart 2009 (bewerkt) [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. Laatst geüpdate: Bewerkt: 7 maart 2009 door Big Boss Reageren Link to comment Delen op andere websites More sharing options...
Big Boss Geplaatst: 7 maart 2009 Auteur Rapport Share Geplaatst: 7 maart 2009 (bewerkt) [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 . 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: 25 oktober 2009 door Big Boss Reageren Link to comment Delen op andere websites More sharing options...
Sandra Geplaatst: 7 maart 2009 Rapport Share Geplaatst: 7 maart 2009 Duidelijk Maar ga je wel uitleggen hoe je params gebruikt bij dcmd? Reageren Link to comment Delen op andere websites More sharing options...
D-V-D-K Geplaatst: 5 april 2009 Rapport Share Geplaatst: 5 april 2009 idd, als er bij stond hoe ik parameters maak had ik wel al mijn stuk of 100 command geconvert Reageren Link to comment Delen op andere websites More sharing options...
Crusher!! Geplaatst: 12 april 2009 Rapport Share Geplaatst: 12 april 2009 dcmd(helloworld, 10, cmdtext); dcmd(commando, lengte, cmdtext); wat bedoel je precies met lengte??? Reageren Link to comment Delen op andere websites More sharing options...
D-V-D-K Geplaatst: 12 april 2009 Rapport Share Geplaatst: 12 april 2009 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. Reageren Link to comment Delen op andere websites More sharing options...
Crusher!! Geplaatst: 12 april 2009 Rapport Share Geplaatst: 12 april 2009 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 Reageren Link to comment Delen op andere websites More sharing options...
D-V-D-K Geplaatst: 12 april 2009 Rapport Share Geplaatst: 12 april 2009 Ben pas begonnen aan een nieuwe gamemode, ik snapte dat dcmd met 1 parameter meteen al toen ik het zag alleen ga ik nu beetje verder lezen over hoe je meerdere params kan maken, ty voor tut Reageren Link to comment Delen op andere websites More sharing options...
JoshTheBoss Geplaatst: 8 juli 2009 Rapport Share Geplaatst: 8 juli 2009 In 3 worden: super en geweldig!!!! ^_^ ik ben bezig met het converteren van al mijn commands. :Y heel erg bedankt _O_ _O_ _O_ _O_ Reageren Link to comment Delen op andere websites More sharing options...
David22 Geplaatst: 8 juli 2009 Rapport Share Geplaatst: 8 juli 2009 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 Reageren Link to comment Delen op andere websites More sharing options...
1112rutger Geplaatst: 12 juli 2009 Rapport Share Geplaatst: 12 juli 2009 (bewerkt) 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: 12 juli 2009 door 1112rutger Reageren Link to comment Delen op andere websites More sharing options...
Big Boss Geplaatst: 12 juli 2009 Auteur Rapport Share Geplaatst: 12 juli 2009 Link geüpdate: http://www.filefront.com/14026061/dcmd.inc Reageren Link to comment Delen op andere websites More sharing options...
1112rutger Geplaatst: 13 juli 2009 Rapport Share Geplaatst: 13 juli 2009 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.. Reageren Link to comment Delen op andere websites More sharing options...
JoshTheBoss Geplaatst: 13 juli 2009 Rapport Share Geplaatst: 13 juli 2009 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 Reageren Link to comment Delen op andere websites More sharing options...
1112rutger Geplaatst: 13 juli 2009 Rapport Share Geplaatst: 13 juli 2009 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 Ik heb gewoon de code gecopy paste om in mijn eigen script te bekijken; http://www.plaatscode.be/109328/ . Reageren Link to comment Delen op andere websites More sharing options...
Recommended Posts
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.