Исходник Гайд AHK-SAMPFUNCS-API

Статус
В этой теме нельзя размещать новые ответы.

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,036
AHK-SAMPFUNCS-API
API для взаимодействия с SAMPFUNCS на AHK, скомпилированных в dll.
API состоит из AHK-SAMPFUNCS-Module.sf и файла AHK-SAMPFUNCS-API.ahk.
Для подключения библиотеки нужно вписать в начало скрипта следующий код:
AutoHotKey:
#include AHK-SAMPFUNCS-API.ahk
global SF := new SAMPFUNCS()
Установка: SF файл переместить в GTA\SAMPFUNCS, AHK скомпилировать в ASI и переместить в корень.


Введение:
Основные понятие (Нажми на название что бы посмотреть подбронее):
  • Конструктор - специальный блок инструкций, вызываемый при создании объекта.
  • Деструктор - специальный блок инструкций, вызываемый при уничтожении объекта.
  • Объект - некоторая сущность в компьютерном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов).
  • Метод - это функция или процедура, принадлежащая какому-то классу или объекту.
То есть при вызове конструктора, он возвращает новый объект через который можно вызывать его методы и получать значение переменных.
Вызов конструктора и помещение возвращаемого объекта в переменную:
AutoHotKey:
Переменная := new Класс()
Уничтожение объекта:
AutoHotKey:
Объект := ""
Вызов метода класса:
AutoHotKey:
Объект.Метод(Аргументы)
Получение значения переменной класса:
AutoHotKey:
Объект.Переменная

При вызове конструктора нашего класса, в случае если SF модуль не найден, то он скачает последнюю версию модуля с моего репозитория и загрузит ее в игру, если это не произойдет в течении 3-ех попыток, конструктор вернет false.
Перед вызовом функций нужно удостоверится что модуль инициализирован, проверить это можно методом ModuleIsInit(), пример:
AutoHotKey:
while (!SF.ModuleIsInit())
    continue
Так что советую устанавливать хоткеи динамический, то есть через функцию HotKey после инициализации, либо в статических хоткеях придется проверять статус модуля.


Примеры:
Долгое время считалось что словить сообщение можно только через чтение чатлога, ну или хотя бы через чтение памяти, но ниже приведен пример чтения чата работающий на RPC хуке.
Запрещает вывод сообщений в чат, и выводить их в консоль SF.
AutoHotKey:
SF.registerRakNetCallback(SF.RAKHOOK_TYPE_INCOMING_RPC, "IncomingRPC")

IncomingRPC(params)
{
    critical ; Предотвращает прерывание текущего потока другими потоками.
    BS := SF.BitStream(params)
    if (BS.packetId == SF.RPC_ScrClientMessage)
    {
        BS.ResetReadPointer()
        BS.Read(color, "DWORD")
        BS.Read(length, "DWORD")
        BS.Read(text, length)
        BS.ResetReadPointer()
        SF.LogConsole("color = " DecToHex(color) " | text = " text)
        return false ; Игнорируем RPC.
    }
    return true ; Успешно завершаем обработку RPC.
}
Следующий пример, по работе с диалогами, позволяет узнать какую кнопку нажал, что ввел, какой пункт выбрал и т.д, нету таких проблем как с костылями в SAMP UDF.
AutoHotKey:
SF.registerDialogCallback("DialogCallback")

!1::
    SF.ShowDialog(2, SF.DIALOG_STYLE_LIST, "Меню", "Пункт 1`n`nПункт 2`nПункт 3", "Назад", "Закрыть")
return

!2::
    SF.ShowDialog(3, SF.DIALOG_STYLE_INPUT, "Меню", "Введите номер:", "Закрыть")
return

DialogCallback(dialogId, buttonId, listItem, input)
{
    GetParamsAsStr(input)
    SF.LogConsole("--------------------")
    SF.LogConsole("dialogId = " dialogId)
    SF.LogConsole("buttonId = " buttonId)
    SF.LogConsole("listItem = " listItem)
    SF.LogConsole("input = " input)
    SF.LogConsole("--------------------")
}
Вызов cleo опкода:
AutoHotKey:
SF.callOpcode("01B6: set_weather 9")

API находиться в стадии разработки.​
 

Вложения

  • AHK-SAMPFUNCS-API.zip
    20.9 KB · Просмотры: 139
Последнее редактирование:

Revalto

Известный
532
225
Как всегда идеально)
По сути он будет работать на уровне AHK или на скорости С++ c подключенным SF API?
 
  • Нравится
Реакции: #Rin

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,036
Как всегда идеально)
По сути он будет работать на уровне AHK или на скорости С++ c подключенным SF API?
AHK вызывает C++ функцию, которая вызывает SF API, по идеи скорость должна быть быстрее.
Но SAMP UDF тоже можно переписать на работу в dll, даже частично написано у меня.
Можно вообще все на ахк писать, он же со структурами тоже может работать, но не так удобно как в C++.
 

Revalto

Известный
532
225
AHK вызывает C++ функцию, которая вызывает SF API, по идеи скорость должна быть быстрее.
Но SAMP UDF тоже можно переписать на работу в dll, даже частично написано у меня.
Можно вообще все на ахк писать, он же со структурами тоже может работать, но не так удобно как в C++.
Скоро забьют AHK темы по эмуляции клавиши на отправку пакетов данных на сервер :D
И нормальный чек чата)

Я любитель хардкора. Подскажи, в чем проблема?
qUdASIT.png
 

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,036
Я любитель хардкора. Подскажи, в чем проблема?
qUdASIT.png
AHK-SAMPFUNCS-Module.sf закинут в папку гта/SAMPFUNCS.
AHK скомпилить в .dll, изменить разширение на .asi и в папку с игрой.

Если ты захотел скомпилить через AHK_H, то огорчу тебе нужно написать автовыполнение кода и перекомпилирвовать его в visual studio.
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
@Rinat_Namazov Опять улучшаешь умирающий AHK. С такими темпами скоро сосать начнёт CLEO и SF сами по себе.
Кстати, разработкой сайтов на заказ не занимаешься?
 
  • Нравится
Реакции: #Rin

Revalto

Известный
532
225
@Rinat_Namazov Опять улучшаешь умирающий AHK. С такими темпами скоро сосать начнёт CLEO и SF сами по себе.
Кстати, разработкой сайтов на заказ не занимаешься?
Ну ты и бред сказанул. Если убрать CLEO и SF, то толку с этих уроков нету. Ибо он показывает как можно работать с SF / CLEO на ahk. Проще говоря упрощает работу, желающим работать с этим)
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
Ну ты и бред сказанул. Если убрать CLEO и SF, то толку с этих уроков нету. Ибо он показывает как можно работать с SF / CLEO на ahk. Проще говоря упрощает работу, желающим работать с этим)
Я имел в виду, что проще будет использовать AHK, чем писать скрипты и плагины на CLEO и SF, ибо AHK намного проще освоить, чем тех двоих.
 

Revalto

Известный
532
225
Я имел в виду, что проще будет использовать AHK, чем писать скрипты и плагины на CLEO и SF, ибо AHK намного проще освоить, чем тех двоих.
C++ легче освоить для SA:MP, ведь весь API написан. Да и этот кусок кода выглядит в C++ легче, чем тут)
 

Di3

Участник
432
20
Чтение через понятно, а отправку можно как то сделать?
В замену sendchat() and sendinput
 

Smer4

Известный
424
51
Есть опкод 0B34
1. Первый вопрос это можно ли сокращать все это дело ну типо
Несокр.
Код:
0B34: samp register_client_command "en" to_label @toggle
Сокр.
Код:
0B34: "en" @toggle
и то и то будет правельно в cleo, но можно ли так делать в ахк (При помощи доп. библиотеки конечно)

2.Я юзаю в своем скрипте 0B34 так, но как не удивительно нихера не работает
Код:
SF.callOpcode("0B34:"say" @say")
проще говоря, скрипт должен переходить в переменную say(in AHK) при вводе юзером команды /say.
А вопрос в ток как правильно юзать этот(0B34) опкод (В АХК БЛ!@Ь).
 

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,036
Есть опкод 0B34
1. Первый вопрос это можно ли сокращать все это дело ну типо
Несокр.
0B34: samp register_client_command "en" to_label @toggleВыделить кодNone
Сокр.
0B34: "en" @toggleВыделить кодNone
и то и то будет правельно в cleo, но можно ли так делать в ахк (При помощи доп. библиотеки конечно)
Спроси FYP'a или протестируй на практике, но я думаю лучше использовать первый вариант.

проще говоря, скрипт должен переходить в переменную say(in AHK) при вводе юзером команды /say.
Это так не работает.

Регистрацию команды я хотел сделать, но не успел.
А если через клео регать, можешь попробовать вот так:
AutoHotKey:
SF.callOpcode("0B34: samp register_client_command ""cmd"" to_label " RegisterCallback("cmd"))

cmd()
{

}
 

Smer4

Известный
424
51
Спроси FYP'a или протестируй на практике, но я думаю лучше использовать первый вариант.


Это так не работает.

Регистрацию команды я хотел сделать, но не успел.
А если через клео регать, можешь попробовать вот так:
AutoHotKey:
SF.callOpcode("0B34: samp register_client_command ""cmd"" to_label " RegisterCallback("cmd"))

cmd()
{

}
Да ля, я все объяснил как дебил, как в твоем плагине или скрипте хз, юзать 0B34 или нету такой возможности?
p.s - я сейчас про https://blast.hk/threads/24406/
 

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,036
SF.registerChatCommand("cmd", "function")
Но она вырублена, так как в ряле после вписывании команды /cmd крашилась игра, мне было лень разбираться, потом гляну.
 
Статус
В этой теме нельзя размещать новые ответы.