[Mysql] Timeban Problem

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


    Ich arbeite gerade an meinem Timeban-System doch leider geht es nicht ganz... in der Datenbank enstehen zwar Einträge aber beim Login, kann ich mich trozdem einloggen obwohl ich "gebannt" bin.


    Datenbank:



    Datenbank Struktur:



    Die Codes:

    stock TBan(playerid,const string[],dauer,bannerid)
    {
    new sing[800];
    new timestamp;
    timestamp = gettime();
    new sekunden = dauer * 60;
    timestamp += sekunden;
    new name[MAX_PLAYER_NAME],bannername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    GetPlayerName(bannerid,bannername,sizeof(bannername));
    format(sing,sizeof(sing),"* %s wurde von %s %s für %d Minuten gebannt.",name,bannername,dauer);
    SendClientMessageToAll(C_Error,sing);
    format(str,sizeof(sing),"Grund: %s",string);
    SendClientMessageToAll(C_Error,sing);
    Kick(playerid);
    new query[900];
    format(query,sizeof(query),"INSERT INTO TimeBan (Name,Datum) VALUES ('%s','%d')",name,timestamp);
    mysql_function_query(dbhandle,query,false,"","");
    return 1;
    }


    ocmd:tban(playerid,params[])
    {
    if(!isAdmin(playerid,2))return SendClientMessage(playerid,C_Error,"Du hast keine Berechtigung für diesen Befehl!");
    new pID,grund[64],dauer;
    if(sscanf(params, "usi", pID, grund,dauer))return SendClientMessage(playerid, 0xFF004BFF, "/tban [ID] [Grund] [Dauer(in min.)]");
    TBan(pID,grund,dauer,playerid);
    return 1;
    }


    // Das ist kurz vor dem Login Dialog:


    new timestamp = gettime();

    new mysqlquery[700];
    format(mysqlquery, sizeof(mysqlquery), "SELECT Datum FROM TimeBan WHERE Name = '%s'",getPlayerName(playerid));
    new bisgebannt = mysql_function_query(dbhandle,mysqlquery,false,"","");


    if(timestamp < bisgebannt)
    {
    new differenz = bisgebannt - timestamp;
    new minuten = differenz / 60;
    new string[64];
    format(string,sizeof(string),"Du bist noch %i Minuten gebannt!",minuten);
    SendClientMessage(playerid,0xFAFAFAFF,string);
    Kick(playerid);
    }


    Ich hoffe es kann mir jemand helfen :D


    MfG German_ScripterHD


    .


    Mit freundlichen Grüßen
    German_ScripterHD

  • mysql_function_query gibt dir den Timestamp nicht zurück.
    Du musst mit mysql_function_query ein Callback aufrufen lassen, zum Beispiel OnPlayerTimeBan, und darin dann den cache des Feldes für die Zeit auslesen. Danach musst du in diesem Callback die Abfrage setzen und auch dort drinnen den Login Dialog anzeigen lassen, falls der Spieler nicht gebannt ist.

  • new bisgebannt = mysql_function_query(dbhandle,mysqlquery,false,"","");
    zu:
    mysql_function_query(dbhandle,mysqlquery,false,"OnPlayerTimeBanCheck","d", playerid);


    Und das hier ganz unten im Gamemode:
    forward OnPlayerTimeBanCheck(playerid);
    public OnPlayerTimeBanCheck(playerid)
    {
    new rows = cache_num_rows(), bisgebannt;
    if(rows > 0)
    {
    bisgebannt = cache_get_row_int(0, 0, dbhandle);
    }
    if(gettime() < bisgebannt)
    {
    new differenz = bisgebannt - timestamp;
    new minuten = differenz / 60;
    new string[64];
    format(string,sizeof(string),"Du bist noch %i Minuten gebannt!",minuten);
    SendClientMessage(playerid,0xFAFAFAFF,string);
    Kick(playerid);
    }
    else
    {
    //Login Dialog hier anzeigen
    }
    return 1;
    }


    Die Abfrage nach dem mysql_function_query entfernst du natürlich, das steht ja jetzt in OnPlayerTimeBanCheck drin, dort zeigst du von nun an auch den Login Dialog an.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()