[Разработка] SAMP UDF | Дорабатываем вместе! | От 04.02.2018 - Страница 19 - Форум Cheat-Master.ru
Модератор форума: Sanoxxx, Alowir, Phoenixxx_Czar  
[Разработка] 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. Можешь вынести метку таймера вне функции и проверить тики процессора smile

Цитата 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, сейчас бы рапорты слать на человека с которым ты сам тут и споришь

Поиск:
Статистика Форума