Anti High Ping System

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
  • Schönen Guten Abend / Morgen,


    heute möchte ich euch mal zeigen & erklären wie man so ein Anti High Ping system bastelt.


    Was ist ein Anti High Ping system ?


    Es sorgt dafür das Spieler die zu stark Laggen bzw. einen zu Hohen Ping haben vom Server gekickt werden.
    Man kann den Wert Dynamisch oder vom Script aus einstellen. Je nach dem mit was man Speichert oder wie
    man es haben will.





    Also als erstes brauchen wir einen Timer, der jede Sekunde den Spieler Updatet. Da wir ja nicht
    mit OnPlayerUpdate Arbeiten wollen, da dies zu viel Recourcen frisst & zu laggs des Servers führen kann.



    Also packen wir unter OnGameModeInit
    SetTimer("PingCheck",1000,true);



    - Das SetTimer steht für den Timer, damit der Server genau weiß was es machen muss.
    - PingCheck steht für den Namen des Timers, kann beliebig geändert werden. Ist nur ein Beispiel.
    - Die 1000 stehen für 1000 Millisekunden, 1000 Millisekunden entsprechen 1 Sekunde.
    - Das true steht für die Wiederholung des Timers. True = Wahr, bedeutet das der Timer jede Sekunde wiederholt wird.


    Danach erstellen wir das Public für den Timer, dazu gehen wir aber vorerst über OnGameModeInit aber unter die Includen und schreiben dort
    folgendes hin.
    forward PingCheck();


    Warum wir das ganze forwarden ? Naja ganz Simple, es ist so wie ein Gesetz von PAWN das alle Öffentlichen ( Publics ) Funktionen geforwarded
    werden müssen.


    So nun erstellen wir irgendwo zwischen den Publics die Funktion des Timers.
    public PingCheck()
    {
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    new ping = GetPlayerPing(i),name[MAX_PLAYER_NAME],string[128];
    GetPlayerName(i,name,sizeof(name));
    if(ping > 300)
    {
    format(string,sizeof(string),"[ANTI HIGH PING] Spieler %s wurde wegen seinem Ping von %d vom Server gekickt."name,ping);
    SendClientMessageToAll(DEINE FARBE,string);
    Kick(i);
    }
    }
    return 1;
    }


    Erklärung:


    new ping = GetPlayerPing(playerid);


    Da zwar jetzt der ping erstellt wurde, aber noch keinen Wert hat, weisen wir ihm den Wert des Spieler Pings zu.
    Hätte der Spieler einen Ping von 50 so ist ping nun auch 50.
    name[MAX_PLAYER_NAME];
    der Wert name ist hier noch nicht gesetzt, aber er kann den Namen aller Spieler annehmen, die auf dem Server sind.


    string[128];
    Steht für die Zeichenlänge die die Nachricht Maximal haben kann.



    GetPlayerName(playerid,name,sizeof(name);
    Diese Funktion ist dazu da, um den Namen des Spielers dem array name zu zu weisen.
    Heißen wir nun Mark so ist name auch Markus



    if(ping > 300)


    Wenn nun der Ping des Spielers über 300 steigt so wird das ausgeführt was in den geschweiften Klammern passieren soll.


    format(string,sizeof(string),"[ANTI HIGH PING] Spieler %s wurde wegen seinem Ping von %d vom Server gekickt."name,ping);
    Natürlich müssen wir auch hier den string mit unserer Nachricht überschreiben. Der zweite Wert von hinten steht für den ersten Parameter
    den wir in der Message angeben, in dem Fall unseren Namen.
    Der Letzte wert steht für unseren Aktuellen Ping.



    Das war es auch schon, ich hoffe ich konnte euch mit diesem kleinen Tutorial ein wenig erklären & auch zeigen wozu was dient.



    Greetz 8)



    Edit: Fehler behoben 8)
    Edit: 2 Klammer hinzugefügt
    Edit: Abfrage hinzugefügt

    3 Mal editiert, zuletzt von K3V1N ()

  • Also ich finde das du alles sehr gut erklärt hast, auch wenn es ein einfaches System ist.


    //Aber es sind noch ein paar Fehler drinne...

    Zitat

    Also packen wir unter OnGameModeInit
    SetTimer("PingCheck",1000,true);

    Müsste bei OnPlayerConnect und OnPlayerDisconnect gestartet/gestoppt werden.
    Und von SetTimer zu SetTimerEx("PingCheck",1000,true,"d",playerid);

  • Das ist doch bitte kein Tutorial sondern ein Codesnippet.


    Warum wird für "string" 128 Zeichen reserviert?


    Ich nehme an um mit der string größe richtig zu sein bzw. es abzusichern es sind 84 Zeichen alleine und + Name wären das 24 und dann noch der Ping dazu höchsten 3 und dabei sicher zu gehen. Man könnte es jedoch schon noch kleiner machen... @K3V1N

    MFG

  • Also ich finde das du alles sehr gut erklärt hast, auch wenn es ein einfaches System ist.


    //Aber es sind noch ein paar Fehler drinne...

    Müsste bei OnPlayerConnect und OnPlayerDisconnect gestartet/gestoppt werden.
    Und von SetTimer zu SetTimerEx("PingCheck",1000,true,"d",playerid);


    Nein, der Callback OnPlayerConnect wird nur aufgeführt wenn der Spieler Connectet. & Wenn er noch nicht eingeloggt ist dann
    bringt das auch nicht viel.
    Edit: Und den Timer müssen wir auch nicht Killen, da wir nun mit einer Schleife arbeiten.


    Es wird aber nur für die ID 0 das System verwendet.


    Ja war ein bisschen Müde ^^ .. habe nun den Fehler behoben 8)

  • dein Code so oben gibt Errors aus..



    new ping = GetPlayerPing(playerid),name[MAX_PLAYER_NAME],string[128];
    GetPlayerName(playerid,name,sizeof(name));// hier auch wieder 2 Klammer schließen
    if(ping > 300)
    {
    format(string,sizeof(string),"[ANTI HIGH PING] Spieler %s wurde wegen seinem Ping von %d vom Server gekickt.",name,ping);// hier fehlte ein ,
    SendClientMessageToAll(DEINE FARBE,string);
    Kick(playerid);
    }


    Wenn schon ;)

    Mit freundlichen Grüßen
    Developer
    Go/Python Developer | ehm. Webdeveloper | Fachinformatiker Anwendungsentwicklung
    Arbeitet in einem cloudigen Umfeld bei einem der größten deutschen Rechenzentrumsbetreibern

  • Nein, der Callback OnPlayerConnect wird nur aufgeführt wenn der Spieler Connectet. & Wenn er noch nicht eingeloggt ist dann
    bringt das auch nicht viel.
    Edit: Und den Timer müssen wir auch nicht Killen, da wir nun mit einer Schleife arbeiten.



    Ja war ein bisschen Müde ^^ .. habe nun den Fehler behoben 8)


    Das hast du doch grade bearbeitet...
    Außerdem ist es doch egal ob er schon eingeloggt ist oder nicht.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Das hast du doch grade bearbeitet...
    Außerdem ist es doch egal ob er schon eingeloggt ist oder nicht.


    Auch wenn es egal ist. Der Timer ist nun nicht mehr Spielerseitig sondern Serverseitig. Warum soll ich für jeden
    einzelnen Spieler unter OnPlayerConnect einen Timer erstellen ? Hinterher sinds dann mal 50 - 100 Timer...


  • Auch wenn es egal ist. Der Timer ist nun nicht mehr Spielerseitig sondern Serverseitig. Warum soll ich für jeden
    einzelnen Spieler unter OnPlayerConnect einen Timer erstellen ? Hinterher sinds dann mal 50 - 100 Timer...


    Aber so wie es jetzt ist, ist es auch nicht besser.
    Du solltest besser noch abfragen ob der Spieler überhaupt connected ist.
    if(!IsPlayerConnected(i))continue;

  • Wäre es nicht ein wenig Resourcen freundlicher, den Namen der Person erst zu speichern, wenn man ihn kicken will?
    Also

    if(ping ...)
    {
    GetPlayerName(...);
    format(....);
    }

    Oder macht das da keinen Unterschied?

    Mit freundlichem Gruß
    Weper


  • Ich glaube nicht das es ein Unterschied macht, da der Name sowieso danach wieder gelöscht wird bzw die Funktion abgebrochen wird.

  • Kriege ein paar Errors.



    C:\Users\Fabian\Desktop\samp\gamemodes\Selfmade.pwn(250) : error 001: expected token: "-string end-", but found "-identifier-"
    C:\Users\Fabian\Desktop\samp\gamemodes\Selfmade.pwn(250) : warning 215: expression has no effect
    C:\Users\Fabian\Desktop\samp\gamemodes\Selfmade.pwn(250) : warning 215: expression has no effect
    C:\Users\Fabian\Desktop\samp\gamemodes\Selfmade.pwn(250) : error 001: expected token: ";", but found ")"
    C:\Users\Fabian\Desktop\samp\gamemodes\Selfmade.pwn(250) : error 029: invalid expression, assumed zero
    C:\Users\Fabian\Desktop\samp\gamemodes\Selfmade.pwn(250) : fatal error 107: too many error messages on one line


    Die zeilen:



    public PingCheck()
    {
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    new ping = GetPlayerPing(i),name[MAX_PLAYER_NAME],string[128];
    GetPlayerName(i,name,sizeof(name));
    if(ping > 300)
    {
    format(string,sizeof(string),"[ANTI HIGH PING] Spieler %s wurde wegen seinem Ping von %d vom Server gekickt."name,ping); <--- Hiers der error iwo
    SendClientMessageToAll(rot,string);
    Kick(i);
    }
    }
    return 1;
    }


    @K3V1N: