Zoll erstellen, per Befehl öffnen / schließen

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 Community,


    dies ist mein erstes Tutorial auf diesem Forum, also falls ich ein paar Fehler machen könnte oder wenn das Tutorial eurer Meinung nach zu kurz sein sollte, bitte ich euch, dies in die Kommentare zu schreiben.
    Zwar habe ich auch bemerkt, dass es hier einen Zoll Tutorial gibt, aber ich persönlich möchte dies ein wenig ausformulierter machen, das heißt, dass man durch einen Befehl das Tor öffnen kann und dass das Police Department durch einen Befehl den Zoll schließen kann, sodass keiner außer die Polizisten den Zoll betreten können.
    Natürlich können diese den Zoll durch Helikopter betreten, aber dies ist euch überlassen, ob ihr auf eurem Server Helikopter machen möchtet oder nicht.
    Fangen wir dann an.


    Als allererstes würde man sagen, dass man sich die Sachen mappen muss. Dies möchte ich nicht in diesem Tutorial zeigen, ihr müsst euch zwei Tore mappen, ein Gebäude / Zollgebäude (weiß nicht, wie man so etwas nennt) und den Zoll so "schließbar" machen, dass sogar Fußgänger den Zoll nicht passagieren können. Der Idealste Ort, nach meiner Meinung, ist eine Brücke, wie z.B. die Verbindung zwischen San Fierro und Las Venturas.


    Zuerst müsst ihr die Objekte in eurem Script einfügen (unter OnGameModeInit)
    - Dies macht ihr deswegen unter OnGameModeInit, da wenn ihr den Server öffnet, dass die Objekte auch direkt gespawnt werden sollen, und nicht erst, wenn ihr einen Befehl eingibt, denn sonst wäre es ja sehr unpraktisch.







    CreateObject(8556, 1644.19995, -25.2, 39.8, 0, 0, 22);
    ZollTor [0] = CreateObject(980, 1648.30005, -17.1, 38.3, 0, 0, 198);//Gate
    CreateObject(2930, 1643.80005, -19.7, 38.2, 0, 0, 22);
    CreateObject(2930, 1643.80005, -19.7, 40.7, 0, 0, 21.995);
    CreateObject(2930, 1641.40002, -18.9, 38, 0, 0, 105.995);
    CreateObject(2930, 1640.19995, -19.3, 38, 0, 0, 105.991);
    CreateObject(2930, 1640.69995, -20.7, 38, 0, 0, 23.991);
    CreateObject(2930, 1640.69995, -20.7, 40.5, 0, 0, 23.989);
    ZollTor [1] = CreateObject(980, 1635.19995, -21.6, 38.1, 0, 0, 19.996);//Gate
    CreateObject(2930, 1630.19995, -23.8, 38.3, 0, 0, 290);
    CreateObject(2930, 1630.19995, -23.7, 40.8, 0, 0, 289.995);
    CreateObject(2930, 1629.30005, -24.1, 40.8, 0, 0, 289.995);
    CreateObject(2930, 1629.30005, -24.1, 38.3, 0, 0, 289.995);


    Vorab habe ich vergessen, dass ihr ganz oben in euer Script eine globale Variable erstellen müsst, denn diese Tore sollen ja auch auf und abschließbar sein.



    new ZollTor[2]; //Dies ist die Variable für die Tore, ZollTor[0] und ZollTor[1], da Pawno es so "ließt".



    Nun müssten wir uns einen Befehl erstellen, mit dem wir den Zoll öffnen. Der Zoll soll sich automatisch nach z.B. fünf Sekunden schließen. Es wäre sehr sinnvoll, wenn ihr OCMD verwenden würdet oder DCMD, RCMD oder ZCMD, da diese Kommandprozessoren viel einfacher sind, wenn ihr z.B. /kick [Spieler] [Grund / Reason] eingeben müsst. Einen Downloadlink habe ich leider nicht zur Verfügung, aber durch SuFu könnt ihr einen bekommen.





    #include <ocmd>
    #include <sscanf> //Mit Sscanf macht ihr die Parameter, falls ihr sie brauchen müsst


    Vielleicht gehören diese beiden "Includes" nicht ins Tutorial, aber da ich mit OCMD den Befehl gescriptet habe, muss ich es auf OCMD lassen, da ich nicht viel arbeiten möchte. (fauler Arbeiter *_*)
    Jetzt geht ihr ganz unten in euer Script - oder ganz oben - und macht: ocmd:zoll(playerid, params[])
    Params sind die parameter, die wir in diesem Falle nicht brauchen und playerid ist derjenige, der diesen Befehl eingibt, also sprich z.B. ihr.




    ocmd:zoll(playerid, params[])
    {
    return 1;
    }



    Jetzt müssen wir dem Script sagen, dass wir params nicht gebrauchen werden, deswegen müsst ihr schreiben:
    #pragma unused params
    Dieser Befehl sagt einfach nur, dass params nicht gebraucht wird. In diesem Falle werden wir auch params kaum gebrauchen.





    ocmd:zoll(playerid, params[])
    {
    #pragma unused params
    return 1;
    }


    Nun haben wir die Grundlagen erledigt. Damit meine ich die Grundlagen der OCMD-Strukturation. Jetzt müssten wir überprüfen, ob der Zoll derzeit offen ist. Dazu erstellen wir uns als erstes eine globale Variable, die wir meinetwegen ZollStatus nennen. Da wir in diesem Falle ZollStatus nicht für jeden Spieler brauchen, machen wir: new ZollStatus;



    new ZollStatus;


    Nun müssen wir überprüfen, ob der Zoll auch offen ist. Wir sagen jetzt mal einfach, dass 0 = Offen ist und 1 = Geschlossen.



    if(ZollStatus == 0)
    {


    }
    else
    {


    }


    Das else habe ich deswegen gemacht, da der Zoll auch geschlossen werden kann. Wenn der Zoll offen ist, sollen sich unsere Tore bewegen. Aber durch einen Befehl gehen ja nicht die beiden Tore aufeinmal auf. Deswegen müssen wir nun überprüfen, ob der Spieler in der Nähe unseres Gates ist. Dies machen wir unter if(ZollStatus == 0).



    if(ZollStatus == 0)
    {
    if(IsPlayerInRangeOfPoint(playerid,5.0,1648.30005, -17.1, 38.3))//IsPlayerInRangeOfPoint überprüft einfach, ob der Spieler in der Nähe unseres Tores ist (in diesem Falle). Und 5.0 ist die maximale Reichweite, die der Spieler sein darf.


    Nun müssen wir das Tor bewegen. Logischerweise müsste man denken, dass das Tor auf "seiner" Stelle bleibt, da wir bisjetzt das Tor nicht bewegt haben. Dazu machen wir MoveObject, setzen uns einen Timer und senden dem Spieler eine Nachricht, dass er den Zoll erfolgreich passiert hat.



    MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-10,3);
    SetTimer("ZollTor0",5000,false);
    SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");


    Bisjetzt sieht unser /zoll Befehl so aus:



    ocmd:zoll(playerid, params[])
    {
    #pragma unused params
    if(ZollStatus == 0)
    {
    if(IsPlayerInRangeOfPoint(playerid,5.0,1648.30005, -17.1, 38.3))
    {
    MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-10,3);
    SetTimer("ZollTor0",5000,false);
    SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");
    }
    return 1;
    }


    Jetzt mache ich das schnell für das andere Tor:



    if(IsPlayerInRangeOfPoint(playerid,5.0,1635.19995, -21.6, 38.1))
    {
    MoveObject(ZollTor[1],1635.19995, -21.6, 38.1-10,3);
    SetTimer("ZollTor1",5000,false);
    SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");
    }


    Jetzt gehen wir zu den Timers ein. Wenn wir einen Timer erstellt haben, passiert nach diesen Millisekunden, die wir bei SetTimer geschrieben haben, etwas. Um dies zu machen, müssen wir als erstes uns einen forward erstellen und dann einen public. Aber wir müssen es so nennen, wie wir es bei SetTimer("HIER"); gemacht haben, also nach den Gänsefüßchen. (tut mir leid, wenn ich mich falsch ausdrücke).



    forward ZollTor0();
    forward ZollTor1();


    public ZollTor0()
    {
    return 1;
    }


    public ZollTor1()
    {
    return 1;
    }


    Nun haben wir das auch erledigt. Nach abgang dieser Zeit sollen sich die Tore wieder zu ihrer position bewegen. Um dies zu machen, kopieren wir uns den MoveObject Befehl in den jeweiligen ZollTor hinein und löschen die "-10", da diese -10 unseren Tor ins tiefe bewegt.



    public ZollTOr0()
    {
    MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-,3);
    return 1;
    }


    public ZollTor1()
    {
    MoveObject(ZollTor[1],1635.19995, -21.6, 38.1,3);
    return 1;
    }


    Eigentlich ist unser Zoll Scripting ganz in Ordnung und schon fertig. Jetzt will ich euch noch zeigen, wie man überprüfen kann, ob der Zoll von der Police Department "geöffnet" wurde, also ob die Polizisten z.B. /zollstatus eingetippt haben. Wenn sie das eingetippt haben, könnt ihr den Zoll nicht passieren, doch wenn der Polizist nocheinmal /zollstatus eintippt, könnt ihr den Zoll wieder über den Befehl /zoll passieren. Da es mir sehr die Zeit gekostet hat, poste ich den ganzen Befehl hier rein:



    ocmd:zollstatus(playerid, params[])
    {
    #pragma unused params
    if(!IsPlayerLSPD(playerid))return SendClientMessage(playerid,Rot,"Du bist kein LSPD Member");
    if(Zoll_Status == 0)
    {

    SendClientMessage(playerid,Weiß,"Das Zoll wurde erfolgreich geschlossen.");
    Zoll_Status = 1;
    }
    else
    {

    SendClientMessage(playerid,Weiß,"Das Zoll wurde erfolgreich geöffnet.");
    Zoll_Status = 0;
    }
    return 1;
    }


    Und unser /zoll Befehl:



    ocmd:zoll(playerid, params[])
    {
    #pragma unused params
    if(ZollStatus!= 0)return SendClientMessage(playerid,Grau,"* Das Zoll ist derzeit geschlossen!");
    if(ZollStatus = 0)
    {
    if(IsPlayerInRangeOfPoint(playerid,5.0,1648.30005, -17.1, 38.3))
    {
    MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-10,3);
    SetTimer("ZollTor0",5000,false);
    }
    if(IsPlayerInRangeOfPoint(playerid,5.0,1635.19995, -21.6, 38.1))
    {
    MoveObject(ZollTor[1],1635.19995, -21.6, 38.1-10,3);
    SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");


    SetTimer("ZollTor1",5000,false);
    }
    }
    else
    {
    SendClientMessage(playerid,WEISS,"Der Zoll ist derzeit geschlossen.");
    }
    return 1;
    }


    Das war es schon mit dem Tutorial. Ich hoffe es hat euch gefallen. Meine harte Arbeit, dieses Tutorial zu veröffentlichen, hat 1 1/2 Stunden gedauert. Falls ich es zu kurz gemacht haben sollte, bitte in die Kommentare schreiben. Oder wenn ich das Tutorial zu unausführlich gemacht habe, bitte einfach schreiben. Kritik / Verbesserungsvorschläge, Fragen auch schreiben!

  • Von mir gibt es dafür leider nur 1/10 Punkte.


    Du und vielleicht auch andere fragen sich nun vielleicht sicherlich Wieso?


    Meine antwort dazu ist eindeutig. Mir ist an deiner Formulierung aufgefallen das du etwas unsicher rüber kommst. Außerdem sehe ich nur Copy & Paste! Jeder, der sich dieses Tutorial anschaut wird also dazu verlockt, einmal schnell die Strg + C Taste und einmal die Strg + V Taste zu drücken. Sinn und Zweck eines Tutorials, ist es aber den User der sich dieses gerade durchliest etwas beizubringen! Und wenn du mir jetzt sagst "Wenn er das so macht ist das halt sein Pech, wer lernen will liest das." Dann ist diese Einstellung falsch! Jeder sollte dazu verlockt werden, und wenn es nur bei der Verlockung bleibt, sich so etwas durchzulesen. Immerhin könnte man somit vielleicht ein paar 08/15 Servern den Stoff nehmen, den sie zur Erhaltung brauchen. Wieso hast du für die genannten Includes kein Downloadlink? Das hättest du aber zumindest einfügen können. Und Wörter würde ich komplett ausschreiben, "SuFu"... ich erinner mich ein User vor sehr langer Zeit schonmal danach fragen gesehen zu haben....



    Was daran 1 1/2 Stunden dauert ist mir zwar unverständlich, aber gut. Wenn das stimmt hast du zumindest nur die Objekte Eingefügt und den rest selber geschrieben.


    Mit freundlichen Grüßen
    Famacertech| Berlin



    Edit: Den einen Punkt hast du von mir eigentlich, wenn ich ganz ehrlich bin nur für die Mühe bekommen. Heute ist Freitag, da will ich mal nicht so hart sein und wollte dir was gutes tun... :thumbup:


    Edit: Ich sehe fehler im Tutorial, siehe Variabeln "Zoll_Status & Zollstatus " .Nun sehe ich auch Klammerfehler, damit ziehe ich von den zwei Punkten noch einen ab!

    5 Mal editiert, zuletzt von Famacertech () aus folgendem Grund: Rechtschreibung, Text überarbeitet, Fehler eingefügt

  • Ich habe das Tutorial nur überflogen, aber der Name 'Zoll' ist doch unpassend? Es geht ja nur um das betreten eines anderen Ortes.


    Advertising has us chasing cars and clothes, working jobs we hate so we can buy shit we don’t need.
    – Tyler Durden


    Sobald Werbung im Spiel ist, bist du, die Nutzerin, der Nutzer, das Produkt.


  • Also ich denke das das weniger oder mehr kopiert ist aber was einzig und allein zählt ist das es funktioniert UND das er sich mühe gibt!


    6/10 Punkten für die vorstellung / mühe!


    -/10 Punkten FÜR: Nix habs nicht getestet


    außerdem für anfänger ist es nicht schlecht

  • Also ich denke das das weniger oder mehr kopiert ist aber was einzig und allein zählt ist das es funktioniert UND das er sich mühe gibt!

    Es zält nicht nur, dass es funktionsfähig ist. Hier wird man nicht verlockt, dieses Tutorial zu lesen, eher es zu Kopieren und Einzufügen. Ja, für die Müher hatte ich ihm gestern auch dafür extra ein Punkt gegeben. Und wenn du meist das es nur funktionieren soll und man sich mühe geben soll, dann hast du den Sinn von Tutorials noch nicht verstanden.

    außerdem für anfänger ist es nicht schlecht

    Doch ist es, siehe mein Post, bereich "Strg + C und Strg + V " dann weisst du was ich meine. Oder meintest du das er ein Anfänger ist? Wenn ja, würde ich mal gerne sehen wo er das geschrieben hat...


    PS: Es gibt bereits ein Tutorial dazu, was hoffentlich besser ist. Und das mit dem schließen der Zölle, wird jeder Anfänger dann auch alleine hinbekommen...