JoshTheBoss Geplaatst: 11 juli 2009 Rapport Geplaatst: 11 juli 2009 (bewerkt) Tutorial voor een goede jail command gemaakt door JoshTheBoss In deze tutorial ga ik uitleggen hoe je een "/jail [playerid] [tijd] [reden]" maakt. Ik heb deze tutorial geschreven omdat ik andere mensen zie die er soms problemen mee hebben. De command is in dcmd en sscanf. Er zit nu ook een countdown bij! Ik heb de countdown helaas niet kunnen testen, want mijn PC is gecrashed.Ik heb de countdown helaas niet kunnen testen, want ik heb er niet zoveel zin in . Onderaan mijn tutorial bevind zich een link naar pastebin, daar is de hele code overzichtelijk met comments. dcmd en sscanf Hoe gebruik je dcmd en sscanf? Alseerst hebben we deze code nodig. Ik heb er een include van gemaakt. Stop deze in include map van je server.dcmd.rar Big Boss heeft een prachtige tutorial gemaakt voor het gebruik van dcmd en sscanf. [Tutorial] dcmd en sscanf Nu gaan wij de "/jail [playerid] [tijd] [reden]" command maken. Bovenaan je script moeten we vier variabelen toevoegen. new jailed[MAX_PLAYERS]; //Hiermee kunnen we checken of de speler is gejailed. new vrijlaattimer; //Hiermee kunnen we de timer die we gaan maken stoppen. new CountdownTimer; //Hiermee kunnen we de countdown timer die we gaan maken stoppen. new Count; //Hier slaan we de tijd in op voor de countdown. Even de kleuren definen. #define COLOR_YELLOW 0xFFFF00AA #define COLOR_BLUE 0x0000BBAA #define COLOR_GREEN 0x33AA33AA #define COLOR_RED 0xAA3333AA Nu moeten we ook de timers die we gaan make forwarden. forward Vrijlaat(playerid); //De timer forward Countdown(playerid); //De countdown Als de speler de server joined en/of weg gaat, moeten we natuurlijk instellen dat hij niet meer in jail zit. public OnPlayerConnect(playerid) { jailed[playerid] = 0; //De jailed waarde staat nu op nul return 1; } public OnPlayerDisconnect(playerid, reason) { jailed[playerid] = 0; //De jailed waarde staat nu op nul return 1; } Onder "OnPlayerCommandText(playerid, cmdtext[])" voegen wij dit toe. dcmd(jail, 4, cmdtext); De vier staat voor het aantal characters dat het command heeft. Nu komt de command zelf. Ik raad aan om het helemaal onderaan het script te doen. Ik zal bij elke regel uitleg zetten. dcmd_jail(playerid, params[]) //Params zijn de dingen die achter het command komen. { if(IsPlayerAdmin(playerid)) //Even checken of de speler eigenlijk admin is. { new anderespeler, tijd, reden[64]; //Een paar variabelen maken om de spelerid, tijd, en reden op te slaan. Elke letter van "uiz" heeft een betekenis. De uitleg daarvoor staat in de tut van Big Boss. if(sscanf(params, "uiz", anderespeler, tijd, reden)) //Checken of de speler eigenlijk iets invoerd. { SendClientMessage(playerid, COLOR_YELLOW, "GEBRUIK: /jail [spelerid/stuk van de naam] [tijd] [reden]"); //Bericht terugsturen hoe het wel moet. return 1; //Einde command } if(IsPlayerConnected(anderespeler)) //Als de speler wel de benodigde dingen in heeft gevoerd, gaan we checken of de gegeven speler present is. { jailed[playerid] = 1; //Defineren dat de speler is gejailed. new berichtvooriedereen[128], berichtvoorspeler[128]; //Twee variabelen om een bericht te maken. new naam[MAX_PLAYER_NAME]; //Om de naam van de betreffende speler op te slaan. GetPlayerName(anderespeler, naam, sizeof(naam)); //De naam van de andere speler verkrijgen. format(berichtvoorspeler, sizeof(berichtvoorspeler), "Je bent gejailed voor %i seconden. REDEN: %s", tijd, reden); //Een string maken om de speler te informeren. SendClientMessage(anderespeler, COLOR_RED, berichtvoorspeler); //De string versturen format(berichtvooriedereen, sizeof(berichtvooriedereen), "%s is gejailed voor %i seconden.", naam, tijd); //Een string maken om de andere mensen van de server te informeren. SendClientMessageToAll(COLOR_BLUE, berichtvooriedereen); //De string versturen SetPlayerPos(anderespeler ,223.2217,111.1841,999.0156); //Daarna de speler in de gevangenis zetten. SetPlayerInterior(anderespeler ,10); //Interior ID instellen. vrijlaattimer = SetTimerEx("Vrijlaat", tijd*1000, false, "i", anderespeler); //Timer creëren voor de vrijlating. De timer neemt de spelerid mee. CountdownTimer = SetTimerEx("Countdown", 1000, tijd*1000, "i", anderespeler); //Countdown timer starten Count = tijd; return 1; //Einde command } else { SendClientMessage(playerid, COLOR_RED, "Deze speler is niet aanwezig!"); //Bericht om te zeggen dat de speler niet aanwezig is. return 1; //Einde command } } else { SendClientMessage(playerid, COLOR_RED, "Je bent geen admin!"); //Bericht om te zeggen dat de command gebruiker geen admin is. return 1; //Einde command } } Nu moeten we de functie maken om de speler vrij te laten. public Vrijlaat(playerid) { KillTimer(vrijlaattimer); //De timer die we hebben gemaakt voor de zekerheid stoppen. new string[256], naam[MAX_PLAYER_NAME]; //Een string voor een bericht. GetPlayerName(playerid, naam, sizeof(naam)); //De naam verkrijgen. SetPlayerPos(playerid, 0.0, 0.0, 0.0); //De positie instellen. Moet je aanpassen naar keuze. SetPlayerFacingAngle(playerid, 0); //De hoek instellen. Moet je aanpassen naar keuze. SendClientMessage(playerid, COLOR_GREEN, "Je bent vrijgelaten uit jail!"); //Bericht voor de speler format(string, sizeof(string), "%s is vrijgelaten!", naam); //Bericht maken voor iedereen SendClientMessageToAll(COLOR_RED, string); //Bericht voor iedereen versturen jailed[playerid] = 0; //De jail waarde weer op nul zetten. return 1; } Nu komt de functie voor de countdown. public Countdown(playerid) { if(Count == 0) { GameTextForPlayer(playerid, "You have been released out of jail!", 3000, 3); KillTimer(CountdownTimer); //De countdown stoppen voor de zekerheid. } else { new string[128]; //De string voor de countdown. format(string, sizeof(string), "%d", Count); //De Gametext met het cijfer voor de speler. GameTextForPlayer(playerid, string, 1500, 3); //De gametext laten zien Count--; //De count min 1 } } En dit is je jail command! Er komt nog een optioneel stukje. Dit zorgt ervoor dat je niet kuntpraten. public OnPlayerText(playerid, text[]) { if(jailed[playerid] == 1) { SendClientMessage(playerid, COLOR_RED, "Je zit in jail. Je mag niet praten!"); return 0; } return 1; } Ik heb het command ook op pastebin gezet. Klikkie! Als je een gevorderde scripter bent, kun je natuurlijk ook codes maken zodat als de speler weggaat en weer de server weer joined, dat hij toch weer in jail zit. SUCCES!!! Credits gaan naar Big Boss voor zijn prachtige tutorial voor dcmd en sscanf. Bewerkt: 17 juli 2009 door JoshTheBoss Reageren
David22 Geplaatst: 12 juli 2009 Rapport Geplaatst: 12 juli 2009 dcmd Mooie tut. Je kan natuurlijk altijd nog een extra stukje maken met een gametext of textdraw waar een countdown in staat, maar dat is allemaal optioneel. Evengoed een goede aanvulling op de tut van Big Boss Reageren
JoshTheBoss Geplaatst: 12 juli 2009 Auteur Rapport Geplaatst: 12 juli 2009 dcmd Mooie tut. Je kan natuurlijk altijd nog een extra stukje maken met een gametext of textdraw waar een countdown in staat, maar dat is allemaal optioneel. Evengoed een goede aanvulling op de tut van Big Boss dankje Reageren
Freaksken Geplaatst: 13 juli 2009 Rapport Geplaatst: 13 juli 2009 (bewerkt) Goeie tut, ookal begrijp ik niks van dcmd en sscanf, ik heb geprobeerd hem om te zetten naar verstaanbaare strtok-taal En ik heb wat dingen toegevoegd. Dat is allemaal gelukt. Alleen, ik heb 1 probleem, als ik iets typ bij reason krijg ik dat niet te zien in de chatbox. vb.: /jail playerid time reason /jail 5 2 Dit is een voorbeeld. ==> Freaksken(ID: 5) is jailed for 2 minutes. Reason: ! if(strcmp(cmd, "/jail", true)==0) { if(!IsPlayerAdmin(playerid)) return 0; new giveplayerid, time, reason; new giveplayer[MAX_PLAYER_NAME]; tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } giveplayerid = strval(tmp); tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } time = strval(tmp); tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } reason = strval(tmp); if(!IsPlayerConnected(giveplayerid)) { SendClientMessage(playerid, COLOR_GREEN, "Player is not online!"); return 1; } if(time > 10) { SendClientMessage(playerid, COLOR_GREEN, "You can not jail someone more than 10 minutes!"); return 1; } jailed[giveplayerid] = 1; SetPlayerPos(giveplayerid ,3792.5220,3023.9463,2.2903); ResetPlayerWeapons(giveplayerid); ResetPlayerMoney(giveplayerid); new string[128]; GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer)); format(string, sizeof(string), "You are jailed for %i minutes. Reason: %s!", time, reason); SendClientMessage(giveplayerid, COLOR_GRAY, string); format(string, sizeof(string), "Jailed for %i minutes!", time); GameTextForPlayer(giveplayerid, string, 2500,3); SendClientMessage(giveplayerid, COLOR_GRAY, "Weapons and money are resetted!"); SendClientMessage(giveplayerid, COLOR_GRAY, "Just take a look around!"); format(string, sizeof(string), "%s(ID:%d) is jailed for %i minutes. Reason: %s!", giveplayer, giveplayerid, time, reason); SendClientMessageToAll(COLOR_GRAY, string); SetTimerEx("Jailtime", time*60000, false, "i", giveplayerid); return 1; } Srry voor de slechte identatie, of hoe dat ook noemt. Bewerkt: 13 juli 2009 door Freaksken Reageren
JoshTheBoss Geplaatst: 13 juli 2009 Auteur Rapport Geplaatst: 13 juli 2009 (bewerkt) Goeie tut,ookal begrijp ik niks van dcmd en sscanf, ik heb geprobeerd hem om te zetten naar verstaanbaare strtok-taal En ik heb wat dingen toegevoegd. Dat is allemaal gelukt. Alleen, ik heb 1 probleem, als ik iets typ bij reason krijg ik dat niet te zien in de chatbox. vb.: /jail playerid time reason /jail 5 2 Dit is een voorbeeld. ==> Freaksken(ID: 5) is jailed for 2 minutes. Reason: ! if(strcmp(cmd, "/jail", true)==0) { if(!IsPlayerAdmin(playerid)) return 0; new giveplayerid, time, reason; new giveplayer[MAX_PLAYER_NAME]; tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } giveplayerid = strval(tmp); tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } time = strval(tmp); tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } reason = strval(tmp); if(!IsPlayerConnected(giveplayerid)) { SendClientMessage(playerid, COLOR_GREEN, "Player is not online!"); return 1; } if(time > 10) { SendClientMessage(playerid, COLOR_GREEN, "You can not jail someone more than 10 minutes!"); return 1; } jailed[giveplayerid] = 1; SetPlayerPos(giveplayerid ,3792.5220,3023.9463,2.2903); ResetPlayerWeapons(giveplayerid); ResetPlayerMoney(giveplayerid); new string[128]; GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer)); format(string, sizeof(string), "You are jailed for %i minutes. Reason: %s!", time, reason); SendClientMessage(giveplayerid, COLOR_GRAY, string); format(string, sizeof(string), "Jailed for %i minutes!", time); GameTextForPlayer(giveplayerid, string, 2500,3); SendClientMessage(giveplayerid, COLOR_GRAY, "Weapons and money are resetted!"); SendClientMessage(giveplayerid, COLOR_GRAY, "Just take a look around!"); format(string, sizeof(string), "%s(ID:%d) is jailed for %i minutes. Reason: %s!", giveplayer, giveplayerid, time, reason); SendClientMessageToAll(COLOR_GRAY, string); SetTimerEx("Jailtime", time*60000, false, "i", giveplayerid); return 1; } Srry voor de slechte identatie, of hoe dat ook noemt. ten eerste, strval is een functie om een string omtezetten in integers(hele getallen). dus strval(tmp) zet de tmp om in cijfers. EDIT: Ik heb wat gezocht en heb het gevonden. in plaats van: if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } reason = strval(tmp); Moet het zijn: if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_BLUE, "Use: /jail [id] [time] [reason]"); return 1; } reason = tmp; Bewerkt: 13 juli 2009 door JoshTheBoss Reageren
David22 Geplaatst: 13 juli 2009 Rapport Geplaatst: 13 juli 2009 Werkt niet. Als je een string in een string wilt zetten voldoet '=' niet, maar moet je een format gebruiken. Reageren
Big Boss Geplaatst: 13 juli 2009 Rapport Geplaatst: 13 juli 2009 ik heb geprobeerd hem om te zetten naar verstaanbaare strtok-taal Ik probeer juist de mensen aan te zetten om meer met dcmd te werken. Vanaf heden ga ik dus geen hulp meer verschaffen aan mensen die per se strtok willen gebruiken. Reageren
David22 Geplaatst: 13 juli 2009 Rapport Geplaatst: 13 juli 2009 ik heb geprobeerd hem om te zetten naar verstaanbaare strtok-taal Ik probeer juist de mensen aan te zetten om meer met dcmd te werken. Vanaf heden ga ik dus geen hulp meer verschaffen aan mensen die per se strtok willen gebruiken. Waarom dcmd? Omdat het sneller, makkelijker en simpeler is Reageren
JoshTheBoss Geplaatst: 15 juli 2009 Auteur Rapport Geplaatst: 15 juli 2009 Toegevoegd bij de tutorial: Een countdown!!! Reageren
David22 Geplaatst: 15 juli 2009 Rapport Geplaatst: 15 juli 2009 Toegevoegd bij de tutorial: Een countdown!!! Goed en duidelijk. Meer kan ik niet zeggen . Ga zo door! Reageren
JoshTheBoss Geplaatst: 15 juli 2009 Auteur Rapport Geplaatst: 15 juli 2009 Toegevoegd bij de tutorial: Een countdown!!! Goed en duidelijk. Meer kan ik niet zeggen . Ga zo door! Thnx Reageren
Big Boss Geplaatst: 16 juli 2009 Rapport Geplaatst: 16 juli 2009 Ik zie een kleine fout. Je hebt je kleuren gedefiniëerd als RGB in de tutorial, en niet als hex. Dit gaat dus waarschijnlijk een tag mismatch o.i.d. geven. Kleuren in Pawn worden gedefinieerd: 0xRRGGBBAA Reageren
JoshTheBoss Geplaatst: 16 juli 2009 Auteur Rapport Geplaatst: 16 juli 2009 Ik zie een kleine fout. Je hebt je kleuren gedefiniëerd als RGB in de tutorial, en niet als hex. Dit gaat dus waarschijnlijk een tag mismatch o.i.d. geven.Kleuren in Pawn worden gedefinieerd: 0xRRGGBBAA oww, ok, k ga het nu verbeteren, want mijn PC is gefixt!!!!!! Reageren
D-V-D-K Geplaatst: 18 juli 2009 Rapport Geplaatst: 18 juli 2009 (bewerkt) Leuke tut alleen als je /kill doet of word vermoord kan je gewoon weer weglopen uit de jail? maargoed, bij een tut zou ik dus niet aan beginners aanraden om [256] arrays te gebruiken. Bewerkt: 18 juli 2009 door D-V-D-K Reageren
D-V-D-K Geplaatst: 1 juli 2010 Rapport Geplaatst: 1 juli 2010 Voeg dit ook even toe zodat ze niet uit de jail kunnen ontsnappen d.m.v. dood gaan: public OnPlayerSpawn(playerid) { if(jailed[playerid]) { SetPlayerPos(playerid, 223.2217, 111.1841, 999.0156); SetPlayerInterior(playerid, 10); return 1; } return 1; } 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.