TBan 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
  • Moin Leute,


    ich sollte jetzt einen neuen Thread aufmachen , da es jetzt ein größere Thread wird/ist. Eine kleine Beschreibung: Ich möchte ein TBAN system schreiben. Jedoch komm ich nicht mit einiegen Warnings klar!
    Nochmal vorab: Ich möchte , wenn ein Spieler tban ist, dass er in die neue Datenbank eingetragen wird. Also ein neue SpielerDatei erstellt. Wo der Name.... steht etc... . Ich poste euch einfach mal den Code:



    enum SpielerTimeBanned
    {
    pNameTBan[MAX_PLAYER_NAME],
    pTBanIP,
    pTBanGrund,
    pvonAdmin,
    pTBanDauer
    }



    ocmd:timeban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID, aname[MAX_PLAYERS],spieler[MAX_PLAYERS],grund[128],dauer,string[128];
    if(sscanf(params,"uds[128]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /Timeban [Name/ID][Dauer][Grund]");
    //if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit der angegebenen ID ist Online");
    {
    format(string,sizeof(string),"[INFO]{00CDFF} %s %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minuten {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",GetPlayerAdminRankName(playerid),aname,spieler,dauer,grund);
    SendClientMessageToAll(0xFF0000FF,string);
    new zeitdauer = Now() + dauer*60;
    CreateTBanAccount(pID);
    Kick(pID);
    }
    }
    return 1;
    }



    stock mktime(hour,minute,second,day,month,year)
    {
    new timestamp2;


    timestamp2 = second + (minute * 60) + (hour * 3600);


    new days_of_month[12];


    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) {
    days_of_month = {31,29,31,30,31,30,31,31,30,31,30,31}; // Schaltjahr
    } else {
    days_of_month = {31,28,31,30,31,30,31,31,30,31,30,31}; // keins
    }
    new days_this_year = 0;
    days_this_year = day;
    if(month > 1) { // No January Calculation, because its always the 0 past months
    for(new i=0; i<month-1;i++) {
    days_this_year += days_of_month[i];
    }
    }
    timestamp2 += days_this_year * 86400;


    for(new j=1970;j<year;j++) {
    timestamp2 += 31536000;
    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) timestamp2 += 86400; // Schaltjahr + 1 Tag
    }


    return timestamp2;
    }


    stock Now()
    {
    new hour,minute,second,year,month,day;
    gettime(hour, minute, second);
    getdate(year, month, day);
    return mktime(hour,minute,second,day,month,year);
    }



    stock CreateTBanAccount(pID)//pass[]
    {
    new query[256],Name[MAX_PLAYER_NAME];
    GetPlayerName(pID,Name, MAX_PLAYER_NAME);
    format(query, sizeof(query), "INSERT INTO `SpielerTimeBanned` (`Name`, `IP`, `TBanGrund`, `vonAdmin`, `Dauer`) VALUES ('%s', '%s', '%s', '%s','%d')", pNameTBan, pTBanIP, pTBanGrund, pvonAdmin, pTBanDauer);// HIER SIND WARNINGS
    mysql_query(query);
    printf("[S-INFO] %s wurde von %s für %d verbannt. Grund: %s",pNameTBan,pvonAdmin,pTBanDauer,pTBanGrund); //UND HIER INSGESAMT 10 Warnings!
    return 1;
    }[/i]


    Mehr habe ich incht! Könnte mir evlt. einer verraten wie dass mit den Variabeln geht? (BITTE KEINE SEITEN SICKEN... :))


    mFG

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • Beitrag von Nexor ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • war schon lange nichtmehr an nem script dran aber ich bin mir ziemlich sicher das man zu einem Enum noch eine variable hinzufügen muss


    enum SpielerTimeBanned
    {
    pNameTBan[MAX_PLAYER_NAME],
    pTBanIP,
    pTBanGrund,
    pvonAdmin,
    pTBanDauer
    }


    new tBan[MAX_PLAYERS][SpielerTimeBanned];


    hätten wir geschafft und dann musst du unten das machen


    printf("[S-INFO] %s wurde von %s für %d verbannt. Grund: %s",tBan[pID][pNameTBan], tBan[pID][pvonAdmin], tBan[pID][pTBanDauer], tBan[pID][pTBanGrund]); //UND HIER INSGESAMT 10 Warnings!


    jetzt dürften schon weniger warnings kommen

  • Habe das andere auch so geändert nur noch ein Warning, steht unten!



    ocmd:timeban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID, aname[MAX_PLAYERS],spieler[MAX_PLAYERS],grund[128],dauer,string[128];
    if(sscanf(params,"uds[128]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /Timeban [Name/ID][Dauer][Grund]");
    //if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit der angegebenen ID ist Online");
    {
    format(string,sizeof(string),"[INFO]{00CDFF} %s %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minuten {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",GetPlayerAdminRankName(playerid),aname,spieler,dauer,grund);
    SendClientMessageToAll(0xFF0000FF,string);
    new zeitdauer = Now() + dauer*60;//warning: warning 204: symbol is assigned a value that is never used: "zeitdauer"
    CreateTBanAccount(pID);
    Kick(pID);
    }
    }


    Mit freundlichen Grüßen
    [KoSoVa] :klugs:


  • Alles klar, der Fehler heißt einfach das die variable "zeitdauer" nur erstellt evtl. befüllt wurde aber nirgends verwendet wird, das werden wir nun ändern. Du musst ja dein Enum auch noch befüllen.



    GetPlayerName(pID,tBan[pID][pNameTBan],sizeof(tBan[pID][pNameTBan]));
    tBan[pID][pvonAdmin] = playerid;
    tBan[pID][pTBanDauer] = zeitdauer;
    tBan[pID][pTBanGrund] = grund;

    das einfach über "CreateTBanAccount(pID);
    und unter new zeitdauer = Now() + dauer*60;


    Dürfte funktionieren


    /edit: Du musst schauen was du abspeichern willst, du hast oben im enum "pvonAdmin" als integer deklariert also musst du die id von dem Admin abspeichern, bei pNameTBan allerdings den Namen also ein string. Ich würde es einheitlich machen und das immer mit den ids musst du aber wissen, wenn du es mit den ids machst musst du halt vorher noch den Namen herrausfinden fillst (z.b. bei printf()) da wolltest du das der Name von dem Admin dort steht (%s) allerdings ist die Variable die dafür eingesetzt wird wie oben erwähnt ein integer somit wird es da zu fehlern kommen. Ich würde dir Raten um das ständinge new pName[MAX_PLAYER_NAME] GetPlayerName etc. zu vermeiden (ist denk ich auch auf dauer ressourcen sparend) eine Funktion zu erstellen.



    stock getPlayerName(playerid)
    {
    new pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pName,sizeof(pName));
    return pName;
    }

    Einmal editiert, zuletzt von Nexor ()

  • Leider nein bekomme errors :/



    ocmd:timeban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID, aname[MAX_PLAYERS],spieler[MAX_PLAYERS],grund[128],dauer,string[128];
    if(sscanf(params,"uds[128]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /TimeBan [Name/ID][Dauer][Grund]");
    //if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit der angegebenen ID ist Online");
    {
    format(string,sizeof(string),"[INFO]{00CDFF} %s %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minuten {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",GetPlayerAdminRankName(playerid),aname,spieler,dauer,grund);
    SendClientMessageToAll(0xFF0000FF,string);
    new zeitdauer = Now() + dauer*60;
    GetPlayerName(pID,SpielerTimeBan[pID][pNameTBan],sizeof(SpielerTimeBan[pID][pNameTBan]));//Alle errors sind hier?
    SpielerTimeBan[pID][pvonAdmin] = playerid;
    SpielerTimeBan[pID][pTBanDauer] = zeitdauer;
    SpielerTimeBan[pID][pTBanGrund] = grund;
    CreateTBanAccount(pID);
    Kick(pID);
    }
    }
    return 1;
    }


    error 001: expected token: "]", but found "-identifier-"
    warning 215: expression has no effect
    error 001: expected token: ";", but found "]"
    error 029: invalid expression, assumed zero
    fatal error 107: too many error messages on one line

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • GetPlayerName(pID,SpielerTimeBan[pID][pNameTBan],sizeof(SpielerTimeBan[pID][pNameTBan]));//Alle errors sind hier?
    muss doch so sein?!
    GetPlayerName(deinespielerid,sizeof(SpielerTimeBan[pID][pNameTBan]),SpielerTimeBan[pID][pNameTBan]);


    schau mal ob es so geht

  • upsala :D also zu Silbermond: ich weiß nicht wie rum die Parameter sind wie gesagt ich hab mich schon lange nichtmehr damit beschäftigt und wenn ichs mach dann mit meiner eingenen Funktion.


    /edit:


    hab mal nachgelesen
    http://wiki.sa-mp.com/wiki/GetPlayerName


    (playerid, const name[], len)
    also id, die variable in die es gespeichert werden soll, die länge der variable.


    Einen Fehler im Code finde ich so jetzt nicht. Also ich finde das die Zeile korrekt ist.

  • also GetPlayerName(deineid,sizeof(indergrössevon),speichervariable);


    nein genau nicht so. Les dir http://wiki.sa-mp.com/wiki/GetPlayerName durch.


    und hier das beispielscript dazu


    public OnPlayerConnect(playerid)
    {
    // Get the name of the player that connected and display a join message to other players

    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));

    format(string, sizeof(string), "%s has joined the server.", name);
    SendClientMessageToAll(0xC4C4C4FF, string);

    return 1;
    }


    Hier kannst du sehen das es nicht id, sizeof, variable ist.

  • hä? :D


    Habe es jetzt so:



    ocmd:timeban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID, aname[MAX_PLAYERS],spieler[MAX_PLAYERS],grund[128],dauer,string[128];
    GetPlayerName(playerid,aname,sizeof(aname));
    GetPlayerName(pID,spieler,sizeof(spieler));
    if(sscanf(params,"uds[128]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /TimeBan [Name/ID][Dauer][Grund]");
    //if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit der angegebenen ID ist Online");
    {
    format(string,sizeof(string),"[INFO]{00CDFF} %s %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minuten {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",GetPlayerAdminRankName(playerid),aname,spieler,dauer,grund);
    SendClientMessageToAll(0xFF0000FF,string);
    new zeitdauer = Now() + dauer*60;
    GetPlayerName(pID,SpielerTimeBan[pID][pNameTBan],sizeof(SpielerTimeBan[pID][pNameTBan]));//ERRORS
    SpielerTimeBan[pID][pvonAdmin] = playerid;
    SpielerTimeBan[pID][pTBanDauer] = zeitdauer;
    SpielerTimeBan[pID][pTBanGrund] = grund;
    CreateTBanAccount(pID);
    Kick(pID);
    }
    }
    return 1;
    }


    Und bekomme diese Errors:
    [PHP]
    error 001: expected token: "]", but found "-identifier-"
    warning 215: expression has no effecterror 001:
    expected token: ";", but found "]"error 029: invalid expression, assumed zerofatal
    error 107: too many error messages on one line
    [/PHP]

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

    3 Mal editiert, zuletzt von [GeD]Max ()


  • versuchs mal so



    new Name[MAX_PLAYER_NAME];
    GetPlayerName(pID, Name, sizeof(Name));//ERRORS
    format(SpielerTimeBan[pID][pNameTBan], sizeof(SpielerTimeBan[pID][pNameTBan]), "%s", Name);

  • Leider nein.. bleibt gleich:



    ocmd:timeban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID, aname[MAX_PLAYERS],spieler[MAX_PLAYERS],Name[MAX_PLAYERS],grund[128],dauer,string[128];
    GetPlayerName(playerid,aname,sizeof(aname));
    GetPlayerName(pID,spieler,sizeof(spieler));
    GetPlayerName(pID, Name, sizeof(Name));
    if(sscanf(params,"uds[128]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /TimeBan [Name/ID][Dauer][Grund]");
    //if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit der angegebenen ID ist Online");
    {
    format(string,sizeof(string),"[INFO]{00CDFF} %s %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minuten {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",GetPlayerAdminRankName(playerid),aname,spieler,dauer,grund);
    SendClientMessageToAll(0xFF0000FF,string);
    format(SpielerTimeBan[pID][pNameTBan], sizeof(SpielerTimeBan[pID][pNameTBan]), "%s", Name);
    new zeitdauer = Now() + dauer*60;
    SpielerTimeBan[pID][pvonAdmin] = playerid;
    SpielerTimeBan[pID][pTBanDauer] = zeitdauer;
    SpielerTimeBan[pID][pTBanGrund] = grund;
    CreateTBanAccount(pID);
    Kick(pID);
    }
    }
    return 1;
    }

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • Okay dann bin ich jetzt echt Ratlos :D wie gesagt hab mich damit schon länger nichtmehr beschäftigt :D speicher einfach dort auch die Playerid rein so wie beim Admin und dann frag dort wo du den Namen brauchst einfach den Namen ab und fertig :D

  • enum SpielerTimeBanned
    {
    pNameTBan[MAX_PLAYER_NAME],
    pTBanIP[16],
    pTBanGrund[32],
    pvonAdmin[MAX_PLAYER_NAME],
    pTBanDauer
    }
    new SpielerTimeBan[MAX_PLAYERS][SpielerTimeBanned];


    ocmd:timeban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID, aname[MAX_PLAYERS],spieler[MAX_PLAYERS],grund[32],dauer,string[128];
    if(sscanf(params,"uds[32]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /Timeban [Name/ID][Dauer][Grund]");
    //if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit der angegebenen ID ist Online");
    {
    GetPlayerName(playerid, SpielerTimeBan[pID][pvonAdmin], MAX_PLAYER_NAME);
    GetPlayerName(pID, SpielerTimeBan[pID][pNameTBan], MAX_PLAYER_NAME);
    format(string,sizeof(string),"[INFO]{00CDFF} %s %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minuten {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",GetPlayerAdminRankName(playerid),SpielerTimeBan[pID][pvonAdmin],SpielerTimeBan[pID][pNameTBan],dauer,grund);
    SendClientMessageToAll(0xFF0000FF,string);
    SpielerTimeBan[pID][pTBanDauer] = Now() + dauer*60;
    GetPlayerIp(pID, SpielerTimeBan[pID][pTBanIP], 16);
    SpielerTimeBan[pID][pTBanGrund] = grund;
    CreateTBanAccount(pID);
    Kick(pID);
    }
    }
    return 1;
    }


    stock CreateTBanAccount(pID)//pass[]
    {
    new query[256],Name[MAX_PLAYER_NAME];
    GetPlayerName(pID,Name, MAX_PLAYER_NAME);
    format(query, sizeof(query), "INSERT INTO `SpielerTimeBanned` (`Name`, `IP`, `TBanGrund`, `vonAdmin`, `Dauer`) VALUES ('%s', '%s', '%s', '%s','%d')", SpielerTimeBan[pID][pNameTBan], SpielerTimeBan[pID][pTBanIP], SpielerTimeBan[pID][pTBanGrund], SpielerTimeBan[pID][pvonAdmin], SpielerTimeBan[pID][pTBanDauer]);
    mysql_query(query);
    printf("[S-INFO] %s wurde von %s für %d verbannt. Grund: %s",SpielerTimeBan[pID][pNameTBan],SpielerTimeBan[pID][pvonAdmin],SpielerTimeBan[pID][pTBanDauer],SpielerTimeBan[pID][pTBanGrund]);
    return 1;
    }


    Versuch es mal so.

  • Danke dir! <3 Jetzt fehlt nur noch das Check system.. Also dass wenn es runter gezähält wurde , dass der Account gelöscht wurde! Und wie mache ich dass , wenn selbst der Server Offline ist , dass der Time noch bis der angegeben zeit bisdahin trozdem entbannt ist? -> Und wieso geht mein UnBan fehl nicht?




    ocmd:unban(playerid,params[])
    {
    if(SpielerInfo[playerid][pAlevel] >= 1)
    {
    new pID,string[256],aname[MAX_PLAYERS],spieler[MAX_PLAYERS],unbanname[MAX_PLAYER_NAME],query[256];
    GetPlayerName(playerid,aname,sizeof(aname));
    GetPlayerName(pID,spieler,sizeof(spieler));
    if(sscanf(params,"s[24]",unbanname)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /UnBan [Name]");
    if(mysql_CheckTBanAccount(pID) == 1)
    {
    format(query,sizeof(query),"DELETE FROM `SpielerTimeBanned `Name`='%s'",unbanname);
    mysql_query(query);
    }
    else if(SpielerInfo[pID][pBanned] == 1)
    {
    SpielerInfo[pID][pBanned] = 0;
    format(string,sizeof(string),"[A-INFO]{FFFFFF} %s wurde von %s vollständig entbannt!",spieler,aname);
    SendAdminMessage(0xFF0000FF,string);
    }
    }
    return 1;
    }


    Jeffry

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

    Einmal editiert, zuletzt von [GeD]Max ()

  • Dein query ist syntaktisch falsch:
    format(query,sizeof(query),"DELETE FROM `SpielerTimeBanned `Name`='%s'",unbanname);
    zu:
    format(query,sizeof(query),"DELETE FROM SpielerTimeBanned WHERE `Name`='%s'",unbanname);



    Zwecks des automatischen unbans:
    Du fragst zum Beispiel alle 10 Sekunden ab, ob es einen Ban gibt der eine EntBannZeit von kleiner als gettime hat.

    SQL
    SELECT FROM bans WHERE unbantime < %d


    für %d wird gettime() in format platziert.


    Durch das Result machst du eine Schleife und selektierst die Bans. Dann löschst du sie.



    ODER:
    Du fragst bei OnPlayerConnect ab, ob der Spieler timegebannt ist, und wenn ja schaust du ob die Zeit kleiner als gettime ist, wenn ja, enfernst du den Ban und lässt den Spieler in den Server.



    Probiere es bitte mal selbst aus, und wenn du es bis morgen nicht hinbekommen hast, postest du den Code hier, den du bis dahin hast.

  • Beitrag von [KoSoVa] ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.