[Разработка] SAMP UDF | Дорабатываем вместе! | От 04.02.2018
|
|
Pr1mera |
Дата: Суббота, 12.08.2017, 20:03 | Сообщение # 271
|
Новичок
Сообщений: 2
Статус: Offline
|
Может кто переделает в более красивый вид - буду благодарен (хотя и так работает). Командный процессор - пишем команду в чат, а AHK её перехватывает и исполняет (включая обработку до 10 параметров)
Код global ADDR_SAMP_CHAT_INPUT := 0x12D8F8
GetChatCommand() { SendInput {Space} Sleep 25 if(!checkHandles()) return "" SendInput {BackSpace} dwAddress := dwSAMP + ADDR_SAMP_CHAT_INPUT sChatCommand := readString(hGTA, dwAddress, 25) if(ErrorLevel) { ErrorLevel := ERROR_READ_MEMORY return "" SendInput {BackSpace} } ErrorLevel := ERROR_OK return sChatCommand SendInput {BackSpace} }
ChatClose() { SendInput ^{vk41} ;Ctrl+A SendInput {Del} SendInput {F6} Exit }
Как использовать:
Код Enter:: params1 = params2 = params3 = params4 = params5 = params6 = params7 = params8 = params9 = params10 = If IsInChat() { COM := getChatCommand() COM := Trim(COM) StringSplit, params, COM, %A_Space% params := RegExReplace(COM, params1 . " ", "")
;=== К О М А Н Д А=== Н А Ч А Л О====================== if (params1 = "/command1") { if (params = params1 or not (RegExMatch(params2, "S)\d+"))) { AddChatMessage("{FF4500}Что-то не так! Попробуйте снова: {A9C4E4}/command1 [ID игрока]") ChatClose() } sendchat(блаблабла) ChatClose() } ;=== К О М А Н Д А === К О Н Е Ц=======================
;=== К О М А Н Д А=== Н А Ч А Л О====================== if (params1 = "/command2") { if (params = params1 or not (RegExMatch(params2, "S)\d+"))) { AddChatMessage("{FF4500}Что-то не так! Попробуйте снова: {A9C4E4}/command2 [ID игрока]") ChatClose() } sendchat(блаблабла) ChatClose() } } else { Send {Enter} } ;=== К О М А Н Д А === К О Н Е Ц=======================
} else { Send {Enter down} Sleep 50 Send {Enter up} } return
Сообщение отредактировал Pr1mera - Суббота, 12.08.2017, 20:27 |
|
|
|
belyankin12 |
Дата: Суббота, 12.08.2017, 22:19 | Сообщение # 272
|
Боец
Сообщений: 69
Статус: Offline
|
Огромный костыль. Зачем эти пробелы и бэкспейсы? Есть команда blockchatinput() блокирующая отправку серверу, используй её. Это правда образует небольшую задержку, но это не критично. Если создать цикла можно обрабатывать до миллиарда команд, в общем, есть к чему стремиться)
|
|
|
|
tumkin |
Дата: Воскресенье, 13.08.2017, 01:01 | Сообщение # 273
|
Tumkin Project
Сообщений: 1186
Статус: Offline
|
Pr1mera, два скрипта с таким командником запустишь, и будут конфликтовать они друг с другом
|
|
|
|
aknqkzxlcs_21 |
Дата: Воскресенье, 13.08.2017, 13:03 | Сообщение # 274
|
Боец
Сообщений: 57
Статус: Offline
|
Цитата Pr1mera ( ) Может кто переделает в более красивый вид - буду благодарен (хотя и так работает).
прости, конечно, но зачем это добавлять в samp-udf? если ты сделаешь САМПОВСКУЮ функцию для регистрации команд как это делается в собейте или в sampfuncs, то пожалуйста допустим, addClientCommand("команда", (int)funcname) но то, что ты добавил, делается непосредственно скриптером только лишняя нагрузка на udf
|
|
|
|
Pr1mera |
Дата: Воскресенье, 13.08.2017, 17:25 | Сообщение # 275
|
Новичок
Сообщений: 2
Статус: Offline
|
Цитата belyankin12 ( ) Зачем эти пробелы и бэкспейсы? Потому что 0x12D8F8 содержит в себе введённый текст до предпоследнего символа (до сих пор не разобрался с чем связано). BlockChatInput() мне тут ничем не поможет.
Цитата tumkin ( ) Pr1mera, два скрипта с таким командником запустишь, и будут конфликтовать они друг с другом Согласен. Поэтому и попросил: дороботать, если кто знает как.
Цитата aknqkzxlcs_21 ( ) если ты сделаешь САМПОВСКУЮ функцию для регистрации команд как это делается в собейте или в sampfuncs, то пожалуйста Странно, что никто этого до сих пор не сделал на AHK: может ты и сделаешь? А я всего-лишь предложил костыль для отсутствующей (на данный момент) функции.
Сообщение отредактировал Pr1mera - Воскресенье, 13.08.2017, 17:26 |
|
|
|
aknqkzxlcs_21 |
Дата: Воскресенье, 13.08.2017, 20:27 | Сообщение # 276
|
Боец
Сообщений: 57
Статус: Offline
|
Цитата Pr1mera ( ) Странно, что никто этого до сих пор не сделал на AHK: может ты и сделаешь? А я всего-лишь предложил костыль для отсутствующей (на данный момент) функции.
могу сделать, но тебе придется инжектить ахк в процесс gta_sa.exe, так как команда привязывается к адресу функции в памяти (так же делают mod_sa, sampfuncs и moonloader, они являются частью процесса игры), следовательно компилить один скрипт в dll (для инжекта), а другой в exe (интерфейс для пользователя и инжект дллки) а поскольку gta_sa.exe и ahk скрипт являются двумя разными процессами, изолированными друг от друга, нет и смысла делать такую функцию, ну только если чтобы заглушить команду (сделать локальной без blockinput) конечно есть много геморных способов заставить два процесса взаимодействовать друг с другом, но это уже другая история
|
|
|
|
belyankin12 |
Дата: Воскресенье, 13.08.2017, 21:13 | Сообщение # 277
|
Боец
Сообщений: 69
Статус: Offline
|
Не понял, о каком введенном тексте до предпоследнего символа речь идёт? В своем обработчике я использую этот же адрес, все считывается идеально: readString(hGTA, dwSAMP + 0x12D8F8, 256)
Блокчат используется сразу после нажатия ентер. Грубо говоря скрипт пропускает любой введенный в чат текст через себя и если там видит / первым символом, то начинает разбираться: не его ли это команда. Как-то так. И только после того как текст прошел через скрипт, он отправляется на сервер (если это не команда или команда но не скриптовая), либо блокируется полностью (если команда скрипта) и выполняется действие.
Сообщение отредактировал belyankin12 - Воскресенье, 13.08.2017, 21:16 |
|
|
|
aknqkzxlcs_21 |
Дата: Воскресенье, 13.08.2017, 22:18 | Сообщение # 278
|
Боец
Сообщений: 57
Статус: Offline
|
блокчат не оч.
Думаю, что пора прекращать тут оффтопить, тема создана не для дискуссий, тут публикуют новые/измененные функции
|
|
|
|
Coockie |
Дата: Понедельник, 14.08.2017, 11:11 | Сообщение # 279
|
Новичок
Сообщений: 27
Статус: Offline
|
HTTP v3.0: https://pastebin.com/EjjYkQs0 Author: Coockie Что добавлено: 1) Возможность отправлять пакеты на сервер 2) Дополнены виды ошибок (статус/текст ответа при ошибках) 3) Добавил функцию отключения кеша Примеры:
Код r := http("https://ahk-scripts.ru", , "POST", true, "?login=Coockie&password=aknqkzxlcs_priemniy") r := http("https://ahk-scripts.ru?login=Coockie", "application/json", "GET", false)
Сообщение отредактировал Coockie - Понедельник, 14.08.2017, 11:13 |
|
|
|
ABS0LUTE |
Дата: Понедельник, 14.08.2017, 18:10 | Сообщение # 280
|
Новичок
Сообщений: 3
Статус: Offline
|
Цитата aknqkzxlcs_21 ( ) могу сделать, но тебе придется инжектить Слишком много воды.
Код global SAMP_CLIENT_CMDS := Object() global SAMP_CLIENT_CMDS_COUNT :=0 global ADDR_SAMP_COMMAND := 0x12D8F8
addClientChatCommand(cmd_string, exec_func, cmd_error) { local cmd cmd := Object() cmd.cmd := cmd_string cmd.func := exec_func cmd.error := cmd_error SAMP_CLIENT_CMDS_COUNT++ SAMP_CLIENT_CMDS[SAMP_CLIENT_CMDS_COUNT] := cmd SetTimer, is_CLIENT_CMD, 25 is_CLIENT_CMD: COM := readString(hGTA, dwSAMP + ADDR_SAMP_COMMAND, 256) for CMD in SAMP_CLIENT_CMDS { checkHandles() if (RegExMatch(COM,"^"+SAMP_CLIENT_CMDS[CMD].cmd)) and (getChatLineEx() = SAMP_CLIENT_CMDS[CMD].error) { ;setChatLine(0,"DEBUG: " COM) ;Debug removeChatLine(0) ; вызывает задержку -> можно заменить на setChatLine writeString(hGTA, dwSAMP + ADDR_SAMP_COMMAND, "") params := StrSplit(COM, A_Space) SAMP_CLIENT_CMDS[CMD].params := params gosub % SAMP_CLIENT_CMDS[CMD].func } } return } Продакшн:
Код addClientChatCommand("/cmd1","cmd1", "Неизвестная команда.") addClientChatCommand("/cmd2","cmd2", "Неизвестная команда.") return
cmd1: addChatMessage("Команда #1 работает!") addChatMessage("Первый параметр: " SAMP_CLIENT_CMDS[1].params[2]) addChatMessage("Второй параметр: " SAMP_CLIENT_CMDS[1].params[3]) return
cmd2: addChatMessage("Команда #2 работает!") addChatMessage("Всего передано параметров: " SAMP_CLIENT_CMDS[2].params.MaxIndex()-1) return
Сообщение отредактировал ABS0LUTE - Вторник, 15.08.2017, 09:06 |
|
|
|
aknqkzxlcs_21 |
Дата: Понедельник, 14.08.2017, 18:27 | Сообщение # 281
|
Боец
Сообщений: 57
Статус: Offline
|
что это?)) ты сам-то проверял этот код? зачем создавать метку внутри функции? а про 120-150 мс не слышал? куча таймеров могут вызвать сбои в работе программы, хотя так не всегда происходит, но все же это лишнее ставить на команду по одному таймеру, быдлокодерство так сказать зачем ты используешь удаление или изменение строк тоже для меня загадка
и речь шла о другом... о регистрации локальных команд в сампе, а не о создании кучи таймеров в ахк и чтении последнего введенного текста в чат, а ты ворвался в разговор с ноги со своим кодом твои команды даже похожи на локальные не будут, ведь локальные команды не отправляются серверу
Сообщение отредактировал aknqkzxlcs_21 - Понедельник, 14.08.2017, 18:30 |
|
|
|
ABS0LUTE |
Дата: Вторник, 15.08.2017, 09:45 | Сообщение # 282
|
Новичок
Сообщений: 3
Статус: Offline
|
Цитата aknqkzxlcs_21 ( ) ты сам-то проверял этот код? А ты?
Цитата aknqkzxlcs_21 ( ) а про 120-150 мс не слышал? Сейчас у 85% людей не ниже i3: каждые 3мс выполнить жалких 300-500 тиков среднего приоритета - ерунда. Ради тебя исправил до 25.
Цитата aknqkzxlcs_21 ( ) куча таймеров могут вызвать сбои в работе программы, Где ты видишь кучу? Открывай OllyDbg и не забывай, что это интерпретатор. При вызове SetTimer создаётся область памяти под таймер и туда вывозится указатель на стэк метки => нельзя создать два таймера с одинаковой меткой. В функции он только чтобы (не очень бдительные) пользователи не переопределили код метки таймера. Вывод: он всего один, который каждые 3мс (уже 25мс) чекает последнюю команду на принадлежность к SAMP_CLIENT_CMDS. Можешь вынести метку таймера вне функции и проверить тики процессора
Цитата aknqkzxlcs_21 ( ) зачем ты используешь удаление или изменение строк Чтобы удалить строку "Неизвестная команда." (в моём случае)
Цитата aknqkzxlcs_21 ( ) о регистрации локальных команд в сампе, Ты так переживаешь о сервере? Во-первых: уж вряд ли он зависнет от некорректных команд, отправляемых к серверу. Во-вторых, серверу будет проще определить сколько игроков используют тот или иной скрипт (иногда полезно). В-третьих, при такой структуре отправки сообщений можно делать F6->ArrowUp->Enter и всё будет корректно работать. В-четвертых, не забывай, что это AHK UserDefinedFunctions. Создание хуков/инжектов и внос своего кода в память процесса (отдельным модулем) - выходит из этого определения. В твоём понимании - считывать чатлог с файла игры, а не из памяти - тоже не SAMP-функция и не является UDF. Ты не прав.
Сообщение отредактировал ABS0LUTE - Вторник, 15.08.2017, 10:18 |
|
|
|
aknqkzxlcs_21 |
Дата: Вторник, 15.08.2017, 11:52 | Сообщение # 283
|
Боец
Сообщений: 57
Статус: Offline
|
Лень всё это читать, но ты походу всё еще не понял, что речь шла о другом, а именно об использовании встроенной самповской функции для регистрации команд, то есть не нужно никаких костылей типа хоткеев на интер, либо таймеров/лупов и доп. проверок
конечно, лучше использовать ваши новые велосипеды, так как самп поддерживает не более 144 локальных команд, а скриптов может быть много, и также могут быть проблемы с выгрузкой команд (если скрипт завершился аварийно, например)
Цитата ABS0LUTE ( ) Ты так переживаешь о сервере? не понял, причем тут сервер вообще локальная команда на то и локальная, что работает внутри клиента и не отправляется серверу 1) мне, например, не нужно, чтобы серверу отправлялась данная команда. Мне не нужно, чтобы он вообще это знал, и тому есть много причин 2) я хочу заменить команду /f (допустим) на свою, чтобы я вводил /f текст, а он отправлял серверу /f [ТЭГ] текст, но тут сразу две проблемы: он отправит и как и /f текст, так и /f [ТЭГ] текст (но вторая не отправится из-за антифлуда) 3) я хочу, чтобы при вводе /z сразу (без ожидания) отправилось серверу /get drugs, но, конечно же, антифлуд не даст тебе отправить /get drugs ранее чем через 1100-1200 мс, так как уже была отправлена /z, придется ставить слип
|
|
|
|
ABS0LUTE |
Дата: Вторник, 15.08.2017, 12:18 | Сообщение # 284
|
Новичок
Сообщений: 3
Статус: Offline
|
Цитата aknqkzxlcs_21 ( ) а именно об использовании встроенной самповской функции для регистрации команд Цитата ABS0LUTE ( ) В-четвертых, не забывай, что это AHK UserDefinedFunctions. Создание хуков/инжектов и внос своего кода в память процесса (отдельным модулем) - выходит из этого определения. В твоём понимании - считывать чатлог с файла игры, а не из памяти - тоже не SAMP-функция и не является UDF. Ты не прав. Дело в том, что то, о чём ты говоришь не входит в UDF в принципе. Хочешь локальной регистрации и инжект - пиши свою DLL, но это будет уже не AHK UDF. Смысл данной темы в написании пользовательских функций, использующих интерфейсы взаимодействия данного интерпретатора и игры. Я всё это к тому, что явно не тебе решать, что подобная (велосипедно-костыльная) функция "портит данный UDF" и не нужна здесь. Возможно переписать мой скрипт "прямее", но смысл его в рамках UDF и этой темы не поменять. По-другому с помощью только AHK ты ничего не сделаешь.
А все твои 1,2,3,N устраняются с помощью, предложенного выше, blockChatInput()
Сообщение отредактировал ABS0LUTE - Вторник, 15.08.2017, 12:24 |
|
|
|
tumkin |
Дата: Вторник, 15.08.2017, 14:10 | Сообщение # 285
|
Tumkin Project
Сообщений: 1186
Статус: Offline
|
ABS0LUTE, сейчас бы рапорты слать на человека с которым ты сам тут и споришь
|
|
|
|