Помогите написать овер простой АХК.

Harold_Sandstorm

Новичок
Автор темы
9
0
В общем, я абсолютный ноль в написании АХК/скриптов, но возникла необходимость в создании ахк, следующего образца:
ввожу команду /in [id]
выводит в строку /r text [ранг игрока id] [фамилия игрока id]

Прошу вас скинуть тему/тутор, в которой/ом расписано как это сделать (для чайника), или в самом лучшем случае накидать код с //пояснениями. Благодарю неравнодушных ♥
 

darksoor

Известный
679
355
В общем, я абсолютный ноль в написании АХК/скриптов, но возникла необходимость в создании ахк, следующего образца:
ввожу команду /in [id]
выводит в строку /r text [ранг игрока id] [фамилия игрока id]

Прошу вас скинуть тему/тутор, в которой/ом расписано как это сделать (для чайника), или в самом лучшем случае накидать код с //пояснениями. Благодарю неравнодушных ♥

AutoHotKey:
#Include SAMP-UDF.ahk ;подключаешь SAMP-UDF (создаёшь рядом со своим скриптом файлик SAMP-UDF.ahk, после переходишь в тему "https://blast.hk/threads/20318/"(без кавычек) и копируешь в данный файл код)

$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/in")
{
    if (RegExMatch(tempText, "^" tempCmd "\s(\d{1,3})$", out_pars)) ;out_pars1 - id введённый пользователем
   {
        RegExMatch(getPlayerNameById(out_pars1), "(\w+)_(\w+)", out_name) ;выводим из Ника игрока фамилию. out_name1 - Имя, out_name2 - фамилия
        SendChat("/r text " out_pars1 " " out_name2)
        Return
    }
    Else
        addChatMessage("Используй: " tempCmd " [Ид]")
}
Return

Если что-то не будет работать, пиши.
 

Harold_Sandstorm

Новичок
Автор темы
9
0
AutoHotKey:
#Include SAMP-UDF.ahk ;подключаешь SAMP-UDF (создаёшь рядом со своим скриптом файлик SAMP-UDF.ahk, после переходишь в тему "https://blast.hk/threads/20318/"(без кавычек) и копируешь в данный файл код)

$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/in")
{
    if (RegExMatch(tempText, "^" tempCmd "\s(\d{1,3})$", out_pars)) ;out_pars1 - id введённый пользователем
   {
        RegExMatch(getPlayerNameById(out_pars1), "(\w+)_(\w+)", out_name) ;выводим из Ника игрока фамилию. out_name1 - Имя, out_name2 - фамилия
        SendChat("/r text " out_pars1 " " out_name2)
        Return
    }
    Else
        addChatMessage("Используй: " tempCmd " [Ид]")
}
Return

Если что-то не будет работать, пиши.
Дружище, максимальный респект за код, но я настолько чайник, что не могу понять, что делать с этим кодом xD. Куда вставить, какое разрешение, куда его закинуть?
 

darksoor

Известный
679
355
Дружище, максимальный респект за код, но я настолько чайник, что не могу понять, что делать с этим кодом xD. Куда вставить, какое разрешение, куда его закинуть?
Для начала установи программу Autohotkey > Modify > Ansi-32(обязательно).
Потом создай два файла с расширением .ahk (один из них назови SAMP-UDF.ahk, второй без разницы как). Заполняешь файл SAMP-UDF.ahk, потом вставляешь тот код, что я тебе написал и запускаешь.
После проверяешь в игре /in [id].
 

darksoor

Известный
679
355
Вместо ИДа должно писаться звание, не могу найти, как реализовать это.

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

Kvisk

Известный
212
223
Можно чекать скины либо паспорт, если тебе его конечно показали.
Если скины статичны (меняются автоматически для каждого ранга, а не лидер тебе их меняет сам, какой захочет), то напиши мне id-шники всех скинов на каждый ранг и я допишу тебе код.
я сомневаюсь что для каждого ранка отдельный скин. Там скорей всего несколько скинов да, но на один скин несколько рангов. Не проще через /members чекать ранг?
 

darksoor

Известный
679
355
я сомневаюсь что для каждого ранка отдельный скин. Там скорей всего несколько скинов да, но на один скин несколько рангов. Не проще через /members чекать ранг?
Мемберс тоже не вариант, а если он в другой организации состоит? Только паспорт тогда.
 

Harold_Sandstorm

Новичок
Автор темы
9
0
Парни, всё намного проще, после чека паспорта чтоб код находил ранг. Если что, скин один для всех рангов(армейка). Сервер - СРП

Мемберс тоже не вариант, а если он в другой организации состоит? Только паспорт тогда.

https://blast.hk/threads/18040/page-74

Идея, в целом, вот. Я просто не смог всё сразу грамотно изложить.
з.ы. Скрин паспорта скину сюда, чтоб не засорять тему:
r0ETLmE.png

MTLnb00
 

darksoor

Известный
679
355
паспорт из чатлога скопируй и скинь
Зачем? Можно и так..

Парни, всё намного проще, после чека паспорта чтоб код находил ранг. Если что, скин один для всех рангов(армейка). Сервер - СРП



https://blast.hk/threads/18040/page-74

Идея, в целом, вот. Я просто не смог всё сразу грамотно изложить.
з.ы. Скрин паспорта скину сюда, чтоб не засорять тему:
r0ETLmE.png

MTLnb00
Так попробуй, может это то, что тебе нужно:
AutoHotKey:
#Include SAMP-UDF.ahk ;подключаешь SAMP-UDF (создаёшь рядом со своим скриптом файлик SAMP-UDF.ahk, после переходишь в тему "https://blast.hk/threads/20318/"(без кавычек) и копируешь в данный файл код)

save(chatlog) {
   static logschat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\ChatLogs\"
   static chat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
   FileCreateDir, % logschat A_MM "-" A_YYYY
   FileAppend, % chatlog, % logschat A_MM "-" A_YYYY "\" A_DD "." A_MM "." A_YYYY ".txt"
   FileDelete, % chat
   return
}

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

$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/in")
{
    if (RegExMatch(tempText, "^" tempCmd "\s(\d{1,3})$", out_pars)) ;out_pars1 - id введённый пользователем
    {
        nick_name := getPlayerNameById(out_pars1) ;выводим из ID никнейм игрока
        RegExMatch(nick_name, "(\w+)_(\w+)", out_name) ;выводим из Ника игрока фамилию. out_name1 - Имя, out_name2 - фамилия
        save(chatlog) ;сохраняем чатлог и удаляем его, после скрипт будет ждать паспорт
        SendChat("Ваш паспорт и цель прибытия.")
        Sleep, 500
        addChatMessageEx("{228b22}", "[AHK] {F5F5DC}Скрипт ожидает предоставления паспорта от {996633}" nick_name ".")
        Loop
        {
            FileRead, chatlog, % file_chat ;читаем чатлог
            if (RegExMatch(chatlog, "Фракция\:\s+(.*)\s+Должность\:\s+([А-я]+)", chattext))
            {
                RegExMatch(chatlog, "Имя\:\s(\w+_\w+)", nicks)
                if (nicks1 == nick_name) ;сверяем, паспорт показан от игрока, чей ID мы ввели, либо нет
                {
                    save(chatlog)
                    StringLower, chattext2, chattext2
                    chattext2 := chattext2 "а"
                    break
                }
                Else
                    Sleep, 50
            }
        }
        SendChat("/r Пропустил на территорию части " chattext2 " " out_name2 ".") ;отправляем сообщение в рацию
        Return
    }
    Else
        addChatMessage("Используй: " tempCmd " [Ид]")
}
Return
 
  • Нравится
Реакции: Kvisk

Kvisk

Известный
212
223
Зачем? Можно и так..


Так попробуй, может это то, что тебе нужно:
AutoHotKey:
#Include SAMP-UDF.ahk ;подключаешь SAMP-UDF (создаёшь рядом со своим скриптом файлик SAMP-UDF.ahk, после переходишь в тему "https://blast.hk/threads/20318/"(без кавычек) и копируешь в данный файл код)

save(chatlog) {
   static logschat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\ChatLogs\"
   static chat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
   FileCreateDir, % logschat A_MM "-" A_YYYY
   FileAppend, % chatlog, % logschat A_MM "-" A_YYYY "\" A_DD "." A_MM "." A_YYYY ".txt"
   FileDelete, % chat
   return
}

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

$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/in")
{
    if (RegExMatch(tempText, "^" tempCmd "\s(\d{1,3})$", out_pars)) ;out_pars1 - id введённый пользователем
    {
        nick_name := getPlayerNameById(out_pars1) ;выводим из ID никнейм игрока
        RegExMatch(nick_name, "(\w+)_(\w+)", out_name) ;выводим из Ника игрока фамилию. out_name1 - Имя, out_name2 - фамилия
        save(chatlog) ;сохраняем чатлог и удаляем его, после скрипт будет ждать паспорт
        SendChat("Ваш паспорт и цель прибытия.")
        Sleep, 500
        addChatMessageEx("{228b22}", "[AHK] {F5F5DC}Скрипт ожидает предоставления паспорта от {996633}" nick_name ".")
        Loop
        {
            FileRead, chatlog, % file_chat ;читаем чатлог
            if (RegExMatch(chatlog, "Фракция\:\s+(.*)\s+Должность\:\s+([А-я]+)", chattext))
            {
                RegExMatch(chatlog, "Имя\:\s(\w+_\w+)", nicks)
                if (nicks1 == nick_name) ;сверяем, паспорт показан от игрока, чей ID мы ввели, либо нет
                {
                    save(chatlog)
                    StringLower, chattext2, chattext2
                    chattext2 := chattext2 "а"
                    break
                }
                Else
                    Sleep, 50
            }
        }
        SendChat("/r Пропустил на территорию части " chattext2 " " out_name2 ".") ;отправляем сообщение в рацию
        Return
    }
    Else
        addChatMessage("Используй: " tempCmd " [Ид]")
}
Return
Там где должность.. Разве так можно писать? У меня постоянно какие-либо ошибки..
AutoHotKey:
"[А-я]"
ErrorLevel = Compile error 8 at offset 3: range out of order in character class
Так же лучше исправить
AutoHotKey:
"Фракция\:\s+(.*)\s+Должность\:\s+([А-я]+" ; это

"Фракция\:\s+(.*)\s+Должность\:\s+([А-яA-z ]+" ; на это
так как ранг может иметь и на английском, + в нём могут быть пробелы)
Ну ето по мелочи.. А так вроде всё красиво, мне нравится)
 

Harold_Sandstorm

Новичок
Автор темы
9
0
Зачем? Можно и так..


Так попробуй, может это то, что тебе нужно:
AutoHotKey:
#Include SAMP-UDF.ahk ;подключаешь SAMP-UDF (создаёшь рядом со своим скриптом файлик SAMP-UDF.ahk, после переходишь в тему "https://blast.hk/threads/20318/"(без кавычек) и копируешь в данный файл код)

save(chatlog) {
   static logschat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\ChatLogs\"
   static chat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
   FileCreateDir, % logschat A_MM "-" A_YYYY
   FileAppend, % chatlog, % logschat A_MM "-" A_YYYY "\" A_DD "." A_MM "." A_YYYY ".txt"
   FileDelete, % chat
   return
}

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

$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/in")
{
    if (RegExMatch(tempText, "^" tempCmd "\s(\d{1,3})$", out_pars)) ;out_pars1 - id введённый пользователем
    {
        nick_name := getPlayerNameById(out_pars1) ;выводим из ID никнейм игрока
        RegExMatch(nick_name, "(\w+)_(\w+)", out_name) ;выводим из Ника игрока фамилию. out_name1 - Имя, out_name2 - фамилия
        save(chatlog) ;сохраняем чатлог и удаляем его, после скрипт будет ждать паспорт
        SendChat("Ваш паспорт и цель прибытия.")
        Sleep, 500
        addChatMessageEx("{228b22}", "[AHK] {F5F5DC}Скрипт ожидает предоставления паспорта от {996633}" nick_name ".")
        Loop
        {
            FileRead, chatlog, % file_chat ;читаем чатлог
            if (RegExMatch(chatlog, "Фракция\:\s+(.*)\s+Должность\:\s+([А-я]+)", chattext))
            {
                RegExMatch(chatlog, "Имя\:\s(\w+_\w+)", nicks)
                if (nicks1 == nick_name) ;сверяем, паспорт показан от игрока, чей ID мы ввели, либо нет
                {
                    save(chatlog)
                    StringLower, chattext2, chattext2
                    chattext2 := chattext2 "а"
                    break
                }
                Else
                    Sleep, 50
            }
        }
        SendChat("/r Пропустил на территорию части " chattext2 " " out_name2 ".") ;отправляем сообщение в рацию
        Return
    }
    Else
        addChatMessage("Используй: " tempCmd " [Ид]")
}
Return

Всё отлично работает, но надо подкоректировать код, который ищет в чатлоге должность. Дело в том, что некоторые звания пишутся в паспорте как "Мл. Лейтенант", "Ст. Мичман", "Капитан 1го ранга" и тд. код сохраняет в переменную chattext2 только мл/ст/капитан.

Там где должность.. Разве так можно писать? У меня постоянно какие-либо ошибки..
AutoHotKey:
"[А-я]"
ErrorLevel = Compile error 8 at offset 3: range out of order in character class
Так же лучше исправить
AutoHotKey:
"Фракция\:\s+(.*)\s+Должность\:\s+([А-я]+" ; это

"Фракция\:\s+(.*)\s+Должность\:\s+([А-яA-z ]+" ; на это
так как ранг может иметь и на английском, + в нём могут быть пробелы)
Ну ето по мелочи.. А так вроде всё красиво, мне нравится)

Не, все ранги на русском, а вот точки, пробелы и даже цифры это проблема.