IsPlayerInArea funktioniert nicht

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,
    das IsPlayerInArea funktioniert bei mir merkwürdigerweise nicht. Hier die Coords wie ich sie abgespeichert habe:
    AddStaticVehicle(411,1015.2937,-940.8803,41.9224,97.1551,1,1);
    AddStaticVehicle(411,994.0790,-932.8064,41.9440,95.4403,1,1);
    Und dies ist die funktion:

    stock IsPlayerInArea(playerid, Float:minx, Float:maxx, Float:miny, Float:maxy) {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    if (x > minx && x < maxx && y > miny && y < maxy) return true;
    return false;
    }

    Möchte ich nun mittels

    IsPlayerInArea(playerid, 1015.2937, 994.0790, -940.8803, -932.8064)

    abfragen, ob der Spieler nun in genau diesen Coords steht kommt der Debug "Spieler steht nicht an der Position".(Zum Debuggen hab ich das reingeschrieben mit printf wird es ausgegeben.)
    Entweder ich bin zu doof oder irgendwas stimmt da nicht, daher würde ich mich freuen, wenn mir jemand helfen könnte. Vielen Dank.

  • Schau dir die Zeile an:

    if (x > minx && x < maxx && y > miny && y < maxy) return true;


    Wenn du als äußere Begrenzung folgende Koordinate hast: 1015.2937
    Aber folgende Koordinate überprüfen willst: 1015.2937
    siehst du, dass beide gleich groß sind.


    Da die Funktion aber nur prüft, ob die Koordinate größer/kleiner als die Begrenzung ist, wird false zurückgegeben.


    <= bzw >= sind die Operatoren, die du in der IsPlayerInArea-Funktion benutzen müsstest, damit true zurückgegeben wird. ;)

  • Ok, so sieht der Code aus:

    stock IsPlayerInArea(playerid, Float:minx, Float:maxx, Float:miny, Float:maxy) {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    if (x >= minx && x <= maxx && y >= miny && y <= maxy) return true;
    return false;
    }

    Ich hab das ganze mal geprintet mit:

    printf("Area: %f, %f, %f, %f",minX, maxX, minY, maxY);
    printf("Spieler: %f, %f",x, y);


    Das kam raus:

    Code
    Area: 1015.293701, 994.078979, -940.880310, -932.806396
    Spieler:	1008.707153, -936.024475


    Wie man ganz unschwer erkennen kann ist bei Spieler die erste Coord die X und die 2. das Y.
    Bei der Area sind die ersten beiden X und die letzten beiden Y. Wenn man richtig hinschaut sieht man, dass der Spieler eigentlich drin steht. Das wird aber nicht angezeigt und gibt mir false zurück.


  • bei den Area Teilen, oder auch bei GangZones bietet sich das hier sehr gut an:


    http://forum.sa-mp.com/showthread.php?t=372


    einfach gewünsche Map stelle auswählen, und er gibt dir Automatisch die min & max x und y Achsen aus. einfach mal probieren..

    Ich möchte sehr kleine Gebiete festlegen, das Tool ist mir zu "grob".



    Area: 994.078979, 1015.293701, -940.880310, -932.806396
    Spieler:1002.087829, -939.329650


    Versuchs mal so.


    Probiert:

    Area: 994.078979, 1015.293701, -940.880310, -932.806396
    Spieler: 1008.535339, -939.449829

    Wieder ein false...

  • Das kann aber nicht sein, ich habe grad folgenden Pseudocode benutzt und mir wurde ein true zurückgegeben...


    stock IsPlayerInArea(playerid, Float:minx, Float:maxx, Float:miny, Float:maxy) {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    x=1008.535339;
    y=-939.449829;
    if(x>minx) print("x>minx");
    if(x<maxx) print("x<maxx");
    if(y>miny) print("y>miny");
    if(y<maxy) print("y<maxy");
    if (x > minx && x < maxx && y > miny && y < maxy) return true;
    return false;
    }


    printf("%i",IsPlayerInArea(0,994.078979, 1015.293701, -940.880310, -932.806396));


    [14:39:41] x>minx
    [14:39:41] x<maxx
    [14:39:41] y>miny
    [14:39:41] y<maxy
    [14:39:41] 1



    Sicher, dass dein Problem an der Funktion liegt?