---> Reportsystem mit Livechat geht nicht so ganz <---

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
    Ich habe heute mal ein Reportsystem gescriptet und habe es ausnahmsweise mal heute nicht abkopiert :)
    Ich habe es mit LiveChat versucht, aber das klappt nicht so ganz.


    Ich weiss auch nicht ob ich das richtig gemacht habe mit den Lifechat.
    Irgendwie klappts nicht, guckt mal ob es so klappen würde.


    ar um den Report anzunehmen :)
    ocmd:ar(playerid,params[])
    {
    new pID,string[128];
    if(GetPVarInt(playerid,"Adminlevel") <= 1)return SendClientMessage(playerid,FARBE_GRAU,"Du bist kein Admin und hast nicht das Recht Reports zu öffnen!");
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,FARBE_WEISS,"/ar [ID]");
    format(string,sizeof(string),"** Administrator %s hat deinen Report angenommen und bearbeitet ihn nun!",SpielerName(playerid));
    if(InSupport[pID]==1)return ErrorMsg(playerid,"Spieler ist bereits in einen Support");
    if(InSupport[playerid]==1)return ErrorMsg(playerid,"Du bist zur zeit noch gerade in einen Report");
    if(hatgeschrieben[pID]==1)
    {
    SendClientMessage(pID,0xFFFF00FF,string);
    SendClientMessage(playerid,FARBE_WEISS,"Du hast einen Report angenommen.");
    InSupport[playerid]=1;
    InSupport[pID]=1;
    }
    else if(hatgeschrieben[playerid]==0)
    {
    SendClientMessage(playerid,FARBE_GRAU,"Spieler hat gar keinen Report geschrieben");
    }
    return 1;
    }


    /sreport um ihn zu schliessen :)
    ocmd:sreport(playerid,params[])
    {
    new pID,string[128];
    if(GetPVarInt(playerid,"Adminlevel") <= 1)return SendClientMessage(playerid,FARBE_WEISS,"Du bist kein Admin und hast nicht das Recht Reports zu schließen!");
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,FARBE_WEISS,"/sreport [ID]");
    if(InSupport[playerid]==1&&InSupport[pID]==1)
    {
    format(string,sizeof(string),"** Administrator %s hat den Support beendet.",SpielerName(playerid));
    SendClientMessage(pID,0xFF00D7FF,string);
    SendClientMessage(playerid,0xFF00D7FF,"Du hast den Support beendet.");
    InSupport[playerid]=0;
    InSupport[pID]=0;
    return 1;
    }
    else
    {
    SendClientMessage(playerid,FARBE_GRAU,"Du bist nicht im support mit dieser Person.");
    return 1;
    }
    }


    /tr um den Report zu löschen
    ocmd:tr(playerid,params[])
    {
    new pID,string[128];
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,FARBE_WEISS,"/tr [ID]");
    if(GetPVarInt(playerid,"Adminlevel") >= 1)
    {
    if(InSupport[pID]==1)return ErrorMsg(playerid,"Spieler ist bereits in einen Support");
    if(InSupport[playerid]==1)return ErrorMsg(playerid,"Du bist zur zeit noch gerade in einen Report");
    if(hatgeschrieben[pID]==1)
    {
    format(string,sizeof(string),"** Administrator %s hat deinen Report gelöscht!",SpielerName(playerid));
    SendClientMessage(pID,FARBE_ROT,string);
    SendClientMessage(playerid,FARBE_WEISS,"Du hast den Report gelöscht!");
    hatgeschrieben[pID]=0;
    return 1;
    }
    else if(hatgeschrieben[pID]==0)
    {
    ErrorMsg(playerid,"Spieler hat gar keinen Report geschrieben");
    }
    }
    return 1;
    }


    Und nun bei OnPlayerText
    den Livechat


    public OnPlayerText(playerid, text[])
    {
    new string[128],pID;
    if(InSupport[playerid]==1)
    {
    format(string,sizeof(string), "%s: %s",SpielerName(playerid),text);
    SendClientMessage(pID,0xFF00FFFF,string);
    SendClientMessage(playerid,0xFF00FFFF,string);
    }
    }


    pls hilft

  • Was mir so direkt auffällt ist, das bei deinem OnPlayerText garnicht erkannt wird an wen das gesendet werden soll


    Richtig, das ist mir auch schon afgefallen, ich musste pID, definieren.
    Aber wie soll ich es denn sonst machen, die meldund soll ja an die Pid und an die playerid gesendet werden.

  • Das ist mein System:



  • Problem an der Sache ist, dass dann nicht mehrere Tickets auf einmal beantwortet werden können. - Und das ist auch dein Fehler.


    Wenn der Supporter das Ticket annimmt, dann setz eine Variable des Supporters auf die ID des Hilfesuchenden und umgekehrt.
    (Sprich:
    Supporter Peter mit ID 20 bekommt die Variable auf 3 gesetzt
    Hilfesuchender Hannes mit ID 3 bekommt die Variable auf 20 gesetzt.
    Die Variable sollte Standartmäßig auf -1 gesetzt werden. (Global))


    Dann kannst du bei OnPlayerText abfragen, ob seine Variable != -1 ist.
    Falls sie das nicht ist, dann schickst du dem Player mit der ID in der Variable eine Nachricht.
    (Wenn deine Variable PlayerTicket heißt so:
    format(message, sizeof(message), "[Ticket]%s : %s"pName, text);
    SendClientMessage(PlayerTicket[playerid], 0xFF0000FF, message))


    Gruß,
    Neo. :)


  • Ich habe es jetzt so gemacht ist das richtig ???
    Ich habe PlayerTicket aber nur in OnPlayerText genutzt, muss das noch woanders hin ?


    new string[128],PlayerTicket[MAX_PLAYERS];
    if(InSupport[playerid]!=-1)
    {
    format(string,sizeof(string), "[Ticket] %s: %s",SpielerName(playerid),text);
    SendClientMessage(PlayerTicket[playerid],0xFF00FFFF, string);
    }

  • Nein, so nicht.
    Habe mich mal kurz ran gesetzt, und das hier für dich gebastelt. Ist zwar ungetestet und aus dem Kopf geschrieben, sollte allerdings laufen.


    Spoiler anzeigen

    Global, also oben im Script.
    new fText[200], playerName[MAX_PLAYER_NAME+1]; // Globale definierung, um Resourcen zu sparen, da wir das in mehreren Funktionen brauchen.
    new PlayerTicket[MAX_PLAYERS];
    /*
    PlayerTicket[playerid] = 501; bedeutet, dass er ein Ticket erstellt hat. (Setz das am besten auf deine Slots +1, damit die Playerid keiner haben kann.)
    PlayerTicket[playerid] = -1; bedeutet, dass er kein Ticket offen hat.
    */

    Spoiler anzeigen

    ocmd:report(playerid, params[])
    {
    new sText[128];
    if(PlayerTicket[playerid] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Du hast bereits ein Ticket geöffnet. Wartes bis es angenommen wird, oder lösche es mir /reportloeschen.");
    if(sscanf(params, "s", sText)) return SendClientMessage(playerid, 0xFF0000FF, "Benutzung: /report [Text]");
    GetPlayerName(playerid, playerName, sizeof(playerName));
    format(fText, sizeof(fText), "[Report] %s: %s", playerName, sText);
    for(new i; i < MAX_PLAYERS; i++)
    {
    if(GetPVarInt(i, "admin") >= 1)
    {
    SendClientMessage(i, 0x000FFBFF, fText);
    SendClientMessage(i, 0x000FFBFF, "Du kannst das Ticket mit '/reportoeffnen' öffnen.");
    }
    }
    SendClientMessage(playerid, 0x000FFBFF, fText);
    PlayerTicket[playerid] = 501; // Einfach nur, damit das nicht mehr -1 ist, und diese ID auch keiner haben kann.
    return 1;
    }

    Spoiler anzeigen
    ocmd:reportloeschen(playerid, params)
    {
    if(PlayerTicket[playerid] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Du hast kein Ticket eröffnet, also kannst du es auch nicht löschen.");
    PlayerTicket[playerid] = -1;
    SendClientMessage(playerid, 0x000FFBFF, "Du hast dein Ticket erfolgreich gelöscht!");
    return 1;
    }

    Spoiler anzeigen
    ocmd:reportoeffnen(playerid, params[])
    {
    new playerName1[MAX_PLAYER_NAME+1];
    if(GetPVarInt(playerid, "admin") < 1) return SendClientMessage(playerid, 0xFF0000FF, "Du bist kein Admin, und hast nicht die Rechte diesen Befehl zu nutzen!");
    if(sscanf(params, "u", pID)) return SendClientMessage(playerid, 0xFF0000FF, "Benutzung: /reportoeffnen [Playerid/TeilDesNamens]");
    if(PlayerTicket[pID] != 501 || PlayerTicket[pID] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Diesem Spieler wird bereits geholfen, oder er hat sein Ticket gelöscht!");
    PlayerTicket[playerid] = pID;
    PlayerTicket[pID] = playerid;
    SendClientMessage(playerid,0x000FFBFF ,"Du kannst nun mit dem Spieler reden!");
    GetPlayerName(playerid, playerName, sizeof(playerName));
    GetPlayerName(pID, playerName1, sizeof(playerName1));
    SendClientMessage(pID, 0x000FFBFF, "____________SUPPORT____________");
    format(fText,sizeof(fText), "Guten Tag, %s. Mein Name ist %s. Wie kann ich Ihnen helfen?", playerName1, playerName);
    SendClientMessage(pID, 0x000FFBFF, fText);
    return 1;
    }

    Spoiler anzeigen
    ocmd:reportschliessen(playerid, params[])
    {
    if(GetPVarInt(playerid, "admin") < 1) return SendClientMessage(playerid, 0xFF0000FF, "Du bist kein Admin, und hast nicht die Rechte diesen Befehl zu nutzen!");
    if(PlayerTicket[playerid] != -1) return SendClientMessage(playerid, 0xFF0000FF, "Du bist in keinem Supportgespräch, welches du beenden könntest.");
    new pID = Ticket[playerid];
    SendClientMessage(pID, 0xFF0000FF, "Dein Supporter hat den Chat geschlossen! Schönen Tag noch auf dem Server! =)");
    Ticket[pID] = -1;
    Ticket[playerid] = -1;
    return 1;
    }

    Spoiler anzeigen
    public OnPlayerText(playerid, text[])
    {
    if(PlayerTicket[playerid] == 501 || PlayerTicket[playerid] == -1) return 1;
    GetPlayerName(playerid, playerName, sizeof(playerName));
    format(fText, sizeof(fText) ,"[Support] %s: %s", playerName, text);
    SendClientMessage(PlayerTicket[playerid], 0x000FFBFF, text);
    return 1;
    }


    Du musst das ganze noch auf dein Adminsystem anpassen. (GetPVarInt(playerid, "admin") habe ich hier verwendet.)


    Gruß,
    Neo. :)