Welkom bij deze tutorial waarin ik je ga uitleggen hoe je commando's maakt met meerdere parameters. Lees deze tutorial goed en zorgvuldig door. Dus stap voor stap.
Vooral bij admin-commando's word vaak 1, 2 of zelfs 3 extra parameters gebruikt. Zoals:
if(strcmp("/skatepark", cmdtext, true) == 0)
{
SetPlayerPos(playerid, 1922.5964, -1399.8970, 13.5703);
SendClientMessage(playerid, COLOR_GREEN, "***Je bent naar het Skatepark geteleporteerd!");
return 1;
}
Maar als je nou als admin andere spelers ernaartoe wilt teleporteren, dan word het al een stuk lastiger omdat er een playerid moet worden doorgegeven.
Je kan het natuurlijk zo doen:
if(strcmp("/skatepark 0", cmdtext, true) == 0)
{
SetPlayerPos(0, 1922.5964, -1399.8970, 13.5703);
SendClientMessage(0, COLOR_GREEN, "***Je bent naar het Skatepark geteleporteerd!");
return 1;
}
if(strcmp("/skatepark 1", cmdtext, true) == 0)
{
SetPlayerPos(1, 1922.5964, -1399.8970, 13.5703);
SendClientMessage(1, COLOR_GREEN, "***Je bent naar het Skatepark geteleporteerd!");
return 1;
}
//enzovoort
Maar om dat nou 200 keer te doen voor elk commando... dan word het een gekkenwerk.
Daarom is er een functie gemaakt voor sa-mp die het ingevoerde commando (cmdtext) scheidt in losse stukjes. Het commando word gescheiden bij de spaties. Deze functie wordt "strtok" genoemd.
Bijvoorbeeld, een admin voert het commando "/giveplayerweapon 4 30 560" (Geef playerid '4' een AK47 (WapenID 30) met 560 kogels.)
Strtok zal deze commandregel scheiden in:
/giveplayerweapon
4
30
560
Oke, om dit soort commando's aan je script toe te voegen, dien je eerst de strtok-functie onderaan script zetten:
Je hoeft echt niets van deze bovenstaande code te begrijpen. Laat het lekker staan en verander er niets aan.
De volgende stap is een een nieuwe string en wat variabele's aanmaken. Dit doe je bovenaan de OnPlayerCommandText-callback:
new cmd[256], idx, tmp[256];
Nu is het tijd om de eerste parameter (het commando zelf) uit de cmdtext te halen:
cmd = strtok(cmdtext, idx);
Dit zet je ook bovenaan de OnPlayerCommandText-callback:
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256], idx, tmp[256];
cmd = strtok(cmdtext, idx);
//hier komen straks de commando's
return 0;
}
De functie 'strcmp' (afkorting van string-compare (compare = vergelijk)) vergelijkt 2 strings met elkaar.
Het is nu dat we de ingevoerde commando gaan vergelijken met een beschikbaar commando. Als voorbeeld neem ik het commando /giveplayerweapon
Het is hetzelfde als normale commando's, alleen vervangen we de "cmdtext" in de eerste regel van elk commando met "cmd":
if(strcmp(cmd, "/giveplayerweapon", true)==0)
{
Als een admin /giveplayerweapon heeft ingevoerd, dan gaan gaan we verder. We moeten eerst nog een paar variabelen aanmaken om het playerid, wapenid en aantal kogels in op te slaan:
new giveplayerid, weaponid, ammo;
Even een overzichtje, tot nu toe hebben we dit:
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256], idx, tmp[256];
cmd = strtok(cmdtext, idx);
if(strcmp(cmd, "/giveplayerweapon", true)==0)
{
new giveplayerid, weaponid, ammo;
}
return 0;
}
We gaan nu de tweede parameter (het playerid) eruit halen, deze slaan we tijdelijk op in de 'tmp'string:
tmp = strtok(cmdtext, idx);
Soms wil het nog wel eens per ongeluk gebeuren dat je een parameter vergeet in te vullen. In dat geval moeten we de admin een error gegeven:
Om te checken of er wel of geen text/getal is ingevoerd, gebruiken we '!strlen' (string-length). Met dat uitroepteken (!) geven we aan dat iets 'niet zo is'.
Dus if(!strlen(tmp)) betekent eigenlijk "Als 'tmp' geen lengte heeft"
In dat geval geven we de admin dus een berichte met de te uitleg hoe hij/zij het commando moet gebruiken:
Omdat de playerid's zoals sa-mp ze kent 'integers' zijn, moeten we de string (tmp) die we nu hebben, omzetten naar een integer, dat doen we met de functie 'strval':
Nog 1 script met een aantal bruikbare commando's die ik vlug in elkaar hebt gezet. Lees het helemaal rustig door, en probeer regel voor regel te begrijpen wat het doet en hoe het werkt.
[Tutorial]Multi-Param Commando's Maken
Welkom bij deze tutorial waarin ik je ga uitleggen hoe je commando's maakt met meerdere parameters. Lees deze tutorial goed en zorgvuldig door. Dus stap voor stap.
Vooral bij admin-commando's word vaak 1, 2 of zelfs 3 extra parameters gebruikt. Zoals:
Ik ga er wel vanuit dat je de basis script-technieken onder de knie hebt.
Een simpel commando maken is niet zo'n probleem:
Maar als je nou als admin andere spelers ernaartoe wilt teleporteren, dan word het al een stuk lastiger omdat er een playerid moet worden doorgegeven.
Je kan het natuurlijk zo doen:
Maar om dat nou 200 keer te doen voor elk commando... dan word het een gekkenwerk.
Daarom is er een functie gemaakt voor sa-mp die het ingevoerde commando (cmdtext) scheidt in losse stukjes. Het commando word gescheiden bij de spaties. Deze functie wordt "strtok" genoemd.
Bijvoorbeeld, een admin voert het commando "/giveplayerweapon 4 30 560" (Geef playerid '4' een AK47 (WapenID 30) met 560 kogels.)
Strtok zal deze commandregel scheiden in:
Oke, om dit soort commando's aan je script toe te voegen, dien je eerst de strtok-functie onderaan script zetten:
Je hoeft echt niets van deze bovenstaande code te begrijpen. Laat het lekker staan en verander er niets aan.
De volgende stap is een een nieuwe string en wat variabele's aanmaken. Dit doe je bovenaan de OnPlayerCommandText-callback:
Nu is het tijd om de eerste parameter (het commando zelf) uit de cmdtext te halen:
Dit zet je ook bovenaan de OnPlayerCommandText-callback:
De functie 'strcmp' (afkorting van string-compare (compare = vergelijk)) vergelijkt 2 strings met elkaar.
Het is nu dat we de ingevoerde commando gaan vergelijken met een beschikbaar commando. Als voorbeeld neem ik het commando /giveplayerweapon
Het is hetzelfde als normale commando's, alleen vervangen we de "cmdtext" in de eerste regel van elk commando met "cmd":
Als een admin /giveplayerweapon heeft ingevoerd, dan gaan gaan we verder. We moeten eerst nog een paar variabelen aanmaken om het playerid, wapenid en aantal kogels in op te slaan:
Even een overzichtje, tot nu toe hebben we dit:
We gaan nu de tweede parameter (het playerid) eruit halen, deze slaan we tijdelijk op in de 'tmp'string:
Soms wil het nog wel eens per ongeluk gebeuren dat je een parameter vergeet in te vullen. In dat geval moeten we de admin een error gegeven:
Om te checken of er wel of geen text/getal is ingevoerd, gebruiken we '!strlen' (string-length). Met dat uitroepteken (!) geven we aan dat iets 'niet zo is'.
Dus if(!strlen(tmp)) betekent eigenlijk "Als 'tmp' geen lengte heeft"
In dat geval geven we de admin dus een berichte met de te uitleg hoe hij/zij het commando moet gebruiken:
Omdat de playerid's zoals sa-mp ze kent 'integers' zijn, moeten we de string (tmp) die we nu hebben, omzetten naar een integer, dat doen we met de functie 'strval':
Overzicht wat we tot nu toe hebben:
Nu hebben we dus de playerid van de diegene die het wapen krijgt opgeslagen in 'giveplayerid'.
Dat was het hele proces om zo'n 2e parameter te krijgen. Om de volgende param te krijgen (weaponID), herhaal je deze code:
Let nu dus op dat we aan het 'weaponID' hebben gebruikt om dat getal op te slaan. Bij de volgende zullen we het getal in de 'ammo'-variabele opslaan:
We zijn bijna klaar met dit commando, we hebben nu alle gegevens die we nodig hebben:
Overzicht:
Nu rest ons een paar dingen te checken:
- Is de ingevoerde speler wel online?
- Is er wel een geldig wapenID ingevoerd?
- Is het aantal ingevoerde kogels niet onder '0'?
We moeten ook nog kijken of de degene die het commando invoerd, wel een admin is. Om te zorgen dat niet-admin een "Unknown Command"bericht krijgt,
zetten we dit in het commando:
(Het beste eigenlijk direct bovenaan het commando.
Mochten de ingevoerde gegevens allemaal geldig te zijn, dan kunnen we de speler het wapen geven en een berichtje sturen naar de admin en ontvanger:
En vergeet niet
om het commando af te sluiten.
Het totale commando word nu een beetje te groot om hier te plaatsen, dus ik gebruik nu even www.pastebin.com
http://pastebin.com/f2a97d58b
Dat was dus een commando met 3 extra parameters. Deze zijn erg lang, een commando met maar 1 extra parameter is natuurlijk veel korter.
Voorbeeld /freeze [playerid]:
Dit commando samen met het /giveplayerweapon commando:
http://pastebin.com/f16cebf8e
Nog 1 script met een aantal bruikbare commando's die ik vlug in elkaar hebt gezet. Lees het helemaal rustig door, en probeer regel voor regel te begrijpen wat het doet en hoe het werkt.
Commando's:
/giveplayerweapon [playerid] [wapenID] [aantal kogels]
/freeze [playerid]
/unfreeze [playerid]
/kick [playerid]
/giveplayermoney [playerid] [bedrag]
http://pastebin.com/f358868e9
Mochten er nog vragen zijn, stel ze gerust in dit topic.
=>Sandra<=
Bewerkt: door =>Sandra<=