[Tutorial] Wie erstellt man ein Gangjail!

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag liebe Brotfische.
    Ich möchte euch hier einmal zeigen, wie man ein Gangjail erstellt.


    Zur erklärung: Gangjail ist ein "Gefängnis", wo Gangs/Mafien User einsperren können.


    Also..Nun zum Tutorial ;)


    Fangen wir zuerst mit den Defines, Forwards und News an, die wir für das Gangjail brauchen.


    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1


    diese Zeile Brauchen wir, um die dcmd-funktion zu aktivieren.Dann brauchen wir folgende News:


    new timer1;


    Diesen Timer benötigen wir dann noch , um festzulegen wie lang der Spieler(der Befreier) dann am Gangjail stehen muss, um einen Spieler aus dem Jail zu befreien. zu guter letzt noch die forwards:


    zusätlich benötigt ihr in euren Spielerdatein noch die Variable "pGangJail". Die Brauchen wir, um den Spieler einzusperren bzw freizulassen.
    forward GANGJAIL(playerid);
    forward ProxDetectorS(Float:radi, playerid, targetid);


    Den ersten benötigen wir, um festzulegen, was passieren soll wenn der Spieler befreit wird.
    Den zweiten benötigen wir, um die Entfernung von 2 Spielern zu ermitteln. Dann legen wir mal los. Am anfang machen wir die "forwards zu publics".


    Fangen wir an mit dem ProxDetectorS. Bei dieser Funktion ermitteln wir durch abfragen der Position des 1.Spielers und der Position des 2.Spielers die Entfernung zwischen den beiden Spielern. Diese Funktion ist aus dem samp-wiki forum.


    public ProxDetectorS(Float:radi, playerid, targetid)
    {
    if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
    {
    new Float:posx, Float:posy, Float:posz;
    new Float:oldposx, Float:oldposy, Float:oldposz;
    new Float:tempposx, Float:tempposy, Float:tempposz;
    GetPlayerPos(playerid, oldposx, oldposy, oldposz);
    GetPlayerPos(targetid, posx, posy, posz);
    tempposx = (oldposx -posx);
    tempposy = (oldposy -posy);
    tempposz = (oldposz -posz);
    if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
    {
    return true;
    }
    }
    return false;
    } Als nächstes kümmern wir uns um den forward: Gangjail(playerid).
    //als erstes fangen wir damit an, das wir es auf alle Spieler beziehen.
    for(new i = 1; i < MAX_PLAYERS; i++)
    //nun fragen wir ab, in welchen Bereich sich der eine Spieler befinden muss, um den Spieler zu befreien.
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266))
    {
    if(SpielerInfo[i][pGangjail] == 1) // Nun Fragen wir ab, ob der gewählte Spieler überhaupt im Jail drin ist.
    {
    SetPlayerPos(i,-372.5778,-1428.0342,25.7266); // nachdem der Timer abgelaufen ist, wird die Position des gewünschten spieler auf die eingestellte Position geändert.
    SpielerInfo[i][pGangjail] = 0; // Der Spieler wird aus dem Jail entlassen
    KillTimer(timer1); // der Timer zum befreien wird beendet, da der Spieler ja befreit wurde.
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist nicht am Gangjail stehen geblieben.");//sollte er nicht in diesem Bereich stehen bleiben, bekommt er eine Fehlermeldung.
    KillTimer(timer1);
    return 1;
    }


    nun kümmern wir uns um die eigentlichen befehle, zum einsperren bzw zum rausholen den Spielers.
    Die dcmd Befehle könnt ihr unterm Script einfügen. Die Befehle werden wir im Format "dcmd" schreiben, da es so einfacher ist einen anderen Spieler abzufragen.


    //Fangen wir mal an
    dcmd_gangjail(playerid,params[])
    {
    new pID; // Das wird die Variable, mit der wir dann den anderen Spieler abfragen.
    if(sscanf(params,"u",pID)) // mit dieser Zeile legen wir fest, was der Spieler zusätzlich zum eigentlichen Befehl überhaupt eingeben muss. In diesem Fall wählen wir das "u", da wir eine SpielerID abfragen wollen.
    {
    return SendClientMessage(playerid,COLOR_WHITE,"Benutzung: /gangjail [playerid]."); //Diese fehlermeldung kommt dann, wenn er vergisst einen Teil des Befehls einzugeben.
    }
    if(SpielerInfo[playerid][Fraktion] > 0) //Hier müsst ihr das "SpielerInfo[playerid][Fraktion]" so verändern, das ihr eure Fraktionsabfrage drin habt.
    {
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266)) // In diesem Bereich muss der Spieler stehen, um einen anderen Spieler einsperren zu können. Ihr könnt die x,y,z Koordinate natürlich verändern.
    {
    if(ProxDetectorS(8.0, playerid, pID)) // Nun kommt unser Proxdetector zum Einsatz. Hier legen wir die Entfernung zwischen den beiden Spielern fest, in welcher der Befehl Funktioniert.
    {
    SetPlayerPos(pID,-368.0691,-1425.5498,25.7266); //Dort wird dann der gewählte Spieler hingesetzt.
    SpielerInfo[pID][pGangjail] = 1; // Der Spieler wird eingejailt.
    return 1;
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Der Spieler ist nicht in deiner Nähe.");
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist nicht am Gangjail.");
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist in keiner Fraktion.");
    }
    }


    dcmd_ungangjail(playerid,params[])
    {
    new pID; // Das wird die Variable, mit der wir dann den anderen Spieler abfragen.
    if (sscanf(params, "u", pID)) // mit dieser Zeile legen wir fest, was der Spieler zusätzlich zum eigentlichen Befehl überhaupt eingeben muss. In diesem Fall wählen wir das "u", da wir eine SpielerID abfragen wollen.
    {
    return SendClientMessage(playerid,COLOR_WHITE,"Benutzung: /ungangjail [playerid]."); //Diese fehlermeldung kommt dann, wenn er vergisst einen Teil des Befehls einzugeben.
    }
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266)) // In diesem Bereich muss der Spieler stehen, um einen anderen Spieler aus dem Gangjail befreien zu können. Ihr könnt die x,y,z Koordinate natürlich verändern.
    {
    timer1 = SetTimerEx("GANGJAIL",20000,0,"playerid",playerid); //Zeit für die Befreiung der Spieler
    return 1;
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Der Spieler ist nicht in deiner Nähe oder du bist nicht an den Zellen."); //Diese Fehlermeldung erscheint wenn der Spieler nicht in der nähe von IsPlayerInRangeOfPoint steht. (x,y,z Koordinate)
    }
    return 1;
    }
    return 1;
    }


    nun zu guter letzt, damit der Befehl auch funktioniert müssen wir den Befehl noch unter "public OnPlayerCommandText(playerid, cmdtext[])" eintragen.
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(gangjail,8,cmdtext); //einmal dcmd, da wir den Befehl im Format geschrieben haben. Dann der Befehl an sich. Mit der Zahl legen wir die länge des Befehl fest(Anzahl der zeichen).
    dcmd(ungangjail,10,cmdtext);
    return 0;
    }



    So vielen dank fürs durch lesen. Falls ihr diesen Befehl schonmal unerklärt von einer Person namens "Kempl" gesehen habt, dann nicht ans klauen denken, sondern ich habe einen Benutzernamenschange gemacht und hieß vorher Kempl und jetz Pluto^^


    //edit Schreibfehler und pwn Texte verbessert
    //edit Einzelne Beschreibungen verändert

    2 Mal editiert, zuletzt von Pluto ()

  • Und wie schaut es aus mit Offlineflucht?
    Nur mal so. ;)

  • man kann selbst dann noch gern eine variable hinzufügen die beim einknasten auf 1 gesetzt wird und dann die variable abspeichern und bei onplayerconnect wieder abfragen.
    Dann befindet sich der Spieler nach einer Offlineflucht immernoch im Knast.