Jump to content

[SA-MP|MTUT] Zelf tekstcommando's maken


JGuntherS

Recommended Posts

SA-MP Minitutorial



Zelf tekstcommando's maken

Hallo daar,

In deze tutorial ga ik je uitleggen hoe je zelf tekstcommando's maakt (commando's die je intypt in de chatbox) :). Basiskennis van Pawn is nodig! (Als je kunt C'en, kun je ook Pawnen :puh:)

Eerst moet je een aantal #include neerzetten, voeg ze toe als je ze er nog niet staan!

#include <a_samp>
#include <core>
#include <float>

Zoek de functie "OnPlayerCommandText" op, als deze er nog niet is, maak hem dan aan met de volgende code:

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}

Eerst even wat over de functie, er komt geen chattekst bij de anderen in beeld als je "return 1;" teruggeeft (returned). Als je "return 0;" doet, komt er wel chattekst bij de anderen in beeld. ("JGuntherS: SA-MP is vet" ofzo)

Je kunt cmdtext[] vergelijken met een bepaalde string met de functie strcmp (string comparison). Als de 2 strings hetzelfde zijn, dan geeft strcmp 0 terug. Op deze manier kun je dat in een check verwerken:

public OnPlayerCommandText(playerid, cmdtext[])
{
new lalastr[256];
new daderstr[MAX_PLAYER_NAME+1];
if (strcmp(cmdtext, "/lala", true)==0)
{
	GetPlayerName(playerid, daderstr, MAX_PLAYER_NAME);
	format(lalastr, 256, "%s said '/Lala'", daderstr);
	SendClientMessageToAll(0x222222FF, lalastr); // Het eerste argument is een kleur
	return 1;
}
return 0;
}

Als je dit gebruikt komt er bij iedereen "NAAM said '/lala'" te staan als je "/lala" in de chatbox intypt., nogal zinloos dus :puh:.

Nu gaan we het wat uitbreiden, met een code waarmee je tegen andere spelers "Lala". Ook nogal zinloos, maar je krijgt toch al een idee van hoe het werkt. Eerst kopiëren we de strtok-functie uit Las Venturas Deathmatch en we zetten deze onderaan in het script:

strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
	index++;
}

new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
	result[index - offset] = string[index];
	index++;
}
result[index - offset] = EOS;
return result;
}

Nu moet je nog een forward maken, voeg dit toe onder de #includes:

forward strtok(const string[], &index);

Strtok geeft het stuk tot aan de eerste spatie terug, perfect dus om het commando "/slala spelerID" te interpreteren! De waarde (pointer)variabele "index" wordt gezet naar de index in de string van het einde van het eerste stuk. Hele vage zin, snap hem zelf ook niet dus geef ik je een voorbeeld:

De string is bijvoorbeeld: "Ik loop". Als je daarop strtok uitvoert, dat zal strtok "Ik" teruggeven, en index zal op 3 komen te staan, drie posities verder in de string dus ("Ik "). Je kunt index ook al instellen als je de functie aanroept, dan zal strtok beginnen te zoeken vanaf die positie. (Hele vage uitleg, zoek anders op het internet naar strtok.)

Nu de echte code, de commentaren geven uitleg. Als je het nog niet snapt, moet je hier posten!

public OnPlayerCommandText(playerid, cmdtext[])
{
new string[256]; // De formatstring, voor de meldingen
new dader[MAX_PLAYER_NAME+1]; // De naam van de "dader"
new slachtoffer[MAX_PLAYER_NAME+1]; // De naam van het "slachtoffer"
new cmd[256]; // Een tijdelijke commandostring
new tmp[256]; // Nog een tijdelijke commandostring
new splayerid; // Het ID van het "slachtoffer"
new idx; // De index voor strtok

cmd = strtok(cmdtext, idx); // Het eerste gebruik van strtok

if(strcmp(cmd, "/slala", true) == 0) { // Is het commando "/slala"?

	tmp = strtok(cmdtext, idx); // Even uitzoeken of er nog wat achter /slala staat. Let op idx, die staat nog op het begin van het volgende stuk van de string door de vorige strtok
	if(!strlen(tmp)) {
		SendClientMessage(playerid, 0xFFFFFFAA, "USAGE: /slala [playerid]"); // Dit wordt uitgevoerd als er niks achter /slala staat
		return 1; // Verstuur de tekst niet als chatbericht
	}
	splayerid = strval(tmp); // Sla het getal achter /slala op in splayerid

	if (IsPlayerConnected(splayerid)) { // Is splayerid een verbonden speler?
		GetPlayerName(splayerid, slachtoffer, sizeof(slachtoffer)); // Vraag de naam op van het slachtoffer
		GetPlayerName(playerid, dader, sizeof(dader)); // Vraag de naam of van de dader
		format(string, sizeof(string), "%s wants to say 'Lala' to you!", dader); // Maakt de melding klaar om verstuurd te worden
		SendClientMessage(splayerid, 0xFFFFFFAA, string); // Verstuur de melding!
		format(string, sizeof(string), "'Lala' has been said to %s", slachtoffer);
		SendClientMessage(playerid, 0xFFFFFFAA, string);
	} else {
			format(string, sizeof(string), "%d is not an active player.", splayerid); // Oh oh, splayerid is geen verbonden speler
			SendClientMessage(playerid, 0xFFFFFFAA, string);
	}
	return 1; // Verstuur de tekst niet als chatbericht
}

return 0; // Het is geen commando, verstuur maar als tekstbericht!
}

Dat was alles. Ik hoop dat je nu weet hoe je zelf tekstcommando's maakt. Als je het niet snapt of er iets anders aan de hand, please feel free to post.

Met dank aan Jarno, hij heeft mijn scriptjes getest :). _O_ Jarno _O_

Link to comment
Delen op andere websites

  • 8 maanden later...
  • 3 weken later...

Hallo. :D

Samen met deze tutorial en de sa:mp wiki heb ik ook getracht een textcommand te maken.

Alleen ik krijg een error. :-(

Error:

error 037: invalid string (possibly non-terminated string)

Code:

new cmd[256], idx;
cmd = strtok(cmdtext, idx);
if(strcmp(cmd, "/hello", true)==0) {
	new tmp[256];
	tmp = strtok(cmdtext, idx);
	new id = strval(tmp);
	if(id == 1) {
		SendClientMessage(playerid, COLOR_GREEN, "You've bought a brand new Cheetah!);
	}
return 1;
}

Mvg,

Mania ^_^

Link to comment
Delen op andere websites

Ik zie de fout:

SendClientMessage(playerid, COLOR_GREEN, "You've bought a brand new Cheetah!);

moet zijn

SendClientMessage(playerid, COLOR_GREEN, "You've bought a brand new Cheetah!");

(Het afsluitende aanhalingsteken is erbijgekomen)

Link to comment
Delen op andere websites

  • 5 maanden later...

voor een topic die al 2 jaar oud is wil misschien wel nog iemand reageren ? maarja uuuh,, als je dat OnPlayerTextCommand er nog niet in hebt hea kun je dat dan gewoon onderaan zetten ? of geeft dat schade aan het script ?

GrTz.

Zero

Link to comment
Delen op andere websites

  • 2 years later...

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