[AHK] Probleme mit Loop + TextCreate + WorldToScreen

  • Beitrag von Renz ()

    Dieser Beitrag wurde von dennismitzwein aus folgendem Grund gelöscht: Spam ().
  • Beitrag von Lugi ()

    Dieser Beitrag wurde von dennismitzwein aus folgendem Grund gelöscht: Bezug entfernt ().
  • Hallo liebe Community


    Ich habe mich da an etwas versucht, was eher eine spontane Idee war. Ich habe also den Scriptschnipsel auf ein paar Minuten schnell hingeklatscht, nun hänge ich aber seit Tagen an der Problemsuche. Villeicht kann mir hier einer helfen.


    Ich möchte mir mit diesem Script einige Positionen auf der Map zeigen lassen. Diese Positionen werden von mir vorher mit einem Textbind in eine TXT-Datei geschrieben. Diese Liste wird wärend dem Spielverlauf ständig erweitert, desswegen lege ich keine festen Positionen direkt im Script fest.


    Das Problem ist nun, dass die Texte, also das rote X das mit TextCreate erstellt wurde, dauerhaft wild blinkt, sobald mehrere Koordinaten in der TXT-Datei stehen. Das zuletzt hinzugefügte blinkt aber nicht.


    So sieht mein Script dafür derzeit aus:



  • Ja okey... aber wie soll man das anders umsetzen?
    MIr fällt nur ein, für jede Koordinate eine ID festlegen, dann ist das ganze aber nicht mehr dynamisch.

    Ich würde es so machen, dass beim Starten deines Scriptes die Datei mit den Positionen ausgelesen wird.
    Jede Position wird dann mit einer fortlaufenden ID und einem Status versehen, in ein Objekt eingefügt und dies wiederum in ein Array abspeichern.
    Dieser Array wird deine Grundlage für dein Timer sein.
    Einfach mit einer for-Schleife den Array durchlaufen und bei jedem wo der Status auf 0 ist, benutzt du TextCreate und setzt den Status auf 1.
    Wenn der Status schon auf 1 ist, einfach die Position updaten.



    MfG

  • Ich würde es so machen, dass beim Starten deines Scriptes die Datei mit den Positionen ausgelesen wird.
    Jede Position wird dann mit einer fortlaufenden ID und einem Status versehen


    Das hab ich jetzt mal folgendermaßen umgesetzt:

    Code
    Loop, read, Datei.txt
    {
    StringSplit, Koordinaten%a_index%, A_LoopReadLine, `,
    Overlay%a_index% := -1
    }
    Settimer, Timer, 1


    Wie ich den Rest umsetzen soll, hab ich keine Ahnung. Verstehe das auch nicht so ganz was du damit meinst:

    in ein Objekt eingefügt und dies wiederum in ein Array abspeichern.

  • Das hab ich jetzt mal folgendermaßen umgesetzt:

    Code
    Loop, read, Datei.txt
    {
    StringSplit, Koordinaten%a_index%, A_LoopReadLine, `,
    Overlay%a_index% := -1
    }
    Settimer, Timer, 1


    Wie ich den Rest umsetzen soll, hab ich keine Ahnung. Verstehe das auch nicht so ganz was du damit meinst:

    Schick bitte mal den Inhalt mit der Datei.txt, mit einer Position.



    MfG

  • Code
    added, 1769.837524, -1914.490845, 13.557945
    added, 1332.273682, -1722.651489, 13.546875
    Zitat von Dewey

    in ein Objekt eingefügt und dies wiederum in ein Array abspeichern. Dieser Array wird deine Grundlage für dein Timer sein. Einfach mit einer for-Schleife den Array durchlaufen

    Den Teil hab ich nicht verstanden, kannst du mir das anders erklären oder ein Scriptbeispiel geben?

  • Code
    added, 1769.837524, -1914.490845, 13.557945
    added, 1332.273682, -1722.651489, 13.546875

    Den Teil hab ich nicht verstanden, kannst du mir das anders erklären oder ein Scriptbeispiel geben?

    Sieht aktuell so aus:


    Der Text von einer Position wird erstellt.
    Buggt noch. Mache morgen weiter.



    MfG

  • Der Text soll ja nur ein X sein um die Position zu markieren und mit WorldToScreen soll sich dieses X mitdrehen wenn ich in in der Nähe bin, also mit IsPlayerInRangeOfPoint.



    Zitat von Dewey

    Buggt noch. Mache morgen weiter.

    Gibts schon was neues?

  • Der Text soll ja nur ein X sein um die Position zu markieren und mit WorldToScreen soll sich dieses X mitdrehen wenn ich in in der Nähe bin, also mit IsPlayerInRangeOfPoint.



    Gibts schon was neues?

    Ich bin leider unter der Woche nur kurz Home. Bin tagsüber in der Berufsschule.
    Der Fehler wird mit Sicherheit an der Variable "Position_Text_%Position_Count%" liegen.
    Entweder wird die falsch erstellt/gespeichert. Habe keine Zeit das am PC zu testen, kann mir nur den Quellcode anschauen.
    Vielleicht kann ja jemand anderes helfen.



    MfG

  • Beim Start des Scriptes klappt das erstellen des Overlays nur manchmal. Auserdem verschiebt sich das Overlay nicht wenn ich mich bewege, liegt wohl daran das die Funktion WorldToScreen fehlende Parameter hat und sobald ich eine zweite Position speichere hat es die selbe OverlayID.


    Und es verschwindet auch nicht wenn ich mich von der Position entferne, da ja auch das IsPlayerInRangeOfPoint fehlt.


    Ganz komisch ist auch, wenn ich mich einmal um 180 Grad drehe wird das Overlay dort wie gespiegelt angezeigt.


    @Dewey:
    Ich hab alles mögliche versucht, aber dein Script überfordert mich. Kannst du da nochmal drüberschauen und nach Fehlern suchen? Wäre nett.

  • Ich hab wieder ein bisschen mehr Zeit und Motivation daran zu arbeiten.
    Werde allerspätestens nächstes Wochenende bestimmt damit fertig sein.


    EDIT:
    Hat doch weniger Zeit in Anspruch genommen, als gedacht. So sieht es jetzt aus:

    Kannst meine Koordinaten nehmen.
    Wenn du das Script startest und die Taste Numpad0 drückst, sollte eigentlich eine neue Position erstellt werden.
    Alle diese Positionen hab ich auf dem Server wo du spielst (Another-Life) am Neulingsspawn getestet.
    Der Radius, wann du einen Text siehst, ist in der Variable "Radius" festgelegt.


    P.S: Musste die Funktion SetParam rausnehmen, weil die Parameter zensiert werden.
    @seegras oder ein anderes Teammitglied, warum muss ich das:

    wegen dem hier zensieren?:



    Einfach nachfragen, wenn etwas unverständlich ist, oder du Probleme bei irgendwas hast.



    MfG

    Einmal editiert, zuletzt von dewey ()

  • Folgende Probleme hab ich noch:


    • Du schreibst im Code SetParam("use_window", "GTA:SA:MP") und im Screenshot unten schreibst du nur window statt use_window. Was ist denn nun korrekt?
    • Beim ausführen des Scripts erhalte ich die Fehlermeldung ==> Too few parameters passed to function. Specifically: worldToScreen(XPOS, YPOS, ZPOS). In der API die ich verwende wäre die Funktion korrekt aufgebaut folgendermaßen WorldToScreen(XPos,YPos,ZPos, x, y). Ich gehe mal davon aus, dass die beiden fehlenden Parameter px1 und px2 sein werden, liege ich da richtig?
    • Im Spiel ist garnichts zu sehen, obwohl ich deine Koordinaten in die Positions.ini kopiert habe. Den Radius hab ich auch schon vergrößert, aber es wird einfach keine Position angezeigt. Das Script funktioniert aber, denn die NumPad0 funktioniert, aber sonst wird nichts angezeigt.


    Und eine kleine Frage hab ich noch, welche nun eigentlich völlig unabhängig von diesem Script ist:
    Die API-Funktion IfIsPlayerInRangeOfPoint nutzt ja eine Range, was also eine Distanz zu einem Punkt bedeutet. Das bedeutet doch es müsste theoretisch möglich sein, sich die Distanz zu einem Punkt auch einfach als Zahl ausgeben zu lassen. Egal wie.. ich möchte die Distanz zu einem beliebigen Punkt nur einfach als Zahl ausgeben.

  • Folgende Probleme hab ich noch:


    • Du schreibst im Code SetParam("use_window", "GTA:SA:MP") und im Screenshot unten schreibst du nur window statt use_window. Was ist denn nun korrekt?
    • Beim ausführen des Scripts erhalte ich die Fehlermeldung ==> Too few parameters passed to function. Specifically: worldToScreen(XPOS, YPOS, ZPOS). In der API die ich verwende wäre die Funktion korrekt aufgebaut folgendermaßen WorldToScreen(XPos,YPos,ZPos, x, y). Ich gehe mal davon aus, dass die beiden fehlenden Parameter px1 und px2 sein werden, liege ich da richtig?
    • Im Spiel ist garnichts zu sehen, obwohl ich deine Koordinaten in die Positions.ini kopiert habe. Den Radius hab ich auch schon vergrößert, aber es wird einfach keine Position angezeigt. Das Script funktioniert aber, denn die NumPad0 funktioniert, aber sonst wird nichts angezeigt.


    Und eine kleine Frage hab ich noch, welche nun eigentlich völlig unabhängig von diesem Script ist:
    Die API-Funktion IfIsPlayerInRangeOfPoint nutzt ja eine Range, was also eine Distanz zu einem Punkt bedeutet. Das bedeutet doch es müsste theoretisch möglich sein, sich die Distanz zu einem Punkt auch einfach als Zahl ausgeben zu lassen. Egal wie.. ich möchte die Distanz zu einem beliebigen Punkt nur einfach als Zahl ausgeben.

    Du könntest ja die IsPlayerInRangeOfPoint Funktion einfach editieren. Allerdings bringt die SAMP UDF auch die Funktion getDist mit, welche die Distanz zwischen zwei Punkten (Parameter als Float-Arrays) im dreidimensionalen Raum berechnet.

  • Folgende Probleme hab ich noch:


    • Du schreibst im Code SetParam("use_window", "GTA:SA:MP") und im Screenshot unten schreibst du nur window statt use_window. Was ist denn nun korrekt?
    • Beim ausführen des Scripts erhalte ich die Fehlermeldung ==> Too few parameters passed to function. Specifically: worldToScreen(XPOS, YPOS, ZPOS). In der API die ich verwende wäre die Funktion korrekt aufgebaut folgendermaßen WorldToScreen(XPos,YPos,ZPos, x, y). Ich gehe mal davon aus, dass die beiden fehlenden Parameter px1 und px2 sein werden, liege ich da richtig?
    • Im Spiel ist garnichts zu sehen, obwohl ich deine Koordinaten in die Positions.ini kopiert habe. Den Radius hab ich auch schon vergrößert, aber es wird einfach keine Position angezeigt. Das Script funktioniert aber, denn die NumPad0 funktioniert, aber sonst wird nichts angezeigt.


    Und eine kleine Frage hab ich noch, welche nun eigentlich völlig unabhängig von diesem Script ist:
    Die API-Funktion IfIsPlayerInRangeOfPoint nutzt ja eine Range, was also eine Distanz zu einem Punkt bedeutet. Das bedeutet doch es müsste theoretisch möglich sein, sich die Distanz zu einem Punkt auch einfach als Zahl ausgeben zu lassen. Egal wie.. ich möchte die Distanz zu einem beliebigen Punkt nur einfach als Zahl ausgeben.

    1. Ob nur der einmalige Aufruf der Funktion SetParam reicht, weiß ich nicht. Jedoch habe ich meine zwei Zeilen aus den Anwendungsbeispielen der Overlay-API.
    *Klick Mich* Zeile 8 und 9.


    2. Es hat schon seine Richtigkeit, wie ich es geschrieben habe. Ich weiß nicht welche API du verwendest und was für Parameter für deine WorldToScreen-Funktion benötigt werden. Aber so sieht meine Funktion aus (mit der SAMP-UDF kompatibel):


    Wenn du diese Funktion benutzt, sollte auch die Fehlermeldung verschwinden.


    3. Liegt wahrscheinlich an Punkt 1 oder 2. Wenn du die beiden Punkte behoben hast und es immer noch nicht funktioniert, einfach melden.


    4. Eine Funktion um eine Distanz zwischen zwei Koordinaten zu errechnen existiert ebenfalls in der SAMP-UDF (getDist() heißt die Funktion).
    Hier der Auszug aus der SAMP-UDF:


    Code
    getDist(pos1,pos2) {
    	if(!pos1 || !pos2)
    		return 0
        return Sqrt((pos1[1]-pos2[1])*(pos1[1]-pos2[1])+(pos1[2]-pos2[2])*(pos1[2]-pos2[2])+(pos1[3]-pos2[3])*(pos1[3]-pos2[3]))
    }

    Beachte hierbei, dass pos1 und pos2 ein Objekt übergeben werden muss. Sollte folgendermaßen aussehen:



    Code
    Numpad0::
    
    
    pos1 = [X, Y, Z]
    pos2 = [X, Y, Z]
    
    
    Dist := getDist(pos1, pos2)
    return



    MfG

  • Ich komm mir grad richtig dumm vor ^^


    Ich nutze nun die SAMP-UDF R15. Dann erhalte ich aber die folgende Fehlermeldung:

    Code
    ==> Call to nonexistent function.
    Specifically: SetParam("window", "GTA:SA:MP")


    Die UDF enthält ja auch die Funktion SetParam nicht..

    Kein Problem ;)
    Habe vorausgesetzt, dass du dich schon mal mit der Overlay-API auseinander gesetzt hast.
    https://github.com/agrippa1994/DX9-Overlay-API


    Aus dem Ordner "bin" die dx9_overlay.dll und dem Ordner "Include/ahk" die overlay.ahk.
    Beide mit deinem Script, der SAMP-UDF usw. in einen Ordner und die 3. Zeile in der overlay.ahk auf folgenden Inhalt ändern:


    Code
    PATH_OVERLAY := RelToAbs(A_ScriptDir, "dx9_overlay.dll")



    MfG

  • Beachte hierbei, dass pos1 und pos2 ein Objekt übergeben werden muss. Sollte folgendermaßen aussehen:


    Code
    Numpad0::
    
    
    pos1 = [X, Y, Z]
    pos2 = [X, Y, Z]
    
    
    Dist := getDist(pos1, pos2)
    return


    MfG


    Ich hab das mal versucht, aber irgendwie kommt immer 0 dabei raus.
    Eine der beiden Positionen soll GetPlayerPos sein und die andere soll entweder eine feste Position oder ebenfalls eine andere dynamische Position sein.


    //Edit: Den oberen Fehler hab ich nun selbst gefunden. Es fehlte in Zeile 3 und 7 lediglich der Doppelpunkt vor dem =. Wie blind man doch manchmal ist xD
    Das nachfolgende würde ich trotzdem gerne wissen.


    Ich würde gerne mit einem Textbind alle Positionen ausblenden. Wenn ich den Textbind erneut verwende, sollen wieder alle Positionen sichtbar sein. Folgendermaßen würde ich das jetzt umsetzen,