Неактуально Lua ASI [SC23] GlobeVision - библиотека для обмена информацией о зоне стрима

etereon

MQ-Team
Автор темы
Проверенный
323
837
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R3
GlobeVision (v1.0-beta)
Библиотека для обмена информацией о зоне стрима для SA:MP 0.3.7 (R1, R3-1), а также RakSAMP Lite
Позволяет каждому пользователю автоматически отправлять информацию о зоне стрима в единый пул, запрашивать данные о других игроках. От подобных себе проектов (GMap и т.д) отличается возможностью масштабного использования и наличием экспортов, которые позволяют использовать информацию в любом виде (не только карты и т.д). Работы основанные на данной библиотеке:
(далле более подробное описание и информация для разработчиков)


Возможности
  • Автоматический сбор информации об игроках посредством перехвата входящящей синхронизации (онфут, водительской и пассажирской) и последующая её отправка на центральный сервер
  • Получение данных об игроках, которые находятся вне вашей стрим-зоны, либо на другом сервере, но попадают зону видимости другого пользователя плагина
Использование
Сам плагин не содержит никакого обработчика входящей информации, но экспортирует функции, которые дают возможность получать данные с сервера и использовать их в любом виде, например, в рамках своего приложения или Lua-скрипта (экспортируемые функции могут быть вызваны через FFI), т.е. использование ограничено лишь вашей фантазией

Как это работает?
Работоспособность достигается за счёт клиент-сайд плагина, собирающего информацию об игроках, и сервера, который хранит полученную информацию, либо отдаёт её по запросу. Для организации адекватного хранения данных я поступил следующим образом:
  1. Файл конфигурации сервера содержит в себе IP-адреса поддерживаемых игровых серверов
  2. При старте сервер выделяет под каждый IP-адрес свой буфер, который содержит в себе структуры MAX_PLAYERS = 1005 игроков следующего вида:
    C++:
    struct player_data_t {
                uint8_t updated : 1; // если == 1, значит игрок был обновлён в течение последних 5-и секунд
                uint8_t health : 7;
                uint8_t armor;
                uint16_t weapon : 6; // текущее оружие
                uint16_t model : 10; // скин
                position_t position; // позиция
                quat_compressed_t quaternion; // поворот
                uint32_t color;
                char nickname[20];
     };
     
     // в будущем может быть добавлено больше данных
  3. Плагин автоматически получает с сервера список поддерживаемых адресов при запуске
  4. Текущая версия даёт возможность добавить в список 255 адресов
  5. Данные с других игровых серверов не собираются
Библиотека является открытой, любой желающий может запустить её на своём хосте и использовать отдельно. Помимо этого, я поддерживаю работу сервера для массового использования, к которому привязан плагин, прикреплённый в этой теме. С актуальным списком адресов, добавленных мною, можно ознакомиться тут (буду постепенно пополнять его, в т.ч по просьбам)

Доступные функции и структуры
Для обеспечения неблокируемой работы скриптов я создал систему буферов, которые по очереди заполняются в потоке плагина. Функции для работы с ними:
C++:
struct position_t {
  float x, y, z;
};

struct quat_t {
  float w, x, y, z;
};

struct player_data_local_t {
  bool updated;
  uint8_t health;
  uint8_t armor;
  uint16_t weapon;
  uint16_t model;
  position_t position;
  quat_t quaternion;
  uint32_t color;
  char nickname[21];
};

// Создание буфера по IP-адресу сервера, возвращает номер созданного буфера
// Если буфер уже существует, то вернёт номер существующего буфера
int __stdcall create_buffer(const char* ip);

// Добавление буфера в очередь на обновление
void __stdcall update_buffer(int buffer_id);

// Долучение данных об игроке из буфера
player_data_local_t __stdcall get_player_data(int buffer_id, uint16_t player_id);

Установка
Для установки основной библиотеки необходимо просто поместить файл globevision.asi в корневую папку игры. Если вы планируете использовать дополнительные Lua-скрипты, то нужно распаковать содержимое архива globevision_lua.7z в папку moonloader

Примеры кода (Lua)
Примеры кода, реализация основной и Lua-библиотеки доступны в репозитории на GitHub
 

Вложения

  • globevision.asi
    22.5 KB · Просмотры: 91
  • globevision_lua.7z
    2.8 KB · Просмотры: 57
Последнее редактирование:

SobFoX;

Известный
108
67
Something has already done it I think based on Marker of the game. In addition, you can use the internal communication of Samp To synchronize packages in use by the server Samp himself

But beautiful and also very neat and accessible
 

Cosmo

Известный
Друг
646
2,597
отправка на центральный сервер
Что за центральный сервер? Какой то внешний ресурс, от которого зависит работоспособность библиотеки?
int __stdcall create_buffer(const char* ip);
Айпи указывается вручную, т.е. фактически можно подставить любого игрока, передав данные с "другого" сервера (или я что-то не так понял?)
 

etereon

MQ-Team
Автор темы
Проверенный
323
837
Реализация карты + наглядная демонстрация работы сети между игроками на разных серверах

Что за центральный сервер? Какой то внешний ресурс, от которого зависит работоспособность библиотеки?
Да, этот сервер нужен, чтоб хранить и отдавать информацию, прямой связи между юзерами нет, т.к. тогда бы не получилось реализовать массовую работу
Айпи указывается вручную, т.е. фактически можно подставить любого игрока, передав данные с "другого" сервера (или я что-то не так понял?)
Все эти функции отвечают только за получение данных
 
  • Нравится
Реакции: Cosmo

why ega

РП игрок
Модератор
2,539
2,233
GlobeVision (v1.0-beta)

Возможности

  • Автоматический сбор информации об игроках посредством перехвата входящящей синхронизации (онфут, водительской и пассажирской) и последующая её отправка на центральный сервер
  • Получение данных об игроках, которые находятся вне вашей стрим-зоны, либо на другом сервере, но попадают зону видимости другого пользователя плагина
Использование

Сам плагин не содержит никакого обработчика входящей информации, но экспортирует функции, которые дают возможность получать данные с сервера и использовать их в любом виде, например, в рамках своего приложения или Lua-скрипта (экспортируемые функции могут быть вызваны через FFI), т.е. использование ограничено лишь вашей фантазией

Как это работает?

Работоспособность достигается за счёт клиент-сайд плагина, собирающего информацию об игроках, и сервера, который хранит полученную информацию, либо отдаёт её по запросу. Для организации адекватного хранения данных я поступил следующим образом:

  1. Файл конфигурации сервера содержит в себе IP-адреса поддерживаемых игровых серверов
  2. При старте сервер выделяет под каждый IP-адрес свой буфер, который содержит в себе структуры MAX_PLAYERS = 1005 игроков следующего вида:
    C++:
    struct player_data_t {
          uint8_t updated : 1; // если == 1, значит игрок был обновлён в течение последних 5-и секунд
          uint8_t health : 7;
          uint8_t armor;
          uint16_t weapon : 6; // текущее оружие
          uint16_t model : 10; // скин
          position_t position; // позиция
          quat_compressed_t quaternion; // поворот
          uint32_t color;
          char nickname[20];
     };
     
     // в будущем может быть добавлено больше данных
  3. Плагин автоматически получает с сервера список поддерживаемых адресов при запуске
  4. Текущая версия даёт возможность добавить в список 255 адресов
  5. Данные с других игровых серверов не собираются
Библиотека является открытой, любой желающий может запустить её на своём хосте и использовать отдельно. Помимо этого, я поддерживаю работу сервера для массового использования, к которому привязан плагин, прикреплённый в этой теме. С актуальным списком адресов, добавленных мною, можно ознакомиться тут (буду постепенно пополнять его, в т.ч по просьбам)

Доступные функции и структуры

Для обеспечения неблокируемой работы скриптов я создал систему буферов, которые по очереди заполняются в потоке плагина. Функции для работы с ними:
C++:
struct position_t {
  float x, y, z;
};

struct quat_t {
  float w, x, y, z;
};

struct player_data_local_t {
  bool updated;
  uint8_t health;
  uint8_t armor;
  uint16_t weapon;
  uint16_t model;
  position_t position;
  quat_t quaternion;
  uint32_t color;
  char nickname[21];
};

// Создание буфера по IP-адресу сервера, возвращает номер созданного буфера
// Если буфер уже существует, то вернёт номер существующего буфера
int __stdcall create_buffer(const char* ip);

// Добавление буфера в очередь на обновление
void __stdcall update_buffer(int buffer_id);

// Долучение данных об игроке из буфера
player_data_local_t __stdcall get_player_data(int buffer_id, uint16_t player_id);

Примеры кода (Lua)

Примеры кода доступны в репозитории на GitHub



Постскриптум

Я планирую развивать данный проект, т.к. у него есть шансы стать чем-то уникальным и полезным. Надеюсь на ваш фидбек и идеи по расширению функционала. Буду благодарен, если кто-то закатает код из примера в небольшую Lua-библиотеку (сам я не силён в этом)
Было бы прикольно в будущем добавить поддержку и других версий Сампа (дл, р2, р4, р5)

реализовать массовую работу
Почему? Если есть юзеры, которые не стремятся к анонимности (IP), то почему бы не добавить возможность p2p соединения
 

etereon

MQ-Team
Автор темы
Проверенный
323
837
Почему? Если есть юзеры, которые не стремятся к анонимности (IP), то почему бы не добавить возможность p2p соединения
Я хотел изначально сделать ретранслятор синхры прямой, но по итогу решил сделать более масштабную штуку, которая хоть 20000 игроков обработает (сервака должно хватить на такие издевательства)
 
  • Вау
Реакции: why ega

MrCreepTon

وНеизвестный
Всефорумный модератор
2,127
4,713
Похожие проекты были уже на самом деле (что от меня, что от qrlck). Интересно, что у тебя в итоге выйдет, хотя как показала практика, сильно эта идея не приживается :С
 

etereon

MQ-Team
Автор темы
Проверенный
323
837
Похожие проекты были уже на самом деле (что от меня, что от qrlck). Интересно, что у тебя в итоге выйдет, хотя как показала практика, сильно эта идея не приживается :С
Всё зависит от того, какую нагрузку выдержит серв) По идее всё должно быть очень шустро
 

zakatov

zkt-team
Проверенный
1,673
513
сильно эта идея не приживается :С
Она не приживается из-за ненадобности в массах, может быть и будет пару человек которые придумают ей применение. Но в большинстве своя эта задумка бесполезна для большиства пользователей
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
597
819
Она не приживается из-за ненадобности в массах, может быть и будет пару человек которые придумают ей применение. Но в большинстве своя эта задумка бесполезна для большиства пользователей
Как минимум можно будет делать массированные атаки на сервера или на конкретного игрока. Как это будет работать? Есть 10 аккаунтов с этим плагином, один из них увидел человека в зоне своего стрима, получил его координаты, все аккаунты телепортируются к нему и начинают рванить. Синхронизация в SA:MP держится на добром слове, поэтому в теории можно отправлять серверу фейк синхру на определённого игрока сразу с 10 аккаунтов и его будет кикать античит. По сути новая эпоха кикеров, рванок и почти всех вредительских софтов.
 

Pavele

Участник
110
7
На основе этого скрипта возможно сделать локальный чат?
 

etereon

MQ-Team
Автор темы
Проверенный
323
837
Прикрепил архивом Lua-библиотеку с готовыми функциями для получения данных (с автоматической конвертацией cdata в таблицу) и эмуляции синхронизации игроков. Подробнее ознакомиться с функциями эмуляции синхронизации можно тут
Базовое использование:
local gv = require("globevision")

function main()
  if not gv.initialize() then -- завершаем скрипт, если библиотека не инициализировалась
    return thisScript():unload()
  end

  local buffer = gv.create_buffer("80.66.82.168") -- создаём буфер для Arizona RP Page

  if buffer == -1 then -- ошибка инициализации буфера
    return thisScript():unload()
  end

  gv.update_buffer(buffer) -- добавляем буфер в очередь на обновление

  wait(100) -- ждём заполнение буфера (в зависимости от интернета происходит за 10-100мс)

  local player = gv.get_player_data(buffer, 403) -- получаем данные игрока с ID = 403

  if player.updated then -- если данные по игроку есть, то выведем их
    print(string.format("NAME: %s | POS: %f %f %f", player.nickname, player.position.x, player.position.y, player.position.z))
  end
end

Помимо этого, прикрепляю файлы для запуска на RakSAMP Lite. Пропатченный lua51.dll подгружает plugins.dll, который инжектит .asi и .dll из папки plugins (данный лоадер подгружает плагины до инициализации ракнета)
 

Вложения

  • RakSAMP.7z
    311.9 KB · Просмотры: 11
Последнее редактирование: