Gutschein System

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 Abend, ich glaub ich habe irgendwo einen Denkfehler.. Wenn ich mir einen Gutschein kaufe, wird ein Code generiert und auch in die Datenbank gespeichert, alles problemlos, aber wenn ich den Gutschein Code dann nutzen möchte, bekomme ich die Nachricht, das der Code nicht existiert - kann mir da vielleicht jemand helfen?


    #define DIALOG_GUTSCHEIN 499


    #define MAX_GUTSCHEINE 500
    enum GutscheinSystem
    {
    gID,
    gOwner[24],
    gCode,
    gUsed,
    gUsedBy[24],
    gAktion
    }
    new Gutschein[MAX_GUTSCHEINE][GutscheinSystem];


    ocmd:usegutschein(playerid, params[])
    {
    new gutscheinid, string[256];
    if(sscanf(params, "d", gutscheinid)) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Benutze: /usegutschein [GutscheinCode]");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(gutscheinid != Gutschein[g][gCode]) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code existiert nicht!");
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    self_mysql_query(string);
    }
    return 1;
    }


    Vielen Dank im voraus und Liebe Grüße! :)

  • Das liegt daran, dass du schon beim ersten Durchlauf aus der Schleife fliegst, wenn die ID nicht dem Gutschein 0 entspricht.
    Schreibe es so:
    ocmd:usegutschein(playerid, params[])
    {
    new gutscheinid, string[256];
    if(sscanf(params, "d", gutscheinid)) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Benutze: /usegutschein [GutscheinCode]");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(gutscheinid != Gutschein[g][gCode]) continue;
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    self_mysql_query(string);
    return 1;
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code existiert nicht!");
    }


  • Gibt leider weiterhin die Nachricht das der Code nicht existiert :/

  • Lass es mal so laufen und poste dann was im Log steht, wenn du den Befehl eingibst:
    ocmd:usegutschein(playerid, params[])
    {
    new gutscheinid, string[256];
    if(sscanf(params, "d", gutscheinid)) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Benutze: /usegutschein [GutscheinCode]");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    printf("g: %d | gutscheinid: %d == %d gCode", g, gutscheinid, Gutschein[g][gCode]);
    if(gutscheinid != Gutschein[g][gCode]) continue;
    printf("passt");
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    self_mysql_query(string);
    return 1;
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code existiert nicht!");
    }



  • Liegt aufjedenfall an MAX_GUTSCHEINE, läuft 500x


    am ende sieht eigentlich alles so aus:


    Code
    g: 499 | gutscheinid: 375567 == 0 gCode
  • Wenn alle gCode's 0 sind (sind wirklich alle 500 auf 0?), dann hast du dem "Gutschein[g][gCode]" keinen Wert zugewiesen.
    Wo gibst du dieser Variable denn einen Wert, also wo gibst du "Gutschein[g][gCode]" den Wert "375567"?


    Ja sind alle 500 auf 0. Ich erstelle einen Gutschein mit /buygutschein, dort wird dann ein Code per random(999999) in die Datenbank gespeichert und der /usegutschein Befehl soll ja eigentlich alle Gutscheine (Gutschein[g][gCode]) durchgehen und den eingegebenen Code überprüfen ob er existiert.

  • Poste bitte mal diesen Befehl, wahrscheinlich klappt deine Zuweisung nicht. ;)


    if(dialogid == DIALOG_GUTSCHEIN) // Gutscheinsystem
    {
    if(response)
    {
    if(listitem == 0) // Namenschange
    {
    new rand = random(999999);
    format(string, sizeof(string), "Du hast ein Gutschen für eine Namensänderung gekauft - der Gutscheincode ist: %d", rand);
    SendClientMessage(playerid, COLOR_YELLOW, string);
    SendClientMessage(playerid, COLOR_WHITE, "Wichtig: Schreibe dir diesen Code auf, falls du ihn an einen Spieler weiter geben möchtest.");
    format(string, sizeof(string), "INSERT INTO `gutscheine` (`gOwner`, `gCode`, `gUsed`, `gAktion`) VALUES ('%s', '%d', '0', '1')", SpielerName(playerid), rand);
    self_mysql_query(string);
    }
    }
    }

    Einmal editiert, zuletzt von varrez ()

  • Du weist der Variable den Wert nicht zu.


    if(dialogid == DIALOG_GUTSCHEIN) // Gutscheinsystem
    {
    if(response)
    {
    if(listitem == 0) // Namenschange
    {
    new rand = random(999998)+1;
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(Gutschein[g][gCode] == 0)
    {
    Gutschein[g][gCode] = rand;
    break;
    }
    }
    format(string, sizeof(string), "Du hast ein Gutschen für eine Namensänderung gekauft - der Gutscheincode ist: %d", rand);
    SendClientMessage(playerid, COLOR_YELLOW, string);
    SendClientMessage(playerid, COLOR_WHITE, "Wichtig: Schreibe dir diesen Code auf, falls du ihn an einen Spieler weiter geben möchtest.");
    format(string, sizeof(string), "INSERT INTO `gutscheine` (`gOwner`, `gCode`, `gUsed`, `gAktion`) VALUES ('%s', '%d', '0', '1')", SpielerName(playerid), rand);
    self_mysql_query(string);
    }
    }
    }


    Dann geht es.


    ABER:
    Mit INSERT INTO musst du aufpassen. Wenn du einen Gutschein wieder löschst, und du AUTO_INCREMENT eingestellt hast, dann stimmen die g's (Index) nicht mehr mit der ID in der Datenbank überein.
    Es wäre sinnvoller, 500 Zeilen in der Tabelle anzulegen (manuell, das geht ja über die SQL-Eingabe) und dann mit UPDATE zu arbeiten.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Jetzt funktionierts, aber wenn ich einen Gutschein Aktiviere, werden in der Datenbank alle auf Used = 1 gesellt ?(


    ocmd:usegutschein(playerid, params[])
    {
    new gutscheinid, string[256];
    if(sscanf(params, "d", gutscheinid)) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Benutze: /usegutschein [GutscheinCode]");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(gutscheinid != Gutschein[g][gCode]) continue;
    format(string, sizeof(string), "Gutschein Aktiviert - von %s", SpielerName(playerid));
    SendClientMessage(playerid, COLOR_WHITE, string);
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    self_mysql_query(string);
    return 1;
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code existiert nicht!");
    }

  • format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    zu:
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s' WHERE gCode = '%d'", SpielerName(playerid),Gutschein[g][gCode]);

  • format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    zu:
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s' WHERE gCode = '%d'", SpielerName(playerid),Gutschein[g][gCode]);

    Super, danke dir für deine Zeit und deine Hilfe - klappt wunderbar! :)
    Jetzt nur noch eine Abfrage, wenn der Code bereits genutzt wurde, das es nicht geht - ich hab echt keinen Durchblick heute :D
    Sollte doch eig so funktionieren ?(
    if(gutscheinid == Gutschein[g][gCode] && Gutschein[g][gUsed] == 1) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code wurde bereits aktiviert.");

  • Kannst du einfach so machen:
    ocmd:usegutschein(playerid, params[])
    {
    new gutscheinid, string[256];
    if(sscanf(params, "d", gutscheinid)) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Benutze: /usegutschein [GutscheinCode]");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(gutscheinid != Gutschein[g][gCode]) continue;
    if(Gutschein[g][gUsed] == 1) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code wurde bereits aktiviert.");
    Gutschein[g][gUsed] = 1;
    format(string, sizeof(string), "Gutschein Aktiviert - von %s", SpielerName(playerid));
    SendClientMessage(playerid, COLOR_WHITE, string);
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s'", SpielerName(playerid));
    self_mysql_query(string);
    return 1;
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code existiert nicht!");
    }

  • Nächstes Problem wäre das er mit nachfolgendem Code, manchmal gUsed, sowie gUsedBy speichert, manchmal aber auch einfach nicht.


    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(strcmp(PlayerInfo[playerid][pOldName], "Niemand", true) == 0) return strmid(PlayerInfo[playerid][pOldName], giveplayer, 0, strlen(giveplayer), 255);
    Gutschein[g][gUsed] = 1;
    SetPlayerName(playerid, inputtext);
    format(string, sizeof(string), "Du hast deinen Namen von %s auf %s geändert.", giveplayer, SpielerName(playerid));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    SendClientMessage(playerid, COLOR_WHITE, "Wichtig: Ändere nach dem Logout deinen Namen im Multiplayer Clienten zu deinem neuen Namen.");
    format(string, sizeof(string), "UPDATE `users` SET `Name`='%s' WHERE `Name`='%s'", SpielerName(playerid), giveplayer);
    self_mysql_query(string);
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s' WHERE gCode = '%d'", SpielerName(playerid), Gutschein[g][gCode]);
    self_mysql_query(string);
    return 1;
    }


    Vielleicht eine Idee?


    Gruß :)

  • In welchem Zusammenhang greifst du denn auf den Gutschein zu?
    Du startest zwar die Schleife, aber die endet in jedem Fall im ersten Durchlauf, es findest keine Prüfung auf irgendwas statt.


    Dem Code fehlt der Zusammenhang zum restlichen System, deshalb geht es nicht. Den Zusammenhang kann ich dir auch nicht herstellen, da ich nicht weiß was du vor hast.
    Poste mal den Codezusammenhang (von Anfang der Prozedur (Befehl?) bis hierhin.

  • In welchem Zusammenhang greifst du denn auf den Gutschein zu?
    Du startest zwar die Schleife, aber die endet in jedem Fall im ersten Durchlauf, es findest keine Prüfung auf irgendwas statt.


    Dem Code fehlt der Zusammenhang zum restlichen System, deshalb geht es nicht. Den Zusammenhang kann ich dir auch nicht herstellen, da ich nicht weiß was du vor hast.
    Poste mal den Codezusammenhang (von Anfang der Prozedur (Befehl?) bis hierhin.


    Dialog wird aufgerufen (INPUT):


    if(dialogid == DIALOG_GNAMECHANGE)
    {
    if(strlen(inputtext) > 24) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Der Name darf nicht mehr als 24 Zeichen und nur Zeichen von A-Z, 0-9 besitzen!");
    if(mysql_CheckAccount(inputtext) == 1) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Der Name ist bereits in der Datenbank vorhanden!");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(strcmp(PlayerInfo[playerid][pOldName], "Niemand", true) == 0) return strmid(PlayerInfo[playerid][pOldName], giveplayer, 0, strlen(giveplayer), 255);
    Gutschein[g][gUsed] = 1;
    SetPlayerName(playerid, inputtext);
    format(string, sizeof(string), "Du hast deinen Namen von %s auf %s geändert.", giveplayer, SpielerName(playerid));
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    SendClientMessage(playerid, COLOR_WHITE, "Wichtig: Ändere nach dem Logout deinen Namen im Multiplayer Clienten zu deinem neuen Namen.");
    format(string, sizeof(string), "UPDATE `users` SET `Name`='%s' WHERE `Name`='%s'", SpielerName(playerid), giveplayer);
    self_mysql_query(string);
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s' WHERE gCode = '%d'", SpielerName(playerid), Gutschein[g][gCode]);
    self_mysql_query(string);
    return 1;
    }
    }

  • Schon klar, aber wie kommst du zu dem Dialog. Der Teil fehlt.
    Ich muss wissen wie du das machst, sonst kann ich es dir nicht verbinden.



    ocmd:usegutschein(playerid, params[])
    {
    new gutscheinid, string[256];
    if(sscanf(params, "d", gutscheinid)) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Benutze: /usegutschein [GutscheinCode]");
    for(new g = 0; g <MAX_GUTSCHEINE; g++)
    {
    if(gutscheinid != Gutschein[g][gCode]) continue;
    if(Gutschein[g][gUsed] == 1) return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code wurde bereits aktiviert.");
    if(Gutschein[g][gAktion] == 1)
    {
    ShowPlayerDialog(playerid, DIALOG_GNAMECHANGE, DIALOG_STYLE_INPUT, "Gutschein einlösen: Namenschange", "Bitte gib deinen neuen Wunschnamen ein:", "Change", "Abbrechen");
    /*Gutschein[g][gUsed] = 1;
    SendClientMessage(playerid, COLOR_WHITE, "Namensänderung");
    format(string, sizeof(string), "UPDATE `gutscheine` SET `gUsed` = '1', `gUsedBy` = '%s' WHERE gCode = '%d'", SpielerName(playerid), Gutschein[g][gCode]);
    self_mysql_query(string);*/
    }
    return 1;
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Dieser Code existiert nicht!");
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen