Исходник Гайд LuaRak - RakNet в Lua!

why ega

РП игрок
Автор темы
Модератор
2,539
2,232
Доброго времени суток.

Представьте, что вы молодой пацан и скачиваете себе LuaRak - библиотеку для Lua, позволяющую взаимодействовать с сетевым движком RakNet внутри ваших скриптов. Данная библиотека заточена первым делом под SAMP (DDOS, DOS, BotNet, мини-прикольчики), но это не мешает использовать ее для реализации собственных проектов, требующих сетевое взаимодействие (онлайн-игры, сетевая часть приложений и т.д.).

Исходный код: GitHub
Примеры использования: GitHub

Зависимости: LuaJIT, Windows.
Библиотека также без проблем работает внутри MoonLoader и RakSAMP Lite.

В связи с ограниченным временем, библиотека выходит только в Alpha-версии. Дальнейшее развитие зависит от вашего фидбека.

LuaRak - таблица, возвращаемая при вызове require для библиотеки в вашем скрипте.
ИспользованиеПараметрыОписание
Lua:
local proxy = LuaRak:proxy()
Принимает: IP и порт прокси-сервера; если
Lua:
local nickname = "LuaRak"
local client = LuaRak:client(nickname)
Принимает: имя персонажа, которое будет использовано при подключении к серверу
Возвращает: экземпляр класса LuaClient
Создает объект класса LuaClient (обертка RakClient)
Lua:
local maxPlayers = 282
 local port = 7777
 local proxy = LuaRak:proxy()
 local server= LuaRak:client(maxPlayers, port, proxy)
Принимает: максимально количество игроков; порт, на котором будет располагаться сервер; экземпляр класса LuaProxy (если не указывать - сервер будет на основном порту).
Возвращает: экземпляр класса LuaServer
Создает объект класса LuaServer (обертка RakServer)
Lua:
local bs1 = LuaRak:BitStream()
local bs2 = LuaRak:BitStream(bs)
local data = "test"
local lengthInBytes = 4
local copyData = false
local bs3 = LuaRak:BitStream(data, lengthInBytes, true)
Принимает: 1 - ничего. 2 - экземпляр BitStream. 3 - указатель на данные; длина данных в байтах; будет ли создана копия данных
Возвращает: экземпляр класса BitStream
Создает объект класса BitStream
Класс для работы на стороне клиента. Именно с помощью него можно можно творить полную грязь на серверах.
Помимо тех функций, что указаны в таблице, также есть функции для работы с RPC, их задокументирую позже
Использование​
Параметры​
Описание​
Lua:
local client = LuaRak:client("Test")
local ip = "127.0.0.1"
local port = 7777
local proxy LuaRak:proxy()
client:connect(ip, port, proxy)
Принимает: строку с IP или доменом сервера; порт сервера; ссылка на объект LuaProxy.
Возвращает: true - если подключение не вызвало ошибок, false - если возникли какие-либо ошибки​
Подключает клиент к серверу​
Lua:
local client = LuaRak:client("Test")
local timeout = 10
client:disconect(timeout)
Принимает: время ожидания перед отключением, если оно не указано, клиент отключается мгновенно​
Отключает клиент от сервера​
Lua:
local client = LuaRak:client("Test")
local bs = LuaRak:BitStream()
client:sendPacket(bs)
local data = "hello"
local length = #hello
client:sendPacket(data, length)
Принимает: 1 - объект BitStream. 2 - указатель на данные; длину данных​
Отправляет пакет на сервер​
Lua:
local client = LuaRak:client("Test")
local bs = LuaRak:BitStream()
client:sendRPC(bs)

local data ="test"
local length = #data
client:sendRPC(data, length)
Принимает: 1 - объект BitStream; 2 - указатель на данные; длину данных​
Отправляет RPC на сервер​
Lua:
local client = LuaRak:client("Test")

while true do
    client:updateNetwork()
end
Обрабатывает данные сети (входящие пакеты и другие обработчики)​
Lua:
local function handler(...)
    print(...)
end


local client = LuaRak:client("Test")
client:addEventHandler("onReceivePacket", handler)
client:addEventHandler("onReceiveRPC", handler)
Принимает: тип обработчика; ссылку на функцию-обработчик​
Регистрирует новый обработчик на какое-либо событие​
Lua:
local client = LuaRak:client("Test")
local rakClient = client:getRakClient()
print(rakClient:GetLastPing())
Возвращает: объект RakClient​
Получает объект RakClient, который использует обертка​
Lua:
local client = LuaRak:client("Test")
print(client:getNickname())
Возвращает: никнейм клиента​
Получает строку с ником клиента​
Lua:
local client = LuaRak:client("Test")
client:setSAMPVersion("SAMP2009.9-282")
Принимает: строку с версией SAMP​
Устанавливает версию SAMP, которую бот будет использовать при подключении на сервер​
Lua:
local client = LuaRak:client("Test")
print(client:getId())
Возвращает: ID клиента на сервере​
Получает ID, установленный сервером для клиента​
Использование​
Параметры​
Описание​
Lua:
local address = "123.43.98.50"
local port = 1993
local user = "user123"
local password = "qwerty123"
local proxy = LuaRak:proxy(address, port, user, password, false)
proxy:setReceiving(true)
Принимает: адрес прокси-сервера; порт прокси-сервера; пользователь (необязательно); пароль от прокси (необязательно) ; запуск передачи данных;​
Подключается к proxy-серверу и установка обмена данными​
Lua:
local proxy = LuaRak:proxy(...)
local originalProxy = proxy:getProxy()
print(originalProxy:IsValidProxy())
Возвращает: ссылку на оригинальный прокси-класс​
Получает доступ к оригинальному прокси-классу, написанному на C++​
Использование​
Параметры​
Описание​
Lua:
local bs = LuaRak:BitStream()
Создает экземпляр класса BitStream​
Lua:
bs:reset()
Сбрасывает указатель чтения и записи в начало битового потока​
Lua:
bs:resetReadPointer()
Сбрасывает указатель чтения в начало битового потока​
Lua:
bs:resetWritePointer()
Сбрасывает указатель записи в начало битового потока​
Lua:
bs:setWriteOffset(offset)
Lua:
offset: number
Устанавливает указатель записи на указанное смещение​
Lua:
bs:getWriteOffset()
Возвращает текущее смещение указателя записи​
Lua:
bs:setReadOffset(offset)
Lua:
offset: number
Устанавливает указатель чтения на указанное смещение​
Lua:
bs:getReadOffset()
Возвращает текущее смещение указателя чтения​
Lua:
bs:getNumberOfBitsUsed()
Возвращает количество использованных битов​
Lua:
bs:getNumberOfBytesUsed()
Возвращает количество использованных байтов​
Lua:
bs:getNumberOfUnreadBits()
Возвращает количество непрочитанных битов​
Lua:
bs:getNumberOfUnreadBytes()
Возвращает количество непрочитанных байтов​
Lua:
bs:ignoreBits(bits)
Lua:
bits: number
Пропускает указанное количество битов​
Lua:
bs:ignoreBytes(bytes)
Lua:
bytes: number
Пропускает указанное количество байтов​
Lua:
bs:writeUInt8(value)
Lua:
value: number
Записывает беззнаковое 8-битовое целое число​
Lua:
bs:writeUInt16(value)
Lua:
value: number
Записывает беззнаковое 16-битовое целое число​
Lua:
bs:writeUInt32(value)
Lua:
value: number
Записывает беззнаковое 32-битовое целое число​
Lua:
bs:writeInt8(value)
Lua:
value: number
Записывает знаковое 8-битовое целое число​
Lua:
bs:writeInt16(value)
Lua:
value: number
Записывает знаковое 16-битовое целое число​
Lua:
bs:writeInt32(value)
Lua:
value: number
Записывает знаковое 32-битовое целое число​
Lua:
bs:writeFloat(value)
Lua:
value: number
Записывает число с плавающей запятой​
Lua:
bs:writeVector3D(vector)
Lua:
vector: table
Записывает трехмерный вектор (table с тремя числами)​
Lua:
bs:writeString(value)
Lua:
value: string
Записывает строку​
Lua:
bs:readUInt8()
Считывает беззнаковое 8-битовое целое число​
Lua:
bs:readUInt16()
Считывает беззнаковое 16-битовое целое число​
Lua:
bs:readUInt32()
Считывает беззнаковое 32-битовое целое число​
Lua:
bs:readInt8()
Считывает знаковое 8-битовое целое число​
Lua:
bs:readInt16()
Считывает знаковое 16-битовое целое число​
Lua:
bs:readInt32()
Считывает знаковое 32-битовое целое число​
Lua:
bs:readFloat()
Считывает число с плавающей запятой​
Lua:
bs:readString(size)
Считывает строку указанного размера​
Lua:
bs:getBitStream()
Возвращает оригинальный класс BitStream​
Lua:
bs:getDataPtr()
Возвращает указатель на данные битового потока​

Доработка серверной обертки, на данный момент работает некорректно
Фикс багов в обертке и самом RakNet (максимальное приближении к тому, что использует SAMP)
Добавить поддержку UNIX систем
Постепенный порт сетевого движка на Lua. На данный момент необходима обертка, написанная на C++ (core.dll)



Благодарность:
@AdCKuY_DpO4uLa - модификация RakNet
@#Northn помощь в некоторых аспектах, касаемо sol2
@lainban поставщик прокси
А также всем lua-seniors за поддержку
1702921426743.png
 

Вложения

  • LuaRak.rar
    2.4 MB · Просмотры: 112
Последнее редактирование:

why ega

РП игрок
Автор темы
Модератор
2,539
2,232
Документацию надо будет подправить, но это уже не сегодня
 
  • Нравится
Реакции: ernestik

ernestik

Новичок
15
3
скрипт топ! эга топ! забрали кота моник и комп! скрипт топ!
 

why ega

РП игрок
Автор темы
Модератор
2,539
2,232
в чем все же практическая польза и уникальность данной библиотеки, учитывая, что мы уже имеем moonbot?
Прокси (знаю, что это делается не так и сложно, можно даже через либу хуков от ртд реализовать, но к чему это? ), независимость от Мун апи (можно реализовать заглушками, но опять пахнет говном), работа не только на клиенте, но и на сервере (пока что до конца не реализовано, надо сделать квери и допилить дешифрование трафикатрафика; опенсорс; Криптон, как мы видим, забил на либу.
В плане? Если я правильно понимаю, в луа(жите) есть всё для этого (псевдо асинхронность тоже благодаря либам, но с этим надо будет разобраться подробнее). Никто не говорит, что за день будет готовый ракнет.луа, но что мешает постепенно переписывать абстракции (для начала раксерв, ракклиент, потом битстрим и т.д.)
 

why ega

РП игрок
Автор темы
Модератор
2,539
2,232
Это всё очень криво работает там(
Есть такое, но я подозреваемого, что это можно как-то обыграть (отказаться от той же асинхронности). В крайнем случае, оставить минимальную базу на крестиках