ackslimit exceeded, messageholelimit exceeded, Server laggt und crasht? Was ist los?

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
  • Ich gruesse euch liebe Community,


    Habe aktuell mein Script Last Bed Standing am laufen, welches ich auch hier im Forum veroeffentlicht habe, jedoch kommt es nun nach laengerem Testen zu Problemen.


    Nach einer nicht definierten Zeit werden Spieler gekickt/gebannt weil irgendwie das messageholelimit oder ackslimit ueberschritten wurde, und dann spielt der Server verrueckt! Nix mehr geht, Fahrzeuge verschwinden, Objekte verschwinden etc.


    Woran kann das liegen? Habe schonmal im Englischen Forum gefragt, und dort wurde mir gesagt dass in meinem Script die typischen Ursachen wie Endlosschleifen etc. nicht zu finden seien.


    Ich hoffe jemand hat Zeit und kann mir bei meinem Problem helfen.



    Hier ein Beispiel: 3 Spieler auf dem Server, 2 sind kurz hintereinander rausgeflogen, beim 3. passiert nix.


    ackslimit und messageholelimit raufsetzen auf 10000 hat auch nichts gebracht, auch da wurde es ueberschritten



    Hier der Link zum Quellcode:


    http://pastebin.com/16cKHfUe

  • Tjoa...crashdetect reinhauen..und wenn das nicht hilft...musst du deine callbacks/timer debuggen und schauen...was so als letztes aufgerufen wurde :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Vielen Dank schonmal, profiler kriege ich nicht zum laufen weshalb ich leider aktuell nur crashdetect drin habe.
    Konnte den Bug reproduzieren: Wenn ich am Anfang, nach dem Zweiten Login , also 2tes mal joinen die Pfeiltasten in der Grand Larceny Teamauswahl oder Stadtauswahl spamme haengt sich irgendwann alles auf und der meldet ueberschrittenes Ackslimit.


    Gibt es einen Weg das zu umgehen? Ich habe das Gefuehl es liegt an OnPlayerUpdate



    Crashdetect sagt jedoch vor dem joinen:



    C
    [10:27:21] [debug] Run time error 4: "Array index out of bounds"
    [10:27:21] [debug]  Attempted to read/write array element at index 65535 in array of size 32
    [10:27:21] [debug] AMX backtrace:
    [10:27:21] [debug] #0 000324bc in public OnPlayerDeath (0, 65535, 54) from bedwarschilliad.amx

    Koennen weiterhin Integer die unendlich gross werden ein Problem werden?

  • Was passiert wenn dieser Wert ueberschritten wird? :D Habe eine Variable die dann auf einmal negativ wird obwohl immer nur 100000 addiert werden jede Sekunde


    OnPlayerDeath
    Ich vermute es liegt an dem String


    Weiterhin wird ein Object Destroyed dass unter Umstaenden nicht existiert, aber ich bezweifle dass das die Ursache fuer das Problem ist

  • Was passiert wenn dieser Wert ueberschritten wird? Habe eine Variable die dann auf einmal negativ wird obwohl immer nur 100000 addiert werden jede Sekunde

    Sehr gut beobachtet, genau das passiert. Die Variable wird negativ ^^



    PKills[killerid]+=1;

    Schau mal, bei so Sachen musst du erstmal prüfen, ob killerid auch wirklich eine spielerid ist.
    Stell dir vor, der Spieler stürzt eine Klippe herunter...der Klippe kannste schlecht einen Kill geben ^^


    Also prüfe:
    if(killerid != INVALID_PLAYER_ID) PKills[killerid]+=1;
    und das überall wo du killerid verwendest ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Vielen Dank schonmal dafuer, macht natuehrlich sinn :D
    Habe etwas gefunden, was eventuell hilft bei der Fehlersuche, ich werde jedoch daraus nicht schlau.


    Es werden in 4 Zonen Random Pickups erstellt mit meiner eigens erstellen Funktion GenerateRandomPickup



    In OnPlayerPickupPickup wird der Wert maxmoney um 1 reduziert, damit will ich verhindern dass mehr als 4000 Pickups spawnen und das Limit ueberschritten wird



    Timer dafuer werden in OnGameModeInit gesetzt

    C
    SetTimer("MoneyTeamGrey", MoneyDropTimer, true);
    	SetTimer("MoneyTeamBrown", MoneyDropTimer, true);
    	SetTimer("MoneyTeamYellow", MoneyDropTimer, true);
    	SetTimer("MoneyJunkyard", 1000, true);


    Hier mal MoneyTeamGrey und MoneyJunkyard


    MoneyDropTimer ist gleich 2500ms, MoneyJunkyard 1000ms, also muessten bei MoneyJunkyard ja schneller mehr Pickups spawnen.
    Was mich jedoch ueberrascht hat: Bei MoneyJunkyard sind maximal 1 oder 2 Pickups gespawnt (obwohl der Timer "kleiner" ist als die anderen), und bei den anderen bestimmt ueber 1000 Stueck! (Obwohl 2500ms)


    Wie kann ich ausserdem den Kram aus dem Profiler auswerten? Werde aus den Funktionsnamen nicht schlau.. (ok Problem geloest dank -d3)


    SCHLAU.png



    Weiterhin reicht, nachdem der Server nun 1 Stunde laeuft, schon 1 Linksklick im Auswahlbildschirm, und "Acks sent" ist innerhalb von einer Sekunde auf ueber 60000 :D
    update.png