Как написать ahk скрипт для samp

Приветствую всех! 👋

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

🆘🆘🆘

Перед игроком появляется будто бы непреодолимая стена, посмотрев на которую, он побежит по форумам просить помощи.

🆘🆘🆘

autohotkey.png

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


Для начала, предлагаю взять каркас нашего скрипта:​

#Include samp.ahk
#IfWinActive GTA:SA:MP
ChatLog = C:UsersUserDocumentsGTA San Andreas User FilesSAMPchatlog.txt
loop    {
lastline := GetNewLine(ChatLog)
;Здесь будет наше регулярное выражение
If expression !=
   SendChat("команда")
}
GetNewLine(filename)    {
static old
static new
if !old    {
        FileGetSize, old, %filename%
        new := old
    }
while old = new    {
        sleep 100 ;задержка
        FileGetSize, new, %filename%
    }
old := new
Loop, read, %filename%
if A_LoopReadLine    {
        last := A_LoopReadLine
    }
return last
}
!end::ExitApp
end::Reload


Что же мы имеем в нашем каркасе? Давайте разберёмся:

;Строка # 1 отвечает за загрузку библиотеки SAMP UDF (обязательно действие при написании скриптов с использованием UDF)
;Строка # 2 исполняет скрипт только в открытом приложении GTA
#Include samp.ahk
#IfWinActive GTA:SA:MP

;Путь к chatlog.txt, а именно к файлу, где сохраняются все сообщения из чата игры
ChatLog = C:UsersUserDocumentsGTA San Andreas User FilesSAMPchatlog.txt

; Начало нашего цикла
loop
{

; lastline - переменная, что хранит в себе данные, полученные с функции GetNewLine.
lastline := GetNewLine(ChatLog)

;Здесь будет наше регулярное выражение и этим всё сказано (вернёмся позже).

;Условие, которое будет исполнено при НЕ пустой переменной регулярного выражения.
If expression !=
{

;SendChat - функция, которая позволяет писать в чат не используя клавиатуру и базовые возможности АХК. (Send, SendInput, SendRaw и.т.д.)
SendChat("команда")

; 1. Закрыли условие expression
; 2. Закрыли цикл loop
}
}

; Далее идёт функция, что определяет появившуюся строку в чате.
; На данном этапе не вижу смысла разбирать эту функцию построчно,
; но в будущем, при потребности - мы обязательно это сделаем.

GetNewLine(filename)
{
static old
static new
if !old
    {
        FileGetSize, old, %filename%
        new := old
    }
while old = new
    {
        sleep 100
        FileGetSize, new, %filename%
    }
old := new
Loop, read, %filename%
if A_LoopReadLine
    {
        last := A_LoopReadLine
    }
return last
}

; Строка № 1 - Сочетание клавиш Alt+END - завершит процесс данного скрипта
; Строка № 2 - Нажатие END - перезагрузит скрипт, после чего он будет готов к работе
!end::ExitApp
end::Reload


Надеюсь, вы поняли структуру и что за чем идёт.
Теперь смело копируйте каркас нашего скрипта, чтобы мы смогли

вместе его редактировать

.
(Копируйте цельным блоком, что я предоставил вам в самом начале)

И вот мы подошли к моменту, на котором желторотики вскрывают себе вены, а новички бьются в конвульсиях, я говорю о РеГуЛяРнЫх ВыРаЖеНиЯх.

Я не собираюсь копировать термин из Википедии, что такое «Регулярные выражения«. Скажу своими словами: Регулярные выраженияэто возможность копировать/вырезать/отправлять, одним словом — обработать необходимую нам строку и достать из неё N-слова. Будь они статичны или переменны — роли не играет.

:hunter:Строку, что нам нужна, будем определять благодаря этим же Регулярным выражениям.:hunter:
В нашем случае — мы будем рассматривать строки такого типа:​

[16:24:44] Nick_Name[7]: по чём штаны?

[20:33:41] — рюмка водки (Nick_Name) [178]

[54:23:41] [23] — Патрик, привет! (Nick_Name)


В Регулярных выражениях есть такое понятие, как литеральный текст. Звучит страшно, но расскажу максимально понятно и только то, что нужно.

Если в искомой строке есть/могут быть литеральные символы, необходимо — нет, не плакать.
Перед и После литеральный символ необходимо обставить Q и E соответственно.
Таким образом, например » [ «, будет считаться не буквально и будет воспринято как часть строки.

; Строка в стандартном виде
Nick_Name[7]
; Строка в виде регулярного выражения
Nick_NameQ[E7Q]E
; Или же
Nick_Name[7]

Поправка: Q .. E в написании, можно заменить на перед любым литеральным символом.
Пример выше.

Главное — не забыть о существовании литеральных символов в принципе.
Запомнили? Молодцы.

Так же, Регулярное выражение не прощает опечаток!
Лишний пробел или его отсутствие может запороть любую «регулярку». И уж поверьте — одним криком от отчаяния и злости от глупого прокола вы не обойдётесь.
Поэтому, всегда следите при написании Регулярного выражения за тем, чтобы они были 1 в 1: «регулярка» в своём понимании, а наша строка — в своём.

;Пример № 1, правильно составленное регулярное выражение:
var = ert tre zsdf
RegExMatch(var, "ert t(.)e zsdf", var)
MsgBox % var1

;Пример № 2, НЕправильно составленное регулярное выражение:
var = ert tre zsdf
RegExMatch(var, "ert t(.)e  zsdf", var)
MsgBox % var1

;Ошибка примера № 2, в виде лишнего пробела перед zsdf.
;Не допускайте таких ошибок.

Структура Регулярного выражения до боли проста:

RegExMatch(ПеременнаяОтСюдаЧитаем, "Опции искомой строки", результат на выходе)


autohotkey2.png


Плавно подошли к написанию собственного Регулярного выражения.

Возьмём за пример эту строку:​

[16:24:44] Nick_Name[7]: по чём штаны?

Из неё нам необходимо «вытащить» Фамилию, ID и само сообщение. Приступим?​

;Для примера нам необходимо создать переменную var, в которой будет находиться наша строка.
var = [16:24:44] Nick_Name[7]: по чём штаны?

Выражение (.*), иногда называют ВсёЧтоУгодно, оно позволит скопировать необходимые нам части сообщения.​

RegExMatch(var, "[16:24:44] Nick_(.*)[(dd?d?)]: (.*)", find)

Теперь занимаемся литеральными символами. У нас их 4.
Две [ скобочки и две ] скобки.​

RegExMatch(var, "[16:24:44] Nick_(.*)[(.*)]: (.*)", find)

Так как наша строка будет читаться из чатлога, время из [16:24:44] и при необходимости Nick_ будут переменны. Поэтому добавляем выражение и для них:​

RegExMatch(var, "[(dd):(dd):(dd)] (.*)_(.*)[(dd?d?)]: (.*)", find)

Что мы имеет на выходе?
Строка, что будет подходить под параметры нашего Регулярного выражения, будет читаться.
И переменная » find » обретёт содержимое.
Хочу добавить примеры строк, что могут и будут определены:​

[16:24:44] Boll_Name[7]: по чём штаны?​

[08:14:34] Trol_Toga[228]: Стол твёрдый.​

[56:44:24] Sjjj_Oma[12]: Афганистан — это страна!​

[02:54:14] WQaa_Side[82]: Эвропа загнивает?​

Теперь немного о переменной find.
Как вы помните, выражение (.*) позволяет не только пропускать N-слова в строчке под условие,
но и определять их для дальнейшего использования.
В данном выражении у нас есть 7 элементов​

RegExMatch(var, "[(dd):(dd):(dd)] (.*)_(.*)[(dd?d?)]: (.*)", find)

Для того, чтобы использовать каждый элемент для своих нужд, необходимо слитно с переменной find записать порядковый номер элемента (.*)​

;[16:24:44] Nick_Name[7]: по чём штаны?
;RegExMatch(var, "[(dd):(dd):(dd)] (.*)_(.*)[(dd?d?)]: (.*)", find)
msgbox % find5 ; покажет нам Name
msgbox % find7 ; покажет нам сообщение
msgbox % find6 ; покажет нам ID


Используем наше выражение​


Вот мы и составили наше Регулярное выражение. Теперь вставляем его в пример ниже:​

#Include samp.ahk
#IfWinActive GTA:SA:MP
ChatLog = C:UsersUserDocumentsGTA San Andreas User FilesSAMPchatlog.txt

loop
{
lastline := GetNewLine(ChatLog)
RegExMatch(var, "[(dd):(dd):(dd)] (.*)_(.*)[(dd?d?)]: (.*)", find)
If find6 !=
{
   SendChat("команда")
}
}

GetNewLine(filename)
{
static old
static new
if !old
    {
        FileGetSize, old, %filename%
        new := old
    }
while old = new
    {
        sleep 100 ;задержка
        FileGetSize, new, %filename%
    }
old := new
Loop, read, %filename%
if A_LoopReadLine
    {
        last := A_LoopReadLine
    }
return last
}
!end::ExitApp
end::Reload

Если элемент «ID» не будет пуст, в чат будет отправлено сообщение «команда».
Дальше уже можно по своему вкусу изменять данное условие. Приведу лишь пару примеров:​

If find6 !=
{
   SendChat("/mute " find6 " 30 флуд")
}
; Если элемент "ID" не будет пуст, в чат от вас последует команда /mute id 30 флуд, что выдаст мут по данному ID

If find5 !=
    SendChat("Адмирал " find5 " , что вы хотели этим сказать?")
;В чат будет отправлено сообщение: Адмирал Name, что вы хотели этим сказать?

If find7 !=
{
SendChat("Цитирую: " find7)
}
;В чат будет отправлено сообщение: Цитирую: по чём штаны?

На этом тема данной статьи подошла к концу.
Используйте данный пример, составляйте свои «регулярки» и будьте всегда первыми в конкурсе «Решите пример: 557 + 992″​


Немного о функции SendChat
Для отправки сообщения, необходимо его закрыть в «», чтобы получилось так:​

Чтобы в строке читалась переменная, необходимо закрыть открытую » и вписать имя переменной, не используя %%, так как в этом случае значение переменной будет читаться так же, как переменная.

Немного о функции addChatMessage
addChatMessage позволяет отправлять в чат фэйк-сообщения, которые видите только вы.
Это можно использовать для того, чтобы при запуске скрипта — в чат было отправлено сообщение о запуске, при любом действии, и т.д.​

addChatMessage("Сообщение")
; Самое стандартное сообщение

Чтобы изменить цвет сообщения, необходимо добавить HTML коды цветов:

addChatMessage("{FF8C00} bass_devware")


Подведём итоги

Я не заявляю, что данный гайд самый подробный и при прочтении его вы обязательно научитесь составлять Регулярные выражения любой сложности.
Нет.
Однако нюанс в том, что таких гайдов и не будет.
В конце статьи я оставлю справку по Регулярным выражениям для тех, кому интересно и для тех, кому не понятно до сих пор.

Любые вопросы можете задавать в данной теме и просьба БЛАГОДАРИТЬ тех, кто вам поможет своим ответом.
Светлого будущего и удачи!
Спасибо, что дочитали до конца.


RegEx | RegExMatch | RegExReplace | samp.udf | AutoHotKey

#V9GAS

Регистрация
8 Дек 2021
Сообщения
358
Лучшие ответы
4
Репутация
94
Адрес

Российской империи

  • #1

Всем привет! Сегодня я расскажу как создать свой скрипт АХК для Samp. Тоесть его задача выполнять быстрые задачи нажав кнопку.
Я буду использовать программу AutoHotkeyScript(AHK).

Первым делом скачаем саму программу на её оффициальном сайте.

После скачивания, создаем файл на рабочем столе.

Кликаем ПКМ по файлику и нажимаем «Edit Script».

У нас открывается файл, в ней будут символы но нам они не нужны, мы их просто удаляем.

И начинаем писать код скрипта, я буду писать для Полиции Лос-Сантоса.

PHP:

NumPad0::
SendMessage, 0x50,, 0x4190419,, A

NumPad0:: — Это клавиша на которой после нажатия будет производиться сам АХК.
SendMessage, 0x50,, 0x4190419,, A — Нужное системное сообщение, без него АХК работать не будет.

Код:

NumPad0::
SendMessage, 0x50,, 0x4190419,, A
SendInput, {F6}/do Удостоверение лежит в правом кармане.{Enter}
Sleep 750
SendInput, {F6}/me достал в открытом виде удостоверение и показал{Enter}
Sleep 750
SendInput, {F6}/do Удостоверение показано.{Enter}
Sleep 750
SendInput, {F6}/me засунул обратно удостоверение в карман{Enter}
Return

SendInput, {F6} — Это команда сама открывает чат с помощью клавиши F6.
{Enter} в конце команды — Это значит что сообщение само будет отправлятся.
Sleep — Это задержка сообщения, НЕ рекомендую ставить меньше 350 потому что может сработать анти-флуд.
Return — Возвращает функцию.

Вот и всё, сейчас я вам показал как сделать простейшую АХК команду. Если возникнут вопросы писать в данной теме.

C-Slo

Donator

Posts: 5105
Game name: Tom_Licata, Lucious_Craig

[GUIDE] Using Autohotkey + Suitable scripts


Image


Autohotkey


Image
AutoHotkey is a free, open-source scripting language for Windows that allows users to easily create small to complex scripts for all kinds of tasks such as: form fillers, auto-clicking, macros, etc. Keybinding means to assign hotkeys to specific functions.

Autohotkey can also be used to keybind SAMP commands.


Using AHK for SAMP


For SAMP, you can use AHK using the following steps.

  • Downloading and Installing AHK: Get a version of Autohotkey from here and install it.
  • Making a script: Click your right mouse button and navigate to «New» —> Autohotkey script. Name it whatever you want, for example «Tomasso’s script». Right click on it again and select «edit script». You will see a block of text. Ignore it and start your script from below (leaving a single line).

    Spoiler

  • Making it functional: Type the keys you want to use for a specific command. Each key has its own name.
    [+] Key names
  • Let’s say we’re going to use they key «F2» for the command «/help». Type F2 in the line and then :: (without space). After the proportion sign, add space and type «SendInput» (without the inverted commas). Add a space again and then type «t/help{Enter}» (without the inverted commas). You can add any other command instead of /help.

    Spoiler

  • You can add more commands to the same hotkey. After «{Enter}» type «t/kill{Enter}» without adding space. The commands will proceed in the written order. If you place /kill command first, then it’ll proceed with that first.

    Code: Select all

    F2:: SendInput t/help{Enter}t/kill{Enter}

    Spoiler

  • If you don’t add «{Enter}» to the end of your commands, it will leave the command line open with the command already written (means you will have to press Enter manually to make the command work).

    Code: Select all

    F2:: SendInput t/help{Enter}t/kill

    Spoiler

    In this case, you will have /kill command written on SAMP command line and you will have to press Enter on your keyboard to kill your character.

    Spoiler

  • You can also create a CUSTOM hotkey by adding «&» between two key names. For example, if we want to use Control and P at once for /p, we will type

    Code: Select all

    Ctrl & P:: SendInput t/p This is the SAPD - Pull over to the right side of the road and turn your engine off!{Enter}

    Spoiler

  • If you want to use more keys for other binds, just start writing your second command on the second line.

    Code: Select all

    Ctrl & P:: SendInput t/p This is the SAPD - Pull over to the right side of the road and turn your engine off!{Enter}
    Ctrl & Z:: SendInput t/tz{Enter}

    Spoiler

    So you have two binds written in this case.

  • Saving your script: Click on «File» at the top left corner of the notepad and click «Save».

    Spoiler

  • Running your script: Click your script in order to run it. Launch your game and you’re good to go!
  • Testing your script: Open notepad and hit your desired key to check whether or not the binds work.

    NOTE: You may assign your own keys by using the proper key names. You can use as many binds for a single key. However, avoid using only alphabet keys which may trigger while you’re typing something (like I am right now).


Suitable Scripts


  • For LEAs

    Code: Select all

    Ctrl & J:: SendInput t/duty{Enter}t/heal{Enter}t/givegun{Enter}
    Ctrl & K:: SendInput t/getfreq 1{Enter}t/syncradio 1{Enter}t/r U*** reporting on duty.{Enter}
    Numpad0:: SendInput t/engine{Enter}
    Ctrl & Numpad0:: SendInput t/engine{Enter}t/car fix{Enter}t/engine{Enter}
    Ctrl & P:: SendInput t/p This is the SAPD - Pull over to the right side of the road and turn your engine off!{Enter}
    Ctrl & Z:: SendInput t/tz{Enter}
    F2:: SendInput t/bk{Enter}t/d 
    F3:: SendInput t/em{Enter}t/d Need immediate backup at my location, over!{Enter}
    F5:: SendInput t/me takes out his cuffs and places them on the suspect's wrists.{Enter}t/cuff
    F6:: SendInput t/me pushes the suspect inside the cruiser.{Enter}t/get 
    

  • For illegals

    Code: Select all

    Numpad0:: SendInput t/engine{Enter}
    Ctrl & Numpad0:: SendInput t/engine{Enter}t/car fix{Enter}t/engine{Enter}
    F5:: SendInput t/fbk{Enter}t/r Need you all at my location.{Enter}
    Ctrl & P:: SendInput t/sellgun 
    Ctrl & Z:: SendInput t/usedrugs heroin{Enter}
    Alt & J:: SendInput t/floadguns{Enter}t/floadbullets{Enter}
    Alt & K:: SendInput t/fillhqstock{Enter}
    Ctrl & J:: SendInput t/loadbulletcrates{Enter}t/loadguncrates{Enter}
    Ctrl & K:: SendInput t/sellbulletcrates{Enter}t/sellguncrates{Enter}
    
  • For dealers

    Code: Select all

    Ctrl & O:: SendInput t/openbets 0{Enter}
    Ctrl & P:: SendInput t/closebets{Enter}t/roulette{Enter}
    Alt & P:: SendInput t/blackjack{Enter}

OPEN YOUR SCRIPT, CLICK EDIT SCRIPT AND PASTE THIS SCRIPT BELOW THE BLOCK OF TEXT.

Spoiler



If you have problems using AHK or need some help, just PM me in-game or on forums so I can help you ASAP.



Last edited by C-Slo on June 11th, 2018, 3:37 pm, edited 7 times in total.

«If you cannot accept the true I don’t find it as mine problem at all.»


Report of the decade.



C-Slo

Donator

Posts: 5105
Game name: Tom_Licata, Lucious_Craig

Re: [GUIDE] Using Autohotkey + Suitable scripts

June 11th, 2018, 2:12 pm

vans wrote: ↑

June 11th, 2018, 2:11 pm


Fix your image if possible.
Image

Also, good one, thank you (:

They’re still uploading (;

Thanks for the feedback.

«If you cannot accept the true I don’t find it as mine problem at all.»


Report of the decade.


Gazzar

SA Police Department

User avatar

Posts: 1771
Game name: Billy_DeLuca

Re: [GUIDE] Using Autohotkey + Suitable scripts

June 11th, 2018, 7:50 pm

Great work buddy, read it all..very useful even for those who doesn’t even now shit about AHK..that’s a true tutorial


Killa

Radio DJ

User avatar

Posts: 341
Game name: Akeem_Coke, Charlie_Agnoli, Tommy_Kartel

Re: [GUIDE] Using Autohotkey + Suitable scripts

June 11th, 2018, 9:02 pm

Excellent

What is Racism???
Racism is when you select your white clothes to wash first before the black ones……. say NO!!!! to racism….. wash them together.

The greatness of a man is not in how much wealth he acquires, but in his integrity and his ability to affect those around him positively.


Return to “Outdated Guides”

На чтение 3 мин Просмотров 2.3к. Опубликовано 26.01.2023

AutoHotkey — сценарный язык программирования, который существенно упрощает процесс PR отыгровок посредством автоматического ввода в игровой чат ряда подготовленных фраз.

AHK по большей части нужен тем игрокам, которые работают в силовых структурах (таких как LSPD, FIB и др.), ведь именно там высокая концентрация коммуникативных действий, где при нажатии нескольких клавиш вы в считанные секунды можете воспроизводить объемные отыгровки с использованием /do, /me, /try и т.д. (например, при проверке гос. сотрудником угнанной машины на предмет взлома).

В crime фракциях отыгровки понадобятся при ограблении гражданских или похитках

Настройка AHK и примеры отыгровок

Содержание

  1. Установка языка
  2. Создание файла
  3. Написание отыгровок
  4. Работа скрипта

Установка языка

Установка AHK не занимает много времени и не требует специальных знаний, нужно лишь скачать файл с официального сайта и установить языковой пакет на свой компьютер.

Ссылка на скачивание с оф. сайта (v1.1): www.autohotkey.com

Настройка AHK и примеры отыгровок

Настройка AHK и примеры отыгровок

Создание файла

Установив AutoHotkey, открываем контекстное меню нажатием правой кнопки мыши на рабочем столе, создаем файл скрипта, выбрав пункт «Создать › AutoHotkey Script», и открываем его любым доступным редактором (например, Блокнот).

Настройка AHK и примеры отыгровок

Написание отыгровок

Разберем принцип написания кода на примере простой отыгровки.

Numpad7::
{
Sendinput, {F6}
Sleep, 200
Sendinput /do Ключ-карта находится на поясе.{Enter}
Sleep, 2200
Sendinput, {F6}
Sleep, 200
Sendinput /me снял ключ-карту с пояса, открыл КПЗ и провел туда задержанного{Enter}
Sleep, 2200
Sendinput, {F6}
Sleep, 200
Sendinput /me закрыл КПЗ и повесил ключ-карту на пояс{Enter}
Return
}

Numpad7:: — клавиша (7 на цифровом блоке клавиатуры), по нажатию которой будет воспроизводиться сценарий в синих скобках.

Сокращение клавиш: # — Win, ! — Alt, ^ — Ctrl, + — Shift (например, !6:: — среагирует на нажатие сочетания клавиш Alt+6)

Sendinput, {F6} — нажимает клавишу F6, которая открывает форму ввода в игровой чат.

Sleep, 200 — ожидание/задержка в ms после открытия формы ввода в чат.

Sleep, 2200 — ожидание/задержка в ms после отправки текста/отыгровки в игровой чат.

Sleep необходимо указывать между каждым действием, например, нажали F6 — подождали, ввели текст в поле и отправили в чат — подождали

Если код будет сбоить, можете увеличить задержку на 10-20%

Sendinput{Enter} — вводит в поле заданный текст/отыгровку и нажимает клавишу Enter.

При необходимости ввести символ # ! ^ +, заключите его в фигурные скобки — {!}

Return — оператор, который возвращает результат воспроизведения/выполнения функции (перед Return не нужно указывать Sleep).

Скачать файл с примерами отыгровок: TEST_AHK.rar (Google Диск)

Настройка AHK и примеры отыгровок

Работа скрипта

Наполнив файл нужными отыгровками, сохраняем его и запускаем, кликнув на значок правой кнопкой мыши и выбрав пункт «Run Script». Если вы все сделали правильно, то на панели задач появится зеленая иконка с буквой «H». Теперь, находясь в игре, при каждом нажатии ранее заданных клавиш будут проигрываться относящиеся к ним сценарии.

Выбрав «Exit» в контекстном меню на иконке в трее, вы завершите работу скрипта

Настройка AHK и примеры отыгровок

Понравилась статья? Поделить с друзьями:
  • Как написать 999 римскими цифрами
  • Как написать 966
  • Как написать 95000 прописью
  • Как написать 928
  • Как написать 926