Ein/Ausgänge auf Knopfdruck

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
  • Hallo liebe Brotfische!
    Hier präsentiere ich euch ein kleines Tutorial, mit dem ihr auf euren Server eigene Ein und Ausgänge "Installieren" könnt.
    Das ist im prinzip die "Profi-Fassung" die vorallem bei vielen Ein/Ausgängen einiges an Zeilen spart!


    Vorraussetzungen
    Ihr benötigt die Grundkentnisse im SA-MP Scripten.
    Und natürlich benötigen wir PAWO ;)


    ---------------------------------------------------
    1. Wir erstellen ein Enum, um nachher alles schön übersichtlich zu haben.
    Da wir Positionen Abfragen wollen, brauchen wir Floats.
    Hier ein Beispiel:
    enum e_eingange {
    Float:i_x,
    Float:i_y,
    Float:i_z,
    Float:a_x,
    Float:a_y,
    Float:a_z,
    interior,
    world
    }

    Ich habe hier Präfix verwendet um es zu verdeutlichen. Alle "i_" Floats sind innen, alle "a_" Floats aussen.


    2. Wir erstellen ein "new" in form einer Auflistung, um unsere Daten zu speichern.
    Dabei gehen wir nach dem oben erstellten Profil vor.
    Wir verbinden das "new" einfach mit unserem Enum:
    new eingange[][e_eingange] = {
    {i_x, i_y, i_z ,a_x ,a_y, a_z, interior, virtualworld},
    {i_x, i_y, i_z ,a_x ,a_y, a_z, interior, virtualworld}
    };
    Bei mehreren Auflistungen müssen alle, bis auf die letzte hinter der geschwungenden Klammer mit einem Kommar versehen sein!
    Erklärungen:
    i_x, i_y, i_z stehen für die Koordinaten des Innenraumes.
    a_x,a_y,a_z stehen für die Koordiaten des Einganges.
    interior und virtualworld erklären sich glaube ich von alleine ;)


    3. Wir erstellen und Laden die Pickups durch eine "for-schleife" in unseren GameMode.
    Die Schleife geht alle, von uns erstellten Ein/Ausgänge durch und erstellt diese beim starten des Gamemodes!
    Ein Beispiel hier für:

    public OnGameModeInit()
    {
    for(new i = 0; i < sizeof(eingange); i++)
    {
    CreatePickup(1239,1,eingange[i][a_x],eingange[i][a_y],eingange[i][a_z],-1); // Wir erstellen ein Pickup an den oben eingetragenen Koordinaten
    CreatePickup(1239,1,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z],-1); // Wir erstellen ein Pickup an den oben eingetragenen Koordinaten
    }
    }


    4. Wir Fragen wieder via einer "for-schleife" ab, ob der Spieler sich beim Drücken einer Taste in Reichweite einer dieser Punkte befindet, die wir oben aufgelistet haben. Hier müssen wir allerdings deutlich zwischen Ein- und Ausgang unterscheiden, da wir beim betreten ja das Interior und ggf. die Virtuelle Welt setzen, und diese beim Verlassen einfach wieder resetten wollen.
    Ein weitere Beispielcode:
    public OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
    {
    if(newkeys == KEY_SECONDARY_ATTACK)
    {
    for(new i = 0;i<sizeof(eingange);i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.0,eingange[i][a_x],eingange[i][a_y],eingange[i][a_z]))
    {
    SetPlayerInterior(playerid,eingange[i][interior]); // Interior setzen
    SetPlayerVirtualWorld(playerid,eingange[i][world]); // Virtualworld Setzen
    SetPlayerPos(playerid,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z]); // Position zu eingetragenen [i]nnenkoordinaten setzen
    }
    else if(IsPlayerInRangeOfPoint(playerid,2.0,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z]) && GetPlayerVirtualWorld(playerid) == eingange[i][world])// Wir Fragen ab, ob die Position und die Virtual-World stimmt
    {
    SetPlayerInterior(playerid,0); // Interior resettem
    SetPlayerVirtualWorld(playerid,0); // Virtualworld resetten
    SetPlayerPos(playerid,eingange[i][a_x],eingange[i][a_y],eingange[i][a_z]); // Position zu eingetragenen [a]ussenkoordinaten setzen
    }
    }
    }
    }
    Sollten weitere Fragen zu funktionen sein, werde ich es etwas genauer beschreiben.
    Da dies hier allerdings im prinzip ganz Simpel ist, denke ich das es nicht viel zu erklären gibt.


    Man kann unsere Auflistungen oben sogar noch mit z.B. 3D-Texten erweitern, um das ganze noch etwas abzurunden.



    Mit Freundlichen Grüßen,
    Firerfan

    //EDIT: Kleinen Fehler verbessert
    //EDIT2:
    Bis jetzt wurde die Virtual-World beim verlassen nicht verglichen.
    Sprich man kam immer am letzten eingetragenen Ort raus.
    Habe das ganze mal fixxed.
    //EDIT3: Die vorherigen "ä"'s geändert. Sollte so nun funktionieren
    //EDIT4: Noch ein parr "ä"'s rausgefischt
    //EDIT5: Fehler bei Schritt 4 berichtigt. Virtualworld wurde falsch verglichen

    6 Mal editiert, zuletzt von Firerfan ()

  • Sehr wenig erklärt.
    Kommt ein neuer im pawn und fragt warum 2 mal XYZ?({i_x, i_y, i_z ,a_x ,a_y, a_z, interior, virtualworld},
    )
    Naya 8/10

  • Und wo soll man die Koods hin klatschen damit er erkennt wohin wir pickups erstellen wollen


    ?


    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(102) : error 001: expected token: "{", but found "ä"
    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(113) : error 001: expected token: ";", but found "ä"
    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(116) : error 010: invalid function or declaration
    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(209) : error 001: expected token: ")", but found "ä"
    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(209) : error 017: undefined symbol "nge"
    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(209) : error 029: invalid expression, assumed zero
    C:\Users\BCEX\Desktop\Eddik\Samp R2\gamemodes\reallife-revolution.pwn(209) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    7 Errors.


    209
    for(new i = 0; i < sizeof(eingänge); i++)
    102
    enum e_eingänge
    113
    new eingänge[][e_eingänge] = {
    116
    };

  • Wie die zu erstellen sind, steht doch oben.
    Die Pickups werden beim Serverstart automatisch erstellt.


    Zu den Errors mit "ä" - ändere das einfach mal in Normale zeichen.
    Garnicht dran gedacht, werde ich aber gleich editieren.

  • Nützliches Tutorial, ich habe allerdings ein Problem!


    Schritt 1-3 ist ja fast nur Copy&Paste und dann für die Auflistung die Koordinaten setzten.


    Ich hab Schritt 4 auch richtig eingefügt und compiled, alles funktioniert aber wen ich auf dem Server gehe dann kann ich ins Interior aber vom Interior nicht wieder raus.
    Muss ich bei Schritt 4 doch etwas ersetzten? Habe bisher nur bei Schritt 2 etwas einfügen müssen.


    Vielen Dank im Vorraus!

  • Hallo


    Vielleicht könntest Du noch ein Tut machen, wo mithilfe der Pickupid rumgeportet wird, dann könntest Du dir die for-Schleife sparen ;)
    Aber sonst gut brauchbar, ist ja der selbe Weg wie bei den Checkpoints.


    DUDA

    Naja, die schleife könnte ich mir nicht sparen, wenn ich das so mache wie oben^^
    Ich finde das ist die übersichtlichste Methode.


    Ja, die Daten werden oben Definiert.
    Eventuell bring ich sowas auch noch als Filterscript raus, das sich ingame Ein- und Ausgänge erstellen lassen.


    MfG Firer

  • Sicher, denk an ein Vehiclesystem


    -Jedes Koordinatenpaar bekommt einen Variablenwert, dieser wird durch die Pickupid bestimmt
    -Dieser Wert wird in einem Enum(wert) abgespeichert
    -OnPlayerPickupID (oder wie das heisst)


    Eigentlich ein simpler Pickupporter, aber per Enum. Evt. fände man auch einen Weg, wie man noch eine Taste drücken müsste.


    Will dich jetzt nicht irgendwie Erniedrigung oder so,einfach als kleiner Hinweis am Rande

  • Das hier ist die Methode "Auf Knopfdruck" ;)
    Aber du hast recht, es geht bei so einem System sogar ohne for-schleife...


    Ganz übersehen, das ich einfach die PickupID verwenden könnte.
    Allerdings finde ich das mit dem Knopfdruck besser - mein kann nicht verstehentlich reinlaufen^^

  • Bitte helfen ;)

  • Bitte helfen ;)

    else if(IsPlayerInRangeOfPoint(playerid,2.0,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z]) && GetPlayerVirtualWorld(playerid) == eingange[i][world])// Wir Fragen ab, ob die Position und die Virtual-World stimmt


    Kopiere dies bei schritt 4.
    Aber bitte achten - es ist die 2te Abfrage.


    Der Fehler war, ich hab das Interior mit der Virtuellen Welt verglichen^^
    Ich ändere das gleich im original topic.



    MfG Firer

  • Geiles Tutorial, habe sofort alles vertstanden ;)
    WIe mache ich es aber mit Temas? Also z.B gTeam_BALLAS, dass nur die hinein können?


    Ist es so wie du es gemacht hast ressourcen sparend`? (ist mir ganz wichtig)

  • Ist Codesparend^^
    Resourcen... Hmm...
    Ich denke mal das eine for-Schleife weniger Resourcen frisst als z.B. 6 normale Abfragen^^


    Ausserdem ists übersichtlicher.
    Mit den Teams hab ich mir auch schon was überlegt ;)
    Ansonsten musst du die Alte Methode benutzen.
    Denke ich werde das erweitern.



    Ich glaube, dass ich's als Filterscript rausbringen werde.
    Ist ja ne nette Sache^^

  • Ja, ist dir eigentlich gut gelungen 9/10.
    Wüsste nicht was es zu verbessern gäbe.

  • Geiles Tutorial, habe sofort alles vertstanden ;)
    WIe mache ich es aber mit Temas? Also z.B gTeam_BALLAS, dass nur die hinein können?


    Ist es so wie du es gemacht hast ressourcen sparend`? (ist mir ganz wichtig)

    Ich hab mal was für dich... naja rausgesucht kann man nicht sagen^^
    [ SCRIPTING ] Simple Ein/Ausgänge per Enter Taste
    Ist zwar länger und nicht so übersichtlich, aber leichter erweiterbar.



    MfG Firer