Исходник Информация Callback-класс для чтения чата

альбертио представляет

Известный
Автор темы
348
184
Привет.
Практически каждый AHK-скриптер считывал данные с чата в SA-MP.
И все делали одинаково - через цикл.
Однако, цикл создает один-единственный поток (thread), который есть AHK.
Поэтому, я решил выложить свою альтернативу.
В чем заключается альтернатива?
Да все просто, все работает на основе callback механизма.
Собственно, сам класс для работы:
AutoHotKey:
/*
    author: muxui
    version: 0.3.1 (stable)
    cdn source (class): https://cdn.muxui.cc/chatreader-class.ahk
    cdn source (samp udf latest for r1 version): https://cdn.muxui.cc/samp-udf-latest.ahk
    This project is open-source, you can remake he!
    Please not remove copyrights and links. Thanks for using. Thanks you!
    © muxui, 2019
*/

class ChatReader {

    static function := ""
    static line := ""
    
    addCallback(function) {
        if (IsFunc(function)) {
            this.function := function
            ObjBindMethod(this, "pool").Call()
            return true
        }
        return false
    }
    
    pool() {
        if ((new_line := getChatLineEx(0)) != this.line) {
            func(this.function).Call(this.line := new_line)
        }
        Sleep, 70
        return ObjBindMethod(this, "pool").Call()
    }
}

Пример использования:
AutoHotKey:
#SingleInstance, Force
#Persistent
#Include, %A_ScriptDir%\project\fa-fa-lib\samp-udf-latest.ahk
#Include, %A_ScriptDir%\project\fa-fa-lib\chatreader-class.ahk
#If WinActive("GTA:SA:MP")

;Создаем объект messages с нашим классом ChatReader()
messages := new ChatReader()

;Вызываем метод класса ChatReader() с параметром нашей произвольной функции
messages.addCallback("messages_event")

;Это наша произвольная функция, в ней также находится произвольный параметр для принятия новой строки из чата
messages_event(text) {
    return addChatMessageEx(0xFFFFFF, "Чат: " text)
}


Зависимость: SAMP-UDF (функция getChatLineEx).
Делал вообще для себя, на написание ушло буквально 7-10 минут.
Думаю, многим понравится эта затея, если есть пожелания - пишите, с радостью сделаю дополню код.

Также, оставляю ссылки для скачивания на свой CDN-сервер:
Сам класс - https://cdn.randewoo.me/chatreader-class.ahk
SAMP-UDF (последняя версия, для версии SA-MP R1) -
https://cdn.randewoo.me/samp-udf-latest.ahk
 
Последнее редактирование:
  • Нравится
Реакции: Smer4 и Unnecess4ry

AnWu

Известный
Всефорумный модератор
4,777
5,400
ты же понимаешь что это все хуйня которая выглядит по другому? поток все так же будет изображать из себя мультипоточность и все так же будет сосать в скорости? единственное решение хуков скинул ринат. то что сделал ты это не хук
 
  • Нравится
Реакции: Roger571

альбертио представляет

Известный
Автор темы
348
184
ты же понимаешь что это все хуйня которая выглядит по другому? поток все так же будет изображать из себя мультипоточность и все так же будет сосать в скорости? единственное решение хуков скинул ринат. то что сделал ты это не хук
Я и не говорил про хук. На мой взгляд - так удобней и код смотрится красивей. Ну то на любителя.
Можешь считать это мини-вспомогательным фреймворком)
ты же понимаешь что это все хуйня которая выглядит по другому? поток все так же будет изображать из себя мультипоточность и все так же будет сосать в скорости? единственное решение хуков скинул ринат. то что сделал ты это не хук
Тут, кстати, даже скорее рекурсия, и немного callback.
Переименован пожалуйста в "вспомогательный фреймворк для чтения чата для новичков", или что-то в этом духе, если не сложно.
 
Последнее редактирование:

RTD

Потужно
Модератор
399
470
Я, кстати, ни разу не видел проектов, реализованных на сурсах Рината🙂
Для ahk в dll нет своего SAMP-UDF без зависимостей(SF Аpi имеет их, не в счет), так что понятно, что все продолжают писать на класике - ahk в exe
Можешь стать первым кто реализует, переписав все сам на DllCall, NumGet, NumPut
Кстати, у тебя устаревший и ограниченный SAMP-UDF(ну с моей точки зрения) посмотри вот этот: https://github.com/Icii2q/SAMP_API/blob/master/API.ahk
Я удивился когда увидел там функцию __INJECT, которая позволяет писать ассемблером ( asm в ахк :roflanebalo: )