Warn System

  • Inhalt:


    • Warn System
    • Dini
    • ocmd
    • sscanf



    Um was geht es in diesem Tutorial?



    Ich erkläre euch Heute mal wie ihr ein, Warn System erstellen könnt.
    Falls einige nicht wissen was damit gemeint ist, erkläre ich es mal.
    Ein warn System ist dazu da um andere Spieler eine Verwarnungen zu geben,
    bei einer bestimmten anzahl an Verwarnungen könnt ihr den Spieler vom Server bannen lassen, oder was auch immer ihr mit ihm anstellen wollt ^^


    Was benötigen wir?

    • Dini ( Zum Speichern/Laden der Warns )
    • OCMD ( Zum erstellen der Befehle )
    • sscanf ( Für die einzelnen Parameter für die Befehle. Für mehr Infos dazu hier KLICKEN )




    Die Erstellung der einzelnen Befehle:


    Befehl zum verteilen der Verwarnungen:




    ocmd:setwarn(playerid, params[])
    {
    if(IsPlayerAdmin(playerid))return SendClientMessage(playerid, WEIS, " Du bist kein Rcon Admin!"); // Hier wird jetzt abgefragt ob der Spieler Rcon Admin ist. Natürlich könnt ihr diese Abfrage mit eure ersetzen.
    new warnid, warnanzahl, warngrund[60];
    if(sscanf(params,"uds",warnid, warnanzahl, warngrund))return SendClientMessage(playerid, WEIS,"Verwendung: /setwarn [Name/ID] [Warn-Anzahl] [Warn-Grund]"); // Sollte sich eigentlich von selbst erklären. wenn nicht KLICK
    if(!IsPlayerConnected(warnid))return SendClientMessage(playerid, WEIS, " Dieser Spieler ist nicht Online!"); // Falls der Spieler (Warnid) sich nicht auf den Server befindet erhält man eine Fehlermeldung.
    if(strlen(warngrund) > 60)return SendClientMessage(playerid,0xC34600FF,"Benutzung: [Warn-Grund darf Maximal nur 60 Zeichen beinhalten!]"); // die 60 steht für die anzahl der Zeichen die Verwendet werden dürfen.
    {
    new string[150]; // Hier erstellen wir den Array für die Nachrichten die wir nun mit der 'format' Funktion formatieren werden.
    format(string,sizeof(string), "Du hast an den Spieler %s %d Warns verteilt, Grund: %s", SpielerName(warnid), warnanzahl, warngrund);SendClientMessage(playerid, WEIS, string);
    SendClientMessage(warnid, WEIS, string);format(string,sizeof(string),"%s vergibt dir %d Warns, sein Grund: %s",SpielerName(playerid), warnanzahl, warngrund);
    SetPVarInt(playerid,"Warns",GetPVarInt(playerid,"Warns")+warnanzahl);
    if(GetPVarInt(warnid, "Warns") >= 3) // Falls der Spieler nun 3 Warns oder mehr hat soll was passieren?. Ich sage er soll eine Nachricht erhalten und im Anschluss gebannt werden.
    {
    SendClientMessage(warnid, WEIS, "Du hast die Maximale Warn anzahl erreicht und wirst nun gebannt!"); // eine Nachricht an den Spieler wird ausgegeben.
    Ban(warnid); // hier durch wird der Spieler gebannt und vom Server gekickt
    }
    }
    return 1;
    }


    Befehl zum löschen der Verwarnungen:



    ocmd:delwarn(playerid, params[])
    {
    if(IsPlayerAdmin(playerid))return SendClientMessage(playerid, WEIS, " Du bist kein Rcon Admin!"); // Hier wird jetzt abgefragt ob der Spieler Rcon Admin ist. Natürlich könnt ihr diese Abfrage mit eure ersetzen.
    new warnid, warnanzahl, warngrund[60];
    if(sscanf(params,"uds",warnid, warnanzahl, warngrund))return SendClientMessage(playerid, WEIS,"Verwendung: /givewarn [Name/ID] [Warn-Anzahl] [Warn-Grund]"); // Sollte sich eigentlich von selbst erklären. wenn nicht KLICK
    if(strlen(warngrund) > 60)return SendClientMessage(playerid,0xC34600FF,"Benutzung: [Warn-Grund darf Maximal nur 60 Zeichen beinhalten!]"); // die 60 steht für die anzahl der Zeichen die Verwendet werden dürfen.
    if(!IsPlayerConnected(warnid))return SendClientMessage(playerid, WEIS, " Dieser Spieler ist nicht Online!"); // Falls der Spieler (Warnid) sich nicht auf den Server befindet erhält man eine Fehlermeldung.
    if(GetPVarInt(warnid,"Warns") - warnanzahl >= 0)return SendClientMessage(playerid,GRUN," Der Spieler hat entweder 0 Warns oder die Warn-Anzahl ist zu groß!"); //Wenn der Spieler 0 Warns hat erhält der Admin diese Fehlermeldung. Oder wählt der Admin mehr Warns aus als der Spieler eigentlich hat erhält er diese Nachricht.
    {
    new string[128]; // Hier erstellen wir wieder den Array für die Nachrichten die wir nun mit der 'format' Funktion formatieren werden.
    format(string,sizeof(string), "Du hast vom Spieler %s %d Warns gelöscht, Grund: %s", SpielerName(warnid), warnanzahl, warngrund);
    SendClientMessage(playerid, WEIS, string);format(string,sizeof(string),"%s löscht dir %d Warns, sein Grund: %s",SpielerName(playerid), warnanzahl, warngrund);
    SendClientMessage(warnid, WEIS, string);
    SetPVarInt(playerid,"Warns",GetPVarInt(playerid,"Warns")-warnanzahl);
    }
    return 1;
    }


    Jetzt müsst ihr nur noch den stock SpielerName erstellen:



    stock SpielerName(playerid)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    return name;
    }


    Bei eurem stock Laden muss es so aussehen:


    SetPVarInt(playerid,"Warns",dini_Int(Spielerdatei,"Warns"));

    Bei eurem stock SpielerSpeichern muss es so aussehen:


    dini_IntSet(Spielerdatei,"Warns",GetPVarInt(playerid,"Warns"));




    So das war nun das kleine Tutorial wie man sich ein Warn-System erstellt.
    Ich werde es so gut es geht noch weiter ausbessern, falls ihr Fehler im Code findet bitte Posten sie mir doch hier im Thread damit ich diese ausbessern kann.
    Über Positives Feedback würde ich mich freuen :D


    Hoffe euch hat das Tut gefallen. Klein aber Fein :P



    Edit: einige Fehler ausgebessert. Danke @west123



    Grüße

    9 Mal editiert, zuletzt von Equ ()

  • ich würd die string größen noch anpassen 128 braucht man auch nicht
    dafür das es ein warn system ist bin ich immerwieder beeindruckt wieviel code man dafür verbraucht


    werds gleich mal testen obs funktioniert und melde mich dann


    //EDIT wo deklarierst du Spielername? bitte zufügen oder entsprechend umändern
    //EDIT#2 deine IstSpielerVerbunden abfrage ist falsch wenn der spieler verbunden ist wird dir Spieler nicht online gesendet
    da fehlt das
    if(!IsPlayerConnected(warnid))

    Einmal editiert, zuletzt von west123 ()

  • Danke für die Fehlerhinweise hab sie mal ausgebessert ^^



    Mich würde es dennoch freuen, wenn du ein kleines Feedback zum Tutorial abgeben könntest.




    Grüße

  • new string[148], string2[148]; // Hier erstellen wir den Array für die Nachrichten die wir nun mit der 'format' Funktion formatieren werden.


    Wozu 2 wenn einer vollkommen reicht?


    Deseiteren nutz nicht die Funktion "SpielerName" sondern lass es direkt per GetPlayerName auslesen


    Sonst gebe ich dir nur 3 Punkte da man einfach zu viel kopieren kann

    All in all it's just another brick in the wall

  • Feedback naja find das system nicht so toll meine persönliche meinung
    vom script her wiegesagt viele fehler
    und da mein sscanf nicht geht weiß ich gar nicht ob das funktioniert aber hab sonnst erstmal nichts bemerkt beim drüber lesen 4/10 punkten


    Fehlerhinweis:
    if
    (GetPVarInt(warnid, "Warns") < 3) wenn warns kleiner als 3 ist wird man gebannt^^ oder seh ich das jetzt falsch? ansonnsten umdrehen bzw und andersrum müsstest du dann warns >=3 machen sonnst würde man mit // EDIT meinte natürlich 3 warns und nicht 4 wegen ban und so




    2 Mal editiert, zuletzt von west123 ()


  • Wozu 2 wenn einer vollkommen reicht?


    Deseiteren nutz nicht die Funktion "SpielerName" sondern lass es direkt per GetPlayerName auslesen


    Sonst gebe ich dir nur 3 Punkte da man einfach zu viel kopieren kann


    Danke erstmal für dein Feedback.


    Dann sage mir doch mal wie du das meinst?
    wenn man dies so erstellen würde:


    new string[256];
    format(string,sizeof(string)," dies ist ein Text");
    format(string,sizeof(string)," dies ist ein zweiter Text");
    SendClientMessage(playerid, -1, string);
    SendClientMessage(pID, -1, string);


    Dann würden doch beide Spieler die Texte bekommen und das will man doch nicht?

    Danke für dein Feedback.


    So wenn du dir das mal hier durch Lesen würdest fällt dir eine Zeile auf die nennt sich "sscanf dort erhälst du den sscanf Code auch ..


    Was benötigen wir?

    • Dini ( Zum Speichern/Laden der Warns )
    • OCMD ( Zum erstellen der Befehle )
    • sscanf ( Für die einzelnen Parameter für die Befehle. Für mehr Infos dazu hier KLICKEN )


  • Nein. Du hast geschrieben gehabt das dein sscanf Code irgendwie nicht Funktioniert,
    und daher hab ich dir einfach mal einen Link zu den Sscanf Code gepostet ..



    Grüße

    aso^^ ja ich hatte 5 versionen von sscanf da ging nur 1 und die include datei hat mir nen runtime error ausgespuckt das meinte ich das mein sscanf nicht funktioniert ich werd den link von dir mal testen
    wobei es bei mir jetzt durch das plugin und den sscanf stock funktioniert


    mfg

  • Ist ja ein C&P Code. Nichts Schritt für Schritt erklärt.


    Ich hab das erklärt. Was ich meine erklärt haben zu müssen damit man weiß was die und die Funktion einen bringt ..
    Keiner hätte lust 10.000 Zeilen voll zu klatschen mit Codes und später würde sich keiner das Tutorial anschauen weil es einfach zu viel zum Lesen wäre ..


    Und falls du meinst das ich es Kopiert & eingefügt habe, nein. Ich habe alles im Forum Editor geschrieben.
    Meinst du aber das jeder es einfach so Kopieren und Einfügen kann, Ja das stimmt ..



    Grüße

  • Ich finde dieses TUTO nicht schlecht allerdings gibt es hier einen kleinen Bug denn man ausnutzen könnte und zwar könnte der Spieler mit einem niedrigen Adminlevel ein höheren Admin einfach die Anzahl an Warns geben und Ihn damit bannen.


    Klar wenn man ein Team hat sollte man darauf vertrauen da so etwas nicht passiert allerdings wird es bestimmt leute geben die dies versuchen.


    Daher kurze Frage ob Ihr eine Abfrage kennt die rausfindet ob ein Adminlevel größer oder kleiner als des Spielers ist der diesen Befehl ausführt.

  • Ich finde dieses TUTO nicht schlecht allerdings gibt es hier einen kleinen Bug denn man ausnutzen könnte und zwar könnte der Spieler mit einem niedrigen Adminlevel ein höheren Admin einfach die Anzahl an Warns geben und Ihn damit bannen.


    Klar wenn man ein Team hat sollte man darauf vertrauen da so etwas nicht passiert allerdings wird es bestimmt leute geben die dies versuchen.


    Daher kurze Frage ob Ihr eine Abfrage kennt die rausfindet ob ein Adminlevel größer oder kleiner als des Spielers ist der diesen Befehl ausführt.

    Hast du den Codeabschnitt an dein eigenem Admin System angepasst oder ist der Befehl weiterhin nur für RCON Admins verfügbar?
    Du kannst für beides eine Abfrage schreiben, aber für letzteres gibt es nur ein "Level", deswegen könntest du eine Abfrage schreiben wo verhindert wird das sich Admins gegenseitig warnen können.



    if(IsPlayerAdmin(warnid)) return SendClientMessage(playerid, -1, "Du kannst ein Admin nicht verwarnen!");


    einfach über die Zeile "Der Spieler ist nicht online" einfügen :)


    //Handy

  • Du kannst für beides eine Abfrage schreiben, aber für letzteres gibt es nur ein "Level", deswegen könntest du eine Abfrage schreiben wo verhindert wird das sich Admins gegenseitig warnen können.

    Danke erstmal für die Schnelle Hilfe.



    Hast du den Codeabschnitt an dein eigenem Admin System angepasst oder ist der Befehl weiterhin nur für RCON Admins verfügbar?

    Anbei habe ich meine Abfrage eingefügt mit dem ich das Level eines Admins überprüfe