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

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    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

    Quellcode

    1. [17:53:50] Number of vehicle models: 144
    2. [17:53:50] Player 0 reports client version: 0.3.7
    3. [17:53:50] Player 1 reports client version: 0.3.7
    4. [17:53:50] Player 2 reports client version: 0.3.7
    5. [17:56:03] [kill] Knogle killed Horst_Josef Shotgun
    6. [17:56:04] Distance to closest bed: 1.679114, Index: 1
    7. [17:57:41] [death] Horst_Josef died 54
    8. [17:57:57] [death] Horst_Josef died 54
    9. [17:58:25] Distance to closest bed: 4.402647, Index: 2
    10. [17:59:41] [death] Horst_Josef died 54
    11. [18:00:28] 0 spent 25000 to purchase weapon 31
    12. [18:00:33] 0 spent 15500 to purchase weapon 27
    13. [18:00:36] 0 spent 25000 to purchase weapon 34
    14. [18:00:43] 0 spent 5000 to purchase weapon 28
    15. [18:00:44] 0 spent 5000 to purchase weapon 28
    16. [18:01:48] [warning] client exceeded 'ackslimit' 89.0.xx.xx:64020 (3981) Limit: 3000/sec
    17. [18:01:58] [part] Horst_Josef has left the server (2:0)
    18. [18:02:00] [warning] client exceeded 'ackslimit' 89.0.xx.xx:51250 (3123) Limit: 3000/sec
    19. [18:02:10] [part] G3rry_Kin9 has left the server (1:0)
    20. [18:02:10] [chat] [Knogle]: t
    21. [18:02:37] [part] Knogle has left the server (0:1)
    Alles anzeigen


    Hier der Link zum Quellcode:

    pastebin.com/16cKHfUe
  • 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

    C-Quellcode

    1. public OnPlayerUpdate(playerid)
    2. {
    3. if(!IsPlayerConnected(playerid)) return 0;
    4. if(IsPlayerNPC(playerid)) return 1;
    5. // changing teams by inputs
    6. if( !gPlayerHasTeamSelected[playerid] &&
    7. GetPlayerState(playerid) == PLAYER_STATE_SPECTATING ) {
    8. ClassSel_HandleTeamSelection(playerid);
    9. return 1;
    10. }
    11. return 1;
    12. }
    Alles anzeigen

    Crashdetect sagt jedoch vor dem joinen:


    C-Quellcode

    1. [10:27:21] [debug] Run time error 4: "Array index out of bounds"
    2. [10:27:21] [debug] Attempted to read/write array element at index 65535 in array of size 32
    3. [10:27:21] [debug] AMX backtrace:
    4. [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

    C-Quellcode

    1. public OnPlayerDeath(playerid, killerid, reason)
    2. {
    3. PDeaths[playerid]+=1;
    4. PKills[killerid]+=1;
    5. IsSpecing[playerid] = 0;
    6. IsBeingSpeced[playerid]=0;
    7. PStealth[playerid]=0;
    8. new pname[MAX_PLAYER_NAME];
    9. GetPlayerName(playerid, pname, sizeof(pname));
    10. new moneyplayerid[32];
    11. new moneykillerid[32];
    12. new matediedstringgrey[128];
    13. new matediedstringred[128];
    14. new matediedstringblue[128];
    15. PBombID[playerid]=0;
    16. PBomb[playerid]=0;
    17. HideMenuForPlayer(ammunation,playerid);
    18. HideMenuForPlayer(pistols,playerid);
    19. HideMenuForPlayer(microsmg,playerid);
    20. HideMenuForPlayer(shotungs,playerid);
    21. HideMenuForPlayer(items,playerid);
    22. HideMenuForPlayer(smg,playerid);
    23. HideMenuForPlayer(rifles,playerid);
    24. HideMenuForPlayer(assaultrifle,playerid);
    25. HideMenuForPlayer(Grenades,playerid);
    26. HideMenuForPlayer(melee,playerid);
    27. HideMenuForPlayer(special,playerid);
    28. HideMenuForPlayer(shopmenu,playerid);
    29. spectatekillerid=killerid;
    30. DestroyObject(BombObject[playerid]);
    31. if(GetPlayerWeapon(playerid) == 16)
    32. {
    33. new Float:x, Float:y, Float:z;
    34. GetPlayerPos(playerid,x,y,z);
    35. CreateExplosion(x,y,z,7,10);
    36. CreateExplosion(x,y,z,9,10);
    37. }
    38. PSkill[playerid]=0;
    39. PBomb[playerid]=0;
    40. if(bedstateviolet != 0 && gPlayerTeamSelection[playerid] == TEAM_VIOLET)
    41. {
    42. format(matediedstringgrey,sizeof(matediedstringgrey),"SERVER: %s (%d) has been killed, watch out! %d players left in Team {610D96}VIOLET",pname,playerid,GetTeamCount(TEAM_VIOLET)-1);
    43. SendClientMessageToAll(COLOR_WHITE,matediedstringgrey);
    44. }
    45. if(bedstateyellow != 0 && gPlayerTeamSelection[playerid] == TEAM_YELLOW)
    46. {
    47. format(matediedstringred,sizeof(matediedstringred),"SERVER: %s (%d) has been killed, watch out! %d players left in Team {FFFF00}YELLOW",pname,playerid,GetTeamCount(TEAM_YELLOW)-1);
    48. SendClientMessageToAll(COLOR_WHITE,matediedstringred);
    49. }
    50. if(bedstatebrown != 0 && gPlayerTeamSelection[playerid] == TEAM_BROWN)
    51. {
    52. format(matediedstringblue,sizeof(matediedstringblue),"SERVER: %s (%d) has been killed, watch out! %d players left in Team {8B4513}BROWN",pname,playerid,GetTeamCount(TEAM_BROWN)-1);
    53. SendClientMessageToAll(COLOR_WHITE,matediedstringblue);
    54. }
    55. new playercash;
    56. playercash = GetPlayerMoney(playerid);
    57. SendDeathMessage(killerid, playerid, reason); // Shows the kill in the killfeed
    58. gPlayerHasTeamSelected[playerid] = 0;
    59. TextDrawHideForPlayer(playerid,txtTimeDisp);
    60. playercash = GetPlayerMoney(playerid);
    61. ResetPlayerMoney(playerid);
    62. format(moneyplayerid,sizeof(moneyplayerid), "~r~ -%d~y~$",playercash);
    63. GameTextForPlayer(playerid,moneyplayerid,1000,1);
    64. GivePlayerMoney(killerid, playercash);
    65. LastMoney[playerid]=playercash;
    66. if(killerid != playerid)
    67. {
    68. format(moneykillerid,sizeof(moneykillerid), "~g~ %d~y~$",playercash);
    69. GameTextForPlayer(killerid,moneykillerid,1000,1);
    70. }
    71. ResetPlayerMoney(playerid);
    72. PKills[playerid] += 1;
    73. return 1;
    74. }
    Alles anzeigen
    Weiterhin wird ein Object Destroyed dass unter Umstaenden nicht existiert, aber ich bezweifle dass das die Ursache fuer das Problem ist
  • Sub Royal schrieb:

    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 ^^


    Sub Royal schrieb:

    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:

    PAWN-Quellcode

    1. if(killerid != INVALID_PLAYER_ID) PKills[killerid]+=1;

    und das überall wo du killerid verwendest ^^


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • 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


    C-Quellcode

    1. public GenerateRandomPickup(modelid,type,Float:x_max,Float:x_min,Float:y_max,Float:y_min,Float:z_max,Float:z_min,virtualworld)
    2. {
    3. if(maxmoney < 4000)
    4. {
    5. moneyval= moneyval+1000;
    6. new Float:rx1=((frandom((floatabs(x_max-x_min)))+x_min));
    7. new Float:ry2=((frandom((floatabs(y_max-y_min)))+y_min));
    8. new Float:rz3=((frandom(floatabs(z_max-z_min))+z_min));
    9. maxmoney = maxmoney +1;
    10. CreatePickup(modelid,type,rx1,ry2,rz3,virtualworld);
    11. }
    12. }
    Alles anzeigen
    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-Quellcode

    1. SetTimer("MoneyTeamGrey", MoneyDropTimer, true);
    2. SetTimer("MoneyTeamBrown", MoneyDropTimer, true);
    3. SetTimer("MoneyTeamYellow", MoneyDropTimer, true);
    4. SetTimer("MoneyJunkyard", 1000, true);

    Hier mal MoneyTeamGrey und MoneyJunkyard

    C-Quellcode

    1. public MoneyTeamGrey()
    2. {
    3. GenerateRandomPickup(1212,19,-2335.7568,-2340.2905,-2023.9417,-2027.9861,270.0450,269.2450,0);
    4. }
    5. //----------------------------------------------------------
    6. public MoneyJunkyard()
    7. {
    8. totaltime = totaltime+1;
    9. GenerateRandomPickup(1212,19,-2303.8931, -2337.4104, -1607.2054,-1644.9517,483.7031,482.9031,0);
    10. }
    Alles anzeigen
    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)




    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
    Bilder
    • SCHLAU.png

      49,26 kB, 1.163×863, 16 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Sub Royal ()