/Mute 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
  • Irgendwie funktioniert es nicht, ich weiß nicht wieso :(
    Hier der Code


    dcmd_mute(playerid,params[])
    {
    new pID, time, reason, String[128];
    if (AccountInfo[playerid][AdminLevel] >= 2 || IsPlayerAdmin(playerid))
    {
    if(sscanf(params,"dds",pID,time,reason)){
    return SendClientMessage(playerid,ROT,"USAGE: /Mute [playerid] [Zeit in Minuten] [Grund]");
    }
    new zeit = time;
    format(String,sizeof(String), "Administrator %s hat %s für %d gemutet! Grund: %s", SpielerName(playerid), SpielerName(pID), zeit, reason);
    SendClientMessage(playerid, ROT, String);
    mute[pID] = 1;
    SetTimerEx("unmute", zeit*1000, false, "i", pID);
    }
    else SendLanguageMessage(playerid, ROT, "FEHLER: Du bist nicht berechtigt diesen Befehl zu benutzen!","ERROR: You aren't authorized to use this command!");
    return true;
    }

  • bei if(sscanf(params,"dds",pID,time,reason)) könnteste auch uds verwenden damit man auch den namen verwenden kann und nicht nur die id des spielers


    i, d Integer
    u User name/id (bots and players)


    ....
    was genau klappt den nicht?

  • Der Code ergibt überhaupt keinen Sinn.
    Nach einem Relog wäre der Spieler wieder entmuted.
    Statt dem ersten "d" im Parameter würde ich ein "u" nehmen dann kannst du auch den Spieler Namen statt nur die playerid angeben.
    Ich würde das ganze mit TimeStamps machen. Denn wenn du zum beispiel 200 Spieler gemuted hast würden 200 Timer laufen was sehr Resourcen Aufwändig wäre.

    RFT

  • Irgendwie funktioniert es nicht, ich weiß nicht wieso :(

    warum rechnest du die zeit *1000? 1000 ist 1 sekunde das heißt wenn du 10 eingibst ist er für 10 sekunden gemutet das macht schonmal 0 sinn
    desweiteren wird der mute nicht gespiechert wie RFT schon erwähnt hat
    welches Speichersystem verwendest du?
    hab meine weiteren fragen mal mit kommentaren eingefügt
    mfg

  • Um deine Frage zu beantworten:
    new pID, time, reason[30], String[128];
    //Und hier:
    if(sscanf(params,"dds[30]",pID,time,reason)){


    reason muss ein Array sein, da es eine Zeichenkette ist.



    An die Posts oben: Traurig, dass keiner annähernd versucht hat die Frage zu beantworten. Wenn er es So machen will, dann lasst es ihn doch so machen. Es hat vielleicht einen Grund!
    Wenn ich frage warum meine Pizza im Ofen verbrannt ist, und die Antwort "mach doch Nudeln" bekomme, was hilft mir das bezüglich meiner Frage? Nichts.

  • Trotzdem bleibt der parameter "playerid" in sscanf ein u und kein d


    Das ist falsch. Du kannst mit u zwar die playerid bekommen, genausogut kannst du sie aber mit d oder i bekommen.


    Um das klarzustellen:
    d = Funktioniert wenn die ID eingegeben wird.
    i = Funktioniert wenn die ID eingegeben wird.
    u = Funktioniert wenn die ID oder der Name eingegeben wird.


    Wenn er nicht möchte, dass der Name eingegeben werden kann, dann muss er sogar d/i benutzen.
    Je nach dem was gewollt ist.


    playerid ist in sscanf also nicht zwangsläufig mit u zu definieren.

  • Ich benutze immer d und ich will das der Spieler sich nach einem Reconnect entmuten kann, wegen meinem Anti Spam System.
    So, leider aber funktioniert das ganze System nicht. Die Minuten werden irgend wie viel zu hoch gesetzt und ich glaube mein System erkennt "pid" nicht. Hier ein Screenshot um es zu verdeutlichen



  • TheAmazingFlash:
    Ich kann dir ganz ehrlich sagen: sscanf ist Scheiße. Punkt.
    Grund: Genau deshalb. Es hat unerklärliche Fehler.


    Benutze strtok, damit hast du viel mehr Möglichkeiten.
    dcmd_mute(playerid,params[])
    {
    new pID, time, String[144];
    if (AccountInfo[playerid][AdminLevel] >= 2 || IsPlayerAdmin(playerid))
    {
    new tmp[20], tmp2[20], tmp3[20], idx;
    tmp = strtok(params, idx); tmp2 = strtok(params, idx); tmp3 = strtok(params, idx);
    if(!strlen(tmp3)) return SendClientMessage(playerid,ROT,"USAGE: /Mute [playerid] [Zeit in Minuten] [Grund]");
    pID = strval(tmp);
    if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,ROT,"Spieler nicht verbunden.");
    new zeit = strval(tmp2);
    format(String,sizeof(String), "Administrator %s hat %s für %d Sekunden gemutet! Grund: %s", SpielerName(playerid), SpielerName(pID), zeit, params[strlen(tmp) + strlen(tmp2) + 2]);
    SendClientMessage(playerid, ROT, String);
    mute[pID] = 1;
    SetTimerEx("unmute", zeit*1000, false, "i", pID);
    }
    else SendLanguageMessage(playerid, ROT, "FEHLER: Du bist nicht berechtigt diesen Befehl zu benutzen!","ERROR: You aren't authorized to use this command!");
    return true;
    }


    http://wiki.sa-mp.com/wiki/Strtok



    sscanf :thumbdown:


    strtok :thumbup: