[Schnippsel] Ping Tester

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 Leute,
    Ich wollte mal meine Referenzen etwas erhöhen ^^
    deswegen zeig ich euch mal wie man einen Ping Tester macht,
    es ist kein großes System, jedoch hilfreich und ja es ist ein Schnippsel ^^


    Was ihr braucht:
    - 2-7 Minuten Zeit
    - eig. nicht mehr.


    Fangen wir an
    Achso, davor noch es gibt 2 Möglich keiten,
    einmal mit Warnungen und einmal Ohne.
    Machen wir erstmal mit Warnungen


    Als Erstes erstellen wir ein New , bzw. die Warnings.
    new PingWarnung[MAX_PLAYERS];
    Ihr könnt es auch natürlich anders nennen. die Max Player bedeutet eig. nur das es immer erhöh bar ist.


    als nähstes erstellen wir den Timer.
    forward PingTest();
    Somit sagen wir dem Script, das wir in diesem Fall nen Timer haben wollen ^^
    public PingTest()
    Das ist dann der Timer
    Wir erstellen nun eine Schleife, und fragen somit alle User ab...
    for(new i= 0; i < GetMaxPlayers(); i++)
    anschließend die Ping Abfrage mit
    if(GetPlayerPing(i) >= 400)
    InDiesem Fall fragt man ab ob der Spieler mehr als 400 Ping hat, wenn er das hat, wollen wir ne Nachricht und ne WarnungPunkt geben. das machen wir mit
    new string[64];
    format(string,sizeof(string),"%s hast ein Warn bekommen. Grund: Hoher Ping(Über 400). ",/*Namen Abfragung*/);
    SendClientMessageToAll(EURE FARBE, string);
    Dan geben wir ihm noch nen WarnungPunkt mit
    PingWarnung[i] ++;
    Dann abfragen ob er schon 3 Warnings oder mehr schon hat mit
    if(PingWarnung[i] > 3)
    Dan kicken wir ihm mit
    Kick(i);
    wenn ihr wollt könnt ihr noch ne nachricht schreiben aber ich machs diesmal nicht ^^
    Jetzt fügen wir den Timer noch unter OnGameModeInit ein
    SetTimer("PingTest",2000,true);
    Damit wird es alle 2 Sekunden abgefragt[10 Sekunden wären auch gut ^^ aber 2-5 wären optimal



    das wars dan auch mit der 1 Methode


    Jetzt kommen wir zur 2x
    Das gleiche nur das wir im Timer Public das
    if(PingWarnung[i] > 3)
    ganz auslassen
    und bei if(GetPlayerPing(i) >= 400)
    den kick einbauen
    ____________________-
    Hier mal im Ganzen für die die es nicht verstanden haben ^^


    Mothode 1.

    new PingWarnung[MAX_PLAYERS]; // Oben Im Script
    forward PingTest(); // oben im Script
    SetTimer("PingTest", 2000,true); // Unter OnGamemode Init


    //Unten Im Script
    public PingTest()
    {

    for(new i= 0; i < GetMaxPlayers(); i++)
    {
    if(GetPlayerPing(i) >= 400)
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(i, name, sizeof(name));
    PingWarnung[i] ++;
    format(string,sizeof(string),"%s hast ein Warn bekommen. Grund: Hoher Ping(Über 400). ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    }
    if(PingWarnung[i] > 3)
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(i, name, sizeof(name));
    format(string,sizeof(string),"%s hast einen Kick bekommen. Grund: Hoher Ping(Über 400).[Zum 3. Mal] ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    Kick(i);
    }
    }
    return 1;
    }


    Mothode 2.

    forward PingTest(); // oben im Script
    SetTimer("PingTest", 2000,true); // Unter OnGamemode Init


    //Unten Im Script
    public PingTest()
    {

    for(new i= 0; i < GetMaxPlayers(); i++)
    {
    if(GetPlayerPing(i) >= 400)
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(i, name, sizeof(name));
    PingWarnung[i] ++;
    format(string,sizeof(string),"%s hast ein Warn bekommen. Grund: Hoher Ping(Über 400). ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    }
    }
    return 1;
    }


    Oder Bei OnPlayerUpdate
    for(new i= 0; i < GetMaxPlayers(); i++)
    {
    if(GetPlayerPing(i) >= 400)
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(i, name, sizeof(name));
    PingWarnung[i] ++;
    format(string,sizeof(string),"%s hast ein Warn bekommen. Grund: Hoher Ping(Über 400). ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    }
    }


    ____
    Wenn ich etwas Falsch hab bitte sagen:D


    p.s
    das ist jetzt zum großteil freihand und ich bin müde, also garantie net garantiert :D

  • Mothode 1.


    Kriege ich einen Error:


    C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(804) : error 017: undefined symbol "playerid"


    Hier:


    public PingTest()
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));//Error
    for(new i= 0; i < GetMaxPlayers(); i++)
    {
    if(GetPlayerPing(i) >= 400)
    {
    PingWarnung[i] ++;
    format(string,sizeof(string),"%s hast ein Warn bekommen. Grund: Hoher Ping(Über 400). ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    }
    if(PingWarnung[i] > 3)
    {
    new msg[128];
    format(string,sizeof(string),"%s hast einen Kick bekommen. Grund: Hoher Ping(Über 400).[Zum 3. Mal] ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    Kick(i);
    }
    }
    return 1;
    }


    Mfg


    Orange

  • C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(804) : error 017: undefined symbol "i"
    C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(805) : error 001: expected token: ";", but found "for"


    GetPlayerName(i, name, sizeof(name));//Error
    for(new i= 0; i < GetMaxPlayers(); i++)

  • Muss auch unter for(new i= 0; i < GetMaxPlayers(); i++){ sein ;)

  • C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(806) : error 001: expected token: ";", but found "{"
    C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(807) : error 017: undefined symbol "i"
    C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(809) : error 017: undefined symbol "i"
    C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(813) : error 017: undefined symbol "i"
    C:\Users\Moritz\Desktop\Mein Selfmade\gamemodes\tutorial.pwn(818) : error 017: undefined symbol "i"


    Mfg


    Orange

  • Alle die mit diesem i zu tun haben, habe das i = playerid nicht ^^

  • public PingTest()
    {

    for(new i= 0; i < GetMaxPlayers(); i++)
    {
    if(GetPlayerPing(i) >= 400)
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(i, name, sizeof(name));
    PingWarnung[i] ++;
    format(string,sizeof(string),"%s hast ein Warn bekommen. Grund: Hoher Ping(Über 400). ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    }
    if(PingWarnung[i] > 3)
    {
    new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(i, name, sizeof(name));
    format(string,sizeof(string),"%s hast einen Kick bekommen. Grund: Hoher Ping(Über 400).[Zum 3. Mal] ", name);
    SendClientMessageToAll(COLOR_YELLOW,string);
    Kick(i);
    }
    }
    return 1;
    }
    versuchs mal so

  • Nicht direkt falsch, aber bitte benutze niemals niemals niemals OnPlayerUpdate.
    Das Teil kann in Tests bis zu 1000 mal pro Sekunde gefeuert werden und da gehen manche Server sehr schnell in die Knie...
    Dann musst du bei OnPlayerUpdate keine for-Schleife machen, weil OnPlayerUpdate schon eine playerid als Parameter mitliefert.

  • Das Teil kann in Tests bis zu 1000 mal pro Sekunde gefeuert werden


    Was zur...


    Das aufwendigste zu für den Server zu syncen ist aktuell der "Wasserwerfer" der Fahrzeuge, selbst da wird das nicht 1000 mal in der Sekunde gefeuert.
    Vielleicht 60 mal, aber 1000 ist wahrlich übertrieben :pinch:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Mir wurde gesagt, dass der Server bis zu 1000 Ticks die Sekunde schafft, und da OnPlayerUpdate jedes mal "gefeurt" wird... ;)
    Natürlich nur in Leerlaufen, je mehr der Server "macht", desto weniger Ticks in der Sekunde schafft er ;)

  • ja deswegen hab ich es ja auch als Timer dargestellt :P

    Wenn es als timer gemacht werden sollte, dann kann der 'oder bei OnPlayerUpdate' Teil aus dem ersten Post raus. Weil so wie der Post jetzt aussieht, kann man als Leser denken, dass man alternativ den selben Code unter OnPlayerUpdate schreiben kann, wie der Code, der im Timer verwendet wird.
    Falls es moeglich sein soll den Code unter OnPlayerUpdate zu nutzen, sollte man den Code dafuer anpassen. Wie Tion schon sagte ist es hoechst ineffizient alle Spieler in OnPlayerUpdate durchzugehen, da OnPlayerUpdate() auf einen einzigen Spieler bezogen ist. Man kann den Code ganz einfach fuer OnPlayerUpdate anpassen. Einfach die for-schleife rausnehmen und 'i' durch 'playerid' austauschen.


    Mir wurde gesagt, dass der Server bis zu 1000 Ticks die Sekunde schafft, und da OnPlayerUpdate jedes mal "gefeurt" wird... ;)
    Natürlich nur in Leerlaufen, je mehr der Server "macht", desto weniger Ticks in der Sekunde schafft er ;)

    Nicht ganz. OnPlayerUpdate kann zwar bei 30-40 aktiven (nicht pausierten) Spielern (oder mehr/weniger, je nach server Einstellung der onfoot_rate/incar_rate/..) um die 1000 mal aufgerufen werden, aber es liegt nicht an den Server-FPS. OnPlayerUpdate wird bei 0 Spielern (hoher Leerlauf) 0 mal in der Sekunde aufgerufen. Es wird immer dann aufgerufen, wenn ein Client ein neues Update seiner Daten sendet.

  • Nicht ganz. OnPlayerUpdate kann zwar bei 30-40 aktiven (nicht pausierten) Spielern (oder mehr/weniger, je nach server Einstellung der onfoot_rate/incar_rate/..) um die 1000 mal aufgerufen werden, aber es liegt nicht an den Server-FPS. OnPlayerUpdate wird bei 0 Spielern (hoher Leerlauf) 0 mal in der Sekunde aufgerufen. Es wird immer dann aufgerufen, wenn ein Client ein neues Update seiner Daten sendet.

    Okay, Leerlauf war etwas unglücklich formuliert, ich meinte "leeres Script" ^^
    Aber da scheinst du recht zu haben, dass der Spieler OnPlayerUpdate steuert, da lag meine frühere Quelle wohl falsch... Mir wurde gesagt, dass das mit jedem Servertick ausgeführt wird, aber jetzt im Nachinein macht deine Erklärung mehr Sinn, da man über OnPlayerUpdate ja auch testen kann, ob der Spieler AFK ist oder nicht ^^


    Edit 1: Zitatfehler, danke an SBIKA
    Edit 2: Edit vergessen >.>