Jump to content

[Tutorial]Jail command


JoshTheBoss

Recommended Posts

:Y

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

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: door JoshTheBoss
Link to comment
Delen op andere websites

dcmd _O_

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 :Y

Link to comment
Delen op andere websites

dcmd _O_

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 :Y

dankje ^_^

Link to comment
Delen op andere websites

Goeie tut,

ookal begrijp ik niks van dcmd en sscanf, ik heb geprobeerd hem om te zetten naar verstaanbaare strtok-taal :puh: 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: door Freaksken
Link to comment
Delen op andere websites

Goeie tut,

ookal begrijp ik niks van dcmd en sscanf, ik heb geprobeerd hem om te zetten naar verstaanbaare strtok-taal :puh: 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: door JoshTheBoss
Link to comment
Delen op andere websites

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. :7 Vanaf heden ga ik dus geen hulp meer verschaffen aan mensen die per se strtok willen gebruiken.

Link to comment
Delen op andere websites

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

Link to comment
Delen op andere websites

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

Link to comment
Delen op andere websites

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

Link to comment
Delen op andere websites

Leuke tut :Y 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: door D-V-D-K
Link to comment
Delen op andere websites

  • 11 maanden later...

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;
}

Link to comment
Delen op andere websites

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