AreaCheck - Problem

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
  • code:
    public isPlayerInArea()
    {
    new Float:X, Float:Y, Float:Z; //We use this to store player position
    for(new i=0; i < MAX_PLAYERS; i++) //This line defines a name for all player, the name is "i"
    {
    GetPlayerPos(i, X, Y, Z); //Here we are storing the player position on the variables X, Y, and Z defined previously
    if (X <= 268 && X >= 240 && Y <= -1331 && Y >= -1407)
    /* This line is the important one!. Here, is where you change those numbers, by the ones
    you get from the /pos command. As you can see, those coordinates, are only the X and Y ones, the Z
    doesnt matter*/
    {
    SendClientMessageToAll(0xDEEE20FF, "IM SPERRGEBIET!"); // Ändern!
    }
    }
    }


    Problem: Das Script an sich funktioniert, bloß nicht richtig. Ich will eine Villa samt Garten drumherum als Mafia-Gebiet kennzeichnen. Dieses Script oben aus der amerikanischen Wiki scheint mir aber nur eine art Dreick einzuzäunen.


    Skizze:


    Schwarz: Mafiagebiet Gesamt
    Blau: Mein erster Versuch mit den Koordinaten:
    x: 296 y: -1358 z: 53
    x: 205 y: -1383 z: 53
    Gelb: Zweiter Versuch mit den Koordinaten:
    x: 268 y: -1331 z: 53
    x: 240 y: -1407 z: 53


    Nun:
    Wie schaffe ich es, das gesamte Quadrat einzuschließen?
    Muss ich dazu noch 2 andere Koordinaten in die if-Abfrage einbauen?


    Problem 2: Oben im Script steht als Kommentar Ändern!!
    Ich hätte es gerne so, das so lange wie man in diesem eingegrenzten Gebiet ist im HUD die Nachricht angezeigt wird. Sie soll also so lange anbleiben wie man drin ist.


    Liebe Grüße,
    Danny


    PS: Link zum Tutorial: KLICK

    Einmal editiert, zuletzt von stixx ()

  • So ein Gebiet besteht immer aus der kleinsten x/y-Koordinate für links unten und der größsten x/y-Koordinate für rechts oben.


    Wenn ich mir deine Zahlen so anschaue müsste es dann so ausschauen:


    if ((X <= 296 && X) >= (205 && Y) <= (-1331 && Y >= -1407))


    Um Problem 2 zu lösen kannst du dir so eine Art "eigene Callbacks" bauen.


    Dazu erstmal folgende Funktionen anlegen;


    stock OnPlayerEnterArea (areaid) {
    return 1;
    }


    stock OnPlayerLeaveArea (areaid) {
    return 1;
    }


    Als nächstes brauchst du einen Timer, der ständig ermittelt in welchem Gebiet sich der Spieler befindet. Das Gebiet speicherst du dann in einer globalen Variable ab (eine Nummer für jedes Gebiet).


    Im nächsten Timerdurchlauf ermittelst du wieder das Gebiet, in dem sich der Spieler befindet. Unterscheidet sich die neu ermittelte Gebiets-ID von der gespeicherten, rufst du auf jeden Fall erstmal OnPlayerLeaveArea mit der gespeicherten ID auf.


    Wenn sich der Spieler in einem anderen Gebiet befindet, also nicht ausserhalb von allen Gebieten die du hast, dann rufst du noch zusätzlich OnPlayerEnterArea auf, mit der neu ermittelten Gebiet-ID.


    Nun kannst du bequem in die neuen Funktionen deinen Code reinschreiben, um z.B: deinen Text anzuzeigen.

    Intel Xeon W3690 Hexacore @ 4.5 GHz - 48GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1 @ P6T WS Pro BIOS

    Mainboard 12 Jahre, CPU 10 Jahre alt - old but gold!

  • Nee leider nicht.
    Jetzt zeigt er mir das Sperrgebiet an Stellen an, wo es niemals sein kann. Zum Beispiel auf der Straße vor dem Haus und bei dem Haus direkt dahinter..
    Macht es in dem Fall nicht mehr Sinn, mit dem Radius zu einem bestimmten Punkt zu arbeiten?


    Wie kann ich den Radius denn etwa abschätzen um eine, man beachte, quadratische Fläche einzuzäunen?
    Oder gibt es noch weitere Lösungen?