Исходник Софт Гайд Библиотека для работы с сетью

Вы хотели бы видеть в SAMP'е голосовой чат?


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

Удалённый пользователь 144706

Гость
Автор темы
Предисловие:

Это продолжение моего предыдущего поста Исходник - Гайд - Сетевое взаимодействие скриптов посредством SAMP пакетов(https://blast.hk/threads/18680/) про взаимодействие скриптов через SAMP-пакеты. Там я расписал в подробностях, как отправить 25 байт другому игроку. Я решил использовать эту фишку и написать скрипт, который передаёт файлы. У меня было очень много проблем с передачей. Передача была похожа больше на протокол UDP (т.е. данные могли передаться, а могли потеряться). Мне сразу захотелось сделать передачу данных с гарантией получения. Так я разработал библиотеку для передачи любого размера (не больше 128 килобайт).

Начинаем работать с библиотекой:

Для использования вам понадобится реализовать CALLBACK функцию receive_data, которая принимает 3 параметра:
  1. 0@ - ID игрока отправившего пакет
  2. 1@ - указатель на данные
  3. 2@ - длина данных в байтах
В этой же функции, после всех действий с данными, вы должны будете очистить область памяти 1@ (или нет, если вы будете где-то хранить на неё указатель):
CLEO:
free 1@

Для отправки данных используется функция send_data с параметрами:
  1. ID игрока, кому нужно отправить пакет
  2. указатель на данные
  3. длина данных в байтах
Данная функция возвращает FALSE если передача данных не удалась (игрок пропал из зоны стрима или его вообще не было) и TRUE если всё прошло хорошо и данные передались.

Ещё стоит добавить, что переменные 21@ - 27@ будут заняты библиотекой и использовать их не рекомендуется.

Небольшой пример отправки и приёма данных размером 10 КБ:
CLEO:
{$CLEO .cs}
{$INCLUDE NetLib.txt}
0000: NOP

alloc 0@ 10240
1@ = FALSE
0B34: samp register_client_command "send" to_label @send_message
while true
    wait 0
    if 1@ == TRUE
    then
        1@ = FALSE
        0B35: samp 1@ = get_last_command_params
        0AD4: 3@ = scan_string 1@ format "%d" 2@
        call @send_data 3 2@ 0@ 10240 3@    // bool send_data(WORD player_id, void *data, DWORD length)
        if 3@ == TRUE
        then
            chatmsg "Передача данных прошла успешно!" -1
        else
            chatmsg "Передача данных не удалась!" -1
        end
    end
end

:send_message
    1@ = TRUE
    cmdret

// void CALLBACK receive_data(WORD player_id, void *data, DWORD length)
:receive_data
    chatmsg "Пришло сообщение от игрока ID(%d) длинной %d байт." -1 0@ 2@
    free 1@
    ret 0

Да, и небольшое предупреждение: не используйте функцию send_data в CALLBACK функциях, типа таймеров, хуков и т.д. Используйте её только в потоках. И да, receive_data тоже вызывается из хука @incoming_packet_hook. Так что если нужно запустить цикл или поставить задержку, то создавайте новый поток.

Передавать можно любые данные, любой длины (ограничение 128 КБ за раз). Доставка данных гарантирована (разве что игрок пропадёт из зоны стрима). Работать должна на любом SAMP сервере. Можете настраивать библиотеку под себя, внутри исходника есть некоторые параметры, вроде задержки между отправкой пакетов, ограничением на размер передаваемых данных, сигнатурами заголовка, данных, конца, ответов да/нет и т.д. Весь код тщательно закомментирован.

Если будут какие-то проблемы с библиотекой - пишите в комментариях.

Теперь не по теме:
В данный момент я работаю над созданием голосового чата для SAMP. (Пишу на C++)
Уже удалось передать моно звук на частоте 8 КГц практически не нагружая сервер. Битрейт передачи звука примерно 6 Кбит/с.

Поддержать автора:
YandexMoney: 410015548714485
Qiwi: +79676632360
 

Вложения

  • NetLib.txt
    18.3 KB · Просмотры: 46
Последнее редактирование модератором:

FYP

Известный
Администратор
1,758
5,721
как же так, почему нет пункта "Да, но если он будет не на клео"?
я видел крипторы и декрипторы, чаты и стиллеры с использованием сокетов, реализацию конструкции switch на инклудах, огромные моды с кучей asm-хуков, виртуальные машины scm для создания клео скриптов под другие игры и даже компилятор си для клео. казалось бы, это уже предел извращения, а клео как платформа для разработки новых модов начинает переходить на второй план, благодаря plugin-sdk и мунлоадеру. и тут внезапно возникает "голосовой чат со своим протоколом передачи данных на основе аим синхры сампа". на клео.

jpUKgwzwiwg.jpg
 
У

Удалённый пользователь 144706

Гость
Автор темы
как же так, почему нет пункта "Да, но если он будет не на клео"?
я видел крипторы и декрипторы, чаты и стиллеры с использованием сокетов, реализацию конструкции switch на инклудах, огромные моды с кучей asm-хуков, виртуальные машины scm для создания клео скриптов под другие игры и даже компилятор си для клео. казалось бы, это уже предел извращения, а клео как платформа для разработки новых модов начинает переходить на второй план, благодаря plugin-sdk и мунлоадеру. и тут внезапно возникает "голосовой чат со своим протоколом передачи данных на основе аим синхры сампа". на клео.

jpUKgwzwiwg.jpg
Чат будет не на клео. Он пишется на C++. И работает совсем по другому принципу.
 
Последнее редактирование модератором:
У

Удалённый пользователь 144706

Гость
Автор темы
тогда ладно. только в самой теме об этом ни слова, а она в разделе клео
Да, за что извиняюсь) Тему создавал ночью, потом решил удалить часть с голосовым чатом(потому что не по теме), но голосование, кажись, нельзя удалять.
 
Последнее редактирование модератором:

iAmerican

Известный
Друг
615
257
Да, радиус действия только зона стрима. Я же вроде писал в теме...
Какие вообще тогда могут быть применения с данной "Библиотекой"?
Конечно плюс за то что старался и всё такое , но нахера пытаться воскрешать мертвый ЦЛЕО?
 
У

Удалённый пользователь 144706

Гость
Автор темы
Какие вообще тогда могут быть применения с данной "Библиотекой"?
Конечно плюс за то что старался и всё такое , но нахера пытаться воскрешать мертвый ЦЛЕО?
Тебе не нравиться Cleo или то, что библиотека работает в радиусе стрима? Если первое, то бери и переписывай на Lua или C++. Я ничего не "воскрешаю". Просто так вышло что на Cleo это было удобнее реализовать лично мне. Важен не язык, а принцип работы. Те кто поняли тему, таких вопросов не задают.
 
Статус
В этой теме нельзя размещать новые ответы.