Abfrage in OnPlayerDeath wird abgebrochen. Fehler unbekannt

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
  • Hello friends.


    Ich hab mal ne Problem aber ich seh den Fehler darin nicht, vllt ist er so einfach, dass ich ihn übersehe.
    Vllt seht ihr den Fehler ja.


    Hier erstmal der Codeauszug aus OnPlayerDeath


    if(playerid == einnahmeleiter)
    {
    KillTimer(einnahmetimer);
    print("KillTimer");
    einnahmetimer = -1;
    print("Einnahmetimer -1");

    SendClientMessageToAll(tuerkis,"Die Einnahme des Ladens ist fehlgeschlagen. Der Einnahmeleiter wurde getötet");
    print("Nachricht fehlgeschlagen");
    GangZoneHideForAll(zone[wirdeingenommen]);
    print("GangZoneHide");


    if(gTeam[einnahmeleiter] == 0)
    {
    GangZoneShowForAll(zone[wirdeingenommen],zonenfarbepolice);
    print("Show wenn Mafia");
    }
    else
    {
    GangZoneShowForAll(zone[wirdeingenommen],zonenfarbemafia);
    print("Show wenn Police");
    }

    TextDrawHideForAll(einnahmetext);
    print("Einnahmedraw hide for all");


    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    print("loop start");
    print("Einnahmetimer -1");
    if(IsPlayerInRangeOfPoint(i,50.0,zonen[wirdeingenommen][pickx],zonen[wirdeingenommen][picky],zonen[wirdeingenommen][pickz]))
    {
    print("Ist in 50 Meter nähe");
    if(gTeam[i] != gTeam[einnahmeleiter])
    {
    print("gTeam != ggteam einnahmeleiter");
    SendClientMessage(i,weiß,"Du erhälst 2 Punkte für das Verteidigen des Ladens");
    print("Zwei Punkte bekommen");
    SetPVarInt(i,PUNKTE_KEY,GetPVarInt(i,PUNKTE_KEY)+2);
    print("Punkte ändern");
    }
    }
    }

    if(gTeam[killerid] != gTeam[einnahmeleiter])
    {
    print("Gtaem killer != gTeam einnahmeleiter");
    SendClientMessage(killerid,weiß,"Du erhälst 3 Punkte für das Töten des Einnahmeleiters");
    print("Erhälst 3 Punkte");
    SetPVarInt(killerid,PUNKTE_KEY,GetPVarInt(killerid,PUNKTE_KEY)+3);
    print("Punkte ändern 2");
    }
    else
    {
    print("gteam killer == gteam leiter");
    SendClientMessage(playerid,rot,"Fehler: Du erhälst keine 3 Punkte für das Töten des Einnahmeleiters da er in deinem Team war");
    }

    einnahmeleiter = -1;
    print("Einnahmeleiter -1");
    wirdeingenommen = -1;
    print("wirdeingenommen -1");

    }


    Ich hab hier die Logeinträge.



    So, das heißt also, dass es genau bis zur Schleife läuft.


    Allerdings wird die letzte Schleife nicht mehr ausgeführt und auch die Wertänderungen der zwei Variablen am unteren Ende nicht.
    Wisst ihr warum ?

  • Anhand der Debug Infos bin ich mir jetzt nicht ganz sicher bis wo der Code läuft,aber ein Problem müsste killerid sein.


    Angenommen man hat Selbstmord begangenist die killerid 0xFFFF oder 65335.


    if(gTeam[killerid] != gTeam[einnahmeleiter]) Spätestens dort hättest du das Limit des Arrays deutlich überschritten und der Code stoppt.
    Überprüf mal via Debug Notes was der wert hinter killerid ist,bevor der Check gemacht wird.


    Muss ja zugeben,teilweise hab ich selber dass Problem.Kommt schon mal vor,dass man vergisst abzufragen ob "killerid == INVALID_PLAYER_ID" ist ;).

  • Ja genau, ich teste es immer mit selfkill.


    Zitat


    [18:22:25] Killerid vor Abfrage = 65535
    [18:22:25] [death] Hagi_Lorma died 255


    Also muss der Code dann so aussehen ?



    if(gTeam[killerid] != gTeam[einnahmeleiter] && killerid != INVALID_PLAYER_ID)

  • Das solltest du doch schon alleine schaffen.
    Überleg doch mal,was Ich geschrieben haben.
    Killerid ist also 65535
    if(gTeam[65535] != gTeam[einnahmeleiter] && 65535 != 65535)
    Es wird doch der Code schon crashen bei der Abfrage mit gTeam,da es außerhalb der Array Grenzen ist.


    Es muss also vorher geprüft werden,ob die killerid INVALID_PLAYER_ID ist.

    if(killerid != INVALID_PLAYER_ID) {
    // Killer ist ein richtiger Spieler!
    // Hier ist also schon sicher,dass der Code wegen der killerid nicht crashen wird
    // da die killerid nicht größer als MAX_PLAYERS sein wird oder kleiner als 0.
    // Damit wird schon mal nicht irgendwo auf's Array zugegriffen,wo es nicht möglich ist
    if( gTeam[killerid] != gTeam[einnahmeleiter] ) {

    }
    }