[AHK] Chat auslesen = Spam?

  • Hey, ich habe folgendes Problem:


    Wenn eine Zeile aus dem Chat in meinem Keybinder ausgelesen wird, Spammt der Keybinder meinen ganzen Chat voll.



    Code:


    AutoTogHi:
    GetChatLine(0, Chatline1)
    if(InStr(Chatline1, "[NACHRICHT] Der Spieler"))
    sleep 500
    SendChat("/f Hallo c:")


    return

  • Ursache deines Fehlers:


    Settimer, AutoTogHi, 1000 ; Beispiel[tt][/tt]
    Das Label AutoTogHi wird jede Sekunde (1000 Millisekunden) aufgerufen...
    GetChatLine() liest somit alle X Sekunden den SAMP Chatlog aus,
    heisst sollange sich Zeile 0 (Definiert als Parameter) nicht ändert, wird er immer wieder die If() bedingung ausführen.
    Nach einem If() muss immer ein Block {} folgen, wenn mehr als 1 Zeile Code folgt.


    Falsch:


    Dies bewirkt, Ist in Chatline1, "[NACHRICHT] Der Spieler" zufinden... ruht das Skript 500 Millisekunden da es sich direkt unter if(InStr(Chatline1, "[NACHRICHT] Der Spieler")) befindet
    und gibt anschliessend die NAchricht aus SendChat("/f Hallo c:") egal ob die If() bedingung erfüllt wurde oder nicht.


    Richtig:


    So wird der ganze Block {} ausgeführt sollte die If() bedingung wahr sein...


    Kleiner Tip:
    Speichere dir die Letzte ausgelesene Zeile als Variable zwischen und frage am anfang ab ob sie gleich == der letzten aktuell gelesenen Chatlog zeile ist.
    Sollte sie gleich sein, kannst du dir den ganzen durchlauf des Labels sparen... Kann bei grossen Keybindern sehr ressourcenschonend sein, jenachdem wie lang der "Baum" wird^^


    Ps.: Da war der Madd92 wohl schneller!

  • Die bessere Variante ist meiner Meinung nach, einfach auf GetChatLine zu verzichten und mit FileOpen und dem File Object Interface zu arbeiten. Dadurch liest man 1. jede Zeile nur einmal aus, 2. liest wirklich jede Nachricht aus, auch wenn viele auf einmal geschrieben werden und 3. spart Performance, da nicht jedes Mal das gesamte Chatlog ausgelesen wird.

  • SetTimer, AutoTogHi, 1000

    PHP
    AutoTogHi:
    {
        chat := GetChatLine(0)
        if(InStr(chat, "[Spieler]Der Spieler"
        sleep, 5000
        SendChat("Hallo.")
    }
    return

    Hab es nicht gestestet, müsste aber so gehen :D

  • SetTimer, AutoTogHi, 1000

    PHP
    AutoTogHi:
    {
        chat := GetChatLine(0)
        if(InStr(chat, "[Spieler]Der Spieler"
        sleep, 5000
        SendChat("Hallo.")
    }
    return

    Hab es nicht gestestet, müsste aber so gehen :D

    Deine Klammer ergibt einfach keinen Sinn. :)

  • Die bessere Variante ist meiner Meinung nach, einfach auf GetChatLine zu verzichten und mit FileOpen und dem File Object Interface zu arbeiten. Dadurch liest man 1. jede Zeile nur einmal aus, 2. liest wirklich jede Nachricht aus, auch wenn viele auf einmal geschrieben werden und 3. spart Performance, da nicht jedes Mal das gesamte Chatlog ausgelesen wird.

    Ich benutze immer diese Funktion, da ich es genau so wie du sehe,
    Bin mit der immer besser gefahren als mit GetChatline, vorallem weil man Zeilen Bereiche überwachen kann...



    SetTimer, AutoTogHi, 1000

    PHP
    AutoTogHi:
    {
        chat := GetChatLine(0)
        if(InStr(chat, "[Spieler]Der Spieler"
        sleep, 5000
        SendChat("Hallo.")
    }
    return

    Hab es nicht gestestet, müsste aber so gehen :D

    Da is genau der selbe fehler drin wie vom Thread ersteller + GetChatline() falsch angewendet.... :dash: