Помогите новичку :)

VuTuV

Участник
Автор темы
51
1
upload_2019-3-30_14-6-18.png

Что делаю не так, АХК должен видеть в чате "Вы не работник медслужбы", и делать что я скажу.
 

darksoor

Известный
674
353
Исправил.

global flag:=false после оглашения file_chat
Ты бы сам лучше попробовал, и что бы вышло? Правильно. Ничего!

И зачем? Пусть учится пошагово делать
Всё для того, чтобы один раз расписать и объяснить человеку.
 

VuTuV

Участник
Автор темы
51
1
Исправил.


Ты бы сам лучше попробовал, и что бы вышло? Правильно. Ничего!


Всё для того, чтобы один раз расписать и объяснить человеку.
Зашёл в игру в чате пишет Вы не сотрудник медслужбы АХК не срабатывает.
 

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
705
пробуй этот скрипт
AutoHotKey:
#NoEnv
#SingleInstance force
#UseHook on

chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)

while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        ; chatline := A_Index
        if RegExMatch(A_LoopReadLine, "Вы не работник медслужбы")
            sendinput {f6}/n откат{enter}
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}

getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}

isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}

Для этого существует функция save(chatlog).
удалять/перемещать чатлог только чтобы прочитать строку чата это 1) не всегда удобно; 2) лютый говнокод

"Вы не работник медслужбы"
если кто-нибудь напишет в чат "Вы не работник медслужбы", то скрипт сработает, поэтому скинь строку из чатлога, чтобы более точно составить регулярку (если она тут вообще понадобится, возможно даже лучше будет использовать InStr)
 

VuTuV

Участник
Автор темы
51
1
Кинь строчку с чатлога.
пробуй этот скрипт
AutoHotKey:
#NoEnv
#SingleInstance force
#UseHook on

chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)

while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        ; chatline := A_Index
        if RegExMatch(A_LoopReadLine, "Вы не работник медслужбы")
            sendinput {f6}/n откат{enter}
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}

getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}

isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}


удалять/перемещать чатлог только чтобы прочитать строку чата это 1) не всегда удобно; 2) лютый говнокод


если кто-нибудь напишет в чат "Вы не работник медслужбы", то скрипт сработает, поэтому скинь строку из чатлога, чтобы более точно составить регулярку (если она тут вообще понадобится, возможно даже лучше будет использовать InStr)
[18:23:16] Вы не работник медслужбы

пробуй этот скрипт
AutoHotKey:
#NoEnv
#SingleInstance force
#UseHook on

chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)

while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        ; chatline := A_Index
        if RegExMatch(A_LoopReadLine, "Вы не работник медслужбы")
            sendinput {f6}/n откат{enter}
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}

getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}

isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}


удалять/перемещать чатлог только чтобы прочитать строку чата это 1) не всегда удобно; 2) лютый говнокод


если кто-нибудь напишет в чат "Вы не работник медслужбы", то скрипт сработает, поэтому скинь строку из чатлога, чтобы более точно составить регулярку (если она тут вообще понадобится, возможно даже лучше будет использовать InStr)
Сработал но, несколько раз профлудил как исправить?

Сам исправил, спасибо всем за помощь.

Тут такой вопрос если мне нужно сразу несколько в чате искать разделать их или вот так?
upload_2019-3-30_21-10-53.png


upload_2019-3-30_21-37-35.png

Ещё отредачил работать будет если вернуть как до этого было

Первый или второй вариант?
 

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
705
Тут такой вопрос если мне нужно сразу несколько в чате искать разделать их или вот так?
нет, ты всё испортил, код должен выглядеть примерно так (не проверял)
AutoHotKey:
#NoEnv
#SingleInstance force
#UseHook on

chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)

while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        str := A_LoopReadLine
        if RegExMatch(A_LoopReadLine, "^\[\d{2}:\d{2}:\d{2}] Вы не работник медслужбы") ; старый пример
        {
            sendmessage, 0x50,, 0x419,, A
            sendinput {f6}/n откат{enter}
            ; здесь любой твой код для "Вы не работник медслужбы"
        }
        if search(str, "Игрок не лежит в больнице") ; новый пример
        {
            sendkeys("{f6}/n Я не могу...")
            ; здесь любое продолжение твоего кода для "Игрок не лежит в больнице"
        }
        if search(str, "Игрок еблан")
        {
            sendkeys("{f6}/n Извините, вы еблан{enter}")
            ; здесь любое продолжение твоего кода для "Игрок еблан"
        }
        ; и так далее продолжать здесь
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}

getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}

isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}

sendkeys(string)
{
    sendmessage, 0x50,, 0x419,, A
    sendinput % string
}

search(haystack, needle) {
    return RegExMatch(haystack, "^\[\d{2}:\d{2}:\d{2}\] " needle)
}


Сработал но, несколько раз профлудил как исправить?
флудить несколько раз он не должен был, я это проверял. что именно ты исправил я не вижу

[18:23:16] Вы не работник медслужбы
лучше помещать это в тег code, каждый пробел важен для скана, а обычным текстом 2+ сливаются в один
 

VuTuV

Участник
Автор темы
51
1
нет, ты всё испортил, код должен выглядеть примерно так (не проверял)
AutoHotKey:
#NoEnv
#SingleInstance force
#UseHook on

chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)

while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        str := A_LoopReadLine
        if RegExMatch(A_LoopReadLine, "^\[\d{2}:\d{2}:\d{2}] Вы не работник медслужбы") ; старый пример
        {
            sendmessage, 0x50,, 0x419,, A
            sendinput {f6}/n откат{enter}
            ; здесь любой твой код для "Вы не работник медслужбы"
        }
        if search(str, "Игрок не лежит в больнице") ; новый пример
        {
            sendkeys("{f6}/n Я не могу...")
            ; здесь любое продолжение твоего кода для "Игрок не лежит в больнице"
        }
        if search(str, "Игрок еблан")
        {
            sendkeys("{f6}/n Извините, вы еблан{enter}")
            ; здесь любое продолжение твоего кода для "Игрок еблан"
        }
        ; и так далее продолжать здесь
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}

getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}

isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}

sendkeys(string)
{
    sendmessage, 0x50,, 0x419,, A
    sendinput % string
}

search(haystack, needle) {
    return RegExMatch(haystack, "^\[\d{2}:\d{2}:\d{2}\] " needle)
}



флудить несколько раз он не должен был, я это проверял. что именно ты исправил я не вижу


лучше помещать это в тег code, каждый пробел важен для скана, а обычным текстом 2+ сливаются в один
где вы \[\d{2}:\d{2}:\d{2}] ват так код перевели?

нет, ты всё испортил, код должен выглядеть примерно так (не проверял)
AutoHotKey:
#NoEnv
#SingleInstance force
#UseHook on

chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)

while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        str := A_LoopReadLine
        if RegExMatch(A_LoopReadLine, "^\[\d{2}:\d{2}:\d{2}] Вы не работник медслужбы") ; старый пример
        {
            sendmessage, 0x50,, 0x419,, A
            sendinput {f6}/n откат{enter}
            ; здесь любой твой код для "Вы не работник медслужбы"
        }
        if search(str, "Игрок не лежит в больнице") ; новый пример
        {
            sendkeys("{f6}/n Я не могу...")
            ; здесь любое продолжение твоего кода для "Игрок не лежит в больнице"
        }
        if search(str, "Игрок еблан")
        {
            sendkeys("{f6}/n Извините, вы еблан{enter}")
            ; здесь любое продолжение твоего кода для "Игрок еблан"
        }
        ; и так далее продолжать здесь
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}

getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}

isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}

sendkeys(string)
{
    sendmessage, 0x50,, 0x419,, A
    sendinput % string
}

search(haystack, needle) {
    return RegExMatch(haystack, "^\[\d{2}:\d{2}:\d{2}\] " needle)
}



флудить несколько раз он не должен был, я это проверял. что именно ты исправил я не вижу


лучше помещать это в тег code, каждый пробел важен для скана, а обычным текстом 2+ сливаются в один
и второй вопрос, он по очереди искать будет или нет?
 

darksoor

Известный
674
353

VuTuV

Участник
Автор темы
51
1

darksoor

Известный
674
353
Ну блин, мне нужно как-то ник сделать типо такого \[\d{2}:\d{2}:\d{2}] и отдельно деньги, можете помочь, и я отстану :)

Да ты глаза свои разунь, у тебя же код готовый есть....

AutoHotKey:
if search(str, "тут пиши своё про деньги")
{
   ;Тут ответ
}

Тебе уже расписали, все как есть. Нужно только немного подумать и сделать, как тебе необходимо.
 

VuTuV

Участник
Автор темы
51
1
Да ты глаза свои разунь, у тебя же код готовый есть....

AutoHotKey:
if search(str, "тут пиши своё про деньги")
{
   ;Тут ответ
}

Тебе уже расписали, все как есть. Нужно только немного подумать и сделать, как тебе необходимо.
Да это я сделал, мне нужно такой-же код \[\d{2}:\d{2}:\d{2}] как будет выгледить ник Мне нужно сделать "Вы провели курс платного лечения у пациента Admin_Admin"

Ник каждый раз будет меняться
 

darksoor

Известный
674
353
Да это я сделал, мне нужно такой-же код \[\d{2}:\d{2}:\d{2}] как будет выгледить ник Мне нужно сделать "Вы провели курс платного лечения у пациента Admin_Admin"

Ник каждый раз будет меняться

AutoHotKey:
if search(str, "Вы провели курс платного лечения у пациента (\w+_\w+)") 
{    
   ;Тут ответ 
}
 

VuTuV

Участник
Автор темы
51
1
upload_2019-3-31_9-59-26.png


Вот держите, мой код.
AutoHotKey:
if (A_IsAdmin = false)
{
   Run *RunAs "%A_ScriptFullPath%" ,, UseErrorLevel
}
#IfWinActive GTA:SA:MP
#NoEnv
#SingleInstance force
#UseHook on
chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)
:?:/medhelp::
SendMessage, 0x50,, 0x4190419,, A
Sleep, 100
SendInput, {F6}Здравствуйте, я Ваш лечущий врач "Ричард Эскобар", сейчас я буду Вас лечить.{Enter}
Sleep, 1500
SendInput, {F6}Сейчас я Вам выдам лекарство от головы, подождите немного, сейчас достану таблетку.{Enter}
Sleep, 1500
SendInput, {F6}/do На плече у Ричарда весит сумка, в сумке таблетки от головы.{Enter}
Sleep, 1500
SendInput, {F6}/me открывает сумку, достаёт от-туда таблетку от головы, закрывает сумку.{Enter}
Sleep, 1500
SendInput, {F6}/me передал лекарство человеку напротив, улыбается тому, что помог ещё одному человеку.{Enter}
SendInput, {F6}/medhelp{Space}
{
Loop, Read, % chatlog
    {
        str := A_LoopReadLine
        if RegExMatch(str, "Игрок не лежит в больнице")
        {
            SendMessage, 0x50,, 0x4190419,, A
            SendInput, {F6}Уважаемый(-ая) пациент(-ка). Я не могу выписать препарат для Вас, займите койку.{Enter}
            Sleep, 1500
            SendInput, {F6}/n Для того что-бы занять койку, подойдите к ней, и пропишите [ /med ].{Enter}
            Sleep, 1500
            SendInput, {F6}/n Если вы не займёте койку. Мне система не даст вылечить Вас.{Enter}
        }
        if search(str, "У пациента нет с собой столько денег")
        {
            SendMessage, 0x50,, 0x4190419,, A
            Sendinput, {f6}/n Я не могу Вас вылечить, у Вас не хватает денег на лечение.{Enter}
        }
        if search(str, "Вы провели курс платного лечения у пациента [\w+_\w+]")
        {  
            SendMessage, 0x50,, 0x4190419,, A
            SendInput, {F6}Удачного Вам дня, больше не болейте.{Enter}
        }  
    chatline := getFileLinesCount(chatlog)
    sleep 50
    }
}
getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}
isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}
return
 

darksoor

Известный
674
353
Посмотреть вложение 27522

Вот держите, мой код.
AutoHotKey:
if (A_IsAdmin = false)
{
   Run *RunAs "%A_ScriptFullPath%" ,, UseErrorLevel
}
#IfWinActive GTA:SA:MP
#NoEnv
#SingleInstance force
#UseHook on
chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)
:?:/medhelp::
SendMessage, 0x50,, 0x4190419,, A
Sleep, 100
SendInput, {F6}Здравствуйте, я Ваш лечущий врач "Ричард Эскобар", сейчас я буду Вас лечить.{Enter}
Sleep, 1500
SendInput, {F6}Сейчас я Вам выдам лекарство от головы, подождите немного, сейчас достану таблетку.{Enter}
Sleep, 1500
SendInput, {F6}/do На плече у Ричарда весит сумка, в сумке таблетки от головы.{Enter}
Sleep, 1500
SendInput, {F6}/me открывает сумку, достаёт от-туда таблетку от головы, закрывает сумку.{Enter}
Sleep, 1500
SendInput, {F6}/me передал лекарство человеку напротив, улыбается тому, что помог ещё одному человеку.{Enter}
SendInput, {F6}/medhelp{Space}
{
Loop, Read, % chatlog
    {
        str := A_LoopReadLine
        if RegExMatch(str, "Игрок не лежит в больнице")
        {
            SendMessage, 0x50,, 0x4190419,, A
            SendInput, {F6}Уважаемый(-ая) пациент(-ка). Я не могу выписать препарат для Вас, займите койку.{Enter}
            Sleep, 1500
            SendInput, {F6}/n Для того что-бы занять койку, подойдите к ней, и пропишите [ /med ].{Enter}
            Sleep, 1500
            SendInput, {F6}/n Если вы не займёте койку. Мне система не даст вылечить Вас.{Enter}
        }
        if search(str, "У пациента нет с собой столько денег")
        {
            SendMessage, 0x50,, 0x4190419,, A
            Sendinput, {f6}/n Я не могу Вас вылечить, у Вас не хватает денег на лечение.{Enter}
        }
        if search(str, "Вы провели курс платного лечения у пациента [\w+_\w+]")
        { 
            SendMessage, 0x50,, 0x4190419,, A
            SendInput, {F6}Удачного Вам дня, больше не болейте.{Enter}
        } 
    chatline := getFileLinesCount(chatlog)
    sleep 50
    }
}
getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}
isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}
return

Где функция search()?

Исковеркал взял регулярку, которую я тебе писал.
 

VuTuV

Участник
Автор темы
51
1
Где функция search()?

Исковеркал взял регулярку, которую я тебе писал.
AutoHotKey:
if (A_IsAdmin = false) 
{
   Run *RunAs "%A_ScriptFullPath%" ,, UseErrorLevel
}
#IfWinActive GTA:SA:MP
#NoEnv
#SingleInstance force
#UseHook on
chatlog := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
chatline := getFileLinesCount(chatlog)
:?:/medhelp::
SendMessage, 0x50,, 0x4190419,, A 
Sleep, 100
SendInput, {F6}Здравствуйте, я Ваш лечущий врач "Ричард Эскобар", сейчас я буду Вас лечить.{Enter}
Sleep, 1500
SendInput, {F6}Сейчас я Вам выдам лекарство от головы, подождите немного, сейчас достану таблетку.{Enter}
Sleep, 1500
SendInput, {F6}/do На плече у Ричарда весит сумка, в сумке таблетки от головы.{Enter}
Sleep, 1500
SendInput, {F6}/me открывает сумку, достаёт от-туда таблетку от головы, закрывает сумку.{Enter}
Sleep, 1500
SendInput, {F6}/me передал лекарство человеку напротив, улыбается тому, что помог ещё одному человеку.{Enter}
SendInput, {F6}/medhelp{Space}
return
while true
{
    if !isGameRunning()
        continue
    Loop, Read, % chatlog
    {
        if (A_Index <= chatline)
            continue
        str := A_LoopReadLine
        if RegExMatch(A_LoopReadLine, "^Игрок не лежит в больнице")
        {
            SendMessage, 0x50,, 0x4190419,, A 
            SendInput, {F6}Уважаемый(-ая) пациент(-ка). Я не могу выписать препарат для Вас, займите койку.{Enter}
            Sleep, 1500
            SendInput, {F6}/n Для того что-бы занять койку, подойдите к ней, и пропишите [ /med ].{Enter}
            Sleep, 1500
            SendInput, {F6}/n Если вы не займёте койку. Мне система не даст вылечить Вас.{Enter} 
        }
        if search(str, "У пациента нет с собой столько денег")
        {
            SendMessage, 0x50,, 0x4190419,, A 
            Sendinput, {f6}/n Я не могу Вас вылечить, у Вас не хватает денег на лечение.{Enter}
        }
        if search(str, "Вы провели курс платного лечения у пациента [\w+_\w+]")
        {
            SendMessage, 0x50,, 0x4190419,, A 
            SendInput, {F6}Удачного Вам дня, больше не болейте.{Enter}
        }
    }
    chatline := getFileLinesCount(chatlog)
    sleep 50
}
getFileLinesCount(filename)
{
    IfNotExist % filename
        return -1
    Loop, Read, % filename
        result := A_Index
    return result
}
isGameRunning()
{
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
        if process.Name == "gta_sa.exe"
            return true
    return false
}
sendkeys(string)
{
    sendmessage, 0x50,, 0x419,, A
    sendinput % string
}
search(haystack, needle) {
    return RegExMatch(haystack, "^\[\d{2}:\d{2}:\d{2}\] " needle)
}
В чат пишет Вы провели курс платного лечения у пациента Ulan_Gro, АХК не срабатывает.

Отредачил.

Не срабатывает АХК. Хотя и в чате появляется все.