AHK | Meldung/Overlay bei Betreten/Verlassen eines Bereiches


  • Hallo Brotfische,


    ich bin mal wieder auf eure Hilfe angewiesen. Wie ihr im folgenden Screen sehen könnt, habe ich einen bestimmten Bereich (grün) gegeben. Betritt/Verlässt man nun diesen Bereich, soll eine Meldung oder ein Overlay erscheinen. Jedoch weiß ich nicht, wie ich abfragen soll, ob sich der Spieler in diesen Bereich begibt oder wieder entfernt. Zu beachten ist, dass der komplette Bereich (Boden bis Himmel) dieser eingrenzenden Punkte gemeint ist! Ich verwende AutoHotKey und die SAMP-API (http://www.samp-api.net/)


    -------------------------------------------------------------------------------------------------------------------------------


    Die 4 Eckpunkte habe ich ebenfalls gegeben und besitzen folgende X & Y Koordinaten:



    Eckpunkt 1 => X: 2625.7 | Y: -1888.6
    Eckpunkt 2 => X: 2848.2 | Y: -1886.2
    Eckpunkt 3 => X: 2851.9 | Y: -1671.9
    Eckpunkt 4 => X: 2625.7 | Y: -1671.0


    -------------------------------------------------------------------------------------------------------------------------------


    Ich möchte es nicht mit IsPlayerInRageOfPoint lösen, da dies ein Kreisradius erzeugt und keinen viereckigen Bereich.


    Es wird ein Timer gesetzt (SetTimer, Bereich, 500) der checkt, ob sich der Spieler in diesen Bereich begibt oder wieder entfernt. Tritt der Spieler in diesen Bereich ein oder verlässt ihn, erscheint eine Meldung (AddChatMessage("Du hast den Bereich betreten") bzw. AddChatMessage("Du hast den Bereich verlassen")). Diese Meldung soll allerdings nur einmal erscheinen (beim Betreten oder Verlassen) und nicht gespammt werden. (Deswegen vielleicht eine Variable auf 1 und dann wieder auf 0 setzen lassen)


    Liebe Grüße
    Bookai

  • Du könntest aufbauen wie in PAWN, sprich mit einer leichten Abfrage.
    if(X >= MinX && X <= MaxX && Y >= MinY && Y <= MaxY)
    Dabei ist X und Y deine aktuelle Koordinate und MinX,MaxX,MinY und MaxY die Koordinaten die du oben bereits angegeben hast. Vielleicht kannst du damit was anfange. ;)

  • @Mencent:


    Bezieht sich das dann z.B. auf eine Fläche von Eckpunkt 1 zu Eckpunkt 2? Dann bräuchte ich in diesem Fall nur die X-Koordinaten (da die Y nahezu gleich sind) und eventuell die Z-Koordinaten, da diese ja die Höhe bestimmen?

  • Du kannst mit dieser Abfrage halt abfragen, ob du in dem Viereck zwischen den Eckpunkten 1,2,3 und 4 bist.
    Ich weiß jetzt nicht, wie man Abfragen in AHK erstellt, aber das würde dann am Ende so ungefähr aussehen:


    If (X >= 2625.7 && X <= 2851.9 && Y >= -1888.6 && Y <= -1671.0)


    Ich weiß nicht ob die Abfrage am Ende so passt, bzw. wie man in AHK die aktuelle Position (GetPlayerPos) ausliest, das solltest du aber eigentlich wissen. ;)


  • Soweit so gut, jetzt hab ich halt das Problem, dass die Meldung (beim Betreten/Verlassen des Bereichs) jede halbe Sekunde gespammt wird.
    Ich hab schon probiert immer eine Variable auf 1 zu stellen, wenn ich im Bereich bin und auf 0 zu stellen, wenn ich den Bereich verlasse. Hat allerdings nicht richtig funktioniert.



    SetTimer, Bereich, 500


    Bereich:
    GetPlayerPosition(xS, yS, zS)
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0)
    {
    AddChatMessage("Du hast den Bereich betreten!")
    }
    else
    {
    AddChatMessage("Du hast den Bereich verlassen!")
    }
    return


    Hat von euch noch jemand eine Idee?

  • Wie sieht dein Code denn aus, wenn du eine Variable auf 1 gesetzt hast?



  • SetTimer, Bereich, 500
    bereich := 0


    Bereich:
    GetPlayerPosition(xS, yS, zS)
    if(bereich = 0)
    {
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0)
    {
    AddChatMessage("Du hast den Bereich betreten!")
    bereich := 1
    }
    }
    if(bereich = 1)
    {
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0) ;Wenn diese Bedingung nicht mehr zutrifft, ...
    {
    AddChatMessage("Du hast den Bereich verlassen!")
    bereich := 0
    }
    }
    return


    Beim Betreten bekomme ich die erste Meldung (1x) & die Variable wird erfolgreich auf 1 gesetzt.
    Doch wie kehre ich die Abfrage so um, dass er reagiert, wenn ich mich aus diesem Bereich wieder entferne?
    Denn dann würde die Variable wieder auf 0 gesetzt werden und es wird gewartet bis ich mich diesem Bereich wieder nähere.


    @Mencent:

    2 Mal editiert, zuletzt von Bookai ()

  • Funktioniert das so?
    SetTimer, Bereich, 500
    bereich := 0


    Bereich:
    GetPlayerPosition(xS,yS,zS)
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0)
    {
    if(bereich = 1)return
    AddChatMessage("Du hast den Bereich betreten!")
    bereich := 1
    }
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0)
    {
    if(bereich = 0)return
    AddChatMessage("Du hast den Bereich verlassen!")
    bereich := 0
    }
    Ich bin mir nicht sicher ob man hinter der Abfrage einfach ein return verwenden kann, aber ich denke schon.

  • Beide If-Abfragen beziehen sich aber auf die Abfrage, ob der Spieler in den Bereich eintretet. Ich bräuchte ja nut die richtige Formulierung der If-Abfrage, wenn er es wieder verlässt...

    Ist doch logisch ?:D Musst doch keine abfrage mehr machen ein simples "else" reicht da völlig aus die erste abfrage frägt ob er drin ist und das else wenn nicht :D
    SetTimer, Bereich, 500
    bereich := false


    Bereich:
    GetPlayerPosition(xS,yS,zS)
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0)
    {
    if(bereich)return
    AddChatMessage("Du hast den Bereich betreten!")
    bereich := true
    }
    else
    {
    if(!bereich)return
    AddChatMessage("Du hast den Bereich verlassen!")
    bereich := false }

  • Naja die Meldung kommt aber dann immer, wenn ich draußen bin. Diese soll es aber erst dann geben, wenn ich zuvor in dem Bereich war.


    Sprich: erstes mal Betreten = Meldung, dann Verlassen = Meldung, wieder Betreten = Meldung, ...


    Und ich bin mir nicht sicher ob !bereich auch in AHK funktioniert.

  • Naja die Meldung kommt aber dann immer, wenn ich draußen bin. Diese soll es aber erst dann geben, wenn ich zuvor in dem Bereich war.


    Sprich: erstes mal Betreten = Meldung, dann Verlassen = Meldung, wieder Betreten = Meldung, ...


    Und ich bin mir nicht sicher ob !bereich auch in AHK funktioniert.

    Glaub mir !funktioniert


    SetTimer, Bereich, 500bereich := false


    Bereich:
    GetPlayerPosition(xS,yS,zS)
    if(xS >= 2625.7 && xS <= 2851.9 && yS >= -1888.6 && yS <= -1671.0 && !bereich) ; Wenn er drin ist und bereich auf false ist
    {
    AddChatMessage("Du hast den Bereich betreten!")
    bereich := true ; bereich wird auf true
    }
    else if(bereich) ; wenn er NICHT in dem oben angegeben Quadrat ist und bereich auf true ist
    {
    AddChatMessage("Du hast den Bereich verlassen!") bereich := false ; bereich wird auf false gesetzt}


    Es kann natürlich sein das das die Koordinaten von dem oben angegebenen Quadrat falsch gesetzt sind.

  • Einen Versuch hätte ich jetzt noch.


    Falls das nicht funktioniert, dann weiß ich auch nicht mehr.

  • @Mencent:


    Vielen Dank, es hat funktioniert.
    Aber ganz verstanden hab ich es noch nicht...


    Die Variable 'bereich' wird anfangs auf false gesetzt, bei dem Timer wird abgefragt ob er im Bereich ist oder nicht. Ist dies der Fall wird noch geprüft ob (!bereich) gilt, aber das '!' macht den bereich doch zu true? (in der Abfrage)

  • Nein.
    Das ! Ist die kurz form für
    If(bereich == 0)
    Das heißt das ! Fragt ab ob bereich false (=0) ist.