1 (изменено: arsytenky, 2019-05-26 13:04:15)

Тема: AHK: автоматизация для врача (SAMP)

Проблема в том, что скрипт не видит переменную и условие в RegExMatch

F1::
{
SendMessage, 0x50,, 0x4190419,, A
SendInput, {F6}^{sc1E}Здравствуйте, меня зовут Cristopher Jonson, я ваш специалист по выдаче медицинских карт.{Enter}
Sleep, 1500
Send, {F6}Вам обновить или сделать новую медицинскую карту?{Enter}

Send, {F6}Введи up или new  -{Space}
Input , idv, V, {enter}
Send, {F6}^{sc1E}
Sleep, 100


SendMessage, 0x50,, 0x4190419,, A
SendInput, {F6}^{sc1E}Отлично, не могли бы вы мне показать ваш паспорт.{Enter}
Sleep, 500
Send, {F6}/b /showpass ID передавать строго по Role Play{Enter}

Send, {F6}Введи айди игрока -{Space}
Input , id, V, {enter}
SendInput, {F6}^{sc1E}
Sleep, 1000
ChatLog = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt ; Путь к ЧатЛогу
FileDelete, %ChatLog%  ; Удаляем ЧатЛог
SendInput, {F6}/id %id%{Enter} ; Пишем в чат
Loop
{
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\Chatlog.txt
RegExMatch(Chatlog, "\Q| Уровень:\E (.*)", out)
RegExMatch(out1, "[0-9]+", out2)
if (out2 > 0 and out2 <= 2){
dollars = 5000
FileDelete, ChatLog  ; Удаляем ЧатЛог
goto, MyLabel1
}
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\Chatlog.txt
RegExMatch(Chatlog, "\Q| Уровень:\E (.*)", out) ; ищем в чат логе слово "Уровень"
RegExMatch(out1, "[0-9]+", out2) ; извлекаем число
if (out2 >= 3 and out2 <= 5){
dollars = 10000
FileDelete, ChatLog  ; Удаляем ЧатЛог
Goto, MyLabel1
}
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\Chatlog.txt
RegExMatch(Chatlog, "\Q| Уровень:\E (.*)", out) ; ищем в чат логе слово "Уровень"
RegExMatch(out1, "[0-9]+", out2)
if (out2 >= 6 and out2 <= 10){
dollars = 15000
Send, {F6} %dollars%{Enter}
FileDelete, ChatLog  ; Удаляем ЧатЛог
Sleep, 1000
Send, {F6} %dollars%{Enter}

}
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\Chatlog.txt
RegExMatch(Chatlog, "\Q| Уровень:\E (.*)", out) ; ищем в чат логе слово "Уровень"
RegExMatch(out1, "[0-9]+", out2) ; извлекаем число
if (out2 >= 11 and out2 <= 15){
dollars = 25000
FileDelete, ChatLog  ; Удаляем ЧатЛог
Goto, MyLabel1
}
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\Chatlog.txt
RegExMatch(Chatlog, "\Q| Уровень:\E (.*)", out)
RegExMatch(out1, "[0-9]+", out2) ; извлекаем число
if (out2 >= 16 and out2 <= 20){
dollars = 35000
FileDelete, ChatLog  ; Удаляем ЧатЛог
Goto, MyLabel1
}
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\Chatlog.txt
RegExMatch(Chatlog, "\Q| Уровень:\E (.*)", out) ; ищем в чат логе слово "Уровень"
RegExMatch(out1, "[0-9]+", out2) ; извлекаем число
if (out2 > 20){
    dollars = 50000
FileDelete, ChatLog  ; Удаляем ЧатЛог
Goto, MyLabel1
}

MyLabel1:

Когда я ввожу new или up в переменную в этой части скрипта,

Send, {F6}Введи up или new  -{Space}
Input , idv, V, {enter}
Send, {F6}^{sc1E}
Sleep, 100

то должно быть так, если ввести up, тогда для игроков 1-2 уровня (и для остальных уровней : 3-5, 6-10, 11-15, 16-20 и больше 20 переменная dollars умножается на 2 и выводится в метку MyLabel1.


MyLabel1:
Send, {F6}Медкарта вам обойдется в %dollars%

Если ввести new, переменная dollars не умножается, просто остаётся указанным значением в функции RegExMath.

2

Re: AHK: автоматизация для врача (SAMP)

Вы строчку из чатлога где уровень игрока прописан предоставьте ещё. А лучше давайте мы решим вашу задачу более грамотным методом? Удалять чатлог каждый раз только для того чтобы избавиться от повторений очень плохая идея. А если вы ещё захотите воспользоваться SAMP UDF то вашу задачу будет достичь гораздо проще.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: автоматизация для врача (SAMP)

belyankin12
Когда вводим /id (айди игрока), показывает следущее...
[14:11:05] [855] Cristopher_Jonson | Уровень: 10
из этой строчки мы извлекаем айди и определяем уровень, а по уровню определяем цену медкарты. Но я хочу, чтобы скрипт мог определять обновить ли медкарту(x2 цена)  или новую (обычная цена). А samp UDF не умею пользоваться.

4

Re: AHK: автоматизация для врача (SAMP)

Проводите чтение чатлога следующим методом - он не требует удалять чатлог каждый раз после чтения и читает чатлог снизу-вверх (таким образом будет найдено именно самое последнее совпадение).


global path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"

		log := {str:"",find:0,num:0}    ,    log.str := []
		FileEncoding, CP0
		Loop, read, %path_log%
		log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
		loop 30
			if RegExMatch(log.str[log.num + 1 - A_Index],"\[(.*)\] \[(.*)\] (.*)\_(.*) \| Уровень\: (.*)", end_str) and (log.find:=log.num + 1 - A_Index)
				break
		if (end_str != "") {
			msgbox, Уровень игрока: %end_str5%, ID: %end_str2%
		} else {
			msgbox, Строка не найдена
		}
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

5

Re: AHK: автоматизация для врача (SAMP)

belyankin12, проще же читать только последнии строки, с последнего вызова. Зачем каждый раз перелопачивать чат лог?

6

Re: AHK: автоматизация для врача (SAMP)

Может быть с точки зрения потребления памяти этот метод нельзя назвать оптимизированным, однако в отличии от других методов, этот я использовал постоянно, потому могу, так сказать, гарантировать его работоспособность. У меня ещё не возникала необходимость в более совершенных подходах, потому я и не искал способа оптимизировать данный метод.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

7

Re: AHK: автоматизация для врача (SAMP)

Мне нужно, чтобы скрипт просто умел умножать переменную dollars на 2, если ввести up. В чтении строк скрипт работает без ошибок

8

Re: AHK: автоматизация для врача (SAMP)

Тогда в чем проблема? Читаете переменную, куда вы вводили свое слово и умножаете стоимость если она = "up". Даже если чтение происходит хорошо, все же советую присмотреться к предоставленному мной методу - он не удаляет чатлог каждый раз.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

9

Re: AHK: автоматизация для врача (SAMP)

belyankin12 пишет:

Может быть с точки зрения потребления памяти этот метод нельзя назвать оптимизированным, однако в отличии от других методов, этот я использовал постоянно, потому могу, так сказать, гарантировать его работоспособность. У меня ещё не возникала необходимость в более совершенных подходах, потому я и не искал способа оптимизировать данный метод.

Так любой способ будет работать, Вам говорят что есть более оптимальный, который тоже будет работать, но не так варварски кушать ресурсы.
Если переименовать - то это работает также, но лучше.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

10

Re: AHK: автоматизация для врача (SAMP)

serzh82saratov, я имел ввиду, что в отличии от других методов, этот метод я знаю, а потому могу разъяснить как что работает. Я убежден в том, что лучше говорить о том, что знаешь наверняка, чем о том, о чем ты лишь только слышал.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

11

Re: AHK: автоматизация для врача (SAMP)

Ну что ж, объясните как оно надёжно работает.
Насколько я понимаю, оно заносит весь файл в массив, и после ищет с конца в последних 30 строках. Но непонятно как при очередном чтении должно быть ясно что это не те же строки что до этого, но если я таковое просто не вижу, то как быть если между чтениями добавлено более 30 строк.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

12

Re: AHK: автоматизация для врача (SAMP)

Тут уже встает вопрос не в методе, а в его применении. То есть я запускаю чтение файла только тогда, когда ожидаю появление нужной мне строки (мне заранее известны сценарии появления тех или иных сообщений в игровом чате). То есть я сначала провоцирую сервер на отправку нужного мне сообщения в чат, а лишь потом запускаю поиск. Если есть вероятность поймать одну и ту же строку несколько раз (такое у меня встречалось, когда я давно-давно читал чат постоянно в цикле, выискивая один из нескольких шаблонов), то я сохраняй md5 всей строки в временный массив. Опять же, я не спорю, что существуют методы понадежней, но ведь и я не претендую на истину в последней инстанции. Мне ещё многому предстоит научиться, но пока что имеем что имеем.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.