Beiträge von Jeffry

    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.

    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"?

    Entweder wie oben gesagt mit der Variable, oder, wenn dir das zu umständlich ist mit der ganzen Zurücksetzerei würde es auch so gehen:


    new world = 99, inside;
    CHECKAGAIN:
    world++;
    inside = 0;
    for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerConnected(i) && GetPlayerVirtualWorld(i) == world) inside++;
    if(inside >= 10) goto CHECKAGAIN;
    SetPlayerVirtualWorld(playerid, world);


    Würde ab Welt 100 anfangen zu prüfen.

    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!");
    }

    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!");
    }

    Laut deinem obigen Befehl müsste es so aussehen:
    ocmd:wettkampf(playerid)
    {
    if((((dini_Int(Spieler,"wettkampfsperre")-gettime())/60) +1) >=1)return SendClientMessage(playerid,ROT,"Du hast noch eine Wettkampfsperre. Weitere Informationen unter /wettkampfinfo.");
    SetPlayerInterior(playerid,6);
    SetPlayerPos(playerid,346.870025,309.259033,999.155700);
    return 1;
    }

    Ok. Da ich nicht alle dieser Includes habe mache folgendes:
    Öffne alle Includes und suche in jeder Include nach "hooked". Die Includes in denen du etwas dazu findest postest du hier als Anhang, dann schaue ich es mir an indem ich es selbst kompiliere.

    Setze mal einen print vor:
    new name[MAX_PLAYER_NAME];


    und schau ob der überhaupt kommt:
    print("SavePlayer aufgerufen");


    Wenn der print kommt, dann schalte mysql_log auf LOG_ALL an und schau nach was im mysql_log geprintet wird, wenn du den Befehl eingibst.

    Ok, dann hätten wir schonmal eine Nähe. Ändere
    printf("vor string");
    Zu
    printf("vor string: Frak %d / Rang %d", Spieler[playerid][pFraktion], Spieler[playerid][pRank]);


    Wie sieht der Print dann aus?
    Falls Frak negativ ist, solltest du das in dem stock abfangen. Falls nicht, wie hast du fRang deklariert?

    Ok, entferne auf jeden Fall mal das "return 1" nach SendClientMessage, das gehört da nicht hin. Wobei das nicht der Grund für die Fehlermeldung sein sollte, dass der Befehl nicht existiert, aber dann bekommt jeder die Nachricht.


    Wenn das Problem mit der "Befehl existiert nicht" Meldung noch besteht, debugge den Code so:
    CMD:department(playerid, params[])
    {
    printf("playerid: %d, logged: %d", playerid, IsLoggedIn(playerid));
    if(!IsLoggedIn(playerid))return 1;
    new text[96], string[128];
    if(sscanf(params, "s[96]", text))return SendClientMessage(playerid, COLOR_GREY, "** Benutze (/d)epartment [Nachricht]");
    printf("Spieler: %d", sizeof(Spieler));
    printf("Fraktion: %d", Spieler[playerid][pFraktion]);
    if(!(Spieler[playerid][pFraktion] == 1 || Spieler[playerid][pFraktion] == 3))return SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Beamter.");
    printf("vor string");
    format(string, sizeof(string), "** %s %s: %s, over **", GetRankName(Spieler[playerid][pFraktion], Spieler[playerid][pRank]), GetName(playerid), text);
    printf("string: %s", string);
    for(new i=0;i<GetMaxPlayers();i++)
    {
    printf("Schleife: %d", i);
    if(IsPlayerConnected(i))
    {
    if(Spieler[i][pFraktion] == 1 || Spieler[i][pFraktion] == 3)
    {
    printf("Sende Nachricht");
    SendClientMessage(i, COLOR_DEPARTMENT, string);
    }
    }
    }
    return 1;
    }


    Dann poste was im Log steht.