JGuntherS Geplaatst: 10 april 2006 Rapport Geplaatst: 10 april 2006 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 ) 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 . 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 . Jarno Reageren
Flame^ Geplaatst: 31 december 2006 Rapport Geplaatst: 31 december 2006 Anders bump je even niet een topic van een half jaar oud met een retarded post.. Reageren
Mania-92 Geplaatst: 20 januari 2007 Rapport Geplaatst: 20 januari 2007 Hallo. 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 Reageren
JGuntherS Geplaatst: 21 januari 2007 Auteur Rapport Geplaatst: 21 januari 2007 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) Reageren
zeroRidaa Geplaatst: 11 juli 2007 Rapport Geplaatst: 11 juli 2007 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 Reageren
Azer Geplaatst: 14 juli 2007 Rapport Geplaatst: 14 juli 2007 Kan je gewoon toevoegen mits het nog niet bestaat. Reageren
Damon_NL Geplaatst: 14 mei 2010 Rapport Geplaatst: 14 mei 2010 Snap er geen reet van. Dan ben je niet de enige, mij lukt het ook al niet Reageren
Big Boss Geplaatst: 15 mei 2010 Rapport Geplaatst: 15 mei 2010 Dit topic is serieus out-dated. Kijk even naar de datum, het dateert uit 2006. Je kan beter even hier of hier kijken voor een wat recentere en betere tutorial. Reageren
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.