BFX Accounts 1.0

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


    ich möchte hier eines meiner neuen Sachen vorstellen welches helfen soll ein Login/Register Skript ohne große Probleme zu integrieren,
    es muss nicht viel getan werden lediglich ein paar Sachen gesetzt und voreingestellt werden.
    Diese "Include" hat den Dialog schon integriert also muss nichts mehr getan werden, es enthält zudem Zusatz "Callback" Funktionen die signalisieren wenn der Spieler ausgeloggt wird,
    eingeloggt wird oder sich registriert.


    Features


    • Integrierter Dialog
    • einfaches Speichern und laden
    • einfaches eingliedern ins Skript ohne großen Aufwand


    Callbacks die ins eigene Skript einbezogen werden können.


    public BA_OnPlayerRegister(playername[],playerid,password[])


    - Standard Rückgabe "true" oder 1
    - wird aufgerufen sobald der Spieler sich registriert hat
    - playername[] ( enthält den Spielernamen des registrierten )
    - playerid ( ID des registrierten )
    - password[] ( Passwort des registrierten )


    public BA_OnPlayerLoad(playername[],playerid)


    - Standard Rückgabe "true" oder 1
    - wird aufgerufen sobald der Spieler die Verbindung zum Server aufnimmt und sein Account gefunden wird!
    - playername[] ( Name des geladenen )
    - playerid ( ID des geladenen )


    public BA_OnPlayerLogout(playername[],playerid)


    - Standard Rückgabe "true" oder 1
    - wird aufgerufen sobald der Spieler den Server verlässt und ausgeloggt wird.
    - playername[] ( Name desjenigen der den Server verlässt )
    - playerid ( ID desjenigen der den Server verlässt )


    public BA_OnPlayerLogin(playername[],playerid,password[])


    - Standard Rückgabe "true" oder 1
    - wird aufgerufen sobald sich der Spieler erfolgreich einloggt.
    - playername[] ( Spielername des eingeloggten )
    - playerid ( ID des eingeloggten )
    - password[] ( verwendetes Passwort des eingeloggten )



    Hier noch Funktionen die genutzt werden können.


    IsPlayerLoggedIn(playerid)


    - fragt ab ob Spieler eingeloggt ist
    - gibt je nach dem "true" oder "false" zurück



    DoPlayerAccExist(playerid)


    - fragt ab ob der Spieler Account existiert.
    - gibt je nach dem "true" oder "false" zurück



    Und hier ein Beispiel Skript wie das ganze abläuft bzw. wo was hin muss : http://pastebin.com/xYn65Dbd



    Wie funktioniert das mit meinen Variablen die gespeichert werden sollen und woher weiss das Skript was ich speichern will ?


    Es gibt eine feste Struktur in diesem System und das ist sie



    enum pVariables_Save
    {
    var_name[MAX_VAR_NAME],
    var_type,
    def_val_str[128],
    def_val_int,
    Float:def_val_float
    };


    Erklärung :

    • Name der Spieler Variable die ihr zum Speicher/Lade Prozess hinzufügen wollt
    • Der Typ dieser Variable ( Ist sie Float, String oder Integer ? ) dazu verwendet ihr bitte die Typen der SpielerVariablen ( http://wiki.sa-mp.com/wiki/PvarTypes )
    • Standardwert wenn es eine Variable vom Typ String/Text ist
    • Standardwert wenn es eine Variable vom Typ Integer/Zahl ist
    • Standardwert wenn es eine Variable vom Typ Float/Fliesskommazahl ist

    Wozu die Standardwerte ?

    diese werden lediglich bei der registrierung übernommen damit das Skript einen festen Wert übernehmen kann für neu registrierte

    Wie verwende ich diese Struktur und wie definiere ich sie ? Wozu braucht das Skript sie wenn ich die SpielerVariablen selber definieren kann ?

    1. Zuerst einmal das Skript braucht sie um zu wissen welche Spieler Variablen geladen und gespeichert werden sollen, es kann nicht hellsehen und ich auch nicht, wer es kann Glückwunsch :D
    2. Die Struktur wird ganz simpel definiert :
    new mein_name[][pVariables_Save] = {{"geld",V_INT,"",20000,0.0} , // jetzt ist diese Variable in der Struktur sprich sie soll gespeichert werden und sie heißt "geld" darin setz ich normalerweise mein Geld Status "SetPVarInt", Standardmäßig 20.000$
    {"wantedlevel",V_INT,"",0,0.0} // hier mein Wanted level ebenfalls Typ Integer und Standardmäßig 0
    };



    Wie verwende ich das nun ?


    Folgendes, ihr habt 3 wichtige Funktionen die zuerst in euer Skript müssen und genau in die selber "Callbacks" wie ihr Name es schon sagt


    BA_OnDialogResponse(playerid, dialogid, response, listitem, inputtext, <struktur>);
    BA_OnPlayerDisconnect(playerid,<struktur>);
    BA_OnPlayerConnect(playerid,<struktur>);


    <struktur> ist der Platzhalter für euren Namens Container der Variablen dort setzt ihr den Container dann auch ein damit das Skript weiss wo die Daten übernommen werden sollen sprich
    welche Spielervariablen gespeichert und geladen werden sollen.


    Beispiel :
    BA_OnPlayerConnect(playerid,mein_name);
    jetzt werden alle Spielervariablen mit den Namen von "mein_name" gespeichert und geladen



    Zu beachten bei "BA_OnPlayerDisconnect", bitte setzt eure Variablen bevor ihr dieses ausführt sonst gehen sie euch verloren sprich sie werden nicht gespeichert!


    Beispiel :
    public OnPlayerDisconnect(playerid, reason)
    {
    SetPVarInt(playerid,"spielergeld",GetPlayerMoney(playerid)); // bitte vor dem Speichern ausführen!
    BA_OnPlayerDisconnect(playerid,meine_vars); // Alles übernehmen und speichern etc...
    return 1;
    }


    Die wichtigsten Definitionen der in der INC die ihr verändern könnt
    #define LOGGED_IN "logged" // Spieler eingeloggt
    #define DO_EXIST "do_exist" // existiert der Account des Spielers ?
    #define PW_KEY "passwort" // Variable für Spieler Passwort
    #define MAX_VAR_NAME 64 // Maximale Variablen Länge
    #define PLAYER_ACC "%s.dat" // Spieler Account (Speicher / lade Pfad )
    #define MIN_PW_LEN 8 // Mindest. länge für Spieler Passwort


    #define H_LOGIN_DIAG 58 // Login Dialog
    #define H_REGISTER_DIAG 59 // Register Dialog


    #define REG_HEADER "Registrierung" // Dialog Titel für Registrierung
    #define REG_TEXT "Bitte registriere dich." // Dialog Text für Registrierung


    #define LOG_HEADER "Einloggen" // Dialog Titel für Login
    #define LOG_TEXT "Logge dich in deinen Account ein." // Dialog Text für Login



    Pastebin [Coming Soon ]


    Achtung : Es wird ein von mir entworfenes Speicherverfahren benötigt , mehr infos hier :
    http://forum.sa-mp.de/san-andr…fx-ini-system-cache-based

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    5 Mal editiert, zuletzt von BlackFoX () aus folgendem Grund: * Bug fix *

  • Wirklich schöne Include :)


    Aber du hast vergessen zu erwähnen das die bfx_ini Include für das speichern benötigt wird
    Solltest du dazuschreiben ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Lol, ich habe gerade was ähnliches in den Startlöchern :o


    Wenn ich das richtig sehe, übergibst du einfach bei OnPlayerConnect einen Array des gegeben Formats und lädst das ganze?
    Und bei OnPlayerDisconnect speicherst du es ab?


    Habe einen Schönheitsfehler entdeckt :x
    Es sollte DoesPlayerAccExist heissen.


    Aber sonst schön.^^

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Genau ich gebe eine Array weiter in der Praktisch alle Namen der Variablen vorhanden sind die ich vorher eingetragen habe damit das Skript weiss welche Spielervariablen ich speichern moechte so kann der Scripter also selber bestimmen was gespeichert werden soll ohne die "include" bzw das Basis Skript zu veraendern und das durch wenig Aufwand

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Es gibt da einen Bug, der in den meisten Fällen nicht kritisch sein wird.
    Dennoch:
    Du verwendest dreimal
    for(new i = 0;i<sizeof(VarTree[]);i++)
    Was du ja eigentlich willst, ist die Anzahl solcher Einträge:
    enum pVariables_Save
    {
    var_name[MAX_VAR_NAME],
    var_type,
    def_val_str[128],
    def_val_int,
    Float:def_val_float
    };


    Was du aber in Wahrheit mit sizeof(VarTree[]) abfragst, ist die Grösse EINES EINZIGEN solchen Eintrages.
    Und dies ist standardmässig MAX_VAR_NAME + 1 + 128 + 1 + 1.
    Übergibt man also irgendeinmal eine Array, der grösser ist als diese Summe, wird das ganze wohl abschmieren oder sonst irgendetwas passiert.


    Du hast also sizeof(VarTree[]), was du aber ja willst, ist sizeof(VarTree) was dann wirklich die Länge dieses Arrays zurückgeben WÜRDE, FALLS diese Länge schon bekannt wäre.
    Da du dem Callback aber nur VarTree[][pVariables_Save] übergibst, ohne Angabe der Länge, wird das dann einen Error geben, da du in diesem Fall sizeof(...) garnicht anwenden kannst.
    Du musst dem Callback also noch ein zusätzliches Argument für die entsprechende Länge von VarTree übergeben.


    PS.: Wieso VarTree? Ein normaler Array wie bei dir ist höchstens ein zu einer linearen Liste degenerierter Baum^^

  • Das könnte wirklich Probleme geben, ich werde wohl doch eine feste Länge definieren müssen eigentlich wollte ich das nicht,
    wird wohl leider nicht anders gehen.


    Ich werde das ganze in der nächsten Stunde nochmal abändern.


    Mir fiel einfach kein anderer Name ein :D



    /Edit :
    Maximale Variablen Angabe wurde nun auf 80 Variablen beschränkt, kann verändern werden wenn nötig.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    Einmal editiert, zuletzt von BlackFoX ()

  • Mir ist gerade eine Idee gekommen.
    Vor kurzem habe ich im Codeschnipsel-Thread folgendes gepostet:
    http://pastebin.com/wz9UMyqY


    Du verwendest ja für jede Variable die gleiche enum-Struktur.
    Zum Abspeichern eines Floats oder eine Integer, ist dies jedoch sehr ineffizient, da du IMMER 512 Bytes für die Strings verwendest.


    Wenn du nun die Pointerfunktionen von oben benutzen würdest, könntest einfach den Pointer und den Typ übergeben.
    Mit dem Pointer könntest du auch beliebig Lange Strings übergeben.

  • Ich werde das ganze mal in mein Skript einbauen, ich habe das Skript nun aber vorerst entfernt da ich vermute noch einige Fehler gefunden zu haben.
    Ich werde das Skript spätestens Morgen wieder freigeben da ich noch einiges zu tun habe


    danke für den Vorschlag irgendwie vergesse ich solche Sachen immer :D
    kommt wohl davon wenn man länger aussetzt :wacko:

    Mfg. BlackFoX_UD_ alias [BFX]Explosion