Class Selection überspringen.

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 habe bis jetzt mit Dini gearbeitet und hatte damit echt keine Probleme. Nun nach einer Weile wollte ich auf MySQL
    umsteigen, was auch prima geklappt hat.
    Dann bin ich doch auf ein Problem gestoßen. Und zwar geht es da drum, dass ich die Class Selection überspringen lassen hab.
    Mit Dini hat das ganze auch super funktioniert, doch seit ich mein Code verändert habe und auf MySQL umgestiegen bin,
    geht es nicht mehr. Weder nachdem Register-Vorgang, noch nach dem Login-Vorgang.


    Hier der Code:


    Mit Dini:

    public OnPlayerRequestClass(playerid, classid)
    {
    SpawnPlayer(playerid);
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    if(UserInfo[playerid][Registriert] == 1){
    SetPlayerPos(playerid, 1109.3824,-1796.4907,16.5938);
    SetPlayerFacingAngle(playerid,87.3954);
    SetCameraBehindPlayer(playerid);
    return SetPlayerSkin(playerid, 101);
    }
    new Userfile[64];
    Userfile = UserPath(playerid);
    SetPlayerPos(playerid, 1109.3824,-1796.4907,16.5938);
    SetPlayerFacingAngle(playerid,87.3954);
    SetCameraBehindPlayer(playerid);
    GivePlayerWeapon(playerid,UserInfo[playerid][wPistol],UserInfo[playerid][pAmmu]);
    GivePlayerWeapon(playerid,UserInfo[playerid][wSMG],UserInfo[playerid][sAmmu]);
    SetPlayerSkin(playerid, dini_Int(Userfile, "Skin"));
    return 1;
    }


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch( dialogid ){
    case DIA_REGISTER:{
    if(response){
    if(!strlen(inputtext)){
    new string[128], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    SendClientMessage(playerid,RED,"Du hast vergessen ein Passwort anzugeben. ");
    format(string,sizeof(string), "Hallo, %s. Du bist noch nicht registriert, trage dazu dein gewünschtes Passwort ein: ", name);
    ShowPlayerDialog(playerid,DIA_REGISTER,DIALOG_STYLE_INPUT,"Registrierung",string,"Registrieren","Abbrechen");
    }else{
    Register(playerid, inputtext);
    UserInfo[playerid][Registriert] = 1;
    }
    }else{
    SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Registrierung geht es hier nicht weiter. ");
    Kick(playerid);

    }
    }
    case DIA_LOGIN:{
    if(response){
    if(!strlen(inputtext)){
    new string[128], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    SendClientMessage(playerid,RED,"Du hast vergessen ein Passwort anzugeben. ");
    format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", name);
    ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_INPUT, "Login", string, "Einloggen", "Abbrechen");
    }else{
    Login(playerid, inputtext);
    }
    }else{
    SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Login geht es hier nicht weiter. ");
    Kick(playerid);


    }
    }
    }
    return 1;
    }


    public Register(playerid, key[])
    {
    new Userfile[64];
    Userfile = UserPath(playerid);
    dini_Create(Userfile);
    dini_Set(Userfile, "Passwort", key);
    SetPlayerScore(playerid,0);
    GivePlayerMoney(playerid, 50000);
    SetSpawnInfo( playerid, 0, 101, 1958.33, 1343.12, 15.36, 269.15, 26, 36, 28, 150, 0, 0 );
    UserInfo[playerid][Konto] = 50000;
    SendClientMessage(playerid,GREEN,"Registrierung erfolgreich! Viel Spaß.");

    }


    public Login(playerid, key[])
    {
    new Userfile[64];
    Userfile = UserPath(playerid);
    if(!strcmp(key,dini_Get(Userfile, "Passwort"), true))
    {
    LoadUser(playerid);
    SendClientMessage(playerid,GREEN,"Login erfolgreich! Viel Spaß.");
    }else{
    new string[128], name[MAX_PLAYER_NAME];
    SendClientMessage(playerid, RED, "Dein Passwort ist falsch.");
    format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", name);
    ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_INPUT, "Login", string, "Einloggen", "Abbrechen");
    }
    return 1;
    }


    public SaveUser(playerid)
    {
    new Userfile[64], Float:X, Float:Y, Float:Z, Float:R, Weap, Ammu;
    Userfile = UserPath(playerid);
    GetPlayerWeaponData(playerid, 2, Weap, Ammu);
    UserInfo[playerid][wPistol] = Weap; UserInfo[playerid][pAmmu] = Ammu;
    GetPlayerWeaponData(playerid, 4, Weap, Ammu);
    UserInfo[playerid][wSMG] = Weap; UserInfo[playerid][sAmmu] = Ammu;
    GetPlayerPos(playerid, X, Y, Z);
    GetPlayerFacingAngle(playerid, R);
    UserInfo[playerid][p_x] = X; UserInfo[playerid][p_y] = Y; UserInfo[playerid][p_z] = Z; UserInfo[playerid][p_r] = R;

    dini_IntSet(Userfile, "Level", GetPlayerScore(playerid));
    dini_IntSet(Userfile, "Geld", GetPlayerMoney(playerid));
    dini_IntSet(Userfile, "Skin", GetPlayerSkin(playerid));
    dini_IntSet(Userfile, "Konto", UserInfo[playerid][Konto]);
    dini_IntSet(Userfile, "Eingeloggt", UserInfo[playerid][Eingeloggt]);
    dini_FloatSet(Userfile, "PosX", UserInfo[playerid][p_x]);
    dini_FloatSet(Userfile, "PosY", UserInfo[playerid][p_y]);
    dini_FloatSet(Userfile, "PosZ", UserInfo[playerid][p_z]);
    dini_FloatSet(Userfile, "PosR", UserInfo[playerid][p_r]);
    dini_IntSet(Userfile, "Pistol", UserInfo[playerid][wPistol]);
    dini_IntSet(Userfile, "PistolAmmu", UserInfo[playerid][pAmmu]);
    dini_IntSet(Userfile, "SMG", UserInfo[playerid][wSMG]);
    dini_IntSet(Userfile, "SMGAmmu", UserInfo[playerid][sAmmu]);

    return 1;
    }


    public LoadUser(playerid)
    {
    new Userfile[64];
    Userfile = UserPath(playerid);
    UserInfo[playerid][p_x] = dini_Float(Userfile, "PosX");
    UserInfo[playerid][p_y] = dini_Float(Userfile, "PosY");
    UserInfo[playerid][p_z] = dini_Float(Userfile, "PosZ");
    UserInfo[playerid][p_r] = dini_Float(Userfile, "PosR");
    UserInfo[playerid][wPistol] = dini_Int(Userfile, "Pistol");
    UserInfo[playerid][pAmmu] = dini_Int(Userfile, "PistolAmmu");
    UserInfo[playerid][wSMG] = dini_Int(Userfile, "SMG");
    UserInfo[playerid][sAmmu] = dini_Int(Userfile, "SMGAmmu");
    SetPlayerScore(playerid, dini_Int(Userfile, "Level"));
    GivePlayerMoney(playerid, dini_Int(Userfile, "Geld"));
    UserInfo[playerid][Konto] = dini_Int(Userfile, "Konto");
    UserInfo[playerid][Eingeloggt] = dini_Int(Userfile, "Eingeloggt");
    SetSpawnInfo(playerid, 0,dini_Int(Userfile, "Skin"), UserInfo[playerid][p_x], UserInfo[playerid][p_y], UserInfo[playerid][p_z], UserInfo[playerid][p_r], UserInfo[playerid][wPistol], UserInfo[playerid][pAmmu], UserInfo[playerid][wSMG], UserInfo[playerid][sAmmu], 0, 0 );
    LoadCar(playerid);
    return 1;
    }


    stock ResetUser(playerid)
    {
    for(new i=0; i<sizeof(UserInfo[]); i++){
    UserInfo[playerid][pInfo:i] = 0;
    }
    return 1;
    }


    Und nun mit MySQL:

    public OnPlayerRequestClass(playerid, classid)
    {
    SpawnPlayer(playerid);
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    if(UserInfo[playerid][Registriert] == 1){
    SetPlayerPos(playerid,1109.3824,-1796.4907,16.5938);
    SetPlayerFacingAngle(playerid,87.3954);
    SetCameraBehindPlayer(playerid);
    return SetPlayerSkin(playerid, 101);
    }
    SetPlayerPos(playerid, 1109.3824,-1796.4907,16.5938);
    SetPlayerFacingAngle(playerid,87.3954);
    SetCameraBehindPlayer(playerid);
    GivePlayerWeapon(playerid,UserInfo[playerid][Pistol],UserInfo[playerid][pAmmu]);
    GivePlayerWeapon(playerid,UserInfo[playerid][SMG],UserInfo[playerid][sAmmu]);
    SetPlayerSkin(playerid, UserInfo[playerid][Skin]);
    return 1;
    }


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch( dialogid ){
    case DIA_REGISTER:{
    if(response){
    new string[128], query[128], passwort[40];
    if(strlen(inputtext)>3){
    ///Registrierung
    mysql_escape_string(inputtext, passwort, sqlHandle);
    format(query, sizeof(query), "INSERT INTO user (username, password) VALUES ('%s','%s')",UserName(playerid), passwort);
    mysql_tquery(sqlHandle,query,"OnUserRegister","i", playerid);
    }else{
    SendClientMessage(playerid,RED,"Das eingegebene Passwort war nicht lang genug. Mindestens 4 Zeichen lang. ");
    format(string,sizeof(string), "Hallo, %s. Du bist noch nicht registriert, trage dazu dein gewünschtes Passwort ein: ", UserName(playerid));
    ShowPlayerDialog(playerid,DIA_REGISTER,DIALOG_STYLE_INPUT,"Registrierung",string,"Registrieren","Abbrechen");
    }
    }else{
    SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Registrierung geht es hier nicht weiter. ");
    Kick(playerid);


    }
    return 1;
    }
    case DIA_LOGIN:{
    if(response){
    new string[128], query[128], passwort[40];
    if(strlen(inputtext)>0){
    mysql_escape_string(inputtext,passwort,sqlHandle);
    format(query, sizeof(query),"SELECT * FROM user WHERE username='%s' AND password='%s'", UserName(playerid), passwort);
    mysql_tquery(sqlHandle,query,"OnPasswordResponse","i",playerid);
    }else{
    format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", UserName(playerid));
    ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_PASSWORD, "Login", string, "Einloggen", "Abbrechen");
    }
    }else{
    SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Login geht es hier nicht weiter. ");
    Kick(playerid);


    }
    return 1;
    }
    }
    return 1;
    }


    public OnUserCheck(playerid)
    {
    new num_rows, num_fields, string[128];
    cache_get_data(num_rows, num_fields, sqlHandle);
    if(num_rows == 0){
    ///Registrierung
    format(string, sizeof(string), "Hallo, %s. Du bist noch nicht registriert, trage dazu dein gewünschtes Passwort ein: ", UserName(playerid));
    ShowPlayerDialog(playerid,DIA_REGISTER,DIALOG_STYLE_INPUT,"Registrierung",string,"Registrieren","Abbrechen");
    }else{
    ///Login
    format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", UserName(playerid));
    ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_PASSWORD, "Login", string, "Einloggen", "Abbrechen");
    }
    return 1;
    }


    public OnUserRegister(playerid)
    {
    UserInfo[playerid][uID] = cache_insert_id(sqlHandle);
    UserInfo[playerid][Registriert] = 1;
    UserInfo[playerid][Eingeloggt] = 1;
    GivePlayerMoney(playerid, 50000);
    SetSpawnInfo( playerid, 0, 101, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0 );
    return 1;
    }


    public OnPasswordResponse(playerid)
    {
    new num_rows, num_fields,string[128];
    cache_get_data(num_rows,num_fields,sqlHandle);
    if(num_rows==1){
    UserInfo[playerid][uID] = cache_get_field_content_int(0,"id",sqlHandle);
    UserInfo[playerid][Eingeloggt] = 1;
    UserInfo[playerid][Level] = cache_get_field_content_int(0,"level",sqlHandle);
    SetPlayerScore(playerid, UserInfo[playerid][Level]);
    UserInfo[playerid][Skin] = cache_get_field_content_int(0,"skin",sqlHandle);
    UserInfo[playerid][Geld] = cache_get_field_content_int(0,"money",sqlHandle);
    SetPlayerMoney(playerid, UserInfo[playerid][Geld]);
    UserInfo[playerid][Adminlevel] = cache_get_field_content_int(0,"adminlevel",sqlHandle);
    UserInfo[playerid][Banned] = cache_get_field_content_int(0,"banned",sqlHandle);
    SetSpawnInfo(playerid, 0, cache_get_field_content_int(0,"skin",sqlHandle),1109.3824,-1796.4907,16.5938, 87.3954 ,0,0,0,0,0,0);
    }else{
    SendClientMessage(playerid, RED, "Das eingegebene Passwort ist falsch!");
    format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", UserName(playerid));
    ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_PASSWORD, "Login", string, "Einloggen", "Abbrechen");
    }
    return 1;
    }


    public SaveUser(playerid)
    {
    if(UserInfo[playerid][Eingeloggt] == 0) return 1;
    ///Speichern
    new query[128];
    format(query, sizeof(query),"UPDATE user SET level='%i', skin='%i', money='%i', adminlevel='%i', banned='%i' WHERE id='%s'", UserInfo[playerid][Level],UserInfo[playerid][Skin],UserInfo[playerid][Geld],UserInfo[playerid][Adminlevel],UserInfo[playerid][Banned],UserInfo[playerid][uID]);
    mysql_tquery(sqlHandle,query,"","");
    return 1;
    }


    public ResetUser(playerid)
    {
    for(new i=0; i<sizeof(UserInfo[]); i++){
    UserInfo[playerid][uInfo:i] = 0;
    }
    return 1;
    }


    Also meiner Meinung nach müsste es kein Unterschied machen, ob es in MySQL oder Dini ist..
    Ich habe auch schon SetSpawnInfo(); unter OnPlayerRequestClass geschrieben. Aber da spawnt der Spieler während dem Login- bzw. Register-Vorgang
    und das will ich eigentlich nicht. Beispiel wie ich es bestmöglichst sein sollte: Register-Dialog taucht auf -> Spieler gibt Passwort ein -> klickt auf "Registrieren" oder drückt Enter
    -> Spieler wird direkt gespawnt. Ohne vorher auf "Spawn" klicken zu müssen. Selbiges auch beim Login-Vorgang.


    Hoffe ihr könnt mir da helfen und sorry für so viel Code..


    Edit: Kann da keiner mal drüberschauen? Ich weiß, ist echt viel Code, aber trotz 2 Tage rumprobieren, komm ich nicht zum gewünschtem Ergebnis. :S


    Mit freundlichen Grüßen
    Ace'X

    Einmal editiert, zuletzt von Ace'X ()

  • Auf Anfrage in PN:


    Das liegt daran, dass in der Zeit, die zwischen absenden des Queries und aufrufen des Callbacks vergeht, der Spieler in die Class Selection gelangt (sind ein paar Millisekunden). Das ist deshalb der Fall, weil der Server nach dem Query-Absenden weiter läuft (was der Sinn dahinter ist, damit es nicht zu Lags kommt).
    Wenn du das umgehen willst, dann kannst du mysql_query verwenden, und direkt danach (ohne Callback) den Cache auslesen, dann wartet der Server die Zeit ab, bis der Cache da ist, und der Spieler sollte nicht gespawnt werden, bevor er sich eingeloggt hat.


    Beispiel: http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_query
    Der zu ändernde Code dürfte bei dir unter OnPlayerConnect stehen.

  • Danke erstmal für deine Mühe.


    Ich enttäusche dich echt ungern, aber ich glaube ich blicke bei MySQL noch nicht so ganz durch.
    Hab jetzt seit deiner Antwort versucht mit Hilfe von Tutorials dass umzuändern, aber leider ohne Erfolg.
    Da ich mit "mysql_tquery" gerarbeitet habe, versteh nicht wie man es mit "mysql_query" macht und das
    ohne einen Callback..


    Will dich auch nicht nach Lösungen fragen, muss es selbst mal lernen. Aber falls ich Probleme habe, komme ich auf diesen Thread
    darauf zurück.


    mfg
    Ace'X

  • Ernsthaft..? Wenn du wüsstest wie kompliziert ich gedacht hab.. :D
    Naja, hat super geklappt. Danke dir.
    Nur jetzt muss ich ja alle mysql_tquery's ändern, oder?
    Weil wenn ich zum Beispiel beim Login das falsche Passwort eingebe, dann spawn ich trotzdem und ich werde erneut aufgefordert, das Passwort einzugeben. Aber man spawnt halt schon, wie gesagt.


    Ich überlege da echt wieder auf Dini umzusteigen..


    mfg
    Ace'X

  • Klappt super. :)
    Danke. Doch noch etwas komisches..


    Wenn ich bei der Tabelle bei "id" auto-increment aktiviere dann wird der Spieler aus irgendeinem Grund nicht gespeichert.
    Aber wenn auto-increment deaktiviert ist, dann schon.


    Hier mal die Save Funktion:

    public SaveUser(playerid)
    {
    if(UserInfo[playerid][Eingeloggt] == 0) return 1;
    ///Speichern
    new query[128];
    format(query, sizeof(query),"UPDATE user SET level='%i', skin='%i', money='%i', adminlevel='%i', banned='%i' WHERE id='%i'", UserInfo[playerid][Level],UserInfo[playerid][Skin],UserInfo[playerid][Geld],UserInfo[playerid][Adminlevel],UserInfo[playerid][Banned],UserInfo[playerid][uID]);
    mysql_tquery(sqlHandle,query, "", "");
    return 1;
    }




    mfg
    Ace'X

  • Hab ich schon drin. :S



    mysql_escape_string(inputtext, passwort, sqlHandle);
    format(query, sizeof(query), "INSERT INTO user (username, password) VALUES ('%s','%s')",UserName(playerid), passwort);
    mysql_tquery(sqlHandle,query);
    UserInfo[playerid][uID] = cache_insert_id(sqlHandle);
    UserInfo[playerid][FirstTime] = 1;
    UserInfo[playerid][Eingeloggt] = 1;
    GivePlayerMoney(playerid, 50000);
    UserInfo[playerid][Geld] = 50000;
    SetPlayerSkin(playerid, 101);
    UserInfo[playerid][Skin] = 101;


    mfg
    Ace'X

  • Sollte eigentlich "mysql_query" sein..
    Wenn ich es mit einem Callback mache, habe ich ja wieder das Anfangsproblem.
    Aber mit mysql_query funktioniert es super.


    Vielen vielen Dank. :D
    Dann können wir endlich das Thema beenden.


    mfg
    Ace'X